@dwelle/excalidraw 0.3.54 → 0.3.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1232,6 +1232,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1232
1232
|
|
|
1233
1233
|
/***/ }),
|
|
1234
1234
|
|
|
1235
|
+
/***/ "../../actions/actionBoundText.tsx":
|
|
1236
|
+
/*!*****************************************!*\
|
|
1237
|
+
!*** ../../actions/actionBoundText.tsx ***!
|
|
1238
|
+
\*****************************************/
|
|
1239
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1240
|
+
|
|
1241
|
+
"use strict";
|
|
1242
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionUnbindText\": () => (/* binding */ actionUnbindText),\n/* harmony export */ \"actionBindText\": () => (/* binding */ actionBindText)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst actionUnbindText = (0,_register__WEBPACK_IMPORTED_MODULE_7__.register)({\r\n name: \"unbindText\",\r\n contextItemLabel: \"labels.unbindText\",\r\n contextItemPredicate: (elements, appState) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)(elements, appState);\r\n return selectedElements.some((element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.hasBoundTextElement)(element));\r\n },\r\n perform: (elements, appState) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\r\n selectedElements.forEach((element) => {\r\n var _a;\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n const { width, height, baseline } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.measureText)(boundTextElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_6__.getFontString)(boundTextElement));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(boundTextElement, {\r\n containerId: null,\r\n width,\r\n height,\r\n baseline,\r\n text: boundTextElement.originalText,\r\n });\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\r\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.id !== boundTextElement.id),\r\n });\r\n }\r\n });\r\n return {\r\n elements,\r\n appState,\r\n commitToHistory: true,\r\n };\r\n },\r\n});\r\nconst actionBindText = (0,_register__WEBPACK_IMPORTED_MODULE_7__.register)({\r\n name: \"bindText\",\r\n contextItemLabel: \"labels.bindText\",\r\n contextItemPredicate: (elements, appState) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)(elements, appState);\r\n if (selectedElements.length === 2) {\r\n const textElement = (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) ||\r\n (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[1]);\r\n let bindingContainer;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextBindableContainer)(selectedElements[0])) {\r\n bindingContainer = selectedElements[0];\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextBindableContainer)(selectedElements[1])) {\r\n bindingContainer = selectedElements[1];\r\n }\r\n if (textElement &&\r\n bindingContainer &&\r\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(bindingContainer) === null) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n perform: (elements, appState) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\r\n let textElement;\r\n let container;\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextBindableContainer)(selectedElements[1])) {\r\n textElement = selectedElements[0];\r\n container = selectedElements[1];\r\n }\r\n else {\r\n textElement = selectedElements[1];\r\n container = selectedElements[0];\r\n }\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\r\n containerId: container.id,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\r\n });\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: textElement.id,\r\n }),\r\n });\r\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\r\n const updatedElements = elements.slice();\r\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\r\n updatedElements.splice(textElementIndex, 1);\r\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\r\n updatedElements.splice(containerIndex + 1, 0, textElement);\r\n return {\r\n elements: updatedElements,\r\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: { [container.id]: true } }),\r\n commitToHistory: true,\r\n };\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBRSxDQUFDO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FDaEQsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FDbkMsQ0FBQztRQUNGLGVBQWUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FDakMsQ0FBQztRQUNGLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTztZQUNMLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLFFBQVEsa0NBQU8sUUFBUSxLQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUU7WUFDdkUsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYWN0aW9ucy9hY3Rpb25Cb3VuZFRleHQudHN4PzRiZmYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXROb25EZWxldGVkRWxlbWVudHMsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIG1lYXN1cmVUZXh0LFxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3gsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBoYXNCb3VuZFRleHRFbGVtZW50LFxuICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcixcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGdldEZvbnRTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIi4vcmVnaXN0ZXJcIjtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblVuYmluZFRleHQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwidW5iaW5kVGV4dFwiLFxuICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy51bmJpbmRUZXh0XCIsXG4gIGNvbnRleHRJdGVtUHJlZGljYXRlOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSxcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUgfSA9IG1lYXN1cmVUZXh0KFxuICAgICAgICAgIGJvdW5kVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcoYm91bmRUZXh0RWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICBjb250YWluZXJJZDogbnVsbCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYmFzZWxpbmUsXG4gICAgICAgICAgdGV4dDogYm91bmRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgIH0pO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+IGVsZS5pZCAhPT0gYm91bmRUZXh0RWxlbWVudC5pZCxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHMsXG4gICAgICBhcHBTdGF0ZSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25CaW5kVGV4dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJiaW5kVGV4dFwiLFxuICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5iaW5kVGV4dFwiLFxuICBjb250ZXh0SXRlbVByZWRpY2F0ZTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID1cbiAgICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSB8fFxuICAgICAgICBpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMV0pO1xuXG4gICAgICBsZXQgYmluZGluZ0NvbnRhaW5lcjtcbiAgICAgIGlmIChpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBiaW5kaW5nQ29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1sxXSkpIHtcbiAgICAgICAgYmluZGluZ0NvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMV07XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRleHRFbGVtZW50ICYmXG4gICAgICAgIGJpbmRpbmdDb250YWluZXIgJiZcbiAgICAgICAgZ2V0Qm91bmRUZXh0RWxlbWVudChiaW5kaW5nQ29udGFpbmVyKSA9PT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyksXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuXG4gICAgbGV0IHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgbGV0IGNvbnRhaW5lcjogRXhjYWxpZHJhd1RleHRDb250YWluZXI7XG5cbiAgICBpZiAoXG4gICAgICBpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmXG4gICAgICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzFdKVxuICAgICkge1xuICAgICAgdGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgY29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzFdIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMF0gYXMgRXhjYWxpZHJhd1RleHRDb250YWluZXI7XG4gICAgfVxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXIuaWQsXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBWRVJUSUNBTF9BTElHTi5NSURETEUsXG4gICAgfSk7XG4gICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIGlkOiB0ZXh0RWxlbWVudC5pZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveCh0ZXh0RWxlbWVudCwgY29udGFpbmVyKTtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudHMgPSBlbGVtZW50cy5zbGljZSgpO1xuICAgIGNvbnN0IHRleHRFbGVtZW50SW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgICAgKGVsZSkgPT4gZWxlLmlkID09PSB0ZXh0RWxlbWVudC5pZCxcbiAgICApO1xuICAgIHVwZGF0ZWRFbGVtZW50cy5zcGxpY2UodGV4dEVsZW1lbnRJbmRleCwgMSk7XG4gICAgY29uc3QgY29udGFpbmVySW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgICAgKGVsZSkgPT4gZWxlLmlkID09PSBjb250YWluZXIuaWQsXG4gICAgKTtcbiAgICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKGNvbnRhaW5lckluZGV4ICsgMSwgMCwgdGV4dEVsZW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogdXBkYXRlZEVsZW1lbnRzLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIHNlbGVjdGVkRWxlbWVudElkczogeyBbY29udGFpbmVyLmlkXTogdHJ1ZSB9IH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../actions/actionBoundText.tsx\n");
|
|
1243
|
+
|
|
1244
|
+
/***/ }),
|
|
1245
|
+
|
|
1235
1246
|
/***/ "../../actions/actionCanvas.tsx":
|
|
1236
1247
|
/*!**************************************!*\
|
|
1237
1248
|
!*** ../../actions/actionCanvas.tsx ***!
|
|
@@ -1371,7 +1382,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1371
1382
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1372
1383
|
|
|
1373
1384
|
"use strict";
|
|
1374
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionChangeStrokeColor\": () => (/* binding */ actionChangeStrokeColor),\n/* harmony export */ \"actionChangeBackgroundColor\": () => (/* binding */ actionChangeBackgroundColor),\n/* harmony export */ \"actionChangeFillStyle\": () => (/* binding */ actionChangeFillStyle),\n/* harmony export */ \"actionChangeStrokeWidth\": () => (/* binding */ actionChangeStrokeWidth),\n/* harmony export */ \"actionChangeSloppiness\": () => (/* binding */ actionChangeSloppiness),\n/* harmony export */ \"actionChangeStrokeStyle\": () => (/* binding */ actionChangeStrokeStyle),\n/* harmony export */ \"actionChangeOpacity\": () => (/* binding */ actionChangeOpacity),\n/* harmony export */ \"actionChangeFontSize\": () => (/* binding */ actionChangeFontSize),\n/* harmony export */ \"actionDecreaseFontSize\": () => (/* binding */ actionDecreaseFontSize),\n/* harmony export */ \"actionIncreaseFontSize\": () => (/* binding */ actionIncreaseFontSize),\n/* harmony export */ \"actionChangeFontFamily\": () => (/* binding */ actionChangeFontFamily),\n/* harmony export */ \"actionChangeTextAlign\": () => (/* binding */ actionChangeTextAlign),\n/* harmony export */ \"actionChangeVerticalAlign\": () => (/* binding */ actionChangeVerticalAlign),\n/* harmony export */ \"actionChangeSharpness\": () => (/* binding */ actionChangeSharpness),\n/* harmony export */ \"actionChangeArrowhead\": () => (/* binding */ actionChangeArrowhead)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var _components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ButtonIconSelect */ \"../../components/ButtonIconSelect.tsx\");\n/* harmony import */ var _components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ColorPicker */ \"../../components/ColorPicker.tsx\");\n/* harmony import */ var _components_IconPicker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/IconPicker */ \"../../components/IconPicker.tsx\");\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_comparisons__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../scene/comparisons */ \"../../scene/comparisons.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst FONT_SIZE_RELATIVE_INCREASE_STEP = 0.1;\r\nconst changeProperty = (elements, appState, callback, includeBoundText = false) => {\r\n const selectedElementIds = (0,_utils__WEBPACK_IMPORTED_MODULE_15__.arrayToMap)((0,_scene__WEBPACK_IMPORTED_MODULE_13__.getSelectedElements)(elements, appState, includeBoundText));\r\n return elements.map((element) => {\r\n var _a;\r\n if (selectedElementIds.get(element.id) ||\r\n element.id === ((_a = appState.editingElement) === null || _a === void 0 ? void 0 : _a.id)) {\r\n return callback(element);\r\n }\r\n return element;\r\n });\r\n};\r\nconst getFormValue = function (elements, appState, getAttribute, defaultValue) {\r\n var _a, _b;\r\n const editingElement = appState.editingElement;\r\n const nonDeletedElements = (0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements);\r\n return ((_b = (_a = (editingElement && getAttribute(editingElement))) !== null && _a !== void 0 ? _a : ((0,_scene__WEBPACK_IMPORTED_MODULE_13__.isSomeElementSelected)(nonDeletedElements, appState)\r\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_13__.getCommonAttributeOfSelectedElements)(nonDeletedElements, appState, getAttribute)\r\n : defaultValue)) !== null && _b !== void 0 ? _b : null);\r\n};\r\nconst offsetElementAfterFontResize = (prevElement, nextElement) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isBoundToContainer)(nextElement)) {\r\n return nextElement;\r\n }\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.mutateElement)(nextElement, {\r\n x: prevElement.textAlign === \"left\"\r\n ? prevElement.x\r\n : prevElement.x +\r\n (prevElement.width - nextElement.width) /\r\n (prevElement.textAlign === \"center\" ? 2 : 1),\r\n // centering vertically is non-standard, but for Excalidraw I think\r\n // it makes sense\r\n y: prevElement.y + (prevElement.height - nextElement.height) / 2,\r\n }, false);\r\n};\r\nconst changeFontSize = (elements, appState, getNewFontSize, fallbackValue) => {\r\n const newFontSizes = new Set();\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newFontSize = getNewFontSize(oldElement);\r\n newFontSizes.add(newFontSize);\r\n let newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, {\r\n fontSize: newFontSize,\r\n });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement), appState);\r\n newElement = offsetElementAfterFontResize(oldElement, newElement);\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { \r\n // update state only if we've set all select text elements to\r\n // the same font size\r\n currentItemFontSize: newFontSizes.size === 1\r\n ? [...newFontSizes][0]\r\n : fallbackValue !== null && fallbackValue !== void 0 ? fallbackValue : appState.currentItemFontSize }),\r\n commitToHistory: true,\r\n };\r\n};\r\n// -----------------------------------------------------------------------------\r\nconst actionChangeStrokeColor = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemStrokeColor && {\r\n elements: changeProperty(elements, appState, (el) => {\r\n return (0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_14__.hasStrokeColor)(el.type)\r\n ? (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeColor: value.currentItemStrokeColor,\r\n })\r\n : el;\r\n }, true),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemStrokeColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.stroke\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementStroke\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.stroke\"), color: getFormValue(elements, appState, (element) => element.strokeColor, appState.currentItemStrokeColor), onChange: (color) => updateData({ currentItemStrokeColor: color }), isActive: appState.openPopup === \"strokeColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"strokeColorPicker\" : null }), elements: elements, appState: appState }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeBackgroundColor = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeBackgroundColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemBackgroundColor && {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n backgroundColor: value.currentItemBackgroundColor,\r\n })),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemBackgroundColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.background\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementBackground\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.background\"), color: getFormValue(elements, appState, (element) => element.backgroundColor, appState.currentItemBackgroundColor), onChange: (color) => updateData({ currentItemBackgroundColor: color }), isActive: appState.openPopup === \"backgroundColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"backgroundColorPicker\" : null }), elements: elements, appState: appState }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeFillStyle = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFillStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fillStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFillStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.fill\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { options: [\r\n {\r\n value: \"hachure\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.hachure\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillHachureIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"cross-hatch\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.crossHatch\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillCrossHatchIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], group: \"fill\", value: getFormValue(elements, appState, (element) => element.fillStyle, appState.currentItemFillStyle), onChange: (value) => {\r\n updateData(value);\r\n } }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeWidth = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeWidth\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeWidth: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeWidth: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeWidth\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"stroke-width\", options: [\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.thin\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 2 }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.bold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 6 }, void 0),\r\n },\r\n {\r\n value: 4,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.extraBold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 10 }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeWidth, appState.currentItemStrokeWidth), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeSloppiness = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeSloppiness\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n seed: (0,_random__WEBPACK_IMPORTED_MODULE_12__.randomInteger)(),\r\n roughness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemRoughness: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.sloppiness\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"sloppiness\", options: [\r\n {\r\n value: 0,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.architect\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArchitectIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.artist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArtistIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.cartoonist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessCartoonistIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.roughness, appState.currentItemRoughness), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeStyle = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"strokeStyle\", options: [\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dashed\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_dashed\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDashedIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dotted\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_dotted\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDottedIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeStyle, appState.currentItemStrokeStyle), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeOpacity = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeOpacity\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n opacity: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemOpacity: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n var _a;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"label\", Object.assign({ className: \"control-label\" }, { children: [(0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.opacity\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"input\", { type: \"range\", min: \"0\", max: \"100\", step: \"10\", onChange: (event) => updateData(+event.target.value), onWheel: (event) => {\r\n event.stopPropagation();\r\n const target = event.target;\r\n const STEP = 10;\r\n const MAX = 100;\r\n const MIN = 0;\r\n const value = +target.value;\r\n if (event.deltaY < 0 && value < MAX) {\r\n updateData(value + STEP);\r\n }\r\n else if (event.deltaY > 0 && value > MIN) {\r\n updateData(value - STEP);\r\n }\r\n }, value: (_a = getFormValue(elements, appState, (element) => element.opacity, appState.currentItemOpacity)) !== null && _a !== void 0 ? _a : undefined }, void 0)] }), void 0));\r\n },\r\n});\r\nconst actionChangeFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFontSize\",\r\n perform: (elements, appState, value) => {\r\n return changeFontSize(elements, appState, () => value, value);\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.fontSize\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-size\", options: [\r\n {\r\n value: 16,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.small\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeSmallIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-small\",\r\n },\r\n {\r\n value: 20,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.medium\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeMediumIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-medium\",\r\n },\r\n {\r\n value: 28,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.large\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeLargeIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-large\",\r\n },\r\n {\r\n value: 36,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.veryLarge\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeExtraLargeIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-veryLarge\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.fontSize;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.fontSize;\r\n }\r\n return null;\r\n }, appState.currentItemFontSize || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_SIZE), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionDecreaseFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"decreaseFontSize\",\r\n perform: (elements, appState, value) => {\r\n return changeFontSize(elements, appState, (element) => Math.round(\r\n // get previous value before relative increase (doesn't work fully\r\n // due to rounding and float precision issues)\r\n (1 / (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)) * element.fontSize));\r\n },\r\n keyTest: (event) => {\r\n return (event[_keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CTRL_OR_CMD] &&\r\n event.shiftKey &&\r\n // KEYS.COMMA needed for MacOS\r\n (event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CHEVRON_LEFT || event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.COMMA));\r\n },\r\n});\r\nconst actionIncreaseFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"increaseFontSize\",\r\n perform: (elements, appState, value) => {\r\n return changeFontSize(elements, appState, (element) => Math.round(element.fontSize * (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)));\r\n },\r\n keyTest: (event) => {\r\n return (event[_keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CTRL_OR_CMD] &&\r\n event.shiftKey &&\r\n // KEYS.PERIOD needed for MacOS\r\n (event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CHEVRON_RIGHT || event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.PERIOD));\r\n },\r\n});\r\nconst actionChangeFontFamily = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFontFamily\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, {\r\n fontFamily: value,\r\n });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement), appState);\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFontFamily: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const options = [\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Virgil,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.handDrawn\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyHandDrawnIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Helvetica,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.normal\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyNormalIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Cascadia,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.code\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyCodeIcon, { theme: appState.theme }, void 0),\r\n },\r\n ];\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.fontFamily\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-family\", options: options, value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.fontFamily;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.fontFamily;\r\n }\r\n return null;\r\n }, appState.currentItemFontFamily || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_FAMILY), onChange: (value) => updateData(value) }, void 0)] }, void 0));\r\n },\r\n});\r\nconst actionChangeTextAlign = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeTextAlign\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, { textAlign: value });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement), appState);\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemTextAlign: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.textAlign\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"text-align\", options: [\r\n {\r\n value: \"left\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.left\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignLeftIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"center\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.center\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignCenterIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"right\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.right\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignRightIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.textAlign;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.textAlign;\r\n }\r\n return null;\r\n }, appState.currentItemTextAlign), onChange: (value) => updateData(value) }, void 0)] }, void 0));\r\n },\r\n});\r\nconst actionChangeVerticalAlign = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeVerticalAlign\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, { verticalAlign: value });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement), appState);\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign({}, appState),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"fieldset\", { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"text-align\", options: [\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.VERTICAL_ALIGN.TOP,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.alignTop\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignTopIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.VERTICAL_ALIGN.MIDDLE,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.centerVertically\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignMiddleIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.VERTICAL_ALIGN.BOTTOM,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.alignBottom\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignBottomIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element) && element.containerId) {\r\n return element.verticalAlign;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.verticalAlign;\r\n }\r\n return null;\r\n }), onChange: (value) => updateData(value) }, void 0) }, void 0));\r\n },\r\n});\r\nconst actionChangeSharpness = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeSharpness\",\r\n perform: (elements, appState, value) => {\r\n const targetElements = (0,_scene__WEBPACK_IMPORTED_MODULE_13__.getTargetElements)((0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements), appState);\r\n const shouldUpdateForNonLinearElements = targetElements.length\r\n ? targetElements.every((el) => !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(el))\r\n : !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType);\r\n const shouldUpdateForLinearElements = targetElements.length\r\n ? targetElements.every(_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)\r\n : (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType);\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeSharpness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeSharpness: shouldUpdateForNonLinearElements\r\n ? value\r\n : appState.currentItemStrokeSharpness, currentItemLinearStrokeSharpness: shouldUpdateForLinearElements\r\n ? value\r\n : appState.currentItemLinearStrokeSharpness }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.edges\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"edges\", options: [\r\n {\r\n value: \"sharp\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.sharp\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeSharpIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"round\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.round\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeRoundIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeSharpness, ((0,_scene__WEBPACK_IMPORTED_MODULE_13__.canChangeSharpness)(appState.elementType) &&\r\n ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType)\r\n ? appState.currentItemLinearStrokeSharpness\r\n : appState.currentItemStrokeSharpness)) ||\r\n null), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeArrowhead = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeArrowhead\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(el)) {\r\n const { position, type } = value;\r\n if (position === \"start\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n startArrowhead: type,\r\n });\r\n return element;\r\n }\r\n else if (position === \"end\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n endArrowhead: type,\r\n });\r\n return element;\r\n }\r\n }\r\n return el;\r\n }),\r\n appState: Object.assign(Object.assign({}, appState), { [value.position === \"start\"\r\n ? \"currentItemStartArrowhead\"\r\n : \"currentItemEndArrowhead\"]: value.type }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const isRTL = (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.getLanguage)().rtl;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowheads\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"iconSelectList\" }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_start\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_none\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n keyBinding: \"q\",\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_arrow\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"w\",\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_bar\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"e\",\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_dot\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"r\",\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_13__.canHaveArrowheads)(element.type)\r\n ? element.startArrowhead\r\n : appState.currentItemStartArrowhead, appState.currentItemStartArrowhead), onChange: (value) => updateData({ position: \"start\", type: value }) }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_end\", group: \"arrowheads\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_none\"),\r\n keyBinding: \"q\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_arrow\"),\r\n keyBinding: \"w\",\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_bar\"),\r\n keyBinding: \"e\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_dot\"),\r\n keyBinding: \"r\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_13__.canHaveArrowheads)(element.type)\r\n ? element.endArrowhead\r\n : appState.currentItemEndArrowhead, appState.currentItemEndArrowhead), onChange: (value) => updateData({ position: \"end\", type: value }) }, void 0)] }), void 0)] }, void 0));\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzLnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDa0U7QUFDVjtBQUNGO0FBZ0N6QjtBQU1QO0FBS0Y7QUFDcUQ7QUFJekM7QUFLRDtBQVVVO0FBQ1Y7QUFDVztBQVF4QjtBQUNvQztBQUNoQjtBQUNBO0FBRXRDLE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxDQUFDO0FBRTdDLE1BQU0sY0FBYyxHQUFHLENBQ3JCLFFBQXNDLEVBQ3RDLFFBQWtCLEVBQ2xCLFFBQTJELEVBQzNELGdCQUFnQixHQUFHLEtBQUssRUFDeEIsRUFBRTtJQUNGLE1BQU0sa0JBQWtCLEdBQUcsbURBQVUsQ0FDbkMsNERBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUMxRCxDQUFDO0lBQ0YsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7O1FBQzlCLElBQ0Usa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLEVBQUUsTUFBSyxjQUFRLENBQUMsY0FBYywwQ0FBRSxFQUFFLEdBQzFDO1lBQ0EsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLFVBQ25CLFFBQXNDLEVBQ3RDLFFBQWtCLEVBQ2xCLFlBQStDLEVBQy9DLFlBQWdCOztJQUVoQixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sa0JBQWtCLEdBQUcsK0RBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsT0FBTyxDQUNMLGFBQUMsY0FBYyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxtQ0FDaEQsQ0FBQyw4REFB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VTtvQ0FDakIsSUFBSSxFQUFFLHlDQUFDLENBQUMsMkJBQTJCLENBQUM7b0NBQ3BDLElBQUksRUFBRSxDQUNKLHVEQUFDLG9FQUFxQixJQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLFdBQUksQ0FDOUQ7b0NBQ0QsVUFBVSxFQUFFLEdBQUc7aUNBQ2hCOzZCQUNGLEVBQ0QsS0FBSyxFQUFFLFlBQVksQ0FDakIsUUFBUSxFQUNSLFFBQVEsRUFDUixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ1Ysb0VBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSwwREFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dDQUN6RCxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVk7Z0NBQ3RCLENBQUMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQ3RDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FDakMsRUFDRCxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQ2pFLGFBQ0UsWUFDRyxDQUNaLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FjdGlvbnMvYWN0aW9uUHJvcGVydGllcy50c3g/ODY5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi8uLi9zcmMvdHlwZXNcIjtcbmltcG9ydCB7IEJ1dHRvbkljb25TZWxlY3QgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9CdXR0b25JY29uU2VsZWN0XCI7XG5pbXBvcnQgeyBDb2xvclBpY2tlciB9IGZyb20gXCIuLi9jb21wb25lbnRzL0NvbG9yUGlja2VyXCI7XG5pbXBvcnQgeyBJY29uUGlja2VyIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSWNvblBpY2tlclwiO1xuaW1wb3J0IHtcbiAgQXJyb3doZWFkQXJyb3dJY29uLFxuICBBcnJvd2hlYWRCYXJJY29uLFxuICBBcnJvd2hlYWREb3RJY29uLFxuICBBcnJvd2hlYWRUcmlhbmdsZUljb24sXG4gIEFycm93aGVhZE5vbmVJY29uLFxuICBFZGdlUm91bmRJY29uLFxuICBFZGdlU2hhcnBJY29uLFxuICBGaWxsQ3Jvc3NIYXRjaEljb24sXG4gIEZpbGxIYWNodXJlSWNvbixcbiAgRmlsbFNvbGlkSWNvbixcbiAgRm9udEZhbWlseUNvZGVJY29uLFxuICBGb250RmFtaWx5SGFuZERyYXduSWNvbixcbiAgRm9udEZhbWlseU5vcm1hbEljb24sXG4gIEZvbnRTaXplRXh0cmFMYXJnZUljb24sXG4gIEZvbnRTaXplTGFyZ2VJY29uLFxuICBGb250U2l6ZU1lZGl1bUljb24sXG4gIEZvbnRTaXplU21hbGxJY29uLFxuICBTbG9wcGluZXNzQXJjaGl0ZWN0SWNvbixcbiAgU2xvcHBpbmVzc0FydGlzdEljb24sXG4gIFNsb3BwaW5lc3NDYXJ0b29uaXN0SWNvbixcbiAgU3Ryb2tlU3R5bGVEYXNoZWRJY29uLFxuICBTdHJva2VTdHlsZURvdHRlZEljb24sXG4gIFN0cm9rZVN0eWxlU29saWRJY29uLFxuICBTdHJva2VXaWR0aEljb24sXG4gIFRleHRBbGlnbkNlbnRlckljb24sXG4gIFRleHRBbGlnbkxlZnRJY29uLFxuICBUZXh0QWxpZ25SaWdodEljb24sXG4gIFRleHRBbGlnblRvcEljb24sXG4gIFRleHRBbGlnbkJvdHRvbUljb24sXG4gIFRleHRBbGlnbk1pZGRsZUljb24sXG59IGZyb20gXCIuLi9jb21wb25lbnRzL2ljb25zXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICBERUZBVUxUX0ZPTlRfU0laRSxcbiAgRk9OVF9GQU1JTFksXG4gIFZFUlRJQ0FMX0FMSUdOLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBnZXROb25EZWxldGVkRWxlbWVudHMsXG4gIGlzVGV4dEVsZW1lbnQsXG4gIHJlZHJhd1RleHRCb3VuZGluZ0JveCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudCxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnRUeXBlLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBBcnJvd2hlYWQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBGb250RmFtaWx5VmFsdWVzLFxuICBUZXh0QWxpZ24sXG4gIFZlcnRpY2FsQWxpZ24sXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IHJhbmRvbUludGVnZXIgfSBmcm9tIFwiLi4vcmFuZG9tXCI7XG5pbXBvcnQge1xuICBjYW5DaGFuZ2VTaGFycG5lc3MsXG4gIGNhbkhhdmVBcnJvd2hlYWRzLFxuICBnZXRDb21tb25BdHRyaWJ1dGVPZlNlbGVjdGVkRWxlbWVudHMsXG4gIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gIGdldFRhcmdldEVsZW1lbnRzLFxuICBpc1NvbWVFbGVtZW50U2VsZWN0ZWQsXG59IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgaGFzU3Ryb2tlQ29sb3IgfSBmcm9tIFwiLi4vc2NlbmUvY29tcGFyaXNvbnNcIjtcbmltcG9ydCB7IGFycmF5VG9NYXAgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIi4vcmVnaXN0ZXJcIjtcblxuY29uc3QgRk9OVF9TSVpFX1JFTEFUSVZFX0lOQ1JFQVNFX1NURVAgPSAwLjE7XG5cbmNvbnN0IGNoYW5nZVByb3BlcnR5ID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBjYWxsYmFjazogKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgaW5jbHVkZUJvdW5kVGV4dCA9IGZhbHNlLFxuKSA9PiB7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudElkcyA9IGFycmF5VG9NYXAoXG4gICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUsIGluY2x1ZGVCb3VuZFRleHQpLFxuICApO1xuICByZXR1cm4gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzLmdldChlbGVtZW50LmlkKSB8fFxuICAgICAgZWxlbWVudC5pZCA9PT0gYXBwU3RhdGUuZWRpdGluZ0VsZW1lbnQ/LmlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9KTtcbn07XG5cbmNvbnN0IGdldEZvcm1WYWx1ZSA9IGZ1bmN0aW9uIDxUPihcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZ2V0QXR0cmlidXRlOiAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IFQsXG4gIGRlZmF1bHRWYWx1ZT86IFQsXG4pOiBUIHwgbnVsbCB7XG4gIGNvbnN0IGVkaXRpbmdFbGVtZW50ID0gYXBwU3RhdGUuZWRpdGluZ0VsZW1lbnQ7XG4gIGNvbnN0IG5vbkRlbGV0ZWRFbGVtZW50cyA9IGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyk7XG4gIHJldHVybiAoXG4gICAgKGVkaXRpbmdFbGVtZW50ICYmIGdldEF0dHJpYnV0ZShlZGl0aW5nRWxlbWVudCkpID8/XG4gICAgKGlzU29tZUVsZW1lbnRTZWxlY3RlZChub25EZWxldGVkRWxlbWVudHMsIGFwcFN0YXRlKVxuICAgICAgPyBnZXRDb21tb25BdHRyaWJ1dGVPZlNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgbm9uRGVsZXRlZEVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIGdldEF0dHJpYnV0ZSxcbiAgICAgICAgKVxuICAgICAgOiBkZWZhdWx0VmFsdWUpID8/XG4gICAgbnVsbFxuICApO1xufTtcblxuY29uc3Qgb2Zmc2V0RWxlbWVudEFmdGVyRm9udFJlc2l6ZSA9IChcbiAgcHJldkVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgbmV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbikgPT4ge1xuICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKG5leHRFbGVtZW50KSkge1xuICAgIHJldHVybiBuZXh0RWxlbWVudDtcbiAgfVxuICByZXR1cm4gbXV0YXRlRWxlbWVudChcbiAgICBuZXh0RWxlbWVudCxcbiAgICB7XG4gICAgICB4OlxuICAgICAgICBwcmV2RWxlbWVudC50ZXh0QWxpZ24gPT09IFwibGVmdFwiXG4gICAgICAgICAgPyBwcmV2RWxlbWVudC54XG4gICAgICAgICAgOiBwcmV2RWxlbWVudC54ICtcbiAgICAgICAgICAgIChwcmV2RWxlbWVudC53aWR0aCAtIG5leHRFbGVtZW50LndpZHRoKSAvXG4gICAgICAgICAgICAgIChwcmV2RWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgPyAyIDogMSksXG4gICAgICAvLyBjZW50ZXJpbmcgdmVydGljYWxseSBpcyBub24tc3RhbmRhcmQsIGJ1dCBmb3IgRXhjYWxpZHJhdyBJIHRoaW5rXG4gICAgICAvLyBpdCBtYWtlcyBzZW5zZVxuICAgICAgeTogcHJldkVsZW1lbnQueSArIChwcmV2RWxlbWVudC5oZWlnaHQgLSBuZXh0RWxlbWVudC5oZWlnaHQpIC8gMixcbiAgICB9LFxuICAgIGZhbHNlLFxuICApO1xufTtcblxuY29uc3QgY2hhbmdlRm9udFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGdldE5ld0ZvbnRTaXplOiAoZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiBudW1iZXIsXG4gIGZhbGxiYWNrVmFsdWU/OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJmb250U2l6ZVwiXSxcbikgPT4ge1xuICBjb25zdCBuZXdGb250U2l6ZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgYXBwU3RhdGUsXG4gICAgICAob2xkRWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChvbGRFbGVtZW50KSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ZvbnRTaXplID0gZ2V0TmV3Rm9udFNpemUob2xkRWxlbWVudCk7XG4gICAgICAgICAgbmV3Rm9udFNpemVzLmFkZChuZXdGb250U2l6ZSk7XG5cbiAgICAgICAgICBsZXQgbmV3RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgob2xkRWxlbWVudCwge1xuICAgICAgICAgICAgZm9udFNpemU6IG5ld0ZvbnRTaXplLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChcbiAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICBnZXRDb250YWluZXJFbGVtZW50KG9sZEVsZW1lbnQpLFxuICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG5ld0VsZW1lbnQgPSBvZmZzZXRFbGVtZW50QWZ0ZXJGb250UmVzaXplKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2xkRWxlbWVudDtcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICksXG4gICAgYXBwU3RhdGU6IHtcbiAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgLy8gdXBkYXRlIHN0YXRlIG9ubHkgaWYgd2UndmUgc2V0IGFsbCBzZWxlY3QgdGV4dCBlbGVtZW50cyB0b1xuICAgICAgLy8gdGhlIHNhbWUgZm9udCBzaXplXG4gICAgICBjdXJyZW50SXRlbUZvbnRTaXplOlxuICAgICAgICBuZXdGb250U2l6ZXMuc2l6ZSA9PT0gMVxuICAgICAgICAgID8gWy4uLm5ld0ZvbnRTaXplc11bMF1cbiAgICAgICAgICA6IGZhbGxiYWNrVmFsdWUgPz8gYXBwU3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICB9LFxuICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgfTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTdHJva2VDb2xvciA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTdHJva2VDb2xvclwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvciAmJiB7XG4gICAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYXNTdHJva2VDb2xvcihlbC50eXBlKVxuICAgICAgICAgICAgICA/IG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogdmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IGVsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogISF2YWx1ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDw+XG4gICAgICA8aDMgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3QoXCJsYWJlbHMuc3Ryb2tlXCIpfTwvaDM+XG4gICAgICA8Q29sb3JQaWNrZXJcbiAgICAgICAgdHlwZT1cImVsZW1lbnRTdHJva2VcIlxuICAgICAgICBsYWJlbD17dChcImxhYmVscy5zdHJva2VcIil9XG4gICAgICAgIGNvbG9yPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyhjb2xvcikgPT4gdXBkYXRlRGF0YSh7IGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IGNvbG9yIH0pfVxuICAgICAgICBpc0FjdGl2ZT17YXBwU3RhdGUub3BlblBvcHVwID09PSBcInN0cm9rZUNvbG9yUGlja2VyXCJ9XG4gICAgICAgIHNldEFjdGl2ZT17KGFjdGl2ZSkgPT5cbiAgICAgICAgICB1cGRhdGVEYXRhKHsgb3BlblBvcHVwOiBhY3RpdmUgPyBcInN0cm9rZUNvbG9yUGlja2VyXCIgOiBudWxsIH0pXG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHM9e2VsZW1lbnRzfVxuICAgICAgICBhcHBTdGF0ZT17YXBwU3RhdGV9XG4gICAgICAvPlxuICAgIDwvPlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VCYWNrZ3JvdW5kQ29sb3IgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlQmFja2dyb3VuZENvbG9yXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLih2YWx1ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvciAmJiB7XG4gICAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB2YWx1ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogISF2YWx1ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8PlxuICAgICAgPGgzIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt0KFwibGFiZWxzLmJhY2tncm91bmRcIil9PC9oMz5cbiAgICAgIDxDb2xvclBpY2tlclxuICAgICAgICB0eXBlPVwiZWxlbWVudEJhY2tncm91bmRcIlxuICAgICAgICBsYWJlbD17dChcImxhYmVscy5iYWNrZ3JvdW5kXCIpfVxuICAgICAgICBjb2xvcj17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyhjb2xvcikgPT4gdXBkYXRlRGF0YSh7IGN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yOiBjb2xvciB9KX1cbiAgICAgICAgaXNBY3RpdmU9e2FwcFN0YXRlLm9wZW5Qb3B1cCA9PT0gXCJiYWNrZ3JvdW5kQ29sb3JQaWNrZXJcIn1cbiAgICAgICAgc2V0QWN0aXZlPXsoYWN0aXZlKSA9PlxuICAgICAgICAgIHVwZGF0ZURhdGEoeyBvcGVuUG9wdXA6IGFjdGl2ZSA/IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCIgOiBudWxsIH0pXG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHM9e2VsZW1lbnRzfVxuICAgICAgICBhcHBTdGF0ZT17YXBwU3RhdGV9XG4gICAgICAvPlxuICAgIDwvPlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VGaWxsU3R5bGUgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlRmlsbFN0eWxlXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBmaWxsU3R5bGU6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgY3VycmVudEl0ZW1GaWxsU3R5bGU6IHZhbHVlIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5maWxsXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcImhhY2h1cmVcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuaGFjaHVyZVwiKSxcbiAgICAgICAgICAgIGljb246IDxGaWxsSGFjaHVyZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcImNyb3NzLWhhdGNoXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmNyb3NzSGF0Y2hcIiksXG4gICAgICAgICAgICBpY29uOiA8RmlsbENyb3NzSGF0Y2hJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJzb2xpZFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zb2xpZFwiKSxcbiAgICAgICAgICAgIGljb246IDxGaWxsU29saWRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgZ3JvdXA9XCJmaWxsXCJcbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5maWxsU3R5bGUsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICB1cGRhdGVEYXRhKHZhbHVlKTtcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgPC9maWVsZHNldD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlU3Ryb2tlV2lkdGggPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlU3Ryb2tlV2lkdGhcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIHN0cm9rZVdpZHRoOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtU3Ryb2tlV2lkdGg6IHZhbHVlIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5zdHJva2VXaWR0aFwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIGdyb3VwPVwic3Ryb2tlLXdpZHRoXCJcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy50aGluXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVdpZHRoSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IHN0cm9rZVdpZHRoPXsyfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAyLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5ib2xkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVdpZHRoSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IHN0cm9rZVdpZHRoPXs2fSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiA0LFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5leHRyYUJvbGRcIiksXG4gICAgICAgICAgICBpY29uOiA8U3Ryb2tlV2lkdGhJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gc3Ryb2tlV2lkdGg9ezEwfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnN0cm9rZVdpZHRoLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTbG9wcGluZXNzID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVNsb3BwaW5lc3NcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIHNlZWQ6IHJhbmRvbUludGVnZXIoKSxcbiAgICAgICAgICByb3VnaG5lc3M6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgY3VycmVudEl0ZW1Sb3VnaG5lc3M6IHZhbHVlIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5zbG9wcGluZXNzXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJzbG9wcGluZXNzXCJcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcmNoaXRlY3RcIiksXG4gICAgICAgICAgICBpY29uOiA8U2xvcHBpbmVzc0FyY2hpdGVjdEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnRpc3RcIiksXG4gICAgICAgICAgICBpY29uOiA8U2xvcHBpbmVzc0FydGlzdEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAyLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5jYXJ0b29uaXN0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFNsb3BwaW5lc3NDYXJ0b29uaXN0SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQucm91Z2huZXNzLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9maWVsZHNldD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlU3Ryb2tlU3R5bGUgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlU3Ryb2tlU3R5bGVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIHN0cm9rZVN0eWxlOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtU3Ryb2tlU3R5bGU6IHZhbHVlIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5zdHJva2VTdHlsZVwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIGdyb3VwPVwic3Ryb2tlU3R5bGVcIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwic29saWRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc3Ryb2tlU3R5bGVfc29saWRcIiksXG4gICAgICAgICAgICBpY29uOiA8U3Ryb2tlU3R5bGVTb2xpZEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcImRhc2hlZFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zdHJva2VTdHlsZV9kYXNoZWRcIiksXG4gICAgICAgICAgICBpY29uOiA8U3Ryb2tlU3R5bGVEYXNoZWRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJkb3R0ZWRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc3Ryb2tlU3R5bGVfZG90dGVkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVN0eWxlRG90dGVkSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuc3Ryb2tlU3R5bGUsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZU9wYWNpdHkgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlT3BhY2l0eVwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgb3BhY2l0eTogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbU9wYWNpdHk6IHZhbHVlIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGxhYmVsIGNsYXNzTmFtZT1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgIHt0KFwibGFiZWxzLm9wYWNpdHlcIil9XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgbWluPVwiMFwiXG4gICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgIHN0ZXA9XCIxMFwiXG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHVwZGF0ZURhdGEoK2V2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgIG9uV2hlZWw9eyhldmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IFNURVAgPSAxMDtcbiAgICAgICAgICBjb25zdCBNQVggPSAxMDA7XG4gICAgICAgICAgY29uc3QgTUlOID0gMDtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9ICt0YXJnZXQudmFsdWU7XG5cbiAgICAgICAgICBpZiAoZXZlbnQuZGVsdGFZIDwgMCAmJiB2YWx1ZSA8IE1BWCkge1xuICAgICAgICAgICAgdXBkYXRlRGF0YSh2YWx1ZSArIFNURVApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCAmJiB2YWx1ZSA+IE1JTikge1xuICAgICAgICAgICAgdXBkYXRlRGF0YSh2YWx1ZSAtIFNURVApO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgdmFsdWU9e1xuICAgICAgICAgIGdldEZvcm1WYWx1ZShcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5vcGFjaXR5LFxuICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICAgICkgPz8gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIC8+XG4gICAgPC9sYWJlbD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlRm9udFNpemUgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlRm9udFNpemVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4gY2hhbmdlRm9udFNpemUoZWxlbWVudHMsIGFwcFN0YXRlLCAoKSA9PiB2YWx1ZSwgdmFsdWUpO1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmZvbnRTaXplXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJmb250LXNpemVcIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDE2LFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zbWFsbFwiKSxcbiAgICAgICAgICAgIGljb246IDxGb250U2l6ZVNtYWxsSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgICAgdGVzdElkOiBcImZvbnRTaXplLXNtYWxsXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLm1lZGl1bVwiKSxcbiAgICAgICAgICAgIGljb246IDxGb250U2l6ZU1lZGl1bUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgIHRlc3RJZDogXCJmb250U2l6ZS1tZWRpdW1cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAyOCxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMubGFyZ2VcIiksXG4gICAgICAgICAgICBpY29uOiA8Rm9udFNpemVMYXJnZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgIHRlc3RJZDogXCJmb250U2l6ZS1sYXJnZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDM2LFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy52ZXJ5TGFyZ2VcIiksXG4gICAgICAgICAgICBpY29uOiA8Rm9udFNpemVFeHRyYUxhcmdlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgICAgdGVzdElkOiBcImZvbnRTaXplLXZlcnlMYXJnZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmZvbnRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gYm91bmRUZXh0RWxlbWVudC5mb250U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSB8fCBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkRlY3JlYXNlRm9udFNpemUgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiZGVjcmVhc2VGb250U2l6ZVwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiBjaGFuZ2VGb250U2l6ZShlbGVtZW50cywgYXBwU3RhdGUsIChlbGVtZW50KSA9PlxuICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgLy8gZ2V0IHByZXZpb3VzIHZhbHVlIGJlZm9yZSByZWxhdGl2ZSBpbmNyZWFzZSAoZG9lc24ndCB3b3JrIGZ1bGx5XG4gICAgICAgIC8vIGR1ZSB0byByb3VuZGluZyBhbmQgZmxvYXQgcHJlY2lzaW9uIGlzc3VlcylcbiAgICAgICAgKDEgLyAoMSArIEZPTlRfU0laRV9SRUxBVElWRV9JTkNSRUFTRV9TVEVQKSkgKiBlbGVtZW50LmZvbnRTaXplLFxuICAgICAgKSxcbiAgICApO1xuICB9LFxuICBrZXlUZXN0OiAoZXZlbnQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAvLyBLRVlTLkNPTU1BIG5lZWRlZCBmb3IgTWFjT1NcbiAgICAgIChldmVudC5rZXkgPT09IEtFWVMuQ0hFVlJPTl9MRUZUIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5DT01NQSlcbiAgICApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25JbmNyZWFzZUZvbnRTaXplID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImluY3JlYXNlRm9udFNpemVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4gY2hhbmdlRm9udFNpemUoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWxlbWVudCkgPT5cbiAgICAgIE1hdGgucm91bmQoZWxlbWVudC5mb250U2l6ZSAqICgxICsgRk9OVF9TSVpFX1JFTEFUSVZFX0lOQ1JFQVNFX1NURVApKSxcbiAgICApO1xuICB9LFxuICBrZXlUZXN0OiAoZXZlbnQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAvLyBLRVlTLlBFUklPRCBuZWVkZWQgZm9yIE1hY09TXG4gICAgICAoZXZlbnQua2V5ID09PSBLRVlTLkNIRVZST05fUklHSFQgfHwgZXZlbnQua2V5ID09PSBLRVlTLlBFUklPRClcbiAgICApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VGb250RmFtaWx5ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZvbnRGYW1pbHlcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIChvbGRFbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQob2xkRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCA9IG5ld0VsZW1lbnRXaXRoKFxuICAgICAgICAgICAgICBvbGRFbGVtZW50LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogdmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KFxuICAgICAgICAgICAgICBuZXdFbGVtZW50LFxuICAgICAgICAgICAgICBnZXRDb250YWluZXJFbGVtZW50KG9sZEVsZW1lbnQpLFxuICAgICAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gb2xkRWxlbWVudDtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgY3VycmVudEl0ZW1Gb250RmFtaWx5OiB2YWx1ZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uczoge1xuICAgICAgdmFsdWU6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gICAgICB0ZXh0OiBzdHJpbmc7XG4gICAgICBpY29uOiBKU1guRWxlbWVudDtcbiAgICB9W10gPSBbXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBGT05UX0ZBTUlMWS5WaXJnaWwsXG4gICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuaGFuZERyYXduXCIpLFxuICAgICAgICBpY29uOiA8Rm9udEZhbWlseUhhbmREcmF3bkljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBGT05UX0ZBTUlMWS5IZWx2ZXRpY2EsXG4gICAgICAgIHRleHQ6IHQoXCJsYWJlbHMubm9ybWFsXCIpLFxuICAgICAgICBpY29uOiA8Rm9udEZhbWlseU5vcm1hbEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBGT05UX0ZBTUlMWS5DYXNjYWRpYSxcbiAgICAgICAgdGV4dDogdChcImxhYmVscy5jb2RlXCIpLFxuICAgICAgICBpY29uOiA8Rm9udEZhbWlseUNvZGVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGZpZWxkc2V0PlxuICAgICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmZvbnRGYW1pbHlcIil9PC9sZWdlbmQ+XG4gICAgICAgIDxCdXR0b25JY29uU2VsZWN0PEZvbnRGYW1pbHlWYWx1ZXMgfCBmYWxzZT5cbiAgICAgICAgICBncm91cD1cImZvbnQtZmFtaWx5XCJcbiAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb250RmFtaWx5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBib3VuZFRleHRFbGVtZW50LmZvbnRGYW1pbHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5IHx8IERFRkFVTFRfRk9OVF9GQU1JTFksXG4gICAgICAgICAgKX1cbiAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlVGV4dEFsaWduID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVRleHRBbGlnblwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgKG9sZEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChvbGRFbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoXG4gICAgICAgICAgICAgIG9sZEVsZW1lbnQsXG4gICAgICAgICAgICAgIHsgdGV4dEFsaWduOiB2YWx1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyRWxlbWVudChvbGRFbGVtZW50KSxcbiAgICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG9sZEVsZW1lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIGN1cnJlbnRJdGVtVGV4dEFsaWduOiB2YWx1ZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy50ZXh0QWxpZ25cIil9PC9sZWdlbmQ+XG4gICAgICAgIDxCdXR0b25JY29uU2VsZWN0PFRleHRBbGlnbiB8IGZhbHNlPlxuICAgICAgICAgIGdyb3VwPVwidGV4dC1hbGlnblwiXG4gICAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMubGVmdFwiKSxcbiAgICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbkxlZnRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5jZW50ZXJcIiksXG4gICAgICAgICAgICAgIGljb246IDxUZXh0QWxpZ25DZW50ZXJJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogXCJyaWdodFwiLFxuICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnJpZ2h0XCIpLFxuICAgICAgICAgICAgICBpY29uOiA8VGV4dEFsaWduUmlnaHRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF19XG4gICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRleHRBbGlnbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICAgICAgKX1cbiAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfSxcbn0pO1xuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVZlcnRpY2FsQWxpZ24gPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlVmVydGljYWxBbGlnblwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgKG9sZEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChvbGRFbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoXG4gICAgICAgICAgICAgIG9sZEVsZW1lbnQsXG4gICAgICAgICAgICAgIHsgdmVydGljYWxBbGlnbjogdmFsdWUgfSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyRWxlbWVudChvbGRFbGVtZW50KSxcbiAgICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG9sZEVsZW1lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZmllbGRzZXQ+XG4gICAgICAgIDxCdXR0b25JY29uU2VsZWN0PFZlcnRpY2FsQWxpZ24gfCBmYWxzZT5cbiAgICAgICAgICBncm91cD1cInRleHQtYWxpZ25cIlxuICAgICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFsdWU6IFZFUlRJQ0FMX0FMSUdOLlRPUCxcbiAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hbGlnblRvcFwiKSxcbiAgICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnblRvcEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiBWRVJUSUNBTF9BTElHTi5NSURETEUsXG4gICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY2VudGVyVmVydGljYWxseVwiKSxcbiAgICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbk1pZGRsZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiBWRVJUSUNBTF9BTElHTi5CT1RUT00sXG4gICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYWxpZ25Cb3R0b21cIiksXG4gICAgICAgICAgICAgIGljb246IDxUZXh0QWxpZ25Cb3R0b21JY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF19XG4gICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShlbGVtZW50cywgYXBwU3RhdGUsIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnZlcnRpY2FsQWxpZ247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9KX1cbiAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlU2hhcnBuZXNzID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVNoYXJwbmVzc1wiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gZ2V0VGFyZ2V0RWxlbWVudHMoXG4gICAgICBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpLFxuICAgICAgYXBwU3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVGb3JOb25MaW5lYXJFbGVtZW50cyA9IHRhcmdldEVsZW1lbnRzLmxlbmd0aFxuICAgICAgPyB0YXJnZXRFbGVtZW50cy5ldmVyeSgoZWwpID0+ICFpc0xpbmVhckVsZW1lbnQoZWwpKVxuICAgICAgOiAhaXNMaW5lYXJFbGVtZW50VHlwZShhcHBTdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRm9yTGluZWFyRWxlbWVudHMgPSB0YXJnZXRFbGVtZW50cy5sZW5ndGhcbiAgICAgID8gdGFyZ2V0RWxlbWVudHMuZXZlcnkoaXNMaW5lYXJFbGVtZW50KVxuICAgICAgOiBpc0xpbmVhckVsZW1lbnRUeXBlKGFwcFN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIHN0cm9rZVNoYXJwbmVzczogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBjdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzczogc2hvdWxkVXBkYXRlRm9yTm9uTGluZWFyRWxlbWVudHNcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3M6IHNob3VsZFVwZGF0ZUZvckxpbmVhckVsZW1lbnRzXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuZWRnZXNcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cImVkZ2VzXCJcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInNoYXJwXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnNoYXJwXCIpLFxuICAgICAgICAgICAgaWNvbjogPEVkZ2VTaGFycEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInJvdW5kXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnJvdW5kXCIpLFxuICAgICAgICAgICAgaWNvbjogPEVkZ2VSb3VuZEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgICAoY2FuQ2hhbmdlU2hhcnBuZXNzKGFwcFN0YXRlLmVsZW1lbnRUeXBlKSAmJlxuICAgICAgICAgICAgKGlzTGluZWFyRWxlbWVudFR5cGUoYXBwU3RhdGUuZWxlbWVudFR5cGUpXG4gICAgICAgICAgICAgID8gYXBwU3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3NcbiAgICAgICAgICAgICAgOiBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcykpIHx8XG4gICAgICAgICAgICBudWxsLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9maWVsZHNldD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlQXJyb3doZWFkID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUFycm93aGVhZFwiLFxuICBwZXJmb3JtOiAoXG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgdmFsdWU6IHsgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCI7IHR5cGU6IEFycm93aGVhZCB9LFxuICApID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PiB7XG4gICAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoZWwpKSB7XG4gICAgICAgICAgY29uc3QgeyBwb3NpdGlvbiwgdHlwZSB9ID0gdmFsdWU7XG5cbiAgICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgICBzdGFydEFycm93aGVhZDogdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgICBlbmRBcnJvd2hlYWQ6IHR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbDtcbiAgICAgIH0pLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIFt2YWx1ZS5wb3NpdGlvbiA9PT0gXCJzdGFydFwiXG4gICAgICAgICAgPyBcImN1cnJlbnRJdGVtU3RhcnRBcnJvd2hlYWRcIlxuICAgICAgICAgIDogXCJjdXJyZW50SXRlbUVuZEFycm93aGVhZFwiXTogdmFsdWUudHlwZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiB7XG4gICAgY29uc3QgaXNSVEwgPSBnZXRMYW5ndWFnZSgpLnJ0bDtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZmllbGRzZXQ+XG4gICAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuYXJyb3doZWFkc1wiKX08L2xlZ2VuZD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpY29uU2VsZWN0TGlzdFwiPlxuICAgICAgICAgIDxJY29uUGlja2VyXG4gICAgICAgICAgICBsYWJlbD1cImFycm93aGVhZF9zdGFydFwiXG4gICAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9ub25lXCIpLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWROb25lSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwicVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYXJyb3dcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9hcnJvd1wiKSxcbiAgICAgICAgICAgICAgICBpY29uOiAoXG4gICAgICAgICAgICAgICAgICA8QXJyb3doZWFkQXJyb3dJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17IWlzUlRMfSAvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJ3XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJiYXJcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9iYXJcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogPEFycm93aGVhZEJhckljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXshaXNSVEx9IC8+LFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwiZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiZG90XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfZG90XCIpLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWREb3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17IWlzUlRMfSAvPixcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInJcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcInRyaWFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfdHJpYW5nbGVcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogKFxuICAgICAgICAgICAgICAgICAgPEFycm93aGVhZFRyaWFuZ2xlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9eyFpc1JUTH0gLz5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwidFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXX1cbiAgICAgICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWU8QXJyb3doZWFkIHwgbnVsbD4oXG4gICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpICYmIGNhbkhhdmVBcnJvd2hlYWRzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgICAgICAgID8gZWxlbWVudC5zdGFydEFycm93aGVhZFxuICAgICAgICAgICAgICAgICAgOiBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLFxuICAgICAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEoeyBwb3NpdGlvbjogXCJzdGFydFwiLCB0eXBlOiB2YWx1ZSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxJY29uUGlja2VyXG4gICAgICAgICAgICBsYWJlbD1cImFycm93aGVhZF9lbmRcIlxuICAgICAgICAgICAgZ3JvdXA9XCJhcnJvd2hlYWRzXCJcbiAgICAgICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX25vbmVcIiksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJxXCIsXG4gICAgICAgICAgICAgICAgaWNvbjogPEFycm93aGVhZE5vbmVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhcnJvd1wiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2Fycm93XCIpLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwid1wiLFxuICAgICAgICAgICAgICAgIGljb246IChcbiAgICAgICAgICAgICAgICAgIDxBcnJvd2hlYWRBcnJvd0ljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXtpc1JUTH0gLz5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYmFyXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfYmFyXCIpLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwiZVwiLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWRCYXJJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17aXNSVEx9IC8+LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiZG90XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfZG90XCIpLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwiclwiLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWREb3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17aXNSVEx9IC8+LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwidHJpYW5nbGVcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF90cmlhbmdsZVwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiAoXG4gICAgICAgICAgICAgICAgICA8QXJyb3doZWFkVHJpYW5nbGVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17aXNSVEx9IC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInRcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF19XG4gICAgICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlPEFycm93aGVhZCB8IG51bGw+KFxuICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSAmJiBjYW5IYXZlQXJyb3doZWFkcyhlbGVtZW50LnR5cGUpXG4gICAgICAgICAgICAgICAgICA/IGVsZW1lbnQuZW5kQXJyb3doZWFkXG4gICAgICAgICAgICAgICAgICA6IGFwcFN0YXRlLmN1cnJlbnRJdGVtRW5kQXJyb3doZWFkLFxuICAgICAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbUVuZEFycm93aGVhZCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHsgcG9zaXRpb246IFwiZW5kXCIsIHR5cGU6IHZhbHVlIH0pfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9maWVsZHNldD5cbiAgICApO1xuICB9LFxufSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../actions/actionProperties.tsx\n");
|
|
1385
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionChangeStrokeColor\": () => (/* binding */ actionChangeStrokeColor),\n/* harmony export */ \"actionChangeBackgroundColor\": () => (/* binding */ actionChangeBackgroundColor),\n/* harmony export */ \"actionChangeFillStyle\": () => (/* binding */ actionChangeFillStyle),\n/* harmony export */ \"actionChangeStrokeWidth\": () => (/* binding */ actionChangeStrokeWidth),\n/* harmony export */ \"actionChangeSloppiness\": () => (/* binding */ actionChangeSloppiness),\n/* harmony export */ \"actionChangeStrokeStyle\": () => (/* binding */ actionChangeStrokeStyle),\n/* harmony export */ \"actionChangeOpacity\": () => (/* binding */ actionChangeOpacity),\n/* harmony export */ \"actionChangeFontSize\": () => (/* binding */ actionChangeFontSize),\n/* harmony export */ \"actionDecreaseFontSize\": () => (/* binding */ actionDecreaseFontSize),\n/* harmony export */ \"actionIncreaseFontSize\": () => (/* binding */ actionIncreaseFontSize),\n/* harmony export */ \"actionChangeFontFamily\": () => (/* binding */ actionChangeFontFamily),\n/* harmony export */ \"actionChangeTextAlign\": () => (/* binding */ actionChangeTextAlign),\n/* harmony export */ \"actionChangeVerticalAlign\": () => (/* binding */ actionChangeVerticalAlign),\n/* harmony export */ \"actionChangeSharpness\": () => (/* binding */ actionChangeSharpness),\n/* harmony export */ \"actionChangeArrowhead\": () => (/* binding */ actionChangeArrowhead)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var _components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ButtonIconSelect */ \"../../components/ButtonIconSelect.tsx\");\n/* harmony import */ var _components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ColorPicker */ \"../../components/ColorPicker.tsx\");\n/* harmony import */ var _components_IconPicker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/IconPicker */ \"../../components/IconPicker.tsx\");\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_comparisons__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../scene/comparisons */ \"../../scene/comparisons.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst FONT_SIZE_RELATIVE_INCREASE_STEP = 0.1;\r\nconst changeProperty = (elements, appState, callback, includeBoundText = false) => {\r\n const selectedElementIds = (0,_utils__WEBPACK_IMPORTED_MODULE_15__.arrayToMap)((0,_scene__WEBPACK_IMPORTED_MODULE_13__.getSelectedElements)(elements, appState, includeBoundText));\r\n return elements.map((element) => {\r\n var _a;\r\n if (selectedElementIds.get(element.id) ||\r\n element.id === ((_a = appState.editingElement) === null || _a === void 0 ? void 0 : _a.id)) {\r\n return callback(element);\r\n }\r\n return element;\r\n });\r\n};\r\nconst getFormValue = function (elements, appState, getAttribute, defaultValue) {\r\n var _a, _b;\r\n const editingElement = appState.editingElement;\r\n const nonDeletedElements = (0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements);\r\n return ((_b = (_a = (editingElement && getAttribute(editingElement))) !== null && _a !== void 0 ? _a : ((0,_scene__WEBPACK_IMPORTED_MODULE_13__.isSomeElementSelected)(nonDeletedElements, appState)\r\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_13__.getCommonAttributeOfSelectedElements)(nonDeletedElements, appState, getAttribute)\r\n : defaultValue)) !== null && _b !== void 0 ? _b : null);\r\n};\r\nconst offsetElementAfterFontResize = (prevElement, nextElement) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isBoundToContainer)(nextElement)) {\r\n return nextElement;\r\n }\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.mutateElement)(nextElement, {\r\n x: prevElement.textAlign === \"left\"\r\n ? prevElement.x\r\n : prevElement.x +\r\n (prevElement.width - nextElement.width) /\r\n (prevElement.textAlign === \"center\" ? 2 : 1),\r\n // centering vertically is non-standard, but for Excalidraw I think\r\n // it makes sense\r\n y: prevElement.y + (prevElement.height - nextElement.height) / 2,\r\n }, false);\r\n};\r\nconst changeFontSize = (elements, appState, getNewFontSize, fallbackValue) => {\r\n const newFontSizes = new Set();\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newFontSize = getNewFontSize(oldElement);\r\n newFontSizes.add(newFontSize);\r\n let newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, {\r\n fontSize: newFontSize,\r\n });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement));\r\n newElement = offsetElementAfterFontResize(oldElement, newElement);\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { \r\n // update state only if we've set all select text elements to\r\n // the same font size\r\n currentItemFontSize: newFontSizes.size === 1\r\n ? [...newFontSizes][0]\r\n : fallbackValue !== null && fallbackValue !== void 0 ? fallbackValue : appState.currentItemFontSize }),\r\n commitToHistory: true,\r\n };\r\n};\r\n// -----------------------------------------------------------------------------\r\nconst actionChangeStrokeColor = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemStrokeColor && {\r\n elements: changeProperty(elements, appState, (el) => {\r\n return (0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_14__.hasStrokeColor)(el.type)\r\n ? (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeColor: value.currentItemStrokeColor,\r\n })\r\n : el;\r\n }, true),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemStrokeColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.stroke\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementStroke\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.stroke\"), color: getFormValue(elements, appState, (element) => element.strokeColor, appState.currentItemStrokeColor), onChange: (color) => updateData({ currentItemStrokeColor: color }), isActive: appState.openPopup === \"strokeColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"strokeColorPicker\" : null }), elements: elements, appState: appState }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeBackgroundColor = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeBackgroundColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemBackgroundColor && {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n backgroundColor: value.currentItemBackgroundColor,\r\n })),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemBackgroundColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.background\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementBackground\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.background\"), color: getFormValue(elements, appState, (element) => element.backgroundColor, appState.currentItemBackgroundColor), onChange: (color) => updateData({ currentItemBackgroundColor: color }), isActive: appState.openPopup === \"backgroundColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"backgroundColorPicker\" : null }), elements: elements, appState: appState }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeFillStyle = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFillStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fillStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFillStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.fill\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { options: [\r\n {\r\n value: \"hachure\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.hachure\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillHachureIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"cross-hatch\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.crossHatch\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillCrossHatchIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], group: \"fill\", value: getFormValue(elements, appState, (element) => element.fillStyle, appState.currentItemFillStyle), onChange: (value) => {\r\n updateData(value);\r\n } }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeWidth = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeWidth\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeWidth: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeWidth: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeWidth\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"stroke-width\", options: [\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.thin\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 2 }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.bold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 6 }, void 0),\r\n },\r\n {\r\n value: 4,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.extraBold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 10 }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeWidth, appState.currentItemStrokeWidth), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeSloppiness = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeSloppiness\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n seed: (0,_random__WEBPACK_IMPORTED_MODULE_12__.randomInteger)(),\r\n roughness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemRoughness: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.sloppiness\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"sloppiness\", options: [\r\n {\r\n value: 0,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.architect\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArchitectIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.artist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArtistIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.cartoonist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessCartoonistIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.roughness, appState.currentItemRoughness), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeStyle = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"strokeStyle\", options: [\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dashed\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_dashed\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDashedIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dotted\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_dotted\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDottedIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeStyle, appState.currentItemStrokeStyle), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeOpacity = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeOpacity\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n opacity: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemOpacity: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n var _a;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"label\", Object.assign({ className: \"control-label\" }, { children: [(0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.opacity\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"input\", { type: \"range\", min: \"0\", max: \"100\", step: \"10\", onChange: (event) => updateData(+event.target.value), onWheel: (event) => {\r\n event.stopPropagation();\r\n const target = event.target;\r\n const STEP = 10;\r\n const MAX = 100;\r\n const MIN = 0;\r\n const value = +target.value;\r\n if (event.deltaY < 0 && value < MAX) {\r\n updateData(value + STEP);\r\n }\r\n else if (event.deltaY > 0 && value > MIN) {\r\n updateData(value - STEP);\r\n }\r\n }, value: (_a = getFormValue(elements, appState, (element) => element.opacity, appState.currentItemOpacity)) !== null && _a !== void 0 ? _a : undefined }, void 0)] }), void 0));\r\n },\r\n});\r\nconst actionChangeFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFontSize\",\r\n perform: (elements, appState, value) => {\r\n return changeFontSize(elements, appState, () => value, value);\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.fontSize\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-size\", options: [\r\n {\r\n value: 16,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.small\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeSmallIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-small\",\r\n },\r\n {\r\n value: 20,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.medium\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeMediumIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-medium\",\r\n },\r\n {\r\n value: 28,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.large\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeLargeIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-large\",\r\n },\r\n {\r\n value: 36,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.veryLarge\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeExtraLargeIcon, { theme: appState.theme }, void 0),\r\n testId: \"fontSize-veryLarge\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.fontSize;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.fontSize;\r\n }\r\n return null;\r\n }, appState.currentItemFontSize || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_SIZE), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionDecreaseFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"decreaseFontSize\",\r\n perform: (elements, appState, value) => {\r\n return changeFontSize(elements, appState, (element) => Math.round(\r\n // get previous value before relative increase (doesn't work fully\r\n // due to rounding and float precision issues)\r\n (1 / (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)) * element.fontSize));\r\n },\r\n keyTest: (event) => {\r\n return (event[_keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CTRL_OR_CMD] &&\r\n event.shiftKey &&\r\n // KEYS.COMMA needed for MacOS\r\n (event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CHEVRON_LEFT || event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.COMMA));\r\n },\r\n});\r\nconst actionIncreaseFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"increaseFontSize\",\r\n perform: (elements, appState, value) => {\r\n return changeFontSize(elements, appState, (element) => Math.round(element.fontSize * (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)));\r\n },\r\n keyTest: (event) => {\r\n return (event[_keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CTRL_OR_CMD] &&\r\n event.shiftKey &&\r\n // KEYS.PERIOD needed for MacOS\r\n (event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.CHEVRON_RIGHT || event.key === _keys__WEBPACK_IMPORTED_MODULE_11__.KEYS.PERIOD));\r\n },\r\n});\r\nconst actionChangeFontFamily = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFontFamily\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, {\r\n fontFamily: value,\r\n });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement));\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFontFamily: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const options = [\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Virgil,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.handDrawn\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyHandDrawnIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Helvetica,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.normal\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyNormalIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Cascadia,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.code\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyCodeIcon, { theme: appState.theme }, void 0),\r\n },\r\n ];\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.fontFamily\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-family\", options: options, value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.fontFamily;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.fontFamily;\r\n }\r\n return null;\r\n }, appState.currentItemFontFamily || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_FAMILY), onChange: (value) => updateData(value) }, void 0)] }, void 0));\r\n },\r\n});\r\nconst actionChangeTextAlign = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeTextAlign\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, { textAlign: value });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement));\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemTextAlign: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.textAlign\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"text-align\", options: [\r\n {\r\n value: \"left\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.left\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignLeftIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"center\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.center\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignCenterIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"right\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.right\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignRightIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.textAlign;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.textAlign;\r\n }\r\n return null;\r\n }, appState.currentItemTextAlign), onChange: (value) => updateData(value) }, void 0)] }, void 0));\r\n },\r\n});\r\nconst actionChangeVerticalAlign = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeVerticalAlign\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (oldElement) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(oldElement)) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(oldElement, { verticalAlign: value });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(oldElement));\r\n return newElement;\r\n }\r\n return oldElement;\r\n }, true),\r\n appState: Object.assign({}, appState),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"fieldset\", { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"text-align\", options: [\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.VERTICAL_ALIGN.TOP,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.alignTop\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignTopIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.VERTICAL_ALIGN.MIDDLE,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.centerVertically\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignMiddleIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.VERTICAL_ALIGN.BOTTOM,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.alignBottom\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignBottomIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element) && element.containerId) {\r\n return element.verticalAlign;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.verticalAlign;\r\n }\r\n return null;\r\n }), onChange: (value) => updateData(value) }, void 0) }, void 0));\r\n },\r\n});\r\nconst actionChangeSharpness = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeSharpness\",\r\n perform: (elements, appState, value) => {\r\n const targetElements = (0,_scene__WEBPACK_IMPORTED_MODULE_13__.getTargetElements)((0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements), appState);\r\n const shouldUpdateForNonLinearElements = targetElements.length\r\n ? targetElements.every((el) => !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(el))\r\n : !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType);\r\n const shouldUpdateForLinearElements = targetElements.length\r\n ? targetElements.every(_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)\r\n : (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType);\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeSharpness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeSharpness: shouldUpdateForNonLinearElements\r\n ? value\r\n : appState.currentItemStrokeSharpness, currentItemLinearStrokeSharpness: shouldUpdateForLinearElements\r\n ? value\r\n : appState.currentItemLinearStrokeSharpness }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.edges\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"edges\", options: [\r\n {\r\n value: \"sharp\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.sharp\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeSharpIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"round\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.round\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeRoundIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeSharpness, ((0,_scene__WEBPACK_IMPORTED_MODULE_13__.canChangeSharpness)(appState.elementType) &&\r\n ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType)\r\n ? appState.currentItemLinearStrokeSharpness\r\n : appState.currentItemStrokeSharpness)) ||\r\n null), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeArrowhead = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeArrowhead\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(el)) {\r\n const { position, type } = value;\r\n if (position === \"start\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n startArrowhead: type,\r\n });\r\n return element;\r\n }\r\n else if (position === \"end\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n endArrowhead: type,\r\n });\r\n return element;\r\n }\r\n }\r\n return el;\r\n }),\r\n appState: Object.assign(Object.assign({}, appState), { [value.position === \"start\"\r\n ? \"currentItemStartArrowhead\"\r\n : \"currentItemEndArrowhead\"]: value.type }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const isRTL = (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.getLanguage)().rtl;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowheads\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"iconSelectList\" }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_start\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_none\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n keyBinding: \"q\",\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_arrow\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"w\",\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_bar\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"e\",\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_dot\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"r\",\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_13__.canHaveArrowheads)(element.type)\r\n ? element.startArrowhead\r\n : appState.currentItemStartArrowhead, appState.currentItemStartArrowhead), onChange: (value) => updateData({ position: \"start\", type: value }) }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_end\", group: \"arrowheads\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_none\"),\r\n keyBinding: \"q\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_arrow\"),\r\n keyBinding: \"w\",\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_bar\"),\r\n keyBinding: \"e\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_dot\"),\r\n keyBinding: \"r\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_13__.canHaveArrowheads)(element.type)\r\n ? element.endArrowhead\r\n : appState.currentItemEndArrowhead, appState.currentItemEndArrowhead), onChange: (value) => updateData({ position: \"end\", type: value }) }, void 0)] }), void 0)] }, void 0));\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzLnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDa0U7QUFDVjtBQUNGO0FBZ0N6QjtBQU1QO0FBS0Y7QUFDcUQ7QUFJekM7QUFLRDtBQVVVO0FBQ1Y7QUFDVztBQVF4QjtBQUNvQztBQUNoQjtBQUNBO0FBRXRDLE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxDQUFDO0FBRTdDLE1BQU0sY0FBYyxHQUFHLENBQ3JCLFFBQXNDLEVBQ3RDLFFBQWtCLEVBQ2xCLFFBQTJELEVBQzNELGdCQUFnQixHQUFHLEtBQUssRUFDeEIsRUFBRTtJQUNGLE1BQU0sa0JBQWtCLEdBQUcsbURBQVUsQ0FDbkMsNERBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUMxRCxDQUFDO0lBQ0YsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7O1FBQzlCLElBQ0Usa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLEVBQUUsTUFBSyxjQUFRLENBQUMsY0FBYywwQ0FBRSxFQUFFLEdBQzFDO1lBQ0EsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLFVBQ25CLFFBQXNDLEVBQ3RDLFFBQWtCLEVBQ2xCLFlBQStDLEVBQy9DLFlBQWdCOztJQUVoQixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sa0JBQWtCLEdBQUcsK0RBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsT0FBTyxDQUNMLGFBQUMsY0FBYyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxtQ0FDaEQsQ0FBQyw4REFB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QUNwQyxJQUFJLEVBQUUsQ0FDSix1REFBQyxvRUFBcUIsSUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxXQUFJLENBQzlEO29DQUNELFVBQVUsRUFBRSxHQUFHO2lDQUNoQjs2QkFDRixFQUNELEtBQUssRUFBRSxZQUFZLENBQ2pCLFFBQVEsRUFDUixRQUFRLEVBQ1IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLG9FQUFlLENBQUMsT0FBTyxDQUFDLElBQUksMERBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQ0FDekQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZO2dDQUN0QixDQUFDLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUN0QyxRQUFRLENBQUMsdUJBQXVCLENBQ2pDLEVBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxXQUNqRSxhQUNFLFlBQ0csQ0FDWixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXMudHN4Pzg2OTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBCdXR0b25JY29uU2VsZWN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQnV0dG9uSWNvblNlbGVjdFwiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Db2xvclBpY2tlclwiO1xuaW1wb3J0IHsgSWNvblBpY2tlciB9IGZyb20gXCIuLi9jb21wb25lbnRzL0ljb25QaWNrZXJcIjtcbmltcG9ydCB7XG4gIEFycm93aGVhZEFycm93SWNvbixcbiAgQXJyb3doZWFkQmFySWNvbixcbiAgQXJyb3doZWFkRG90SWNvbixcbiAgQXJyb3doZWFkVHJpYW5nbGVJY29uLFxuICBBcnJvd2hlYWROb25lSWNvbixcbiAgRWRnZVJvdW5kSWNvbixcbiAgRWRnZVNoYXJwSWNvbixcbiAgRmlsbENyb3NzSGF0Y2hJY29uLFxuICBGaWxsSGFjaHVyZUljb24sXG4gIEZpbGxTb2xpZEljb24sXG4gIEZvbnRGYW1pbHlDb2RlSWNvbixcbiAgRm9udEZhbWlseUhhbmREcmF3bkljb24sXG4gIEZvbnRGYW1pbHlOb3JtYWxJY29uLFxuICBGb250U2l6ZUV4dHJhTGFyZ2VJY29uLFxuICBGb250U2l6ZUxhcmdlSWNvbixcbiAgRm9udFNpemVNZWRpdW1JY29uLFxuICBGb250U2l6ZVNtYWxsSWNvbixcbiAgU2xvcHBpbmVzc0FyY2hpdGVjdEljb24sXG4gIFNsb3BwaW5lc3NBcnRpc3RJY29uLFxuICBTbG9wcGluZXNzQ2FydG9vbmlzdEljb24sXG4gIFN0cm9rZVN0eWxlRGFzaGVkSWNvbixcbiAgU3Ryb2tlU3R5bGVEb3R0ZWRJY29uLFxuICBTdHJva2VTdHlsZVNvbGlkSWNvbixcbiAgU3Ryb2tlV2lkdGhJY29uLFxuICBUZXh0QWxpZ25DZW50ZXJJY29uLFxuICBUZXh0QWxpZ25MZWZ0SWNvbixcbiAgVGV4dEFsaWduUmlnaHRJY29uLFxuICBUZXh0QWxpZ25Ub3BJY29uLFxuICBUZXh0QWxpZ25Cb3R0b21JY29uLFxuICBUZXh0QWxpZ25NaWRkbGVJY29uLFxufSBmcm9tIFwiLi4vY29tcG9uZW50cy9pY29uc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxuICBWRVJUSUNBTF9BTElHTixcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzLFxuICBpc1RleHRFbGVtZW50LFxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3gsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50VHlwZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgVGV4dEFsaWduLFxuICBWZXJ0aWNhbEFsaWduLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0TGFuZ3VhZ2UsIHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHtcbiAgY2FuQ2hhbmdlU2hhcnBuZXNzLFxuICBjYW5IYXZlQXJyb3doZWFkcyxcbiAgZ2V0Q29tbW9uQXR0cmlidXRlT2ZTZWxlY3RlZEVsZW1lbnRzLFxuICBnZXRTZWxlY3RlZEVsZW1lbnRzLFxuICBnZXRUYXJnZXRFbGVtZW50cyxcbiAgaXNTb21lRWxlbWVudFNlbGVjdGVkLFxufSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGhhc1N0cm9rZUNvbG9yIH0gZnJvbSBcIi4uL3NjZW5lL2NvbXBhcmlzb25zXCI7XG5pbXBvcnQgeyBhcnJheVRvTWFwIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gXCIuL3JlZ2lzdGVyXCI7XG5cbmNvbnN0IEZPTlRfU0laRV9SRUxBVElWRV9JTkNSRUFTRV9TVEVQID0gMC4xO1xuXG5jb25zdCBjaGFuZ2VQcm9wZXJ0eSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgY2FsbGJhY2s6IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4gRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGluY2x1ZGVCb3VuZFRleHQgPSBmYWxzZSxcbikgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHMgPSBhcnJheVRvTWFwKFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlLCBpbmNsdWRlQm91bmRUZXh0KSxcbiAgKTtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5nZXQoZWxlbWVudC5pZCkgfHxcbiAgICAgIGVsZW1lbnQuaWQgPT09IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSk7XG59O1xuXG5jb25zdCBnZXRGb3JtVmFsdWUgPSBmdW5jdGlvbiA8VD4oXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGdldEF0dHJpYnV0ZTogKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiBULFxuICBkZWZhdWx0VmFsdWU/OiBULFxuKTogVCB8IG51bGwge1xuICBjb25zdCBlZGl0aW5nRWxlbWVudCA9IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50O1xuICBjb25zdCBub25EZWxldGVkRWxlbWVudHMgPSBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpO1xuICByZXR1cm4gKFxuICAgIChlZGl0aW5nRWxlbWVudCAmJiBnZXRBdHRyaWJ1dGUoZWRpdGluZ0VsZW1lbnQpKSA/P1xuICAgIChpc1NvbWVFbGVtZW50U2VsZWN0ZWQobm9uRGVsZXRlZEVsZW1lbnRzLCBhcHBTdGF0ZSlcbiAgICAgID8gZ2V0Q29tbW9uQXR0cmlidXRlT2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIG5vbkRlbGV0ZWRFbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICBnZXRBdHRyaWJ1dGUsXG4gICAgICAgIClcbiAgICAgIDogZGVmYXVsdFZhbHVlKSA/P1xuICAgIG51bGxcbiAgKTtcbn07XG5cbmNvbnN0IG9mZnNldEVsZW1lbnRBZnRlckZvbnRSZXNpemUgPSAoXG4gIHByZXZFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIG5leHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4pID0+IHtcbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihuZXh0RWxlbWVudCkpIHtcbiAgICByZXR1cm4gbmV4dEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIG11dGF0ZUVsZW1lbnQoXG4gICAgbmV4dEVsZW1lbnQsXG4gICAge1xuICAgICAgeDpcbiAgICAgICAgcHJldkVsZW1lbnQudGV4dEFsaWduID09PSBcImxlZnRcIlxuICAgICAgICAgID8gcHJldkVsZW1lbnQueFxuICAgICAgICAgIDogcHJldkVsZW1lbnQueCArXG4gICAgICAgICAgICAocHJldkVsZW1lbnQud2lkdGggLSBuZXh0RWxlbWVudC53aWR0aCkgL1xuICAgICAgICAgICAgICAocHJldkVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiID8gMiA6IDEpLFxuICAgICAgLy8gY2VudGVyaW5nIHZlcnRpY2FsbHkgaXMgbm9uLXN0YW5kYXJkLCBidXQgZm9yIEV4Y2FsaWRyYXcgSSB0aGlua1xuICAgICAgLy8gaXQgbWFrZXMgc2Vuc2VcbiAgICAgIHk6IHByZXZFbGVtZW50LnkgKyAocHJldkVsZW1lbnQuaGVpZ2h0IC0gbmV4dEVsZW1lbnQuaGVpZ2h0KSAvIDIsXG4gICAgfSxcbiAgICBmYWxzZSxcbiAgKTtcbn07XG5cbmNvbnN0IGNoYW5nZUZvbnRTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBnZXROZXdGb250U2l6ZTogKGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCkgPT4gbnVtYmVyLFxuICBmYWxsYmFja1ZhbHVlPzogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wiZm9udFNpemVcIl0sXG4pID0+IHtcbiAgY29uc3QgbmV3Rm9udFNpemVzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoXG4gICAgICBlbGVtZW50cyxcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgKG9sZEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQob2xkRWxlbWVudCkpIHtcbiAgICAgICAgICBjb25zdCBuZXdGb250U2l6ZSA9IGdldE5ld0ZvbnRTaXplKG9sZEVsZW1lbnQpO1xuICAgICAgICAgIG5ld0ZvbnRTaXplcy5hZGQobmV3Rm9udFNpemUpO1xuXG4gICAgICAgICAgbGV0IG5ld0VsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCA9IG5ld0VsZW1lbnRXaXRoKG9sZEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGZvbnRTaXplOiBuZXdGb250U2l6ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3gobmV3RWxlbWVudCwgZ2V0Q29udGFpbmVyRWxlbWVudChvbGRFbGVtZW50KSk7XG5cbiAgICAgICAgICBuZXdFbGVtZW50ID0gb2Zmc2V0RWxlbWVudEFmdGVyRm9udFJlc2l6ZShvbGRFbGVtZW50LCBuZXdFbGVtZW50KTtcblxuICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9sZEVsZW1lbnQ7XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApLFxuICAgIGFwcFN0YXRlOiB7XG4gICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgIC8vIHVwZGF0ZSBzdGF0ZSBvbmx5IGlmIHdlJ3ZlIHNldCBhbGwgc2VsZWN0IHRleHQgZWxlbWVudHMgdG9cbiAgICAgIC8vIHRoZSBzYW1lIGZvbnQgc2l6ZVxuICAgICAgY3VycmVudEl0ZW1Gb250U2l6ZTpcbiAgICAgICAgbmV3Rm9udFNpemVzLnNpemUgPT09IDFcbiAgICAgICAgICA/IFsuLi5uZXdGb250U2l6ZXNdWzBdXG4gICAgICAgICAgOiBmYWxsYmFja1ZhbHVlID8/IGFwcFN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgfSxcbiAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gIH07XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlU3Ryb2tlQ29sb3IgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlU3Ryb2tlQ29sb3JcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHZhbHVlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IgJiYge1xuICAgICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGFzU3Ryb2tlQ29sb3IoZWwudHlwZSlcbiAgICAgICAgICAgICAgPyBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHZhbHVlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBlbDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICAuLi52YWx1ZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6ICEhdmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8PlxuICAgICAgPGgzIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt0KFwibGFiZWxzLnN0cm9rZVwiKX08L2gzPlxuICAgICAgPENvbG9yUGlja2VyXG4gICAgICAgIHR5cGU9XCJlbGVtZW50U3Ryb2tlXCJcbiAgICAgICAgbGFiZWw9e3QoXCJsYWJlbHMuc3Ryb2tlXCIpfVxuICAgICAgICBjb2xvcj17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsoY29sb3IpID0+IHVwZGF0ZURhdGEoeyBjdXJyZW50SXRlbVN0cm9rZUNvbG9yOiBjb2xvciB9KX1cbiAgICAgICAgaXNBY3RpdmU9e2FwcFN0YXRlLm9wZW5Qb3B1cCA9PT0gXCJzdHJva2VDb2xvclBpY2tlclwifVxuICAgICAgICBzZXRBY3RpdmU9eyhhY3RpdmUpID0+XG4gICAgICAgICAgdXBkYXRlRGF0YSh7IG9wZW5Qb3B1cDogYWN0aXZlID8gXCJzdHJva2VDb2xvclBpY2tlclwiIDogbnVsbCB9KVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzPXtlbGVtZW50c31cbiAgICAgICAgYXBwU3RhdGU9e2FwcFN0YXRlfVxuICAgICAgLz5cbiAgICA8Lz5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlQmFja2dyb3VuZENvbG9yID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUJhY2tncm91bmRDb2xvclwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odmFsdWUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IgJiYge1xuICAgICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdmFsdWUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICAuLi52YWx1ZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6ICEhdmFsdWUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPD5cbiAgICAgIDxoMyBhcmlhLWhpZGRlbj1cInRydWVcIj57dChcImxhYmVscy5iYWNrZ3JvdW5kXCIpfTwvaDM+XG4gICAgICA8Q29sb3JQaWNrZXJcbiAgICAgICAgdHlwZT1cImVsZW1lbnRCYWNrZ3JvdW5kXCJcbiAgICAgICAgbGFiZWw9e3QoXCJsYWJlbHMuYmFja2dyb3VuZFwiKX1cbiAgICAgICAgY29sb3I9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsoY29sb3IpID0+IHVwZGF0ZURhdGEoeyBjdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcjogY29sb3IgfSl9XG4gICAgICAgIGlzQWN0aXZlPXthcHBTdGF0ZS5vcGVuUG9wdXAgPT09IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCJ9XG4gICAgICAgIHNldEFjdGl2ZT17KGFjdGl2ZSkgPT5cbiAgICAgICAgICB1cGRhdGVEYXRhKHsgb3BlblBvcHVwOiBhY3RpdmUgPyBcImJhY2tncm91bmRDb2xvclBpY2tlclwiIDogbnVsbCB9KVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzPXtlbGVtZW50c31cbiAgICAgICAgYXBwU3RhdGU9e2FwcFN0YXRlfVxuICAgICAgLz5cbiAgICA8Lz5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlRmlsbFN0eWxlID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZpbGxTdHlsZVwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgZmlsbFN0eWxlOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtRmlsbFN0eWxlOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuZmlsbFwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJoYWNodXJlXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmhhY2h1cmVcIiksXG4gICAgICAgICAgICBpY29uOiA8RmlsbEhhY2h1cmVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJjcm9zcy1oYXRjaFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5jcm9zc0hhdGNoXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZpbGxDcm9zc0hhdGNoSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwic29saWRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc29saWRcIiksXG4gICAgICAgICAgICBpY29uOiA8RmlsbFNvbGlkSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIGdyb3VwPVwiZmlsbFwiXG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsbFN0eWxlLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgdXBkYXRlRGF0YSh2YWx1ZSk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVN0cm9rZVdpZHRoID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVN0cm9rZVdpZHRoXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzdHJva2VXaWR0aDogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuc3Ryb2tlV2lkdGhcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cInN0cm9rZS13aWR0aFwiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMudGhpblwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VXaWR0aEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBzdHJva2VXaWR0aD17Mn0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYm9sZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VXaWR0aEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBzdHJva2VXaWR0aD17Nn0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogNCxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuZXh0cmFCb2xkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVdpZHRoSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IHN0cm9rZVdpZHRoPXsxMH0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5zdHJva2VXaWR0aCxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9maWVsZHNldD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlU2xvcHBpbmVzcyA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTbG9wcGluZXNzXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzZWVkOiByYW5kb21JbnRlZ2VyKCksXG4gICAgICAgICAgcm91Z2huZXNzOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtUm91Z2huZXNzOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuc2xvcHBpbmVzc1wiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIGdyb3VwPVwic2xvcHBpbmVzc1wiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJjaGl0ZWN0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFNsb3BwaW5lc3NBcmNoaXRlY3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJ0aXN0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFNsb3BwaW5lc3NBcnRpc3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY2FydG9vbmlzdFwiKSxcbiAgICAgICAgICAgIGljb246IDxTbG9wcGluZXNzQ2FydG9vbmlzdEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnJvdWdobmVzcyxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVN0cm9rZVN0eWxlID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVN0cm9rZVN0eWxlXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzdHJva2VTdHlsZTogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbVN0cm9rZVN0eWxlOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuc3Ryb2tlU3R5bGVcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cInN0cm9rZVN0eWxlXCJcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInNvbGlkXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnN0cm9rZVN0eWxlX3NvbGlkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVN0eWxlU29saWRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJkYXNoZWRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc3Ryb2tlU3R5bGVfZGFzaGVkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVN0eWxlRGFzaGVkSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwiZG90dGVkXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnN0cm9rZVN0eWxlX2RvdHRlZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VTdHlsZURvdHRlZEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnN0cm9rZVN0eWxlLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VPcGFjaXR5ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZU9wYWNpdHlcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIG9wYWNpdHk6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgY3VycmVudEl0ZW1PcGFjaXR5OiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjb250cm9sLWxhYmVsXCI+XG4gICAgICB7dChcImxhYmVscy5vcGFjaXR5XCIpfVxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgIG1pbj1cIjBcIlxuICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICBzdGVwPVwiMTBcIlxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB1cGRhdGVEYXRhKCtldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICBvbldoZWVsPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBTVEVQID0gMTA7XG4gICAgICAgICAgY29uc3QgTUFYID0gMTAwO1xuICAgICAgICAgIGNvbnN0IE1JTiA9IDA7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSArdGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDAgJiYgdmFsdWUgPCBNQVgpIHtcbiAgICAgICAgICAgIHVwZGF0ZURhdGEodmFsdWUgKyBTVEVQKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDAgJiYgdmFsdWUgPiBNSU4pIHtcbiAgICAgICAgICAgIHVwZGF0ZURhdGEodmFsdWUgLSBTVEVQKTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAgIHZhbHVlPXtcbiAgICAgICAgICBnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQub3BhY2l0eSxcbiAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgICApID8/IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAvPlxuICAgIDwvbGFiZWw+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZUZvbnRTaXplID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZvbnRTaXplXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIGNoYW5nZUZvbnRTaXplKGVsZW1lbnRzLCBhcHBTdGF0ZSwgKCkgPT4gdmFsdWUsIHZhbHVlKTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5mb250U2l6ZVwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIGdyb3VwPVwiZm9udC1zaXplXCJcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAxNixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc21hbGxcIiksXG4gICAgICAgICAgICBpY29uOiA8Rm9udFNpemVTbWFsbEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgIHRlc3RJZDogXCJmb250U2l6ZS1zbWFsbFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDIwLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5tZWRpdW1cIiksXG4gICAgICAgICAgICBpY29uOiA8Rm9udFNpemVNZWRpdW1JY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB0ZXN0SWQ6IFwiZm9udFNpemUtbWVkaXVtXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMjgsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmxhcmdlXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZvbnRTaXplTGFyZ2VJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB0ZXN0SWQ6IFwiZm9udFNpemUtbGFyZ2VcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAzNixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMudmVyeUxhcmdlXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZvbnRTaXplRXh0cmFMYXJnZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgIHRlc3RJZDogXCJmb250U2l6ZS12ZXJ5TGFyZ2VcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb250U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQuZm9udFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUgfHwgREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25EZWNyZWFzZUZvbnRTaXplID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImRlY3JlYXNlRm9udFNpemVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4gY2hhbmdlRm9udFNpemUoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWxlbWVudCkgPT5cbiAgICAgIE1hdGgucm91bmQoXG4gICAgICAgIC8vIGdldCBwcmV2aW91cyB2YWx1ZSBiZWZvcmUgcmVsYXRpdmUgaW5jcmVhc2UgKGRvZXNuJ3Qgd29yayBmdWxseVxuICAgICAgICAvLyBkdWUgdG8gcm91bmRpbmcgYW5kIGZsb2F0IHByZWNpc2lvbiBpc3N1ZXMpXG4gICAgICAgICgxIC8gKDEgKyBGT05UX1NJWkVfUkVMQVRJVkVfSU5DUkVBU0VfU1RFUCkpICogZWxlbWVudC5mb250U2l6ZSxcbiAgICAgICksXG4gICAgKTtcbiAgfSxcbiAga2V5VGVzdDogKGV2ZW50KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAgLy8gS0VZUy5DT01NQSBuZWVkZWQgZm9yIE1hY09TXG4gICAgICAoZXZlbnQua2V5ID09PSBLRVlTLkNIRVZST05fTEVGVCB8fCBldmVudC5rZXkgPT09IEtFWVMuQ09NTUEpXG4gICAgKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uSW5jcmVhc2VGb250U2l6ZSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJpbmNyZWFzZUZvbnRTaXplXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIGNoYW5nZUZvbnRTaXplKGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsZW1lbnQpID0+XG4gICAgICBNYXRoLnJvdW5kKGVsZW1lbnQuZm9udFNpemUgKiAoMSArIEZPTlRfU0laRV9SRUxBVElWRV9JTkNSRUFTRV9TVEVQKSksXG4gICAgKTtcbiAgfSxcbiAga2V5VGVzdDogKGV2ZW50KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAgLy8gS0VZUy5QRVJJT0QgbmVlZGVkIGZvciBNYWNPU1xuICAgICAgKGV2ZW50LmtleSA9PT0gS0VZUy5DSEVWUk9OX1JJR0hUIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5QRVJJT0QpXG4gICAgKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlRm9udEZhbWlseSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VGb250RmFtaWx5XCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAob2xkRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KG9sZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICAgICAgICAgICAgb2xkRWxlbWVudCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IHZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChuZXdFbGVtZW50LCBnZXRDb250YWluZXJFbGVtZW50KG9sZEVsZW1lbnQpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBvbGRFbGVtZW50O1xuICAgICAgICB9LFxuICAgICAgICB0cnVlLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBjdXJyZW50SXRlbUZvbnRGYW1pbHk6IHZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiB7XG4gICAgICB2YWx1ZTogRm9udEZhbWlseVZhbHVlcztcbiAgICAgIHRleHQ6IHN0cmluZztcbiAgICAgIGljb246IEpTWC5FbGVtZW50O1xuICAgIH1bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IEZPTlRfRkFNSUxZLlZpcmdpbCxcbiAgICAgICAgdGV4dDogdChcImxhYmVscy5oYW5kRHJhd25cIiksXG4gICAgICAgIGljb246IDxGb250RmFtaWx5SGFuZERyYXduSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IEZPTlRfRkFNSUxZLkhlbHZldGljYSxcbiAgICAgICAgdGV4dDogdChcImxhYmVscy5ub3JtYWxcIiksXG4gICAgICAgIGljb246IDxGb250RmFtaWx5Tm9ybWFsSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IEZPTlRfRkFNSUxZLkNhc2NhZGlhLFxuICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmNvZGVcIiksXG4gICAgICAgIGljb246IDxGb250RmFtaWx5Q29kZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZmllbGRzZXQ+XG4gICAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuZm9udEZhbWlseVwiKX08L2xlZ2VuZD5cbiAgICAgICAgPEJ1dHRvbkljb25TZWxlY3Q8Rm9udEZhbWlseVZhbHVlcyB8IGZhbHNlPlxuICAgICAgICAgIGdyb3VwPVwiZm9udC1mYW1pbHlcIlxuICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmZvbnRGYW1pbHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQuZm9udEZhbWlseTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHkgfHwgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgICAgICAgICApfVxuICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgICAvPlxuICAgICAgPC9maWVsZHNldD5cbiAgICApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VUZXh0QWxpZ24gPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlVGV4dEFsaWduXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAob2xkRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KG9sZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICAgICAgICAgICAgb2xkRWxlbWVudCxcbiAgICAgICAgICAgICAgeyB0ZXh0QWxpZ246IHZhbHVlIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KG5ld0VsZW1lbnQsIGdldENvbnRhaW5lckVsZW1lbnQob2xkRWxlbWVudCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG9sZEVsZW1lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIGN1cnJlbnRJdGVtVGV4dEFsaWduOiB2YWx1ZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy50ZXh0QWxpZ25cIil9PC9sZWdlbmQ+XG4gICAgICAgIDxCdXR0b25JY29uU2VsZWN0PFRleHRBbGlnbiB8IGZhbHNlPlxuICAgICAgICAgIGdyb3VwPVwidGV4dC1hbGlnblwiXG4gICAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMubGVmdFwiKSxcbiAgICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbkxlZnRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5jZW50ZXJcIiksXG4gICAgICAgICAgICAgIGljb246IDxUZXh0QWxpZ25DZW50ZXJJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogXCJyaWdodFwiLFxuICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnJpZ2h0XCIpLFxuICAgICAgICAgICAgICBpY29uOiA8VGV4dEFsaWduUmlnaHRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF19XG4gICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRleHRBbGlnbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICAgICAgKX1cbiAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfSxcbn0pO1xuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVZlcnRpY2FsQWxpZ24gPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlVmVydGljYWxBbGlnblwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgKG9sZEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChvbGRFbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoXG4gICAgICAgICAgICAgIG9sZEVsZW1lbnQsXG4gICAgICAgICAgICAgIHsgdmVydGljYWxBbGlnbjogdmFsdWUgfSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChuZXdFbGVtZW50LCBnZXRDb250YWluZXJFbGVtZW50KG9sZEVsZW1lbnQpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBvbGRFbGVtZW50O1xuICAgICAgICB9LFxuICAgICAgICB0cnVlLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGZpZWxkc2V0PlxuICAgICAgICA8QnV0dG9uSWNvblNlbGVjdDxWZXJ0aWNhbEFsaWduIHwgZmFsc2U+XG4gICAgICAgICAgZ3JvdXA9XCJ0ZXh0LWFsaWduXCJcbiAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiBWRVJUSUNBTF9BTElHTi5UT1AsXG4gICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYWxpZ25Ub3BcIiksXG4gICAgICAgICAgICAgIGljb246IDxUZXh0QWxpZ25Ub3BJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogVkVSVElDQUxfQUxJR04uTUlERExFLFxuICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmNlbnRlclZlcnRpY2FsbHlcIiksXG4gICAgICAgICAgICAgIGljb246IDxUZXh0QWxpZ25NaWRkbGVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YWx1ZTogVkVSVElDQUxfQUxJR04uQk9UVE9NLFxuICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFsaWduQm90dG9tXCIpLFxuICAgICAgICAgICAgICBpY29uOiA8VGV4dEFsaWduQm90dG9tSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdfVxuICAgICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC52ZXJ0aWNhbEFsaWduO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSl9XG4gICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAgIC8+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVNoYXJwbmVzcyA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTaGFycG5lc3NcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50cyA9IGdldFRhcmdldEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRm9yTm9uTGluZWFyRWxlbWVudHMgPSB0YXJnZXRFbGVtZW50cy5sZW5ndGhcbiAgICAgID8gdGFyZ2V0RWxlbWVudHMuZXZlcnkoKGVsKSA9PiAhaXNMaW5lYXJFbGVtZW50KGVsKSlcbiAgICAgIDogIWlzTGluZWFyRWxlbWVudFR5cGUoYXBwU3RhdGUuZWxlbWVudFR5cGUpO1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUZvckxpbmVhckVsZW1lbnRzID0gdGFyZ2V0RWxlbWVudHMubGVuZ3RoXG4gICAgICA/IHRhcmdldEVsZW1lbnRzLmV2ZXJ5KGlzTGluZWFyRWxlbWVudClcbiAgICAgIDogaXNMaW5lYXJFbGVtZW50VHlwZShhcHBTdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzdHJva2VTaGFycG5lc3M6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3M6IHNob3VsZFVwZGF0ZUZvck5vbkxpbmVhckVsZW1lbnRzXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICAgIGN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzOiBzaG91bGRVcGRhdGVGb3JMaW5lYXJFbGVtZW50c1xuICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICA6IGFwcFN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmVkZ2VzXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJlZGdlc1wiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJzaGFycFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zaGFycFwiKSxcbiAgICAgICAgICAgIGljb246IDxFZGdlU2hhcnBJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJyb3VuZFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5yb3VuZFwiKSxcbiAgICAgICAgICAgIGljb246IDxFZGdlUm91bmRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5zdHJva2VTaGFycG5lc3MsXG4gICAgICAgICAgKGNhbkNoYW5nZVNoYXJwbmVzcyhhcHBTdGF0ZS5lbGVtZW50VHlwZSkgJiZcbiAgICAgICAgICAgIChpc0xpbmVhckVsZW1lbnRUeXBlKGFwcFN0YXRlLmVsZW1lbnRUeXBlKVxuICAgICAgICAgICAgICA/IGFwcFN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzXG4gICAgICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MpKSB8fFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZUFycm93aGVhZCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VBcnJvd2hlYWRcIixcbiAgcGVyZm9ybTogKFxuICAgIGVsZW1lbnRzLFxuICAgIGFwcFN0YXRlLFxuICAgIHZhbHVlOiB7IHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiOyB0eXBlOiBBcnJvd2hlYWQgfSxcbiAgKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT4ge1xuICAgICAgICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsKSkge1xuICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb24sIHR5cGUgfSA9IHZhbHVlO1xuXG4gICAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgc3RhcnRBcnJvd2hlYWQ6IHR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgZW5kQXJyb3doZWFkOiB0eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9KSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBbdmFsdWUucG9zaXRpb24gPT09IFwic3RhcnRcIlxuICAgICAgICAgID8gXCJjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkXCJcbiAgICAgICAgICA6IFwiY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRcIl06IHZhbHVlLnR5cGUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4ge1xuICAgIGNvbnN0IGlzUlRMID0gZ2V0TGFuZ3VhZ2UoKS5ydGw7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGZpZWxkc2V0PlxuICAgICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmFycm93aGVhZHNcIil9PC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaWNvblNlbGVjdExpc3RcIj5cbiAgICAgICAgICA8SWNvblBpY2tlclxuICAgICAgICAgICAgbGFiZWw9XCJhcnJvd2hlYWRfc3RhcnRcIlxuICAgICAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfbm9uZVwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkTm9uZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInFcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFycm93XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfYXJyb3dcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogKFxuICAgICAgICAgICAgICAgICAgPEFycm93aGVhZEFycm93SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9eyFpc1JUTH0gLz5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwid1wiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYmFyXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfYmFyXCIpLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWRCYXJJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17IWlzUlRMfSAvPixcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcImVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImRvdFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2RvdFwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkRG90SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9eyFpc1JUTH0gLz4sXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJyXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX3RyaWFuZ2xlXCIpLFxuICAgICAgICAgICAgICAgIGljb246IChcbiAgICAgICAgICAgICAgICAgIDxBcnJvd2hlYWRUcmlhbmdsZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXshaXNSVEx9IC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInRcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF19XG4gICAgICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlPEFycm93aGVhZCB8IG51bGw+KFxuICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSAmJiBjYW5IYXZlQXJyb3doZWFkcyhlbGVtZW50LnR5cGUpXG4gICAgICAgICAgICAgICAgICA/IGVsZW1lbnQuc3RhcnRBcnJvd2hlYWRcbiAgICAgICAgICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHsgcG9zaXRpb246IFwic3RhcnRcIiwgdHlwZTogdmFsdWUgfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8SWNvblBpY2tlclxuICAgICAgICAgICAgbGFiZWw9XCJhcnJvd2hlYWRfZW5kXCJcbiAgICAgICAgICAgIGdyb3VwPVwiYXJyb3doZWFkc1wiXG4gICAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9ub25lXCIpLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwicVwiLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWROb25lSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYXJyb3dcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9hcnJvd1wiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcIndcIixcbiAgICAgICAgICAgICAgICBpY29uOiAoXG4gICAgICAgICAgICAgICAgICA8QXJyb3doZWFkQXJyb3dJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17aXNSVEx9IC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImJhclwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2JhclwiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcImVcIixcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkQmFySWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImRvdFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2RvdFwiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInJcIixcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkRG90SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcInRyaWFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfdHJpYW5nbGVcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogKFxuICAgICAgICAgICAgICAgICAgPEFycm93aGVhZFRyaWFuZ2xlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJ0XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdfVxuICAgICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZTxBcnJvd2hlYWQgfCBudWxsPihcbiAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgJiYgY2FuSGF2ZUFycm93aGVhZHMoZWxlbWVudC50eXBlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmVuZEFycm93aGVhZFxuICAgICAgICAgICAgICAgICAgOiBhcHBTdGF0ZS5jdXJyZW50SXRlbUVuZEFycm93aGVhZCxcbiAgICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQsXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh7IHBvc2l0aW9uOiBcImVuZFwiLCB0eXBlOiB2YWx1ZSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../actions/actionProperties.tsx\n");
|
|
1375
1386
|
|
|
1376
1387
|
/***/ }),
|
|
1377
1388
|
|
|
@@ -1393,7 +1404,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1393
1404
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1394
1405
|
|
|
1395
1406
|
"use strict";
|
|
1396
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"copiedStyles\": () => (/* binding */ copiedStyles),\n/* harmony export */ \"actionCopyStyles\": () => (/* binding */ actionCopyStyles),\n/* harmony export */ \"actionPasteStyles\": () => (/* binding */ actionPasteStyles)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// `copiedStyles` is exported only for tests.\r\nlet copiedStyles = \"{}\";\r\nconst actionCopyStyles = (0,_register__WEBPACK_IMPORTED_MODULE_3__.register)({\r\n name: \"copyStyles\",\r\n perform: (elements, appState) => {\r\n const element = elements.find((el) => appState.selectedElementIds[el.id]);\r\n if (element) {\r\n copiedStyles = JSON.stringify(element);\r\n }\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { toastMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_2__.t)(\"toast.copyStyles\") }),\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.copyStyles\",\r\n keyTest: (event) => event[_keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.CTRL_OR_CMD] && event.altKey && event.code === _keys__WEBPACK_IMPORTED_MODULE_1__.CODES.C,\r\n});\r\nconst actionPasteStyles = (0,_register__WEBPACK_IMPORTED_MODULE_3__.register)({\r\n name: \"pasteStyles\",\r\n perform: (elements, appState) => {\r\n const pastedElement = JSON.parse(copiedStyles);\r\n if (!(0,_element__WEBPACK_IMPORTED_MODULE_0__.isExcalidrawElement)(pastedElement)) {\r\n return { elements, commitToHistory: false };\r\n }\r\n return {\r\n elements: elements.map((element) => {\r\n if (appState.selectedElementIds[element.id]) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.newElementWith)(element, {\r\n backgroundColor: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.backgroundColor,\r\n strokeWidth: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.strokeWidth,\r\n strokeColor: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.strokeColor,\r\n strokeStyle: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.strokeStyle,\r\n fillStyle: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.fillStyle,\r\n opacity: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.opacity,\r\n roughness: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.roughness,\r\n });\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(newElement) && (0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(newElement, {\r\n fontSize: (pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.fontSize) || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_SIZE,\r\n fontFamily: (pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.fontFamily) || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_FAMILY,\r\n textAlign: (pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.textAlign) || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_TEXT_ALIGN,\r\n });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_0__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(newElement), appState);\r\n }\r\n return newElement;\r\n }\r\n return element;\r\n }),\r\n commitToHistory: true,\r\n };\r\n },\r\n contextItemLabel: \"labels.pasteStyles\",\r\n keyTest: (event) => event[_keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.CTRL_OR_CMD] && event.altKey && event.code === _keys__WEBPACK_IMPORTED_MODULE_1__.CODES.V,\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LGFBQWEsQ0FBRSxTQUFTLEtBQUksMERBQWtCO3lCQUMxRCxDQUFDLENBQUM7d0JBRUgsK0RBQXFCLENBQ25CLFVBQVUsRUFDVix5RUFBbUIsQ0FBQyxVQUFVLENBQUMsRUFDL0IsUUFBUSxDQUNULENBQUM7cUJBQ0g7b0JBQ0QsT0FBTyxVQUFVLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUMsQ0FBQztZQUNGLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBQ0QsZ0JBQWdCLEVBQUUsb0JBQW9CO0lBQ3RDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2pCLEtBQUssQ0FBQyxtREFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSywwQ0FBTztDQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYWN0aW9ucy9hY3Rpb25TdHlsZXMudHM/ODA2MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBpc1RleHRFbGVtZW50LFxuICBpc0V4Y2FsaWRyYXdFbGVtZW50LFxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3gsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIi4vcmVnaXN0ZXJcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIERFRkFVTFRfRk9OVF9GQU1JTFksXG4gIERFRkFVTFRfVEVYVF9BTElHTixcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0Q29udGFpbmVyRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5cbi8vIGBjb3BpZWRTdHlsZXNgIGlzIGV4cG9ydGVkIG9ubHkgZm9yIHRlc3RzLlxuZXhwb3J0IGxldCBjb3BpZWRTdHlsZXM6IHN0cmluZyA9IFwie31cIjtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNvcHlTdHlsZXMgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY29weVN0eWxlc1wiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGVsKSA9PiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWwuaWRdKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgY29waWVkU3R5bGVzID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgdG9hc3RNZXNzYWdlOiB0KFwidG9hc3QuY29weVN0eWxlc1wiKSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgIH07XG4gIH0sXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLmNvcHlTdHlsZXNcIixcbiAga2V5VGVzdDogKGV2ZW50KSA9PlxuICAgIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIGV2ZW50LmFsdEtleSAmJiBldmVudC5jb2RlID09PSBDT0RFUy5DLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25QYXN0ZVN0eWxlcyA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJwYXN0ZVN0eWxlc1wiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3QgcGFzdGVkRWxlbWVudCA9IEpTT04ucGFyc2UoY29waWVkU3R5bGVzKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0VsZW1lbnQocGFzdGVkRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB7IGVsZW1lbnRzLCBjb21taXRUb0hpc3Rvcnk6IGZhbHNlIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWxlbWVudCwge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBwYXN0ZWRFbGVtZW50Py5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogcGFzdGVkRWxlbWVudD8uc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogcGFzdGVkRWxlbWVudD8uc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICBzdHJva2VTdHlsZTogcGFzdGVkRWxlbWVudD8uc3Ryb2tlU3R5bGUsXG4gICAgICAgICAgICBmaWxsU3R5bGU6IHBhc3RlZEVsZW1lbnQ/LmZpbGxTdHlsZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IHBhc3RlZEVsZW1lbnQ/Lm9wYWNpdHksXG4gICAgICAgICAgICByb3VnaG5lc3M6IHBhc3RlZEVsZW1lbnQ/LnJvdWdobmVzcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChuZXdFbGVtZW50KSAmJiBpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld0VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgZm9udFNpemU6IHBhc3RlZEVsZW1lbnQ/LmZvbnRTaXplIHx8IERFRkFVTFRfRk9OVF9TSVpFLFxuICAgICAgICAgICAgICBmb250RmFtaWx5OiBwYXN0ZWRFbGVtZW50Py5mb250RmFtaWx5IHx8IERFRkFVTFRfRk9OVF9GQU1JTFksXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogcGFzdGVkRWxlbWVudD8udGV4dEFsaWduIHx8IERFRkFVTFRfVEVYVF9BTElHTixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3goXG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIGdldENvbnRhaW5lckVsZW1lbnQobmV3RWxlbWVudCksXG4gICAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9KSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVN0eWxlc1wiLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+XG4gICAgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmNvZGUgPT09IENPREVTLlYsXG59KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/actionStyles.ts\n");
|
|
1407
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"copiedStyles\": () => (/* binding */ copiedStyles),\n/* harmony export */ \"actionCopyStyles\": () => (/* binding */ actionCopyStyles),\n/* harmony export */ \"actionPasteStyles\": () => (/* binding */ actionPasteStyles)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// `copiedStyles` is exported only for tests.\r\nlet copiedStyles = \"{}\";\r\nconst actionCopyStyles = (0,_register__WEBPACK_IMPORTED_MODULE_3__.register)({\r\n name: \"copyStyles\",\r\n perform: (elements, appState) => {\r\n const element = elements.find((el) => appState.selectedElementIds[el.id]);\r\n if (element) {\r\n copiedStyles = JSON.stringify(element);\r\n }\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { toastMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_2__.t)(\"toast.copyStyles\") }),\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.copyStyles\",\r\n keyTest: (event) => event[_keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.CTRL_OR_CMD] && event.altKey && event.code === _keys__WEBPACK_IMPORTED_MODULE_1__.CODES.C,\r\n});\r\nconst actionPasteStyles = (0,_register__WEBPACK_IMPORTED_MODULE_3__.register)({\r\n name: \"pasteStyles\",\r\n perform: (elements, appState) => {\r\n const pastedElement = JSON.parse(copiedStyles);\r\n if (!(0,_element__WEBPACK_IMPORTED_MODULE_0__.isExcalidrawElement)(pastedElement)) {\r\n return { elements, commitToHistory: false };\r\n }\r\n return {\r\n elements: elements.map((element) => {\r\n if (appState.selectedElementIds[element.id]) {\r\n const newElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.newElementWith)(element, {\r\n backgroundColor: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.backgroundColor,\r\n strokeWidth: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.strokeWidth,\r\n strokeColor: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.strokeColor,\r\n strokeStyle: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.strokeStyle,\r\n fillStyle: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.fillStyle,\r\n opacity: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.opacity,\r\n roughness: pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.roughness,\r\n });\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(newElement) && (0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(newElement, {\r\n fontSize: (pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.fontSize) || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_SIZE,\r\n fontFamily: (pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.fontFamily) || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_FAMILY,\r\n textAlign: (pastedElement === null || pastedElement === void 0 ? void 0 : pastedElement.textAlign) || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_TEXT_ALIGN,\r\n });\r\n (0,_element__WEBPACK_IMPORTED_MODULE_0__.redrawTextBoundingBox)(newElement, (0,_element_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(newElement));\r\n }\r\n return newElement;\r\n }\r\n return element;\r\n }),\r\n commitToHistory: true,\r\n };\r\n },\r\n contextItemLabel: \"labels.pasteStyles\",\r\n keyTest: (event) => event[_keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.CTRL_OR_CMD] && event.altKey && event.code === _keys__WEBPACK_IMPORTED_MODULE_1__.CODES.V,\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LGFBQWEsQ0FBRSxTQUFTLEtBQUksMERBQWtCO3lCQUMxRCxDQUFDLENBQUM7d0JBRUgsK0RBQXFCLENBQUMsVUFBVSxFQUFFLHlFQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQ3BFO29CQUNELE9BQU8sVUFBVSxDQUFDO2lCQUNuQjtnQkFDRCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUM7WUFDRixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUNELGdCQUFnQixFQUFFLG9CQUFvQjtJQUN0QyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNqQixLQUFLLENBQUMsbURBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssMENBQU87Q0FDcEUsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FjdGlvbnMvYWN0aW9uU3R5bGVzLnRzPzgwNjIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaXNUZXh0RWxlbWVudCxcbiAgaXNFeGNhbGlkcmF3RWxlbWVudCxcbiAgcmVkcmF3VGV4dEJvdW5kaW5nQm94LFxufSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gXCIuL3JlZ2lzdGVyXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9OVF9TSVpFLFxuICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICBERUZBVUxUX1RFWFRfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldENvbnRhaW5lckVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuXG4vLyBgY29waWVkU3R5bGVzYCBpcyBleHBvcnRlZCBvbmx5IGZvciB0ZXN0cy5cbmV4cG9ydCBsZXQgY29waWVkU3R5bGVzOiBzdHJpbmcgPSBcInt9XCI7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25Db3B5U3R5bGVzID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNvcHlTdHlsZXNcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50cy5maW5kKChlbCkgPT4gYXBwU3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2VsLmlkXSk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGNvcGllZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIHRvYXN0TWVzc2FnZTogdChcInRvYXN0LmNvcHlTdHlsZXNcIiksXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZSxcbiAgICB9O1xuICB9LFxuICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5jb3B5U3R5bGVzXCIsXG4gIGtleVRlc3Q6IChldmVudCkgPT5cbiAgICBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQuY29kZSA9PT0gQ09ERVMuQyxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uUGFzdGVTdHlsZXMgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwicGFzdGVTdHlsZXNcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHBhc3RlZEVsZW1lbnQgPSBKU09OLnBhcnNlKGNvcGllZFN0eWxlcyk7XG4gICAgaWYgKCFpc0V4Y2FsaWRyYXdFbGVtZW50KHBhc3RlZEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4geyBlbGVtZW50cywgY29tbWl0VG9IaXN0b3J5OiBmYWxzZSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoYXBwU3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IG5ld0VsZW1lbnRXaXRoKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogcGFzdGVkRWxlbWVudD8uYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IHBhc3RlZEVsZW1lbnQ/LnN0cm9rZVdpZHRoLFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHBhc3RlZEVsZW1lbnQ/LnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgc3Ryb2tlU3R5bGU6IHBhc3RlZEVsZW1lbnQ/LnN0cm9rZVN0eWxlLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiBwYXN0ZWRFbGVtZW50Py5maWxsU3R5bGUsXG4gICAgICAgICAgICBvcGFjaXR5OiBwYXN0ZWRFbGVtZW50Py5vcGFjaXR5LFxuICAgICAgICAgICAgcm91Z2huZXNzOiBwYXN0ZWRFbGVtZW50Py5yb3VnaG5lc3MsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQobmV3RWxlbWVudCkgJiYgaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdFbGVtZW50LCB7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiBwYXN0ZWRFbGVtZW50Py5mb250U2l6ZSB8fCBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogcGFzdGVkRWxlbWVudD8uZm9udEZhbWlseSB8fCBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IHBhc3RlZEVsZW1lbnQ/LnRleHRBbGlnbiB8fCBERUZBVUxUX1RFWFRfQUxJR04sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KG5ld0VsZW1lbnQsIGdldENvbnRhaW5lckVsZW1lbnQobmV3RWxlbWVudCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0pLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlU3R5bGVzXCIsXG4gIGtleVRlc3Q6IChldmVudCkgPT5cbiAgICBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQuY29kZSA9PT0gQ09ERVMuVixcbn0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../actions/actionStyles.ts\n");
|
|
1397
1408
|
|
|
1398
1409
|
/***/ }),
|
|
1399
1410
|
|
|
@@ -1441,17 +1452,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1441
1452
|
|
|
1442
1453
|
/***/ }),
|
|
1443
1454
|
|
|
1444
|
-
/***/ "../../actions/actionUnbindText.tsx":
|
|
1445
|
-
/*!******************************************!*\
|
|
1446
|
-
!*** ../../actions/actionUnbindText.tsx ***!
|
|
1447
|
-
\******************************************/
|
|
1448
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1449
|
-
|
|
1450
|
-
"use strict";
|
|
1451
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionUnbindText\": () => (/* binding */ actionUnbindText)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\nconst actionUnbindText = (0,_register__WEBPACK_IMPORTED_MODULE_5__.register)({\r\n name: \"unbindText\",\r\n contextItemLabel: \"labels.unbindText\",\r\n perform: (elements, appState) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_3__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_0__.getNonDeletedElements)(elements), appState);\r\n selectedElements.forEach((element) => {\r\n var _a;\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n const { width, height, baseline } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.measureText)(boundTextElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getFontString)(boundTextElement));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(boundTextElement, {\r\n containerId: null,\r\n width,\r\n height,\r\n baseline,\r\n text: boundTextElement.originalText,\r\n });\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.id !== boundTextElement.id),\r\n });\r\n }\r\n });\r\n return {\r\n elements,\r\n appState,\r\n commitToHistory: true,\r\n };\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYWN0aW9ucy9hY3Rpb25VbmJpbmRUZXh0LnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQW1EO0FBQ007QUFDaUI7QUFFM0I7QUFDTjtBQUNIO0FBRS9CLE1BQU0sZ0JBQWdCLEdBQUcsbURBQVEsQ0FBQztJQUN2QyxJQUFJLEVBQUUsWUFBWTtJQUNsQixnQkFBZ0IsRUFBRSxtQkFBbUI7SUFDckMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsMkRBQW1CLENBQzFDLCtEQUFxQixDQUFDLFFBQVEsQ0FBQyxFQUMvQixRQUFRLENBQ1QsQ0FBQztRQUNGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFOztZQUNuQyxNQUFNLGdCQUFnQixHQUFHLHlFQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLGlFQUFXLENBQzdDLGdCQUFnQixDQUFDLFlBQVksRUFDN0IscURBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNoQyxDQUFDO2dCQUNGLHFFQUFhLENBQUMsZ0JBQXlDLEVBQUU7b0JBQ3ZELFdBQVcsRUFBRSxJQUFJO29CQUNqQixLQUFLO29CQUNMLE1BQU07b0JBQ04sUUFBUTtvQkFDUixJQUFJLEVBQUUsZ0JBQWdCLENBQUMsWUFBWTtpQkFDcEMsQ0FBQyxDQUFDO2dCQUNILHFFQUFhLENBQUMsT0FBTyxFQUFFO29CQUNyQixhQUFhLEVBQUUsYUFBTyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUMxQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFLENBQ3hDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsUUFBUTtZQUNSLFFBQVE7WUFDUixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL2FjdGlvblVuYmluZFRleHQudHN4PzVmOWMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBtZWFzdXJlVGV4dCB9IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgZ2V0Rm9udFN0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uVW5iaW5kVGV4dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ1bmJpbmRUZXh0XCIsXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnVuYmluZFRleHRcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUgfSA9IG1lYXN1cmVUZXh0KFxuICAgICAgICAgIGJvdW5kVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcoYm91bmRUZXh0RWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICBjb250YWluZXJJZDogbnVsbCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYmFzZWxpbmUsXG4gICAgICAgICAgdGV4dDogYm91bmRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgIH0pO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+IGVsZS5pZCAhPT0gYm91bmRUZXh0RWxlbWVudC5pZCxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHMsXG4gICAgICBhcHBTdGF0ZSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxufSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../actions/actionUnbindText.tsx\n");
|
|
1452
|
-
|
|
1453
|
-
/***/ }),
|
|
1454
|
-
|
|
1455
1455
|
/***/ "../../actions/actionZindex.tsx":
|
|
1456
1456
|
/*!**************************************!*\
|
|
1457
1457
|
!*** ../../actions/actionZindex.tsx ***!
|
|
@@ -1470,7 +1470,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1470
1470
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1471
1471
|
|
|
1472
1472
|
"use strict";
|
|
1473
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionDeleteSelected\": () => (/* reexport safe */ _actionDeleteSelected__WEBPACK_IMPORTED_MODULE_0__.actionDeleteSelected),\n/* harmony export */ \"actionBringForward\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionBringForward),\n/* harmony export */ \"actionBringToFront\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionBringToFront),\n/* harmony export */ \"actionSendBackward\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionSendBackward),\n/* harmony export */ \"actionSendToBack\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionSendToBack),\n/* harmony export */ \"actionSelectAll\": () => (/* reexport safe */ _actionSelectAll__WEBPACK_IMPORTED_MODULE_2__.actionSelectAll),\n/* harmony export */ \"actionDuplicateSelection\": () => (/* reexport safe */ _actionDuplicateSelection__WEBPACK_IMPORTED_MODULE_3__.actionDuplicateSelection),\n/* harmony export */ \"actionChangeStrokeColor\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeStrokeColor),\n/* harmony export */ \"actionChangeBackgroundColor\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeBackgroundColor),\n/* harmony export */ \"actionChangeStrokeWidth\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeStrokeWidth),\n/* harmony export */ \"actionChangeFillStyle\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeFillStyle),\n/* harmony export */ \"actionChangeSloppiness\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeSloppiness),\n/* harmony export */ \"actionChangeOpacity\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeOpacity),\n/* harmony export */ \"actionChangeFontSize\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeFontSize),\n/* harmony export */ \"actionChangeFontFamily\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeFontFamily),\n/* harmony export */ \"actionChangeTextAlign\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeTextAlign),\n/* harmony export */ \"actionChangeVerticalAlign\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeVerticalAlign),\n/* harmony export */ \"actionChangeViewBackgroundColor\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionChangeViewBackgroundColor),\n/* harmony export */ \"actionClearCanvas\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionClearCanvas),\n/* harmony export */ \"actionZoomIn\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionZoomIn),\n/* harmony export */ \"actionZoomOut\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionZoomOut),\n/* harmony export */ \"actionResetZoom\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionResetZoom),\n/* harmony export */ \"actionZoomToFit\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionZoomToFit),\n/* harmony export */ \"actionToggleTheme\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionToggleTheme),\n/* harmony export */ \"actionFinalize\": () => (/* reexport safe */ _actionFinalize__WEBPACK_IMPORTED_MODULE_6__.actionFinalize),\n/* harmony export */ \"actionChangeProjectName\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionChangeProjectName),\n/* harmony export */ \"actionChangeExportBackground\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionChangeExportBackground),\n/* harmony export */ \"actionSaveToActiveFile\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionSaveToActiveFile),\n/* harmony export */ \"actionSaveFileToDisk\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionSaveFileToDisk),\n/* harmony export */ \"actionLoadScene\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionLoadScene),\n/* harmony export */ \"actionCopyStyles\": () => (/* reexport safe */ _actionStyles__WEBPACK_IMPORTED_MODULE_8__.actionCopyStyles),\n/* harmony export */ \"actionPasteStyles\": () => (/* reexport safe */ _actionStyles__WEBPACK_IMPORTED_MODULE_8__.actionPasteStyles),\n/* harmony export */ \"actionToggleCanvasMenu\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionToggleCanvasMenu),\n/* harmony export */ \"actionToggleEditMenu\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionToggleEditMenu),\n/* harmony export */ \"actionFullScreen\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionFullScreen),\n/* harmony export */ \"actionShortcuts\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionShortcuts),\n/* harmony export */ \"actionGroup\": () => (/* reexport safe */ _actionGroup__WEBPACK_IMPORTED_MODULE_10__.actionGroup),\n/* harmony export */ \"actionUngroup\": () => (/* reexport safe */ _actionGroup__WEBPACK_IMPORTED_MODULE_10__.actionUngroup),\n/* harmony export */ \"actionGoToCollaborator\": () => (/* reexport safe */ _actionNavigate__WEBPACK_IMPORTED_MODULE_11__.actionGoToCollaborator),\n/* harmony export */ \"actionAddToLibrary\": () => (/* reexport safe */ _actionAddToLibrary__WEBPACK_IMPORTED_MODULE_12__.actionAddToLibrary),\n/* harmony export */ \"actionAlignTop\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignTop),\n/* harmony export */ \"actionAlignBottom\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignBottom),\n/* harmony export */ \"actionAlignLeft\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignLeft),\n/* harmony export */ \"actionAlignRight\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignRight),\n/* harmony export */ \"actionAlignVerticallyCentered\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignVerticallyCentered),\n/* harmony export */ \"actionAlignHorizontallyCentered\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignHorizontallyCentered),\n/* harmony export */ \"distributeHorizontally\": () => (/* reexport safe */ _actionDistribute__WEBPACK_IMPORTED_MODULE_14__.distributeHorizontally),\n/* harmony export */ \"distributeVertically\": () => (/* reexport safe */ _actionDistribute__WEBPACK_IMPORTED_MODULE_14__.distributeVertically),\n/* harmony export */ \"actionFlipHorizontal\": () => (/* reexport safe */ _actionFlip__WEBPACK_IMPORTED_MODULE_15__.actionFlipHorizontal),\n/* harmony export */ \"actionFlipVertical\": () => (/* reexport safe */ _actionFlip__WEBPACK_IMPORTED_MODULE_15__.actionFlipVertical),\n/* harmony export */ \"actionCopy\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCopy),\n/* harmony export */ \"actionCut\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCut),\n/* harmony export */ \"actionCopyAsPng\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCopyAsPng),\n/* harmony export */ \"actionCopyAsSvg\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCopyAsSvg),\n/* harmony export */ \"actionToggleGridMode\": () => (/* reexport safe */ _actionToggleGridMode__WEBPACK_IMPORTED_MODULE_17__.actionToggleGridMode),\n/* harmony export */ \"actionToggleZenMode\": () => (/* reexport safe */ _actionToggleZenMode__WEBPACK_IMPORTED_MODULE_18__.actionToggleZenMode),\n/* harmony export */ \"actionToggleStats\": () => (/* reexport safe */ _actionToggleStats__WEBPACK_IMPORTED_MODULE_19__.actionToggleStats),\n/* harmony export */ \"actionUnbindText\": () => (/* reexport safe */ _actionUnbindText__WEBPACK_IMPORTED_MODULE_20__.actionUnbindText),\n/* harmony export */ \"actionLink\": () => (/* reexport safe */ _element_Hyperlink__WEBPACK_IMPORTED_MODULE_21__.actionLink)\n/* harmony export */ });\n/* harmony import */ var _actionDeleteSelected__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actionDeleteSelected */ \"../../actions/actionDeleteSelected.tsx\");\n/* harmony import */ var _actionZindex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actionZindex */ \"../../actions/actionZindex.tsx\");\n/* harmony import */ var _actionSelectAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actionSelectAll */ \"../../actions/actionSelectAll.ts\");\n/* harmony import */ var _actionDuplicateSelection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actionDuplicateSelection */ \"../../actions/actionDuplicateSelection.tsx\");\n/* harmony import */ var _actionProperties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actionCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _actionFinalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./actionFinalize */ \"../../actions/actionFinalize.tsx\");\n/* harmony import */ var _actionExport__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./actionExport */ \"../../actions/actionExport.tsx\");\n/* harmony import */ var _actionStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actionStyles */ \"../../actions/actionStyles.ts\");\n/* harmony import */ var _actionMenu__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./actionMenu */ \"../../actions/actionMenu.tsx\");\n/* harmony import */ var _actionGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./actionGroup */ \"../../actions/actionGroup.tsx\");\n/* harmony import */ var _actionNavigate__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./actionNavigate */ \"../../actions/actionNavigate.tsx\");\n/* harmony import */ var _actionAddToLibrary__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./actionAddToLibrary */ \"../../actions/actionAddToLibrary.ts\");\n/* harmony import */ var _actionAlign__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./actionAlign */ \"../../actions/actionAlign.tsx\");\n/* harmony import */ var _actionDistribute__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./actionDistribute */ \"../../actions/actionDistribute.tsx\");\n/* harmony import */ var _actionFlip__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./actionFlip */ \"../../actions/actionFlip.ts\");\n/* harmony import */ var _actionClipboard__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./actionClipboard */ \"../../actions/actionClipboard.tsx\");\n/* harmony import */ var _actionToggleGridMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./actionToggleGridMode */ \"../../actions/actionToggleGridMode.tsx\");\n/* harmony import */ var _actionToggleZenMode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./actionToggleZenMode */ \"../../actions/actionToggleZenMode.tsx\");\n/* harmony import */ var _actionToggleStats__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./actionToggleStats */ \"../../actions/actionToggleStats.tsx\");\n/* harmony import */ var _actionUnbindText__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./actionUnbindText */ \"../../actions/actionUnbindText.tsx\");\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/Hyperlink */ \"../../element/Hyperlink.tsx\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYWN0aW9ucy9pbmRleC50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEQ7QUFNdEM7QUFDNEI7QUFDa0I7QUFZMUM7QUFVSjtBQUUwQjtBQVExQjtBQUU2QztBQU0vQztBQUVxQztBQUVEO0FBRUE7QUFTbkM7QUFLSztBQUU0QztBQU83QztBQUVtQztBQUNGO0FBRUo7QUFDRjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FjdGlvbnMvaW5kZXgudHM/MDI0NSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhY3Rpb25EZWxldGVTZWxlY3RlZCB9IGZyb20gXCIuL2FjdGlvbkRlbGV0ZVNlbGVjdGVkXCI7XG5leHBvcnQge1xuICBhY3Rpb25CcmluZ0ZvcndhcmQsXG4gIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICBhY3Rpb25TZW5kVG9CYWNrLFxufSBmcm9tIFwiLi9hY3Rpb25aaW5kZXhcIjtcbmV4cG9ydCB7IGFjdGlvblNlbGVjdEFsbCB9IGZyb20gXCIuL2FjdGlvblNlbGVjdEFsbFwiO1xuZXhwb3J0IHsgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uXCI7XG5leHBvcnQge1xuICBhY3Rpb25DaGFuZ2VTdHJva2VDb2xvcixcbiAgYWN0aW9uQ2hhbmdlQmFja2dyb3VuZENvbG9yLFxuICBhY3Rpb25DaGFuZ2VTdHJva2VXaWR0aCxcbiAgYWN0aW9uQ2hhbmdlRmlsbFN0eWxlLFxuICBhY3Rpb25DaGFuZ2VTbG9wcGluZXNzLFxuICBhY3Rpb25DaGFuZ2VPcGFjaXR5LFxuICBhY3Rpb25DaGFuZ2VGb250U2l6ZSxcbiAgYWN0aW9uQ2hhbmdlRm9udEZhbWlseSxcbiAgYWN0aW9uQ2hhbmdlVGV4dEFsaWduLFxuICBhY3Rpb25DaGFuZ2VWZXJ0aWNhbEFsaWduLFxufSBmcm9tIFwiLi9hY3Rpb25Qcm9wZXJ0aWVzXCI7XG5cbmV4cG9ydCB7XG4gIGFjdGlvbkNoYW5nZVZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIGFjdGlvbkNsZWFyQ2FudmFzLFxuICBhY3Rpb25ab29tSW4sXG4gIGFjdGlvblpvb21PdXQsXG4gIGFjdGlvblJlc2V0Wm9vbSxcbiAgYWN0aW9uWm9vbVRvRml0LFxuICBhY3Rpb25Ub2dnbGVUaGVtZSxcbn0gZnJvbSBcIi4vYWN0aW9uQ2FudmFzXCI7XG5cbmV4cG9ydCB7IGFjdGlvbkZpbmFsaXplIH0gZnJvbSBcIi4vYWN0aW9uRmluYWxpemVcIjtcblxuZXhwb3J0IHtcbiAgYWN0aW9uQ2hhbmdlUHJvamVjdE5hbWUsXG4gIGFjdGlvbkNoYW5nZUV4cG9ydEJhY2tncm91bmQsXG4gIGFjdGlvblNhdmVUb0FjdGl2ZUZpbGUsXG4gIGFjdGlvblNhdmVGaWxlVG9EaXNrLFxuICBhY3Rpb25Mb2FkU2NlbmUsXG59IGZyb20gXCIuL2FjdGlvbkV4cG9ydFwiO1xuXG5leHBvcnQgeyBhY3Rpb25Db3B5U3R5bGVzLCBhY3Rpb25QYXN0ZVN0eWxlcyB9IGZyb20gXCIuL2FjdGlvblN0eWxlc1wiO1xuZXhwb3J0IHtcbiAgYWN0aW9uVG9nZ2xlQ2FudmFzTWVudSxcbiAgYWN0aW9uVG9nZ2xlRWRpdE1lbnUsXG4gIGFjdGlvbkZ1bGxTY3JlZW4sXG4gIGFjdGlvblNob3J0Y3V0cyxcbn0gZnJvbSBcIi4vYWN0aW9uTWVudVwiO1xuXG5leHBvcnQgeyBhY3Rpb25Hcm91cCwgYWN0aW9uVW5ncm91cCB9IGZyb20gXCIuL2FjdGlvbkdyb3VwXCI7XG5cbmV4cG9ydCB7IGFjdGlvbkdvVG9Db2xsYWJvcmF0b3IgfSBmcm9tIFwiLi9hY3Rpb25OYXZpZ2F0ZVwiO1xuXG5leHBvcnQgeyBhY3Rpb25BZGRUb0xpYnJhcnkgfSBmcm9tIFwiLi9hY3Rpb25BZGRUb0xpYnJhcnlcIjtcblxuZXhwb3J0IHtcbiAgYWN0aW9uQWxpZ25Ub3AsXG4gIGFjdGlvbkFsaWduQm90dG9tLFxuICBhY3Rpb25BbGlnbkxlZnQsXG4gIGFjdGlvbkFsaWduUmlnaHQsXG4gIGFjdGlvbkFsaWduVmVydGljYWxseUNlbnRlcmVkLFxuICBhY3Rpb25BbGlnbkhvcml6b250YWxseUNlbnRlcmVkLFxufSBmcm9tIFwiLi9hY3Rpb25BbGlnblwiO1xuXG5leHBvcnQge1xuICBkaXN0cmlidXRlSG9yaXpvbnRhbGx5LFxuICBkaXN0cmlidXRlVmVydGljYWxseSxcbn0gZnJvbSBcIi4vYWN0aW9uRGlzdHJpYnV0ZVwiO1xuXG5leHBvcnQgeyBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgYWN0aW9uRmxpcFZlcnRpY2FsIH0gZnJvbSBcIi4vYWN0aW9uRmxpcFwiO1xuXG5leHBvcnQge1xuICBhY3Rpb25Db3B5LFxuICBhY3Rpb25DdXQsXG4gIGFjdGlvbkNvcHlBc1BuZyxcbiAgYWN0aW9uQ29weUFzU3ZnLFxufSBmcm9tIFwiLi9hY3Rpb25DbGlwYm9hcmRcIjtcblxuZXhwb3J0IHsgYWN0aW9uVG9nZ2xlR3JpZE1vZGUgfSBmcm9tIFwiLi9hY3Rpb25Ub2dnbGVHcmlkTW9kZVwiO1xuZXhwb3J0IHsgYWN0aW9uVG9nZ2xlWmVuTW9kZSB9IGZyb20gXCIuL2FjdGlvblRvZ2dsZVplbk1vZGVcIjtcblxuZXhwb3J0IHsgYWN0aW9uVG9nZ2xlU3RhdHMgfSBmcm9tIFwiLi9hY3Rpb25Ub2dnbGVTdGF0c1wiO1xuZXhwb3J0IHsgYWN0aW9uVW5iaW5kVGV4dCB9IGZyb20gXCIuL2FjdGlvblVuYmluZFRleHRcIjtcbmV4cG9ydCB7IGFjdGlvbkxpbmsgfSBmcm9tIFwiLi4vZWxlbWVudC9IeXBlcmxpbmtcIjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/index.ts\n");
|
|
1473
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionDeleteSelected\": () => (/* reexport safe */ _actionDeleteSelected__WEBPACK_IMPORTED_MODULE_0__.actionDeleteSelected),\n/* harmony export */ \"actionBringForward\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionBringForward),\n/* harmony export */ \"actionBringToFront\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionBringToFront),\n/* harmony export */ \"actionSendBackward\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionSendBackward),\n/* harmony export */ \"actionSendToBack\": () => (/* reexport safe */ _actionZindex__WEBPACK_IMPORTED_MODULE_1__.actionSendToBack),\n/* harmony export */ \"actionSelectAll\": () => (/* reexport safe */ _actionSelectAll__WEBPACK_IMPORTED_MODULE_2__.actionSelectAll),\n/* harmony export */ \"actionDuplicateSelection\": () => (/* reexport safe */ _actionDuplicateSelection__WEBPACK_IMPORTED_MODULE_3__.actionDuplicateSelection),\n/* harmony export */ \"actionChangeStrokeColor\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeStrokeColor),\n/* harmony export */ \"actionChangeBackgroundColor\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeBackgroundColor),\n/* harmony export */ \"actionChangeStrokeWidth\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeStrokeWidth),\n/* harmony export */ \"actionChangeFillStyle\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeFillStyle),\n/* harmony export */ \"actionChangeSloppiness\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeSloppiness),\n/* harmony export */ \"actionChangeOpacity\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeOpacity),\n/* harmony export */ \"actionChangeFontSize\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeFontSize),\n/* harmony export */ \"actionChangeFontFamily\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeFontFamily),\n/* harmony export */ \"actionChangeTextAlign\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeTextAlign),\n/* harmony export */ \"actionChangeVerticalAlign\": () => (/* reexport safe */ _actionProperties__WEBPACK_IMPORTED_MODULE_4__.actionChangeVerticalAlign),\n/* harmony export */ \"actionChangeViewBackgroundColor\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionChangeViewBackgroundColor),\n/* harmony export */ \"actionClearCanvas\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionClearCanvas),\n/* harmony export */ \"actionZoomIn\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionZoomIn),\n/* harmony export */ \"actionZoomOut\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionZoomOut),\n/* harmony export */ \"actionResetZoom\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionResetZoom),\n/* harmony export */ \"actionZoomToFit\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionZoomToFit),\n/* harmony export */ \"actionToggleTheme\": () => (/* reexport safe */ _actionCanvas__WEBPACK_IMPORTED_MODULE_5__.actionToggleTheme),\n/* harmony export */ \"actionFinalize\": () => (/* reexport safe */ _actionFinalize__WEBPACK_IMPORTED_MODULE_6__.actionFinalize),\n/* harmony export */ \"actionChangeProjectName\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionChangeProjectName),\n/* harmony export */ \"actionChangeExportBackground\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionChangeExportBackground),\n/* harmony export */ \"actionSaveToActiveFile\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionSaveToActiveFile),\n/* harmony export */ \"actionSaveFileToDisk\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionSaveFileToDisk),\n/* harmony export */ \"actionLoadScene\": () => (/* reexport safe */ _actionExport__WEBPACK_IMPORTED_MODULE_7__.actionLoadScene),\n/* harmony export */ \"actionCopyStyles\": () => (/* reexport safe */ _actionStyles__WEBPACK_IMPORTED_MODULE_8__.actionCopyStyles),\n/* harmony export */ \"actionPasteStyles\": () => (/* reexport safe */ _actionStyles__WEBPACK_IMPORTED_MODULE_8__.actionPasteStyles),\n/* harmony export */ \"actionToggleCanvasMenu\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionToggleCanvasMenu),\n/* harmony export */ \"actionToggleEditMenu\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionToggleEditMenu),\n/* harmony export */ \"actionFullScreen\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionFullScreen),\n/* harmony export */ \"actionShortcuts\": () => (/* reexport safe */ _actionMenu__WEBPACK_IMPORTED_MODULE_9__.actionShortcuts),\n/* harmony export */ \"actionGroup\": () => (/* reexport safe */ _actionGroup__WEBPACK_IMPORTED_MODULE_10__.actionGroup),\n/* harmony export */ \"actionUngroup\": () => (/* reexport safe */ _actionGroup__WEBPACK_IMPORTED_MODULE_10__.actionUngroup),\n/* harmony export */ \"actionGoToCollaborator\": () => (/* reexport safe */ _actionNavigate__WEBPACK_IMPORTED_MODULE_11__.actionGoToCollaborator),\n/* harmony export */ \"actionAddToLibrary\": () => (/* reexport safe */ _actionAddToLibrary__WEBPACK_IMPORTED_MODULE_12__.actionAddToLibrary),\n/* harmony export */ \"actionAlignTop\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignTop),\n/* harmony export */ \"actionAlignBottom\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignBottom),\n/* harmony export */ \"actionAlignLeft\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignLeft),\n/* harmony export */ \"actionAlignRight\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignRight),\n/* harmony export */ \"actionAlignVerticallyCentered\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignVerticallyCentered),\n/* harmony export */ \"actionAlignHorizontallyCentered\": () => (/* reexport safe */ _actionAlign__WEBPACK_IMPORTED_MODULE_13__.actionAlignHorizontallyCentered),\n/* harmony export */ \"distributeHorizontally\": () => (/* reexport safe */ _actionDistribute__WEBPACK_IMPORTED_MODULE_14__.distributeHorizontally),\n/* harmony export */ \"distributeVertically\": () => (/* reexport safe */ _actionDistribute__WEBPACK_IMPORTED_MODULE_14__.distributeVertically),\n/* harmony export */ \"actionFlipHorizontal\": () => (/* reexport safe */ _actionFlip__WEBPACK_IMPORTED_MODULE_15__.actionFlipHorizontal),\n/* harmony export */ \"actionFlipVertical\": () => (/* reexport safe */ _actionFlip__WEBPACK_IMPORTED_MODULE_15__.actionFlipVertical),\n/* harmony export */ \"actionCopy\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCopy),\n/* harmony export */ \"actionCut\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCut),\n/* harmony export */ \"actionCopyAsPng\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCopyAsPng),\n/* harmony export */ \"actionCopyAsSvg\": () => (/* reexport safe */ _actionClipboard__WEBPACK_IMPORTED_MODULE_16__.actionCopyAsSvg),\n/* harmony export */ \"actionToggleGridMode\": () => (/* reexport safe */ _actionToggleGridMode__WEBPACK_IMPORTED_MODULE_17__.actionToggleGridMode),\n/* harmony export */ \"actionToggleZenMode\": () => (/* reexport safe */ _actionToggleZenMode__WEBPACK_IMPORTED_MODULE_18__.actionToggleZenMode),\n/* harmony export */ \"actionToggleStats\": () => (/* reexport safe */ _actionToggleStats__WEBPACK_IMPORTED_MODULE_19__.actionToggleStats),\n/* harmony export */ \"actionUnbindText\": () => (/* reexport safe */ _actionBoundText__WEBPACK_IMPORTED_MODULE_20__.actionUnbindText),\n/* harmony export */ \"actionBindText\": () => (/* reexport safe */ _actionBoundText__WEBPACK_IMPORTED_MODULE_20__.actionBindText),\n/* harmony export */ \"actionLink\": () => (/* reexport safe */ _element_Hyperlink__WEBPACK_IMPORTED_MODULE_21__.actionLink)\n/* harmony export */ });\n/* harmony import */ var _actionDeleteSelected__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actionDeleteSelected */ \"../../actions/actionDeleteSelected.tsx\");\n/* harmony import */ var _actionZindex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actionZindex */ \"../../actions/actionZindex.tsx\");\n/* harmony import */ var _actionSelectAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actionSelectAll */ \"../../actions/actionSelectAll.ts\");\n/* harmony import */ var _actionDuplicateSelection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actionDuplicateSelection */ \"../../actions/actionDuplicateSelection.tsx\");\n/* harmony import */ var _actionProperties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actionCanvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _actionFinalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./actionFinalize */ \"../../actions/actionFinalize.tsx\");\n/* harmony import */ var _actionExport__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./actionExport */ \"../../actions/actionExport.tsx\");\n/* harmony import */ var _actionStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actionStyles */ \"../../actions/actionStyles.ts\");\n/* harmony import */ var _actionMenu__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./actionMenu */ \"../../actions/actionMenu.tsx\");\n/* harmony import */ var _actionGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./actionGroup */ \"../../actions/actionGroup.tsx\");\n/* harmony import */ var _actionNavigate__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./actionNavigate */ \"../../actions/actionNavigate.tsx\");\n/* harmony import */ var _actionAddToLibrary__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./actionAddToLibrary */ \"../../actions/actionAddToLibrary.ts\");\n/* harmony import */ var _actionAlign__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./actionAlign */ \"../../actions/actionAlign.tsx\");\n/* harmony import */ var _actionDistribute__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./actionDistribute */ \"../../actions/actionDistribute.tsx\");\n/* harmony import */ var _actionFlip__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./actionFlip */ \"../../actions/actionFlip.ts\");\n/* harmony import */ var _actionClipboard__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./actionClipboard */ \"../../actions/actionClipboard.tsx\");\n/* harmony import */ var _actionToggleGridMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./actionToggleGridMode */ \"../../actions/actionToggleGridMode.tsx\");\n/* harmony import */ var _actionToggleZenMode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./actionToggleZenMode */ \"../../actions/actionToggleZenMode.tsx\");\n/* harmony import */ var _actionToggleStats__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./actionToggleStats */ \"../../actions/actionToggleStats.tsx\");\n/* harmony import */ var _actionBoundText__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./actionBoundText */ \"../../actions/actionBoundText.tsx\");\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/Hyperlink */ \"../../element/Hyperlink.tsx\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYWN0aW9ucy9pbmRleC50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQThEO0FBTXRDO0FBQzRCO0FBQ2tCO0FBWTFDO0FBVUo7QUFFMEI7QUFRMUI7QUFFNkM7QUFNL0M7QUFFcUM7QUFFRDtBQUVBO0FBU25DO0FBS0s7QUFFNEM7QUFPN0M7QUFFbUM7QUFDRjtBQUVKO0FBQ2E7QUFDbkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYWN0aW9ucy9pbmRleC50cz8wMjQ1Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGFjdGlvbkRlbGV0ZVNlbGVjdGVkIH0gZnJvbSBcIi4vYWN0aW9uRGVsZXRlU2VsZWN0ZWRcIjtcbmV4cG9ydCB7XG4gIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gIGFjdGlvblNlbmRUb0JhY2ssXG59IGZyb20gXCIuL2FjdGlvblppbmRleFwiO1xuZXhwb3J0IHsgYWN0aW9uU2VsZWN0QWxsIH0gZnJvbSBcIi4vYWN0aW9uU2VsZWN0QWxsXCI7XG5leHBvcnQgeyBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb25cIjtcbmV4cG9ydCB7XG4gIGFjdGlvbkNoYW5nZVN0cm9rZUNvbG9yLFxuICBhY3Rpb25DaGFuZ2VCYWNrZ3JvdW5kQ29sb3IsXG4gIGFjdGlvbkNoYW5nZVN0cm9rZVdpZHRoLFxuICBhY3Rpb25DaGFuZ2VGaWxsU3R5bGUsXG4gIGFjdGlvbkNoYW5nZVNsb3BwaW5lc3MsXG4gIGFjdGlvbkNoYW5nZU9wYWNpdHksXG4gIGFjdGlvbkNoYW5nZUZvbnRTaXplLFxuICBhY3Rpb25DaGFuZ2VGb250RmFtaWx5LFxuICBhY3Rpb25DaGFuZ2VUZXh0QWxpZ24sXG4gIGFjdGlvbkNoYW5nZVZlcnRpY2FsQWxpZ24sXG59IGZyb20gXCIuL2FjdGlvblByb3BlcnRpZXNcIjtcblxuZXhwb3J0IHtcbiAgYWN0aW9uQ2hhbmdlVmlld0JhY2tncm91bmRDb2xvcixcbiAgYWN0aW9uQ2xlYXJDYW52YXMsXG4gIGFjdGlvblpvb21JbixcbiAgYWN0aW9uWm9vbU91dCxcbiAgYWN0aW9uUmVzZXRab29tLFxuICBhY3Rpb25ab29tVG9GaXQsXG4gIGFjdGlvblRvZ2dsZVRoZW1lLFxufSBmcm9tIFwiLi9hY3Rpb25DYW52YXNcIjtcblxuZXhwb3J0IHsgYWN0aW9uRmluYWxpemUgfSBmcm9tIFwiLi9hY3Rpb25GaW5hbGl6ZVwiO1xuXG5leHBvcnQge1xuICBhY3Rpb25DaGFuZ2VQcm9qZWN0TmFtZSxcbiAgYWN0aW9uQ2hhbmdlRXhwb3J0QmFja2dyb3VuZCxcbiAgYWN0aW9uU2F2ZVRvQWN0aXZlRmlsZSxcbiAgYWN0aW9uU2F2ZUZpbGVUb0Rpc2ssXG4gIGFjdGlvbkxvYWRTY2VuZSxcbn0gZnJvbSBcIi4vYWN0aW9uRXhwb3J0XCI7XG5cbmV4cG9ydCB7IGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvblBhc3RlU3R5bGVzIH0gZnJvbSBcIi4vYWN0aW9uU3R5bGVzXCI7XG5leHBvcnQge1xuICBhY3Rpb25Ub2dnbGVDYW52YXNNZW51LFxuICBhY3Rpb25Ub2dnbGVFZGl0TWVudSxcbiAgYWN0aW9uRnVsbFNjcmVlbixcbiAgYWN0aW9uU2hvcnRjdXRzLFxufSBmcm9tIFwiLi9hY3Rpb25NZW51XCI7XG5cbmV4cG9ydCB7IGFjdGlvbkdyb3VwLCBhY3Rpb25Vbmdyb3VwIH0gZnJvbSBcIi4vYWN0aW9uR3JvdXBcIjtcblxuZXhwb3J0IHsgYWN0aW9uR29Ub0NvbGxhYm9yYXRvciB9IGZyb20gXCIuL2FjdGlvbk5hdmlnYXRlXCI7XG5cbmV4cG9ydCB7IGFjdGlvbkFkZFRvTGlicmFyeSB9IGZyb20gXCIuL2FjdGlvbkFkZFRvTGlicmFyeVwiO1xuXG5leHBvcnQge1xuICBhY3Rpb25BbGlnblRvcCxcbiAgYWN0aW9uQWxpZ25Cb3R0b20sXG4gIGFjdGlvbkFsaWduTGVmdCxcbiAgYWN0aW9uQWxpZ25SaWdodCxcbiAgYWN0aW9uQWxpZ25WZXJ0aWNhbGx5Q2VudGVyZWQsXG4gIGFjdGlvbkFsaWduSG9yaXpvbnRhbGx5Q2VudGVyZWQsXG59IGZyb20gXCIuL2FjdGlvbkFsaWduXCI7XG5cbmV4cG9ydCB7XG4gIGRpc3RyaWJ1dGVIb3Jpem9udGFsbHksXG4gIGRpc3RyaWJ1dGVWZXJ0aWNhbGx5LFxufSBmcm9tIFwiLi9hY3Rpb25EaXN0cmlidXRlXCI7XG5cbmV4cG9ydCB7IGFjdGlvbkZsaXBIb3Jpem9udGFsLCBhY3Rpb25GbGlwVmVydGljYWwgfSBmcm9tIFwiLi9hY3Rpb25GbGlwXCI7XG5cbmV4cG9ydCB7XG4gIGFjdGlvbkNvcHksXG4gIGFjdGlvbkN1dCxcbiAgYWN0aW9uQ29weUFzUG5nLFxuICBhY3Rpb25Db3B5QXNTdmcsXG59IGZyb20gXCIuL2FjdGlvbkNsaXBib2FyZFwiO1xuXG5leHBvcnQgeyBhY3Rpb25Ub2dnbGVHcmlkTW9kZSB9IGZyb20gXCIuL2FjdGlvblRvZ2dsZUdyaWRNb2RlXCI7XG5leHBvcnQgeyBhY3Rpb25Ub2dnbGVaZW5Nb2RlIH0gZnJvbSBcIi4vYWN0aW9uVG9nZ2xlWmVuTW9kZVwiO1xuXG5leHBvcnQgeyBhY3Rpb25Ub2dnbGVTdGF0cyB9IGZyb20gXCIuL2FjdGlvblRvZ2dsZVN0YXRzXCI7XG5leHBvcnQgeyBhY3Rpb25VbmJpbmRUZXh0LCBhY3Rpb25CaW5kVGV4dCB9IGZyb20gXCIuL2FjdGlvbkJvdW5kVGV4dFwiO1xuZXhwb3J0IHsgYWN0aW9uTGluayB9IGZyb20gXCIuLi9lbGVtZW50L0h5cGVybGlua1wiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../actions/index.ts\n");
|
|
1474
1474
|
|
|
1475
1475
|
/***/ }),
|
|
1476
1476
|
|
|
@@ -1613,7 +1613,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1613
1613
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1614
1614
|
|
|
1615
1615
|
"use strict";
|
|
1616
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useDeviceType\": () => (/* binding */ useDeviceType),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.dev.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../renderer */ \"../../renderer/index.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Stats */ \"../../components/Stats.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../data/blob */ \"../../data/blob.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! lodash.throttle */ \"../../../node_modules/lodash.throttle/index.js\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_42__);\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/collision */ \"../../element/collision.ts\");\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/Hyperlink */ \"../../element/Hyperlink.tsx\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst defaultDeviceTypeContext = {\r\n isMobile: false,\r\n isTouchScreen: false,\r\n};\r\nconst DeviceTypeContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(defaultDeviceTypeContext);\r\nconst useDeviceType = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(DeviceTypeContext);\r\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\r\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\r\nlet didTapTwice = false;\r\nlet tappedTwiceTimer = 0;\r\nlet cursorX = 0;\r\nlet cursorY = 0;\r\nlet isHoldingSpace = false;\r\nlet isPanning = false;\r\nlet isDraggingScrollBar = false;\r\nlet currentScrollBars = { horizontal: null, vertical: null };\r\nlet touchTimeout = 0;\r\nlet invalidateContextMenu = false;\r\nlet lastPointerUp = null;\r\nconst gesture = {\r\n pointers: new Map(),\r\n lastCenter: null,\r\n initialDistance: null,\r\n initialScale: null,\r\n};\r\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\r\n constructor(props) {\r\n var _a;\r\n super(props);\r\n this.canvas = null;\r\n this.rc = null;\r\n this.unmounted = false;\r\n this.deviceType = {\r\n isMobile: false,\r\n isTouchScreen: false,\r\n };\r\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\r\n this.files = {};\r\n this.imageCache = new Map();\r\n this.lastPointerDown = null;\r\n this.lastPointerUp = null;\r\n this.contextMenuOpen = false;\r\n this.lastScenePointer = null;\r\n this.focusContainer = () => {\r\n var _a;\r\n if (this.props.autoFocus) {\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\r\n }\r\n };\r\n this.getSceneElementsIncludingDeleted = () => {\r\n return this.scene.getElementsIncludingDeleted();\r\n };\r\n this.getSceneElements = () => {\r\n return this.scene.getElements();\r\n };\r\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((actionResult) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n // Since context menu closes when action triggered so setting to false\r\n this.contextMenuOpen = false;\r\n if (this.unmounted || actionResult === false) {\r\n return;\r\n }\r\n let editingElement = null;\r\n if (actionResult.elements) {\r\n actionResult.elements.forEach((element) => {\r\n var _a;\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\r\n this.state.editingElement !== element &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n editingElement = element;\r\n }\r\n });\r\n this.scene.replaceAllElements(actionResult.elements);\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n }\r\n if (actionResult.files) {\r\n this.files = actionResult.replaceFiles\r\n ? actionResult.files\r\n : Object.assign(Object.assign({}, this.files), actionResult.files);\r\n this.addNewImagesToImageCache();\r\n }\r\n if (actionResult.appState || editingElement) {\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\r\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\r\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\r\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_11__.THEME.LIGHT;\r\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\r\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\r\n viewModeEnabled = this.props.viewModeEnabled;\r\n }\r\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\r\n zenModeEnabled = this.props.zenModeEnabled;\r\n }\r\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\r\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null;\r\n }\r\n if (typeof this.props.theme !== \"undefined\") {\r\n theme = this.props.theme;\r\n }\r\n if (typeof this.props.name !== \"undefined\") {\r\n name = this.props.name;\r\n }\r\n this.setState((state) => {\r\n var _a;\r\n // using Object.assign instead of spread to fool TS 4.2.2+ into\r\n // regarding the resulting type as not containing undefined\r\n // (which the following expression will never contain)\r\n return Object.assign(actionResult.appState || {}, {\r\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\r\n viewModeEnabled,\r\n zenModeEnabled,\r\n gridSize,\r\n theme,\r\n name,\r\n });\r\n }, () => {\r\n if (actionResult.syncHistory) {\r\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\r\n }\r\n });\r\n }\r\n });\r\n // Lifecycle\r\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isHoldingSpace = false;\r\n this.setState({ isBindingEnabled: true });\r\n });\r\n this.onUnload = () => {\r\n this.onBlur();\r\n };\r\n this.disableEvent = (event) => {\r\n event.preventDefault();\r\n };\r\n this.onFontLoaded = () => {\r\n this.scene.getElementsIncludingDeleted().forEach((element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.onSceneUpdated();\r\n };\r\n this.importLibraryFromUrl = (url, token) => __awaiter(this, void 0, void 0, function* () {\r\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary)) {\r\n const hash = new URLSearchParams(window.location.hash.slice(1));\r\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `#${hash.toString()}`);\r\n }\r\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary)) {\r\n const query = new URLSearchParams(window.location.search);\r\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `?${query.toString()}`);\r\n }\r\n try {\r\n const request = yield fetch(decodeURIComponent(url));\r\n const blob = yield request.blob();\r\n const json = JSON.parse(yield blob.text());\r\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_13__.isValidLibrary)(json)) {\r\n throw new Error();\r\n }\r\n if (token === this.id ||\r\n window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.confirmAddLibrary\", {\r\n numShapes: (json.libraryItems || json.library || []).length,\r\n }))) {\r\n yield this.library.importLibrary(blob, \"published\");\r\n // hack to rerender the library items after import\r\n if (this.state.isLibraryOpen) {\r\n this.setState({ isLibraryOpen: false });\r\n }\r\n this.setState({ isLibraryOpen: true });\r\n }\r\n }\r\n catch (error) {\r\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.errorLoadingLibrary\"));\r\n console.error(error);\r\n }\r\n finally {\r\n this.focusContainer();\r\n }\r\n });\r\n this.resetHistory = () => {\r\n this.history.clear();\r\n };\r\n /**\r\n * Resets scene & history.\r\n * ! Do not use to clear scene user action !\r\n */\r\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((opts) => {\r\n this.scene.replaceAllElements([]);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\r\n this.resetHistory();\r\n });\r\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\r\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\r\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\r\n if (!launchParams.files.length) {\r\n return;\r\n }\r\n const fileHandle = launchParams.files[0];\r\n const blob = yield fileHandle.getFile();\r\n blob.handle = fileHandle;\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(blob, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n }));\r\n }\r\n if (!this.state.isLoading) {\r\n this.setState({ isLoading: true });\r\n }\r\n let initialData = null;\r\n try {\r\n initialData = (yield this.props.initialData) || null;\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\r\n this.libraryItemsFromStorage = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreLibraryItems)(initialData.libraryItems, \"unpublished\");\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n initialData = {\r\n appState: {\r\n errorMessage: error.message ||\r\n \"Encountered an error during importing or restoring scene data\",\r\n },\r\n };\r\n }\r\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restore)(initialData, null, null);\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), { elementType: scene.appState.elementType === \"image\"\r\n ? \"selection\"\r\n : scene.appState.elementType, isLoading: false });\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\r\n }\r\n if ((initialData === null || initialData === void 0 ? void 0 : initialData.scrollX) != null) {\r\n scene.appState.scrollX = initialData.scrollX;\r\n }\r\n if ((initialData === null || initialData === void 0 ? void 0 : initialData.scrollY) != null) {\r\n scene.appState.scrollY = initialData.scrollY;\r\n }\r\n this.resetHistory();\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\r\n const libraryUrl = \r\n // current\r\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary) ||\r\n // legacy, kept for compat reasons\r\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n if (libraryUrl) {\r\n yield this.importLibraryFromUrl(libraryUrl);\r\n }\r\n });\r\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n this.scene\r\n .getElementsIncludingDeleted()\r\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element));\r\n this.setState({});\r\n });\r\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\r\n this.setState((state) => {\r\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\r\n return null;\r\n }\r\n return { offsetTop, offsetLeft };\r\n });\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.SCROLL_TIMEOUT);\r\n // Copy/paste\r\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.cutAll();\r\n event.preventDefault();\r\n });\r\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.copyAll();\r\n event.preventDefault();\r\n });\r\n this.cutAll = () => {\r\n this.copyAll();\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected);\r\n };\r\n this.copyAll = () => {\r\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.copyToClipboard)(this.scene.getElements(), this.state, this.files);\r\n };\r\n this.onTapStart = (event) => {\r\n // fix for Apple Pencil Scribble\r\n // On Android, preventing the event would disable contextMenu on tap-hold\r\n if (!_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\r\n event.preventDefault();\r\n }\r\n if (!didTapTwice) {\r\n didTapTwice = true;\r\n clearTimeout(tappedTwiceTimer);\r\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_11__.TAP_TWICE_TIMEOUT);\r\n return;\r\n }\r\n // insert text only if we tapped twice with a single finger\r\n // event.touches.length === 1 will also prevent inserting text when user's zooming\r\n if (didTapTwice && event.touches.length === 1) {\r\n const [touch] = event.touches;\r\n // @ts-ignore\r\n this.handleCanvasDoubleClick({\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n });\r\n didTapTwice = false;\r\n clearTimeout(tappedTwiceTimer);\r\n }\r\n if (_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\r\n event.preventDefault();\r\n }\r\n if (event.touches.length === 2) {\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n }\r\n };\r\n this.onTapEnd = (event) => {\r\n this.resetContextMenuTimer();\r\n if (event.touches.length > 0) {\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n }\r\n else {\r\n gesture.pointers.clear();\r\n }\r\n };\r\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\r\n var _b, _c;\r\n // #686\r\n const target = document.activeElement;\r\n const isExcalidrawActive = (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);\r\n if (!isExcalidrawActive) {\r\n return;\r\n }\r\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\r\n if (\r\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\r\n // thus these checks don't make sense\r\n event &&\r\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(target))) {\r\n return;\r\n }\r\n // must be called in the same frame (thus before any awaits) as the paste\r\n // event else some browsers (FF...) will clear the clipboardData\r\n // (something something security)\r\n let file = (_c = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _c === void 0 ? void 0 : _c.files[0];\r\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event);\r\n if (!file && data.text) {\r\n const string = data.text.trim();\r\n if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\r\n // ignore SVG validation/normalization which will be done during image\r\n // initialization\r\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(string);\r\n }\r\n }\r\n // prefer spreadsheet data over image file (MS Office/Libre Office)\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file) && !data.spreadsheet) {\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n if (this.props.onPaste) {\r\n try {\r\n if ((yield this.props.onPaste(data, event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n if (data.errorMessage) {\r\n this.setState({ errorMessage: data.errorMessage });\r\n }\r\n else if (data.spreadsheet) {\r\n this.setState({\r\n pasteDialog: {\r\n data: data.spreadsheet,\r\n shown: true,\r\n },\r\n });\r\n }\r\n else if (data.elements) {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: data.elements,\r\n files: data.files || null,\r\n position: \"cursor\",\r\n });\r\n }\r\n else if (data.text) {\r\n this.addTextFromPaste(data.text);\r\n }\r\n this.selectShapeTool(\"selection\");\r\n event === null || event === void 0 ? void 0 : event.preventDefault();\r\n }));\r\n this.addElementsFromPasteOrLibrary = (opts) => {\r\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreElements)(opts.elements, null);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(elements);\r\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minX, maxX) / 2;\r\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minY, maxY) / 2;\r\n const clientX = typeof opts.position === \"object\"\r\n ? opts.position.clientX\r\n : opts.position === \"cursor\"\r\n ? cursorX\r\n : this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = typeof opts.position === \"object\"\r\n ? opts.position.clientY\r\n : opts.position === \"cursor\"\r\n ? cursorY\r\n : this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const dx = x - elementsCenterX;\r\n const dy = y - elementsCenterY;\r\n const groupIdMap = new Map();\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(dx, dy, this.state.gridSize);\r\n const oldIdToDuplicatedId = new Map();\r\n const newElements = elements.map((element) => {\r\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\r\n x: element.x + gridX - minX,\r\n y: element.y + gridY - minY,\r\n });\r\n oldIdToDuplicatedId.set(element.id, newElement.id);\r\n return newElement;\r\n });\r\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\r\n const nextElements = [\r\n ...this.scene.getElementsIncludingDeleted(),\r\n ...newElements,\r\n ];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\r\n if (opts.files) {\r\n this.files = Object.assign(Object.assign({}, this.files), opts.files);\r\n }\r\n this.scene.replaceAllElements(nextElements);\r\n this.history.resumeRecording();\r\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: false, selectedElementIds: newElements.reduce((map, element) => {\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(element)) {\r\n map[element.id] = true;\r\n }\r\n return map;\r\n }, {}), selectedGroupIds: {} }), this.scene.getElements()), () => {\r\n if (opts.files) {\r\n this.addNewImagesToImageCache();\r\n }\r\n });\r\n this.selectShapeTool(\"selection\");\r\n };\r\n // Collaboration\r\n this.setAppState = (obj) => {\r\n this.setState(obj);\r\n };\r\n this.removePointer = (event) => {\r\n if (touchTimeout) {\r\n this.resetContextMenuTimer();\r\n }\r\n gesture.pointers.delete(event.pointerId);\r\n };\r\n this.toggleLock = () => {\r\n this.setState((prevState) => {\r\n return {\r\n elementLocked: !prevState.elementLocked,\r\n elementType: prevState.elementLocked\r\n ? \"selection\"\r\n : prevState.elementType,\r\n };\r\n });\r\n };\r\n this.togglePenMode = () => {\r\n this.setState((prevState) => {\r\n return {\r\n penMode: !prevState.penMode,\r\n };\r\n });\r\n };\r\n this.toggleZenMode = () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode);\r\n };\r\n this.toggleStats = () => {\r\n if (!this.state.showStats) {\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_8__.trackEvent)(\"dialog\", \"stats\");\r\n }\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats);\r\n };\r\n this.scrollToContent = (target = this.scene.getElements()) => {\r\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\r\n };\r\n this.clearToast = () => {\r\n this.setState({ toastMessage: null });\r\n };\r\n this.setToastMessage = (toastMessage) => {\r\n this.setState({ toastMessage });\r\n };\r\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const webShareTargetCache = yield caches.open(\"web-share-target\");\r\n const file = yield webShareTargetCache.match(\"shared-file\");\r\n if (file) {\r\n const blob = yield file.blob();\r\n this.loadFileToCanvas(blob);\r\n yield webShareTargetCache.delete(\"shared-file\");\r\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, window.location.pathname);\r\n }\r\n }\r\n catch (error) {\r\n this.setState({ errorMessage: error.message });\r\n }\r\n });\r\n /** adds supplied files to existing files in the appState */\r\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((files) => {\r\n const filesMap = files.reduce((acc, fileData) => {\r\n acc.set(fileData.id, fileData);\r\n return acc;\r\n }, new Map());\r\n this.files = Object.assign(Object.assign({}, this.files), Object.fromEntries(filesMap));\r\n this.scene.getElements().forEach((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\r\n filesMap.has(element.fileId)) {\r\n this.imageCache.delete(element.fileId);\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.scene.informMutation();\r\n this.addNewImagesToImageCache();\r\n });\r\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((sceneData) => {\r\n if (sceneData.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n if (sceneData.appState) {\r\n this.setState(sceneData.appState);\r\n }\r\n if (sceneData.elements) {\r\n this.scene.replaceAllElements(sceneData.elements);\r\n }\r\n if (sceneData.collaborators) {\r\n this.setState({ collaborators: sceneData.collaborators });\r\n }\r\n if (sceneData.libraryItems) {\r\n this.library.saveLibrary((0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreLibraryItems)(sceneData.libraryItems, \"unpublished\"));\r\n }\r\n });\r\n this.onSceneUpdated = () => {\r\n this.setState({});\r\n };\r\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n cursorX = event.clientX;\r\n cursorY = event.clientY;\r\n });\r\n // Input handling\r\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // normalize `event.key` when CapsLock is pressed #2372\r\n if (\"Proxy\" in window &&\r\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\r\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\r\n event = new Proxy(event, {\r\n get(ev, prop) {\r\n const value = ev[prop];\r\n if (typeof value === \"function\") {\r\n // fix for Proxies hijacking `this`\r\n return value.bind(ev);\r\n }\r\n return prop === \"key\"\r\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\r\n // it back\r\n event.shiftKey\r\n ? ev.key.toUpperCase()\r\n : ev.key.toLowerCase()\r\n : value;\r\n },\r\n });\r\n }\r\n if (((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ESCAPE) ||\r\n // case: using arrows to move between buttons\r\n ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isInputLike)(event.target))) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.QUESTION_MARK) {\r\n this.setState({\r\n showHelpDialog: true,\r\n });\r\n }\r\n if (this.actionManager.handleKeyDown(event)) {\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: false });\r\n }\r\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.ZERO) {\r\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const step = (this.state.gridSize &&\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT\r\n : this.state.gridSize)) ||\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state, true);\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_LEFT) {\r\n offsetX = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_RIGHT) {\r\n offsetX = step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_UP) {\r\n offsetY = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_DOWN) {\r\n offsetY = step;\r\n }\r\n selectedElements.forEach((element) => {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n x: element.x + offsetX,\r\n y: element.y + offsetY,\r\n });\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element, {\r\n simultaneouslyUpdated: selectedElements,\r\n });\r\n });\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n event.preventDefault();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ENTER) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n }\r\n else if (selectedElements.length === 1 &&\r\n !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n const selectedElement = selectedElements[0];\r\n this.startTextEditing({\r\n sceneX: selectedElement.x + selectedElement.width / 2,\r\n sceneY: selectedElement.y + selectedElement.height / 2,\r\n shouldBind: true,\r\n });\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n else if (!event.ctrlKey &&\r\n !event.altKey &&\r\n !event.metaKey &&\r\n this.state.draggingElement === null) {\r\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_33__.findShapeByKey)(event.key);\r\n if (shape) {\r\n this.selectShapeTool(shape);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.Q) {\r\n this.toggleLock();\r\n }\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE && gesture.pointers.size === 0) {\r\n isHoldingSpace = true;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n event.preventDefault();\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (this.state.elementType === \"selection\" &&\r\n !selectedElements.length) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G &&\r\n ((0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(this.state.elementType) ||\r\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(element.type)))) {\r\n this.setState({ openPopup: \"backgroundColorPicker\" });\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n this.setState({ openPopup: \"strokeColorPicker\" });\r\n }\r\n }\r\n });\r\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (this.state.elementType === \"selection\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n isHoldingSpace = false;\r\n }\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: true });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements)(selectedElements)\r\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)(selectedElements);\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n });\r\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n gesture.initialScale = this.state.zoom.value;\r\n });\r\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n // onGestureChange only has zoom factor but not the center.\r\n // If we're on iPad or iPhone, then we recognize multi-touch and will\r\n // zoom in at the right location on the touchMove handler already.\r\n // On Macbook, we don't have those events so will zoom in at the\r\n // current location instead.\r\n if (gesture.pointers.size >= 2) {\r\n return;\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (initialScale) {\r\n this.setState((state) => (Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\r\n viewportX: cursorX,\r\n viewportY: cursorY,\r\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * event.scale),\r\n }, state))));\r\n }\r\n });\r\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n gesture.initialScale = null;\r\n });\r\n this.startTextEditing = ({ sceneX, sceneY, shouldBind, insertAtParentCenter = true, }) => {\r\n var _a, _b;\r\n let parentCenterPosition = insertAtParentCenter &&\r\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n let existingTextElement = null;\r\n let container = null;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1) {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(selectedElements[0])) {\r\n existingTextElement = selectedElements[0];\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isTextBindableContainer)(selectedElements[0])) {\r\n container = selectedElements[0];\r\n existingTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getBoundTextElement)(container);\r\n }\r\n }\r\n existingTextElement =\r\n existingTextElement !== null && existingTextElement !== void 0 ? existingTextElement : this.getTextElementAtPosition(sceneX, sceneY);\r\n // bind to container when shouldBind is true or\r\n // clicked on center of container\r\n if (!container &&\r\n !existingTextElement &&\r\n (shouldBind || parentCenterPosition)) {\r\n container = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene.getElements().filter((ele) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(ele)), sceneX, sceneY);\r\n }\r\n if (!existingTextElement && container) {\r\n const fontString = {\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n };\r\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\r\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\r\n const newHeight = Math.max(container.height, minHeight);\r\n const newWidth = Math.max(container.width, minWidth);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(container, { height: newHeight, width: newWidth });\r\n sceneX = container.x + newWidth / 2;\r\n sceneY = container.y + newHeight / 2;\r\n if (parentCenterPosition) {\r\n parentCenterPosition = this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n }\r\n }\r\n const element = existingTextElement\r\n ? existingTextElement\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x: parentCenterPosition\r\n ? parentCenterPosition.elementCenterX\r\n : sceneX,\r\n y: parentCenterPosition\r\n ? parentCenterPosition.elementCenterY\r\n : sceneY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text: \"\",\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: parentCenterPosition\r\n ? \"center\"\r\n : this.state.currentItemTextAlign,\r\n verticalAlign: parentCenterPosition\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.VERTICAL_ALIGN.MIDDLE\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\r\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : [],\r\n });\r\n this.setState({ editingElement: element });\r\n if (!existingTextElement) {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n // case: creating new text not centered to parent element → offset Y\r\n // so that the text is centered to cursor position\r\n if (!parentCenterPosition) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n y: element.y - element.baseline / 2,\r\n });\r\n }\r\n }\r\n this.setState({\r\n editingElement: element,\r\n });\r\n this.handleTextWysiwyg(element, {\r\n isExistingElement: !!existingTextElement,\r\n });\r\n };\r\n this.handleCanvasDoubleClick = (event) => {\r\n // case: double-clicking with arrow/line tool selected would both create\r\n // text and enter multiElement mode\r\n if (this.state.multiElement) {\r\n return;\r\n }\r\n // we should only be able to double click when mode is selection\r\n if (this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n return;\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIds)(this.state);\r\n if (selectedGroupIds.length > 0) {\r\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\r\n const selectedGroupId = hitElement &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\r\n if (selectedGroupId) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getElements()));\r\n return;\r\n }\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1) {\r\n const selectedElement = selectedElements[0];\r\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(selectedElement);\r\n if (canBindText) {\r\n sceneX = selectedElement.x + selectedElement.width / 2;\r\n sceneY = selectedElement.y + selectedElement.height / 2;\r\n }\r\n }\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n shouldBind: false,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n }\r\n };\r\n this.getElementLinkAtPosition = (scenePointer, hitElement) => {\r\n // Reversing so we traverse the elements in decreasing order\r\n // of z-index\r\n const elements = this.scene.getElements().slice().reverse();\r\n let hitElementIndex = Infinity;\r\n return elements.find((element, index) => {\r\n if (hitElement && element.id === hitElement.id) {\r\n hitElementIndex = index;\r\n }\r\n return (element.link &&\r\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(element, this.state, [scenePointer.x, scenePointer.y], this.deviceType.isMobile) &&\r\n index <= hitElementIndex);\r\n });\r\n };\r\n this.redirectToLink = (event, isTouchScreen) => {\r\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\r\n if (!this.hitLinkElement ||\r\n // For touch screen allow dragging threshold else strict check\r\n (isTouchScreen && draggedDistance > _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD) ||\r\n (!isTouchScreen && draggedDistance !== 0)) {\r\n return;\r\n }\r\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerDown, this.state);\r\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerDownCoords.x, lastPointerDownCoords.y], this.deviceType.isMobile);\r\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerUp, this.state);\r\n const lastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerUpCoords.x, lastPointerUpCoords.y], this.deviceType.isMobile);\r\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\r\n const url = this.hitLinkElement.link;\r\n if (url) {\r\n let customEvent;\r\n if (this.props.onLinkOpen) {\r\n customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\r\n this.props.onLinkOpen(this.hitLinkElement, customEvent);\r\n }\r\n if (!(customEvent === null || customEvent === void 0 ? void 0 : customEvent.defaultPrevented)) {\r\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isLocalLink)(url) ? \"_self\" : \"_blank\";\r\n const newWindow = window.open(undefined, target);\r\n // https://mathiasbynens.github.io/rel-noopener/\r\n if (newWindow) {\r\n newWindow.opener = null;\r\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.normalizeLink)(url);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n this.handleCanvasPointerMove = (event) => {\r\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\r\n if (gesture.pointers.has(event.pointerId)) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (gesture.pointers.size === 2 &&\r\n gesture.lastCenter &&\r\n initialScale &&\r\n gesture.initialDistance) {\r\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n const deltaX = center.x - gesture.lastCenter.x;\r\n const deltaY = center.y - gesture.lastCenter.y;\r\n gesture.lastCenter = center;\r\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n const scaleFactor = this.state.elementType === \"freedraw\" && this.state.penMode\r\n ? 1\r\n : distance / gesture.initialDistance;\r\n const nextZoom = scaleFactor\r\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * scaleFactor)\r\n : this.state.zoom.value;\r\n this.setState((state) => {\r\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\r\n viewportX: center.x,\r\n viewportY: center.y,\r\n nextZoom,\r\n }, state);\r\n return {\r\n zoom: zoomState.zoom,\r\n scrollX: zoomState.scrollX + deltaX / nextZoom,\r\n scrollY: zoomState.scrollY + deltaY / nextZoom,\r\n shouldCacheIgnoreZoom: true,\r\n };\r\n });\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n }\r\n else {\r\n gesture.lastCenter =\r\n gesture.initialDistance =\r\n gesture.initialScale =\r\n null;\r\n }\r\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\r\n return;\r\n }\r\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\r\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\r\n if (!this.state.draggingElement && !this.state.multiElement) {\r\n if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n }\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\r\n if (this.state.editingLinearElement &&\r\n !this.state.editingLinearElement.isDragging) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({ editingLinearElement });\r\n }\r\n if (editingLinearElement.lastUncommittedPoint != null) {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n else {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElementType)(this.state.elementType)) {\r\n // Hovering with a selected tool or creating new linear element via click\r\n // and point\r\n const { draggingElement } = this.state;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], this.state.startBoundElement);\r\n }\r\n else {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n }\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n const { x: rx, y: ry } = multiElement;\r\n const { points, lastCommittedPoint } = multiElement;\r\n const lastPoint = points[points.length - 1];\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n if (lastPoint === lastCommittedPoint) {\r\n // if we haven't yet created a temp point and we're beyond commit-zone\r\n // threshold, add a point\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\r\n });\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n // in this branch, we're inside the commit zone, and no uncommitted\r\n // point exists. Thus do nothing (don't add/remove points).\r\n }\r\n }\r\n else if (points.length > 2 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: points.slice(0, -1),\r\n });\r\n }\r\n else {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(points, this.state.zoom.value)) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n // update last uncommitted point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [\r\n ...points.slice(0, -1),\r\n [scenePointerX - rx, scenePointerY - ry],\r\n ],\r\n });\r\n }\r\n return;\r\n }\r\n const hasDeselectedButton = Boolean(event.buttons);\r\n if (hasDeselectedButton ||\r\n (this.state.elementType !== \"selection\" &&\r\n this.state.elementType !== \"text\" &&\r\n this.state.elementType !== \"eraser\")) {\r\n return;\r\n }\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 &&\r\n !isOverScrollBar &&\r\n !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType &&\r\n elementWithTransformHandleType.transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)(elementWithTransformHandleType));\r\n return;\r\n }\r\n }\r\n else if (selectedElements.length > 1 && !isOverScrollBar) {\r\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType,\r\n }));\r\n return;\r\n }\r\n }\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\r\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n return;\r\n }\r\n if (this.hitLinkElement &&\r\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.showHyperlinkTooltip)(this.hitLinkElement, this.state);\r\n }\r\n else {\r\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.hideHyperlinkToolip)();\r\n if (hitElement &&\r\n hitElement.link &&\r\n this.state.selectedElementIds[hitElement.id] &&\r\n !this.contextMenuOpen &&\r\n !this.state.showHyperlinkPopup) {\r\n this.setState({ showHyperlinkPopup: \"info\" });\r\n }\r\n else if (this.state.elementType === \"text\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n }\r\n else if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n else if (this.state.editingLinearElement) {\r\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getElement(this.state.editingLinearElement.elementId);\r\n if (element &&\r\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(element, this.state, [\r\n scenePointer.x,\r\n scenePointer.y,\r\n ])) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n }\r\n else if (\r\n // if using cmd/ctrl, we're not dragging\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] &&\r\n (hitElement ||\r\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n }\r\n };\r\n this.handleEraser = (event, pointerDownState, scenePointer) => {\r\n const updateElementIds = (elements) => {\r\n elements.forEach((element) => {\r\n idsToUpdate.push(element.id);\r\n if (event.altKey) {\r\n if (pointerDownState.elementIdsToErase[element.id]) {\r\n pointerDownState.elementIdsToErase[element.id] = false;\r\n }\r\n }\r\n else {\r\n pointerDownState.elementIdsToErase[element.id] = true;\r\n }\r\n });\r\n };\r\n const idsToUpdate = [];\r\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);\r\n const threshold = 10 / this.state.zoom.value;\r\n const point = Object.assign({}, pointerDownState.lastCoords);\r\n let samplingInterval = 0;\r\n while (samplingInterval <= distance) {\r\n const hitElements = this.getElementsAtPosition(point.x, point.y);\r\n updateElementIds(hitElements);\r\n // Exit since we reached current point\r\n if (samplingInterval === distance) {\r\n break;\r\n }\r\n // Calculate next point in the line at a distance of sampling interval\r\n samplingInterval = Math.min(samplingInterval + threshold, distance);\r\n const distanceRatio = samplingInterval / distance;\r\n const nextX = (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\r\n const nextY = (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\r\n point.x = nextX;\r\n point.y = nextY;\r\n }\r\n const elements = this.scene.getElements().map((ele) => {\r\n const id = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) && idsToUpdate.includes(ele.containerId)\r\n ? ele.containerId\r\n : ele.id;\r\n if (idsToUpdate.includes(id)) {\r\n if (event.altKey) {\r\n if (pointerDownState.elementIdsToErase[id] === false) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\r\n opacity: this.state.currentItemOpacity,\r\n });\r\n }\r\n }\r\n else {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { opacity: 20 });\r\n }\r\n }\r\n return ele;\r\n });\r\n this.scene.replaceAllElements(elements);\r\n pointerDownState.lastCoords.x = scenePointer.x;\r\n pointerDownState.lastCoords.y = scenePointer.y;\r\n };\r\n // set touch moving for mobile context menu\r\n this.handleTouchMove = (event) => {\r\n invalidateContextMenu = true;\r\n };\r\n this.handleCanvasPointerDown = (event) => {\r\n // remove any active selection when we start to interact with canvas\r\n // (mainly, we care about removing selection outside the component which\r\n // would prevent our copy handling otherwise)\r\n const selection = document.getSelection();\r\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\r\n selection.removeAllRanges();\r\n }\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\r\n this.maybeCleanupAfterMissingPointerUp(event);\r\n //fires only once, if pen is detected, penMode is enabled\r\n //the user can disable this by toggling the penMode button\r\n if (!this.state.penDetected && event.pointerType === \"pen\") {\r\n this.setState((prevState) => {\r\n return {\r\n penMode: true,\r\n penDetected: true,\r\n };\r\n });\r\n }\r\n if (!this.deviceType.isTouchScreen &&\r\n [\"pen\", \"touch\"].includes(event.pointerType)) {\r\n this.deviceType = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.deviceType, { isTouchScreen: true });\r\n }\r\n if (isPanning) {\r\n return;\r\n }\r\n this.lastPointerDown = event;\r\n this.setState({\r\n lastPointerDownWith: event.pointerType,\r\n cursorButton: \"down\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"down\");\r\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\r\n return;\r\n }\r\n // only handle left mouse button or touch\r\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN &&\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.TOUCH) {\r\n return;\r\n }\r\n this.updateGestureOnPointerDown(event);\r\n // don't select while panning\r\n if (gesture.pointers.size > 1) {\r\n return;\r\n }\r\n // State for the duration of a pointer interaction, which starts with a\r\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\r\n const pointerDownState = this.initialPointerDownState(event);\r\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\r\n return;\r\n }\r\n // Since context menu closes on pointer down so setting to false\r\n this.contextMenuOpen = false;\r\n this.clearSelectionIfNotUsingSelection();\r\n this.updateBindingEnabledOnPointerMove(event);\r\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\r\n return;\r\n }\r\n const allowOnPointerDown = !this.state.penMode ||\r\n event.pointerType !== \"touch\" ||\r\n this.state.elementType === \"selection\" ||\r\n this.state.elementType === \"text\" ||\r\n this.state.elementType === \"image\";\r\n if (!allowOnPointerDown) {\r\n return;\r\n }\r\n if (this.state.elementType === \"text\") {\r\n this.handleTextOnPointerDown(event, pointerDownState);\r\n return;\r\n }\r\n else if (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\") {\r\n this.handleLinearElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType === \"image\") {\r\n // reset image preview on pointerdown\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n if (!this.state.pendingImageElement) {\r\n return;\r\n }\r\n this.setState({\r\n draggingElement: this.state.pendingImageElement,\r\n editingElement: this.state.pendingImageElement,\r\n pendingImageElement: null,\r\n multiElement: null,\r\n });\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(this.state.pendingImageElement, {\r\n x,\r\n y,\r\n });\r\n }\r\n else if (this.state.elementType === \"freedraw\") {\r\n this.handleFreeDrawElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType !== \"eraser\") {\r\n this.createGenericElementOnPointerDown(this.state.elementType, pointerDownState);\r\n }\r\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\r\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\r\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\r\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\r\n lastPointerUp = onPointerUp;\r\n if (!this.state.viewModeEnabled) {\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, onKeyDown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, onKeyUp);\r\n pointerDownState.eventListeners.onMove = onPointerMove;\r\n pointerDownState.eventListeners.onUp = onPointerUp;\r\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\r\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\r\n }\r\n };\r\n this.handleCanvasPointerUp = (event) => {\r\n this.lastPointerUp = event;\r\n if (this.deviceType.isTouchScreen) {\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: event.clientX, clientY: event.clientY }, this.state);\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\r\n }\r\n if (this.hitLinkElement &&\r\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\r\n this.redirectToLink(event, this.deviceType.isTouchScreen);\r\n }\r\n this.removePointer(event);\r\n };\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\r\n // deal with opening context menu on touch devices\r\n if (event.pointerType === \"touch\") {\r\n invalidateContextMenu = false;\r\n if (touchTimeout) {\r\n // If there's already a touchTimeout, this means that there's another\r\n // touch down and we are doing another touch, so we shouldn't open the\r\n // context menu.\r\n invalidateContextMenu = true;\r\n }\r\n else {\r\n // open the context menu with the first touch's clientX and clientY\r\n // if the touch is not moving\r\n touchTimeout = window.setTimeout(() => {\r\n touchTimeout = 0;\r\n if (!invalidateContextMenu) {\r\n this.handleCanvasContextMenu(event);\r\n }\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.TOUCH_CTX_MENU_TIMEOUT);\r\n }\r\n }\r\n };\r\n this.resetContextMenuTimer = () => {\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n invalidateContextMenu = false;\r\n };\r\n // Returns whether the event is a panning\r\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\r\n if (!(gesture.pointers.size === 0 &&\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.WHEEL ||\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\r\n this.state.viewModeEnabled)) ||\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\r\n return false;\r\n }\r\n isPanning = true;\r\n event.preventDefault();\r\n let nextPastePrevented = false;\r\n const isLinux = /Linux/.test(window.navigator.platform);\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n let { clientX: lastX, clientY: lastY } = event;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\r\n const deltaX = lastX - event.clientX;\r\n const deltaY = lastY - event.clientY;\r\n lastX = event.clientX;\r\n lastY = event.clientY;\r\n /*\r\n * Prevent paste event if we move while middle clicking on Linux.\r\n * See issue #1383.\r\n */\r\n if (isLinux &&\r\n !nextPastePrevented &&\r\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\r\n nextPastePrevented = true;\r\n /* Prevent the next paste event */\r\n const preventNextPaste = (event) => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n event.stopPropagation();\r\n };\r\n /*\r\n * Reenable next paste in case of disabled middle click paste for\r\n * any reason:\r\n * - right click paste\r\n * - empty clipboard\r\n */\r\n const enableNextPaste = () => {\r\n setTimeout(() => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }, 100);\r\n };\r\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }\r\n this.setState({\r\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\r\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\r\n });\r\n });\r\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((lastPointerUp = () => {\r\n lastPointerUp = null;\r\n isPanning = false;\r\n if (!isHoldingSpace) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n }\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n onPointerMove.flush();\r\n }));\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n return true;\r\n };\r\n this.clearSelectionIfNotUsingSelection = () => {\r\n if (this.state.elementType !== \"selection\") {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n };\r\n /**\r\n * @returns whether the pointer event has been completely handled\r\n */\r\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType != null) {\r\n this.setState({\r\n resizingElement: elementWithTransformHandleType.element,\r\n });\r\n pointerDownState.resize.handleType =\r\n elementWithTransformHandleType.transformHandleType;\r\n }\r\n }\r\n else if (selectedElements.length > 1) {\r\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n }\r\n if (pointerDownState.resize.handleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType: pointerDownState.resize.handleType,\r\n }));\r\n pointerDownState.resize.isResizing = true;\r\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0]) &&\r\n selectedElements[0].points.length === 2) {\r\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\r\n }\r\n }\r\n else {\r\n if (this.state.editingLinearElement) {\r\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\r\n if (ret.hitElement) {\r\n pointerDownState.hit.element = ret.hitElement;\r\n }\r\n if (ret.didAddPoint) {\r\n return true;\r\n }\r\n }\r\n // hitElement may already be set above, so check first\r\n pointerDownState.hit.element =\r\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n if (pointerDownState.hit.element) {\r\n // Early return if pointer is hitting link icon\r\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y], this.deviceType.isMobile)) {\r\n return false;\r\n }\r\n pointerDownState.hit.hasHitElementInside =\r\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\r\n }\r\n // For overlapped elements one position may hit\r\n // multiple elements\r\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n const hitElement = pointerDownState.hit.element;\r\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hitElement === null || !someHitElementIsSelected) &&\r\n !event.shiftKey &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.clearSelection(hitElement);\r\n }\r\n if (this.state.editingLinearElement) {\r\n this.setState({\r\n selectedElementIds: {\r\n [this.state.editingLinearElement.elementId]: true,\r\n },\r\n });\r\n // If we click on something\r\n }\r\n else if (hitElement != null) {\r\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\r\n // mark as not completely handled so as to allow dragging etc.\r\n return false;\r\n }\r\n // deselect if item is selected\r\n // if shift is not clicked, this will always return true\r\n // otherwise, it will trigger selection based on current\r\n // state of the box\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n // if we are currently editing a group, exiting editing mode and deselect the group.\r\n if (this.state.editingGroupId &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n // Add hit element to selection. At this point if we're not holding\r\n // SHIFT the previously selected element(s) were deselected above\r\n // (make sure you use setState updater to use latest state)\r\n if (!someHitElementIsSelected &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.setState((prevState) => {\r\n return (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }), showHyperlinkPopup: hitElement.link ? \"info\" : false }), this.scene.getElements());\r\n });\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n }\r\n }\r\n this.setState({\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n }\r\n return false;\r\n };\r\n this.handleTextOnPointerDown = (event, pointerDownState) => {\r\n // if we're currently still editing text, clicking outside\r\n // should only finalize it, not create another (irrespective\r\n // of state.elementLocked)\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\r\n return;\r\n }\r\n let sceneX = pointerDownState.origin.x;\r\n let sceneY = pointerDownState.origin.y;\r\n const element = this.getElementAtPosition(sceneX, sceneY, {\r\n includeBoundTextElement: true,\r\n });\r\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(element);\r\n if (canBindText) {\r\n sceneX = element.x + element.width / 2;\r\n sceneY = element.y + element.height / 2;\r\n }\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n shouldBind: false,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!this.state.elementLocked) {\r\n this.setState({\r\n elementType: \"selection\",\r\n });\r\n }\r\n };\r\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n // Begin a mark capture. This does not have to update state yet.\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\r\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.newFreeDrawElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n simulatePressure: event.pressure === 0.5,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n const pressures = element.simulatePressure\r\n ? element.pressures\r\n : [...element.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [[0, 0]],\r\n pressures,\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n };\r\n this.createImageElement = ({ sceneX, sceneY, }) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(sceneX, sceneY, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newImageElement)({\r\n type: \"image\",\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n });\r\n return element;\r\n };\r\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n // finalize if completing a loop\r\n if (multiElement.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\r\n // clicking inside commit zone → finalize arrow\r\n if (multiElement.points.length > 1 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\r\n }));\r\n // clicking outside commit zone → update reference for last committed\r\n // point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\r\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\r\n an arrow, we want it to be null for both. Otherwise, we want it to use the\r\n values from appState. */\r\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\r\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\r\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\r\n : [null, null];\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newLinearElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n startArrowhead,\r\n endArrowhead,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [...element.points, [0, 0]],\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n };\r\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n });\r\n if (element.type === \"selection\") {\r\n this.setState({\r\n selectionElement: element,\r\n draggingElement: element,\r\n });\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n multiElement: null,\r\n draggingElement: element,\r\n editingElement: element,\r\n });\r\n }\r\n };\r\n this.eraseElements = (pointerDownState) => {\r\n const hitElement = pointerDownState.hit.element;\r\n const elements = this.scene.getElements().map((ele) => {\r\n if (pointerDownState.elementIdsToErase[ele.id]) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\r\n }\r\n else if (hitElement && ele.id === hitElement.id) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) &&\r\n (pointerDownState.elementIdsToErase[ele.containerId] ||\r\n (hitElement && ele.containerId === hitElement.id))) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\r\n }\r\n return ele;\r\n });\r\n this.history.resumeRecording();\r\n this.scene.replaceAllElements(elements);\r\n };\r\n this.initializeImage = ({ imageFile, imageElement: _imageElement, showCursorImagePreview = false, }) => __awaiter(this, void 0, void 0, function* () {\r\n var _d, _e, _f, _g;\r\n // at this point this should be guaranteed image file, but we do this check\r\n // to satisfy TS down the line\r\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(imageFile)) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.unsupportedFileType\"));\r\n }\r\n const mimeType = imageFile.type;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, \"wait\");\r\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.normalizeSVG)(yield imageFile.text()), imageFile.name);\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.svgImageInsertError\"));\r\n }\r\n }\r\n // generate image id (by default the file digest) before any\r\n // resizing/compression takes place to keep it more portable\r\n const fileId = yield (((_e = (_d = this.props).generateIdForFile) === null || _e === void 0 ? void 0 : _e.call(_d, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.generateIdFromFile)(imageFile));\r\n if (!fileId) {\r\n console.warn(\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\");\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"));\r\n }\r\n const existingFileData = this.files[fileId];\r\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\r\n try {\r\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\r\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\r\n });\r\n }\r\n catch (error) {\r\n console.error(\"error trying to resing image file on insertion\", error);\r\n }\r\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.fileTooBig\", {\r\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\r\n }));\r\n }\r\n }\r\n if (showCursorImagePreview) {\r\n const dataURL = (_f = this.files[fileId]) === null || _f === void 0 ? void 0 : _f.dataURL;\r\n // optimization so that we don't unnecessarily resize the original\r\n // full-size file for cursor preview\r\n // (it's much faster to convert the resized dataURL to File)\r\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.dataURLToFile)(dataURL);\r\n this.setImagePreviewCursor(resizedFile || imageFile);\r\n }\r\n const dataURL = ((_g = this.files[fileId]) === null || _g === void 0 ? void 0 : _g.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imageFile));\r\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(_imageElement, {\r\n fileId,\r\n }, false);\r\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n var _h, _j;\r\n try {\r\n this.files = Object.assign(Object.assign({}, this.files), { [fileId]: {\r\n mimeType,\r\n id: fileId,\r\n dataURL,\r\n created: Date.now(),\r\n } });\r\n const cachedImageData = this.imageCache.get(fileId);\r\n if (!cachedImageData) {\r\n this.addNewImagesToImageCache();\r\n yield this.updateImageCache([imageElement]);\r\n }\r\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\r\n yield cachedImageData.image;\r\n }\r\n if (((_h = this.state.pendingImageElement) === null || _h === void 0 ? void 0 : _h.id) !== imageElement.id &&\r\n ((_j = this.state.draggingElement) === null || _j === void 0 ? void 0 : _j.id) !== imageElement.id) {\r\n this.initializeImageDimensions(imageElement, true);\r\n }\r\n resolve(imageElement);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\")));\r\n }\r\n finally {\r\n if (!showCursorImagePreview) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n }\r\n }));\r\n });\r\n /**\r\n * inserts image into elements array and rerenders\r\n */\r\n this.insertImageElement = (imageElement, imageFile, showCursorImagePreview) => __awaiter(this, void 0, void 0, function* () {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n imageElement,\r\n ]);\r\n try {\r\n yield this.initializeImage({\r\n imageFile,\r\n imageElement,\r\n showCursorImagePreview,\r\n });\r\n }\r\n catch (error) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n isDeleted: true,\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n this.setState({\r\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"),\r\n });\r\n }\r\n });\r\n this.setImagePreviewCursor = (imageFile) => __awaiter(this, void 0, void 0, function* () {\r\n // mustn't be larger than 128 px\r\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\r\n const cursorImageSizePx = 96;\r\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\r\n maxWidthOrHeight: cursorImageSizePx,\r\n });\r\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imagePreview);\r\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\r\n // a small canvas\r\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.loadHTMLImageElement)(previewDataURL);\r\n let height = Math.min(img.height, cursorImageSizePx);\r\n let width = height * (img.width / img.height);\r\n if (width > cursorImageSizePx) {\r\n width = cursorImageSizePx;\r\n height = width * (img.height / img.width);\r\n }\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.height = height;\r\n canvas.width = width;\r\n const context = canvas.getContext(\"2d\");\r\n context.drawImage(img, 0, 0, width, height);\r\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg);\r\n }\r\n if (this.state.pendingImageElement) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, `url(${previewDataURL}) 4 4, auto`);\r\n }\r\n });\r\n this.onImageAction = ({ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const clientX = this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.fileOpen)({\r\n description: \"Image\",\r\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\r\n });\r\n const imageElement = this.createImageElement({\r\n sceneX: x,\r\n sceneY: y,\r\n });\r\n if (insertOnCanvasDirectly) {\r\n this.insertImageElement(imageElement, imageFile);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({\r\n selectedElementIds: { [imageElement.id]: true },\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n else {\r\n this.setState({\r\n pendingImageElement: imageElement,\r\n }, () => {\r\n this.insertImageElement(imageElement, imageFile, \r\n /* showCursorImagePreview */ true);\r\n });\r\n }\r\n }\r\n catch (error) {\r\n if (error.name !== \"AbortError\") {\r\n console.error(error);\r\n }\r\n else {\r\n console.warn(error);\r\n }\r\n this.setState({\r\n pendingImageElement: null,\r\n editingElement: null,\r\n elementType: \"selection\",\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n });\r\n this.initializeImageDimensions = (imageElement, forceNaturalSize = false) => {\r\n var _a;\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(imageElement) &&\r\n ((_a = this.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n if (!image || image instanceof Promise) {\r\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value) {\r\n const placeholderSize = 100 / this.state.zoom.value;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n x: imageElement.x - placeholderSize / 2,\r\n y: imageElement.y - placeholderSize / 2,\r\n width: placeholderSize,\r\n height: placeholderSize,\r\n });\r\n }\r\n return;\r\n }\r\n if (forceNaturalSize ||\r\n // if user-created bounding box is below threshold, assume the\r\n // intention was to click instead of drag, and use the image's\r\n // intrinsic size\r\n (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value)) {\r\n const minHeight = Math.max(this.state.height - 120, 160);\r\n // max 65% of canvas height, clamped to <300px, vh - 120px>\r\n const maxHeight = Math.min(minHeight, Math.floor(this.state.height * 0.5) / this.state.zoom.value);\r\n const height = Math.min(image.naturalHeight, maxHeight);\r\n const width = height * (image.naturalWidth / image.naturalHeight);\r\n // add current imageElement width/height to account for previous centering\r\n // of the placeholder image\r\n const x = imageElement.x + imageElement.width / 2 - width / 2;\r\n const y = imageElement.y + imageElement.height / 2 - height / 2;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, { x, y, width, height });\r\n }\r\n };\r\n /** updates image cache, refreshing updated elements and/or setting status\r\n to error for images that fail during <img> element creation */\r\n this.updateImageCache = (elements, files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.updateImageCache)({\r\n imageCache: this.imageCache,\r\n fileIds: elements.map((element) => element.fileId),\r\n files,\r\n });\r\n if (updatedFiles.size || erroredFiles.size) {\r\n for (const element of elements) {\r\n if (updatedFiles.has(element.fileId)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n }\r\n }\r\n if (erroredFiles.size) {\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().map((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\r\n erroredFiles.has(element.fileId)) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(element, {\r\n status: \"error\",\r\n });\r\n }\r\n return element;\r\n }));\r\n }\r\n return { updatedFiles, erroredFiles };\r\n });\r\n /** adds new images to imageCache and re-renders if needed */\r\n this.addNewImagesToImageCache = (imageElements = (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.getInitializedImageElements)(this.scene.getElements()), files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const uncachedImageElements = imageElements.filter((element) => !element.isDeleted && !this.imageCache.has(element.fileId));\r\n if (uncachedImageElements.length) {\r\n const { updatedFiles } = yield this.updateImageCache(uncachedImageElements, files);\r\n if (updatedFiles.size) {\r\n this.scene.informMutation();\r\n }\r\n }\r\n });\r\n /** generally you should use `addNewImagesToImageCache()` directly if you need\r\n * to render new images. This is just a failsafe */\r\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default()(() => {\r\n this.addNewImagesToImageCache();\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.IMAGE_RENDER_TIMEOUT);\r\n this.updateBindingEnabledOnPointerMove = (event) => {\r\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.shouldEnableBindingForPointerEvent)(event);\r\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\r\n this.setState({ isBindingEnabled: shouldEnableBinding });\r\n }\r\n };\r\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\r\n });\r\n };\r\n this.maybeSuggestBindingsForLinearElementAtCoords = (linearElement, \r\n /** scene coords */\r\n pointerCoords, \r\n // During line creation the start binding hasn't been written yet\r\n // into `linearElement`\r\n oppositeBindingBoundElement) => {\r\n if (!pointerCoords.length) {\r\n return;\r\n }\r\n const suggestedBindings = pointerCoords.reduce((acc, coords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(coords, this.scene);\r\n if (hoveredBindableElement != null &&\r\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\r\n acc.push(hoveredBindableElement);\r\n }\r\n return acc;\r\n }, []);\r\n this.setState({ suggestedBindings });\r\n };\r\n this.handleCanvasRef = (canvas) => {\r\n var _a, _b, _c;\r\n // canvas is null when unmounting\r\n if (canvas !== null) {\r\n this.canvas = canvas;\r\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__[\"default\"].canvas(this.canvas);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel, {\r\n passive: false,\r\n });\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n else {\r\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel);\r\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n };\r\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\r\n var _k, _l;\r\n try {\r\n const file = event.dataTransfer.files.item(0);\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\r\n // first attempt to decode scene from the image if it's embedded\r\n // ---------------------------------------------------------------------\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted());\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n return;\r\n }\r\n catch (error) {\r\n if (error.name !== \"EncodingError\") {\r\n throw error;\r\n }\r\n }\r\n }\r\n // if no scene is embedded or we fail for whatever reason, fall back\r\n // to importing as regular image\r\n // ---------------------------------------------------------------------\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n return this.setState({\r\n isLoading: false,\r\n errorMessage: error.message,\r\n });\r\n }\r\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib);\r\n if (libraryShapes !== \"\") {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: JSON.parse(libraryShapes),\r\n position: event,\r\n files: null,\r\n });\r\n return;\r\n }\r\n const file = (_k = event.dataTransfer) === null || _k === void 0 ? void 0 : _k.files.item(0);\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib ||\r\n ((_l = file === null || file === void 0 ? void 0 : file.name) === null || _l === void 0 ? void 0 : _l.endsWith(\".excalidrawlib\"))) {\r\n this.library\r\n .importLibrary(file)\r\n .then(() => {\r\n // Close and then open to get the libraries updated\r\n this.setState({ isLibraryOpen: false });\r\n this.setState({ isLibraryOpen: true });\r\n })\r\n .catch((error) => this.setState({ isLoading: false, errorMessage: error.message }));\r\n // default: assume an Excalidraw file regardless of extension/MimeType\r\n }\r\n else if (file) {\r\n this.setState({ isLoading: true });\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n yield this.loadFileToCanvas(file);\r\n }\r\n });\r\n this.loadFileToCanvas = (file) => {\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n };\r\n this.handleCanvasContextMenu = (event) => {\r\n event.preventDefault();\r\n if ((event.nativeEvent.pointerType === \"touch\" ||\r\n (event.nativeEvent.pointerType === \"pen\" &&\r\n // always allow if user uses a pen secondary button\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.SECONDARY)) &&\r\n this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\r\n const type = element ? \"element\" : \"canvas\";\r\n const container = this.excalidrawContainerRef.current;\r\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\r\n const left = event.clientX - offsetLeft;\r\n const top = event.clientY - offsetTop;\r\n if (element && !this.state.selectedElementIds[element.id]) {\r\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\r\n this._openContextMenu({ top, left }, type);\r\n });\r\n }\r\n else {\r\n this._openContextMenu({ top, left }, type);\r\n }\r\n };\r\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\r\n var _a;\r\n const draggingElement = this.state.draggingElement;\r\n const pointerCoords = pointerDownState.lastCoords;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"selection\") {\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event));\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(draggingElement) &&\r\n ((_a = this.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n const aspectRatio = image && !(image instanceof Promise)\r\n ? image.width / image.height\r\n : null;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), aspectRatio);\r\n this.maybeSuggestBindingForAll([draggingElement]);\r\n }\r\n };\r\n this.maybeHandleResize = (pointerDownState, event) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const transformHandleType = pointerDownState.resize.handleType;\r\n this.setState({\r\n // TODO: rename this state field to \"isScaling\" to distinguish\r\n // it from the generic \"isResizing\" which includes scaling and\r\n // rotating\r\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\r\n isRotating: transformHandleType === \"rotation\",\r\n });\r\n const pointerCoords = pointerDownState.lastCoords;\r\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(selectedElements[0])\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n return true;\r\n }\r\n return false;\r\n };\r\n /** @private use this.handleCanvasContextMenu */\r\n this._openContextMenu = ({ left, top, }, type) => {\r\n if (this.state.showHyperlinkPopup) {\r\n this.setState({ showHyperlinkPopup: false });\r\n }\r\n this.contextMenuOpen = true;\r\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const separator = \"separator\";\r\n const elements = this.scene.getElements();\r\n const options = [];\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng);\r\n }\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg);\r\n }\r\n if (type === \"canvas\") {\r\n const viewModeOptions = [\r\n ...options,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ];\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: viewModeOptions,\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: [\r\n this.deviceType.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.deviceType.isMobile && navigator.clipboard && separator,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg,\r\n ((_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) ||\r\n (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0)) &&\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSelectAll,\r\n separator,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n }\r\n else if (type === \"element\") {\r\n const elementsWithUnbindedText = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state).some((element) => !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(element));\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy, ...options],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: [\r\n this.deviceType.isMobile && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCut,\r\n this.deviceType.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy,\r\n this.deviceType.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.deviceType.isMobile && separator,\r\n ...options,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyStyles,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionPasteStyles,\r\n separator,\r\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup,\r\n !elementsWithUnbindedText && _actions__WEBPACK_IMPORTED_MODULE_4__.actionUnbindText,\r\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup,\r\n (maybeGroupAction || maybeUngroupAction) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionAddToLibrary,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendBackward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringForward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendToBack,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringToFront,\r\n separator,\r\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal,\r\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical,\r\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionLink.contextItemPredicate(elements, this.state) && _actions__WEBPACK_IMPORTED_MODULE_4__.actionLink,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDuplicateSelection,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n }\r\n };\r\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n if (isPanning) {\r\n return;\r\n }\r\n const { deltaX, deltaY } = event;\r\n const { selectedElementIds, previousSelectedElementIds } = this.state;\r\n // note that event.ctrlKey is necessary to handle pinch zooming\r\n if (event.metaKey || event.ctrlKey) {\r\n const sign = Math.sign(deltaY);\r\n const MAX_STEP = 10;\r\n let delta = Math.abs(deltaY);\r\n if (delta > MAX_STEP) {\r\n delta = MAX_STEP;\r\n }\r\n delta *= sign;\r\n if (Object.keys(previousSelectedElementIds).length !== 0) {\r\n setTimeout(() => {\r\n this.setState({\r\n selectedElementIds: previousSelectedElementIds,\r\n previousSelectedElementIds: {},\r\n });\r\n }, 1000);\r\n }\r\n let newZoom = this.state.zoom.value - delta / 100;\r\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\r\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\r\n // round to nearest step\r\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\r\n viewportX: cursorX,\r\n viewportY: cursorY,\r\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(newZoom),\r\n }, state)), { selectedElementIds: {}, previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0\r\n ? selectedElementIds\r\n : previousSelectedElementIds, shouldCacheIgnoreZoom: true })));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n return;\r\n }\r\n // scroll horizontally when shift pressed\r\n if (event.shiftKey) {\r\n this.setState(({ zoom, scrollX }) => ({\r\n // on Mac, shift+wheel tends to result in deltaX\r\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\r\n }));\r\n return;\r\n }\r\n this.setState(({ zoom, scrollX, scrollY }) => ({\r\n scrollX: scrollX - deltaX / zoom.value,\r\n scrollY: scrollY - deltaY / zoom.value,\r\n }));\r\n });\r\n this.savePointer = (x, y, button) => {\r\n var _a, _b;\r\n if (!x || !y) {\r\n return;\r\n }\r\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\r\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\r\n // sometimes the pointer goes off screen\r\n }\r\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n pointer,\r\n button,\r\n pointersMap: gesture.pointers,\r\n });\r\n };\r\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n if (!this.unmounted) {\r\n this.setState({ shouldCacheIgnoreZoom: false });\r\n }\r\n }, 300);\r\n this.updateDOMRect = (cb) => {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\r\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\r\n if (width === currentWidth &&\r\n height === currentHeight &&\r\n offsetLeft === currentOffsetLeft &&\r\n offsetTop === currentOffsetTop) {\r\n if (cb) {\r\n cb();\r\n }\r\n return;\r\n }\r\n this.setState({\r\n width,\r\n height,\r\n offsetLeft,\r\n offsetTop,\r\n }, () => {\r\n cb && cb();\r\n });\r\n }\r\n };\r\n this.refresh = () => {\r\n this.setState(Object.assign({}, this.getCanvasOffsets()));\r\n };\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)();\r\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\r\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\r\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight, showHyperlinkPopup: false });\r\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_47__.nanoid)();\r\n if (excalidrawRef) {\r\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resolvablePromise)();\r\n const api = {\r\n ready: true,\r\n readyPromise,\r\n updateScene: this.updateScene,\r\n addFiles: this.addFiles,\r\n resetScene: this.resetScene,\r\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\r\n history: {\r\n clear: this.resetHistory,\r\n },\r\n scrollToContent: this.scrollToContent,\r\n getSceneElements: this.getSceneElements,\r\n getAppState: () => this.state,\r\n getFiles: () => this.files,\r\n refresh: this.refresh,\r\n importLibrary: this.importLibraryFromUrl,\r\n setToastMessage: this.setToastMessage,\r\n id: this.id,\r\n app: this,\r\n };\r\n if (typeof excalidrawRef === \"function\") {\r\n excalidrawRef(api);\r\n }\r\n else {\r\n excalidrawRef.current = api;\r\n }\r\n readyPromise.resolve(api);\r\n }\r\n this.excalidrawContainerValue = {\r\n container: this.excalidrawContainerRef.current,\r\n id: this.id,\r\n };\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__[\"default\"]();\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this);\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__[\"default\"]();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_6__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_7__.actions);\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createUndoAction)(this.history));\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createRedoAction)(this.history));\r\n }\r\n renderCanvas() {\r\n const canvasScale = window.devicePixelRatio;\r\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\r\n const canvasWidth = canvasDOMWidth * canvasScale;\r\n const canvasHeight = canvasDOMHeight * canvasScale;\r\n if (viewModeEnabled) {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n cursor: _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n render() {\r\n var _a, _b;\r\n const { zenModeEnabled, viewModeEnabled } = this.state;\r\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\"excalidraw excalidraw-container\", {\r\n \"excalidraw--zen-mode\": zenModeEnabled,\r\n \"excalidraw--view-mode\": viewModeEnabled,\r\n \"excalidraw--mobile\": this.deviceType.isMobile,\r\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(DeviceTypeContext.Provider, Object.assign({ value: this.deviceType }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_36__[\"default\"], { onHomeButtonClick: this.props.onHomeButtonClick, canvas: this.canvas, appState: this.state, files: this.files, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onPenModeToggle: this.togglePenMode, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\r\n elements,\r\n position: \"center\",\r\n files: null,\r\n }), zenModeEnabled: zenModeEnabled, toggleZenMode: this.toggleZenMode, langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.getLanguage)().code, isCollaborating: this.props.isCollaborating, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, viewModeEnabled: viewModeEnabled, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\r\n zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\r\n this.props.UIOptions.canvasActions &&\r\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id, onImageAction: this.onImageAction }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }, void 0), selectedElement.length === 1 && this.state.showHyperlinkPopup && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.Hyperlink, { element: selectedElement[0], appState: this.state, setAppState: this.setAppState, onLinkOpen: this.props.onLinkOpen }, selectedElement[0].id)), this.state.showStats && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_37__.Stats, { appState: this.state, setAppState: this.setAppState, elements: this.scene.getElements(), onClose: this.toggleStats, renderCustomStats: renderCustomStats }, void 0)), this.state.toastMessage !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_38__.Toast, { message: this.state.toastMessage, clearToast: this.clearToast }, void 0)), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() }, void 0)] }), void 0) }), void 0) }), void 0));\r\n }\r\n componentDidMount() {\r\n var _a, _b;\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.unmounted = false;\r\n this.excalidrawContainerValue.container =\r\n this.excalidrawContainerRef.current;\r\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n const setState = this.setState.bind(this);\r\n Object.defineProperties(window.h, {\r\n state: {\r\n configurable: true,\r\n get: () => {\r\n return this.state;\r\n },\r\n },\r\n setState: {\r\n configurable: true,\r\n value: (...args) => {\r\n return this.setState(...args);\r\n },\r\n },\r\n app: {\r\n configurable: true,\r\n value: this,\r\n },\r\n history: {\r\n configurable: true,\r\n value: this.history,\r\n },\r\n });\r\n }\r\n this.scene.addCallback(this.onSceneUpdated);\r\n this.addEventListeners();\r\n if (this.excalidrawContainerRef.current) {\r\n this.focusContainer();\r\n }\r\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // compute isMobile state\r\n // ---------------------------------------------------------------------\r\n const { width, height } = this.excalidrawContainerRef.current.getBoundingClientRect();\r\n this.deviceType = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.deviceType, {\r\n isMobile: width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT ||\r\n (height < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE &&\r\n width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE),\r\n });\r\n // refresh offsets\r\n // ---------------------------------------------------------------------\r\n this.updateDOMRect();\r\n });\r\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\r\n }\r\n else if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\r\n const handler = () => {\r\n this.deviceType = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.deviceType, {\r\n isMobile: mediaQuery.matches,\r\n });\r\n };\r\n mediaQuery.addListener(handler);\r\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\r\n }\r\n const searchParams = new URLSearchParams(window.location.search.slice(1));\r\n if (searchParams.has(\"web-share-target\")) {\r\n // Obtain a file that was shared via the Web Share Target API.\r\n this.restoreFileFromShare();\r\n }\r\n else {\r\n this.updateDOMRect(this.initializeScene);\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n var _a;\r\n this.files = {};\r\n this.imageCache.clear();\r\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.unmounted = true;\r\n this.removeEventListeners();\r\n this.scene.destroy();\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.clearRenderCache)();\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__[\"default\"]();\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__[\"default\"]();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_6__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this);\r\n this.canvas = null;\r\n this.rc = null;\r\n // @ts-ignore\r\n this.excalidrawContainerRef.current = undefined;\r\n this.nearestScrollableContainer = undefined;\r\n this.excalidrawContainerValue = { container: null, id: \"unmounted\" };\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n }\r\n removeEventListeners() {\r\n var _a, _b, _c, _d, _e, _f;\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n (_e = (_d = document.fonts) === null || _d === void 0 ? void 0 : _d.removeEventListener) === null || _e === void 0 ? void 0 : _e.call(_d, \"loadingdone\", this.onFontLoaded);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n (_f = this.detachIsMobileMqHandler) === null || _f === void 0 ? void 0 : _f.call(this);\r\n }\r\n addEventListeners() {\r\n var _a, _b, _c, _d;\r\n this.removeEventListeners();\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer); // #3553\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n if (this.props.handleKeyboardGlobally) {\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp, { passive: true });\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\r\n // rerender text elements on font load to fix #637 && #1553\r\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \"loadingdone\", this.onFontLoaded);\r\n // Safari-only desktop pinch zoom\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n if (this.props.detectScroll) {\r\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\r\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n }\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n }\r\n componentDidUpdate(prevProps, prevState) {\r\n var _a, _b, _c;\r\n if (Object.keys(this.state.selectedElementIds).length &&\r\n (0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n this.setState({ elementType: \"selection\" });\r\n }\r\n if (prevState.theme !== this.state.theme) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setEraserCursor)(this.canvas, this.state.theme);\r\n }\r\n // Hide hyperlink popup if shown when element type is not selection\r\n if (prevState.elementType === \"selection\" &&\r\n this.state.elementType !== \"selection\" &&\r\n this.state.showHyperlinkPopup) {\r\n this.setState({ showHyperlinkPopup: false });\r\n }\r\n if (prevProps.langCode !== this.props.langCode) {\r\n this.updateLanguage();\r\n }\r\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\r\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\r\n }\r\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\r\n this.addEventListeners();\r\n this.deselectElements();\r\n }\r\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\r\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\r\n }\r\n if (prevProps.theme !== this.props.theme && this.props.theme) {\r\n this.setState({ theme: this.props.theme });\r\n }\r\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\r\n this.setState({\r\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null,\r\n });\r\n }\r\n if (!this.props.UIOptions.canvasActions &&\r\n this.state.openMenu === \"canvas\") {\r\n this.setState({\r\n openMenu: null,\r\n });\r\n }\r\n if (this.props.name && prevProps.name !== this.props.name) {\r\n this.setState({\r\n name: this.props.name,\r\n });\r\n }\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\r\n if (this.state.editingLinearElement &&\r\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\r\n // defer so that the commitToHistory flag isn't reset via current update\r\n setTimeout(() => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n const { multiElement } = prevState;\r\n if (prevState.elementType !== this.state.elementType &&\r\n multiElement != null &&\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(multiElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\r\n }\r\n const cursorButton = {};\r\n const pointerViewportCoords = {};\r\n const remoteSelectedElementIds = {};\r\n const pointerUsernames = {};\r\n const pointerUserStates = {};\r\n this.state.collaborators.forEach((user, socketId) => {\r\n if (user.selectedElementIds) {\r\n for (const id of Object.keys(user.selectedElementIds)) {\r\n if (!(id in remoteSelectedElementIds)) {\r\n remoteSelectedElementIds[id] = [];\r\n }\r\n remoteSelectedElementIds[id].push(socketId);\r\n }\r\n }\r\n if (!user.pointer) {\r\n return;\r\n }\r\n if (user.username) {\r\n pointerUsernames[socketId] = user.username;\r\n }\r\n if (user.userState) {\r\n pointerUserStates[socketId] = user.userState;\r\n }\r\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: user.pointer.x,\r\n sceneY: user.pointer.y,\r\n }, this.state);\r\n cursorButton[socketId] = user.button;\r\n });\r\n const renderingElements = this.scene.getElements().filter((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(element)) {\r\n if (\r\n // not placed on canvas yet (but in elements array)\r\n this.state.pendingImageElement &&\r\n element.id === this.state.pendingImageElement.id) {\r\n return false;\r\n }\r\n }\r\n // don't render text element that's being currently edited (it's\r\n // rendered on remote only)\r\n return (!this.state.editingElement ||\r\n this.state.editingElement.type !== \"text\" ||\r\n element.id !== this.state.editingElement.id);\r\n });\r\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_28__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\r\n scrollX: this.state.scrollX,\r\n scrollY: this.state.scrollY,\r\n viewBackgroundColor: this.state.viewBackgroundColor,\r\n zoom: this.state.zoom,\r\n remotePointerViewportCoords: pointerViewportCoords,\r\n remotePointerButton: cursorButton,\r\n remoteSelectedElementIds,\r\n remotePointerUsernames: pointerUsernames,\r\n remotePointerUserStates: pointerUserStates,\r\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\r\n theme: this.state.theme,\r\n imageCache: this.imageCache,\r\n isExporting: false,\r\n renderScrollbars: !this.deviceType.isMobile,\r\n });\r\n if (scrollBars) {\r\n currentScrollBars = scrollBars;\r\n }\r\n const scrolledOutside = \r\n // hide when editing text\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\r\n ? false\r\n : !atLeastOneVisibleElement && renderingElements.length > 0;\r\n if (this.state.scrolledOutside !== scrolledOutside) {\r\n this.setState({ scrolledOutside });\r\n }\r\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\r\n this.scheduleImageRefresh();\r\n // Do not notify consumers if we're still loading the scene. Among other\r\n // potential issues, this fixes a case where the tab isn't focused during\r\n // init, which would trigger onChange with empty elements, which would then\r\n // override whatever is in localStorage currently.\r\n if (!this.state.isLoading) {\r\n (_c = (_b = this.props).onChange) === null || _c === void 0 ? void 0 : _c.call(_b, this.scene.getElementsIncludingDeleted(), this.state, this.files, this.props.id);\r\n }\r\n }\r\n static resetTapTwice() {\r\n didTapTwice = false;\r\n }\r\n addTextFromPaste(text) {\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x,\r\n y,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text,\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: this.state.currentItemTextAlign,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({ selectedElementIds: { [element.id]: true } });\r\n this.history.resumeRecording();\r\n }\r\n selectShapeTool(elementType) {\r\n if (!isHoldingSpace) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isToolIcon)(document.activeElement)) {\r\n this.focusContainer();\r\n }\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElementType)(elementType)) {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n if (elementType === \"image\") {\r\n this.onImageAction();\r\n }\r\n if (elementType !== \"selection\") {\r\n this.setState({\r\n elementType,\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n else {\r\n this.setState({ elementType });\r\n }\r\n }\r\n handleTextWysiwyg(element, { isExistingElement = false, }) {\r\n const updateElement = (text, originalText, isDeleted) => {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\r\n text,\r\n isDeleted,\r\n originalText,\r\n });\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n };\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.textWysiwyg)({\r\n id: element.id,\r\n canvas: this.canvas,\r\n getViewportCoords: (x, y) => {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: x,\r\n sceneY: y,\r\n }, this.state);\r\n return [\r\n viewportX - this.state.offsetLeft,\r\n viewportY - this.state.offsetTop,\r\n ];\r\n },\r\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((text) => {\r\n updateElement(text, text, false);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element);\r\n }\r\n }),\r\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(({ text, viaKeyboard, originalText }) => {\r\n const isDeleted = !text.trim();\r\n updateElement(text, originalText, isDeleted);\r\n // select the created text element only if submitting via keyboard\r\n // (when submitting via click it should act as signal to deselect)\r\n if (!isDeleted && viaKeyboard) {\r\n const elementIdToSelect = element.containerId\r\n ? element.containerId\r\n : element.id;\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [elementIdToSelect]: true }),\r\n }));\r\n }\r\n if (isDeleted) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDeletion)(this.scene.getElements(), [element]);\r\n }\r\n if (!isDeleted || isExistingElement) {\r\n this.history.resumeRecording();\r\n }\r\n this.setState({\r\n draggingElement: null,\r\n editingElement: null,\r\n });\r\n if (this.state.elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n this.focusContainer();\r\n }),\r\n element,\r\n excalidrawContainer: this.excalidrawContainerRef.current,\r\n app: this,\r\n });\r\n // deselect all other elements when inserting text\r\n this.deselectElements();\r\n // do an initial update to re-initialize element position since we were\r\n // modifying element's x/y for sake of editor (case: syncing to remote)\r\n updateElement(element.text, element.originalText, false);\r\n }\r\n deselectElements() {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n getTextElementAtPosition(x, y) {\r\n const element = this.getElementAtPosition(x, y, {\r\n includeBoundTextElement: true,\r\n });\r\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && !element.isDeleted) {\r\n return element;\r\n }\r\n return null;\r\n }\r\n getElementAtPosition(x, y, opts) {\r\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement);\r\n if (allHitElements.length > 1) {\r\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\r\n for (let index = allHitElements.length - 1; index > -1; index--) {\r\n if (this.state.selectedElementIds[allHitElements[index].id]) {\r\n return allHitElements[index];\r\n }\r\n }\r\n }\r\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\r\n // If we're hitting element with highest z-index only on its bounding box\r\n // while also hitting other element figure, the latter should be considered.\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\r\n ? allHitElements[allHitElements.length - 2]\r\n : elementWithHighestZIndex;\r\n }\r\n if (allHitElements.length === 1) {\r\n return allHitElements[0];\r\n }\r\n return null;\r\n }\r\n getElementsAtPosition(x, y, includeBoundTextElement = false) {\r\n const elements = includeBoundTextElement\r\n ? this.scene.getElements()\r\n : this.scene\r\n .getElements()\r\n .filter((element) => !((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && element.containerId));\r\n return (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsAtPosition)(elements, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_16__.hitTest)(element, this.state, x, y));\r\n }\r\n maybeCleanupAfterMissingPointerUp(event) {\r\n if (lastPointerUp !== null) {\r\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\r\n // this can happen when a contextual menu or alert is triggered. In order to avoid\r\n // being in a weird state, we clean up on the next pointerdown\r\n lastPointerUp(event);\r\n }\r\n }\r\n updateGestureOnPointerDown(event) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n if (gesture.pointers.size === 2) {\r\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n gesture.initialScale = this.state.zoom.value;\r\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n }\r\n }\r\n initialPointerDownState(event) {\r\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return {\r\n origin,\r\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD],\r\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\r\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\r\n // we need to duplicate because we'll be updating this state\r\n lastCoords: Object.assign({}, origin),\r\n originalElements: this.scene.getElements().reduce((acc, element) => {\r\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.deepCopyElement)(element));\r\n return acc;\r\n }, new Map()),\r\n resize: {\r\n handleType: false,\r\n isResizing: false,\r\n offset: { x: 0, y: 0 },\r\n arrowDirection: \"origin\",\r\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\r\n },\r\n hit: {\r\n element: null,\r\n allHitElements: [],\r\n wasAddedToSelection: false,\r\n hasBeenDuplicated: false,\r\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\r\n hasHitElementInside: false,\r\n },\r\n drag: {\r\n hasOccurred: false,\r\n offset: null,\r\n },\r\n eventListeners: {\r\n onMove: null,\r\n onUp: null,\r\n onKeyUp: null,\r\n onKeyDown: null,\r\n },\r\n boxSelection: {\r\n hasOccurred: false,\r\n },\r\n elementIdsToErase: {},\r\n };\r\n }\r\n // Returns whether the event is a dragging a scrollbar\r\n handleDraggingScrollBar(event, pointerDownState) {\r\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\r\n return false;\r\n }\r\n isDraggingScrollBar = true;\r\n pointerDownState.lastCoords.x = event.clientX;\r\n pointerDownState.lastCoords.y = event.clientY;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\r\n });\r\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isDraggingScrollBar = false;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n lastPointerUp = null;\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n onPointerMove.flush();\r\n });\r\n lastPointerUp = onPointerUp;\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n return true;\r\n }\r\n isASelectedElement(hitElement) {\r\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\r\n }\r\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\r\n if (selectedElements.length < 2) {\r\n return false;\r\n }\r\n // How many pixels off the shape boundary we still consider a hit\r\n const threshold = 10 / this.state.zoom.value;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return (point.x > x1 - threshold &&\r\n point.x < x2 + threshold &&\r\n point.y > y1 - threshold &&\r\n point.y < y2 + threshold);\r\n }\r\n onKeyDownFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onKeyUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // Prevents focus from escaping excalidraw tab\r\n event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ALT && event.preventDefault();\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onPointerMoveFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\r\n var _a, _b;\r\n // We need to initialize dragOffsetXY only after we've updated\r\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\r\n // event handler should hopefully ensure we're already working with\r\n // the updated state.\r\n if (pointerDownState.drag.offset === null) {\r\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\r\n }\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\r\n return;\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n this.handleEraser(event, pointerDownState, pointerCoords);\r\n return;\r\n }\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n // for arrows/lines, don't start dragging until a given threshold\r\n // to ensure we don't create a 2-point arrow by mistake when\r\n // user clicks mouse in a way that it moves a tiny bit (thus\r\n // triggering pointermove)\r\n if (!pointerDownState.drag.hasOccurred &&\r\n (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\")) {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD) {\r\n return;\r\n }\r\n }\r\n if (pointerDownState.resize.isResizing) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return true;\r\n }\r\n }\r\n if (this.state.editingLinearElement) {\r\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, pointsSceneCoords) => {\r\n this.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\r\n });\r\n if (didDrag) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n return;\r\n }\r\n }\r\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hasHitASelectedElement ||\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) &&\r\n // this allows for box-selecting points when clicking inside the\r\n // line's bounding box\r\n (!this.state.editingLinearElement || !event.shiftKey) &&\r\n // box-selecting without shift when editing line, not clicking on a line\r\n (!this.state.editingLinearElement ||\r\n ((_a = this.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !==\r\n ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) ||\r\n pointerDownState.hit.hasHitElementInside)) {\r\n // Marking that click was used for dragging to check\r\n // if elements should be deselected on pointerup\r\n pointerDownState.drag.hasOccurred = true;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\r\n // it would have weird results (stuff jumping all over the screen)\r\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\r\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n const [dragDistanceX, dragDistanceY] = [\r\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\r\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\r\n ];\r\n // We only drag in one direction if shift is pressed\r\n const lockDirection = event.shiftKey;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, this.state);\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n // We duplicate the selected element if alt is pressed on pointer move\r\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\r\n // Move the currently selected elements to the top of the z index stack, and\r\n // put the duplicates where the selected elements used to be.\r\n // (the origin point where the dragging started)\r\n pointerDownState.hit.hasBeenDuplicated = true;\r\n const nextElements = [];\r\n const elementsToAppend = [];\r\n const groupIdMap = new Map();\r\n const oldIdToDuplicatedId = new Map();\r\n const hitElement = pointerDownState.hit.element;\r\n const elements = this.scene.getElementsIncludingDeleted();\r\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state, true).map((element) => element.id);\r\n for (const element of elements) {\r\n if (selectedElementIds.includes(element.id) ||\r\n // case: the state.selectedElementIds might not have been\r\n // updated yet by the time this mousemove event is fired\r\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\r\n pointerDownState.hit.wasAddedToSelection)) {\r\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\r\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(duplicatedElement, {\r\n x: duplicatedElement.x + (originDragX - dragX),\r\n y: duplicatedElement.y + (originDragY - dragY),\r\n });\r\n nextElements.push(duplicatedElement);\r\n elementsToAppend.push(element);\r\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\r\n }\r\n else {\r\n nextElements.push(element);\r\n }\r\n }\r\n const nextSceneElements = [...nextElements, ...elementsToAppend];\r\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\r\n this.scene.replaceAllElements(nextSceneElements);\r\n }\r\n return;\r\n }\r\n }\r\n // It is very important to read this.state within each move event,\r\n // otherwise we would read a stale one!\r\n const draggingElement = this.state.draggingElement;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"freedraw\") {\r\n const points = draggingElement.points;\r\n const dx = pointerCoords.x - draggingElement.x;\r\n const dy = pointerCoords.y - draggingElement.y;\r\n const lastPoint = points.length > 0 && points[points.length - 1];\r\n const discardPoint = lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\r\n if (!discardPoint) {\r\n const pressures = draggingElement.simulatePressure\r\n ? draggingElement.pressures\r\n : [...draggingElement.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n }\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n pointerDownState.drag.hasOccurred = true;\r\n const points = draggingElement.points;\r\n let dx = gridX - draggingElement.x;\r\n let dy = gridY - draggingElement.y;\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\r\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.elementType, dx, dy));\r\n }\r\n if (points.length === 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\r\n }\r\n else if (points.length > 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points.slice(0, -1), [dx, dy]],\r\n });\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n // When creating a linear element by dragging\r\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], this.state.startBoundElement);\r\n }\r\n }\r\n else {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n }\r\n if (this.state.elementType === \"selection\") {\r\n pointerDownState.boxSelection.hasOccurred = true;\r\n const elements = this.scene.getElements();\r\n if (!event.shiftKey &&\r\n // allows for box-selecting points (without shift)\r\n !this.state.editingLinearElement &&\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(elements, this.state)) {\r\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\r\n [pointerDownState.hit.element.id]: true,\r\n } }), this.scene.getElements()));\r\n }\r\n else {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n }\r\n // box-select line editor points\r\n if (this.state.editingLinearElement) {\r\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handleBoxSelection(event, this.state, this.setState.bind(this));\r\n // regular box-select\r\n }\r\n else {\r\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsWithinSelection)(elements, draggingElement);\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {})), (pointerDownState.hit.element\r\n ? {\r\n // if using ctrl/cmd, select the hitElement only if we\r\n // haven't box-selected anything else\r\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length,\r\n }\r\n : null)), showHyperlinkPopup: elementsWithinSelection.length === 1 &&\r\n elementsWithinSelection[0].link\r\n ? \"info\"\r\n : false }), this.scene.getElements()));\r\n }\r\n }\r\n });\r\n }\r\n // Returns whether the pointer move happened over either scrollbar\r\n handlePointerMoveOverScrollbars(event, pointerDownState) {\r\n if (pointerDownState.scrollbars.isOverHorizontal) {\r\n const x = event.clientX;\r\n const dx = x - pointerDownState.lastCoords.x;\r\n this.setState({\r\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.x = x;\r\n return true;\r\n }\r\n if (pointerDownState.scrollbars.isOverVertical) {\r\n const y = event.clientY;\r\n const dy = y - pointerDownState.lastCoords.y;\r\n this.setState({\r\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.y = y;\r\n return true;\r\n }\r\n return false;\r\n }\r\n onPointerUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((childEvent) => {\r\n var _a, _b;\r\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating, } = this.state;\r\n this.setState({\r\n isResizing: false,\r\n isRotating: false,\r\n resizingElement: null,\r\n selectionElement: null,\r\n cursorButton: \"up\",\r\n // text elements are reset on finalize, and resetting on pointerup\r\n // may cause issues with double taps\r\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\r\n ? this.state.editingElement\r\n : null,\r\n });\r\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\r\n // Handle end of dragging a point of a linear element, might close a loop\r\n // and sets binding element\r\n if (this.state.editingLinearElement) {\r\n if (!pointerDownState.boxSelection.hasOccurred &&\r\n (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !==\r\n this.state.editingLinearElement.elementId ||\r\n !pointerDownState.hit.hasHitElementInside)) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n }\r\n else {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({\r\n editingLinearElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n }\r\n }\r\n lastPointerUp = null;\r\n if (pointerDownState.eventListeners.onMove) {\r\n pointerDownState.eventListeners.onMove.flush();\r\n }\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\r\n if (this.state.pendingImageElement) {\r\n this.setState({ pendingImageElement: null });\r\n }\r\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n const points = draggingElement.points;\r\n let dx = pointerCoords.x - draggingElement.x;\r\n let dy = pointerCoords.y - draggingElement.y;\r\n // Allows dots to avoid being flagged as infinitely small\r\n if (dx === points[0][0] && dy === points[0][1]) {\r\n dy += 0.0001;\r\n dx += 0.0001;\r\n }\r\n const pressures = draggingElement.simulatePressure\r\n ? []\r\n : [...draggingElement.pressures, childEvent.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n lastCommittedPoint: [dx, dy],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)) {\r\n const imageElement = draggingElement;\r\n try {\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n catch (error) {\r\n console.error(error);\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== imageElement.id));\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n }\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n if (draggingElement.points.length > 1) {\r\n this.history.resumeRecording();\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n if (!pointerDownState.drag.hasOccurred &&\r\n draggingElement &&\r\n !multiElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [\r\n ...draggingElement.points,\r\n [\r\n pointerCoords.x - draggingElement.x,\r\n pointerCoords.y - draggingElement.y,\r\n ],\r\n ],\r\n });\r\n this.setState({\r\n multiElement: draggingElement,\r\n editingElement: this.state.draggingElement,\r\n });\r\n }\r\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\r\n }\r\n this.setState({ suggestedBindings: [], startBoundElement: null });\r\n if (!elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n elementType: \"selection\",\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n else {\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n }\r\n return;\r\n }\r\n if (elementType !== \"selection\" &&\r\n draggingElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(draggingElement)) {\r\n // remove invisible element which was added in onPointerDown\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\r\n this.setState({\r\n draggingElement: null,\r\n });\r\n return;\r\n }\r\n if (draggingElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getNormalizedDimensions)(draggingElement));\r\n }\r\n if (resizingElement) {\r\n this.history.resumeRecording();\r\n }\r\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(resizingElement)) {\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== resizingElement.id));\r\n }\r\n // Code below handles selection when element(s) weren't\r\n // drag or added to selection on pointer down phase.\r\n const hitElement = pointerDownState.hit.element;\r\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\r\n if (draggedDistance === 0) {\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({\r\n clientX: this.lastPointerUp.clientX,\r\n clientY: this.lastPointerUp.clientY,\r\n }, this.state);\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n pointerDownState.hit.element = hitElement;\r\n }\r\n this.eraseElements(pointerDownState);\r\n return;\r\n }\r\n if (hitElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !pointerDownState.hit.wasAddedToSelection &&\r\n // if we're editing a line, pointerup shouldn't switch selection if\r\n // box selected\r\n (!this.state.editingLinearElement ||\r\n !pointerDownState.boxSelection.hasOccurred)) {\r\n // when inside line editor, shift selects points instead\r\n if (childEvent.shiftKey && !this.state.editingLinearElement) {\r\n if (this.state.selectedElementIds[hitElement.id]) {\r\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_23__.isSelectedViaGroup)(this.state, hitElement)) {\r\n // We want to unselect all groups hitElement is part of\r\n // as well as all elements that are part of the groups\r\n // hitElement is part of\r\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\r\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getElementsInGroup)(this.scene.getElements(), groupId))\r\n .map((element) => ({ [element.id]: false }))\r\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\r\n this.setState((_prevState) => ({\r\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\r\n .map((gId) => ({ [gId]: false }))\r\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\r\n }));\r\n }\r\n else {\r\n // remove element from selection while\r\n // keeping prev elements selected\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getElements()));\r\n }\r\n }\r\n else {\r\n // add element to selection while\r\n // keeping prev elements selected\r\n this.setState((_prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\r\n }));\r\n }\r\n }\r\n else {\r\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getElements()))));\r\n }\r\n }\r\n if (!this.state.editingLinearElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !this.state.isResizing &&\r\n ((hitElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\r\n (!hitElement &&\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\r\n // Deselect selected elements\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n return;\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\r\n }));\r\n }\r\n if (elementType !== \"selection\" ||\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(this.scene.getElements(), this.state)) {\r\n this.history.resumeRecording();\r\n }\r\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\r\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? _element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements\r\n : _element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state));\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n elementType: \"selection\",\r\n });\r\n }\r\n else {\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n });\r\n }\r\n });\r\n }\r\n maybeSuggestBindingForAll(selectedElements) {\r\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getEligibleElementsForBinding)(selectedElements);\r\n this.setState({ suggestedBindings });\r\n }\r\n clearSelection(hitElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n // Continue editing the same group if the user selected a different\r\n // element from it\r\n editingGroupId: prevState.editingGroupId &&\r\n hitElement != null &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, prevState.editingGroupId)\r\n ? prevState.editingGroupId\r\n : null,\r\n }));\r\n this.setState({\r\n selectedElementIds: {},\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\r\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)), x, y);\r\n if (elementClickedInside) {\r\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\r\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\r\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\r\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_11__.TEXT_TO_CENTER_SNAP_THRESHOLD;\r\n if (isSnappedToCenter) {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\r\n return { viewportX, viewportY, elementCenterX, elementCenterY };\r\n }\r\n }\r\n }\r\n getCanvasOffsets() {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { left, top } = excalidrawContainer.getBoundingClientRect();\r\n return {\r\n offsetLeft: left,\r\n offsetTop: top,\r\n };\r\n }\r\n return {\r\n offsetLeft: 0,\r\n offsetTop: 0,\r\n };\r\n }\r\n updateLanguage() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_25__.languages.find((lang) => lang.code === this.props.langCode) ||\r\n _i18n__WEBPACK_IMPORTED_MODULE_25__.defaultLang;\r\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.setLanguage)(currentLang);\r\n this.setAppState({});\r\n });\r\n }\r\n}\r\nApp.defaultProps = {\r\n // needed for tests to pass since we directly render App in many tests\r\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_UI_OPTIONS,\r\n};\r\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n window.h = window.h || {};\r\n Object.defineProperties(window.h, {\r\n elements: {\r\n configurable: true,\r\n get() {\r\n return this.app.scene.getElementsIncludingDeleted();\r\n },\r\n set(elements) {\r\n return this.app.scene.replaceAllElements(elements);\r\n },\r\n },\r\n });\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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VSxFQUFFLENBQUM7WUFDYixTQUFTLEVBQUUsQ0FBQztTQUNiLENBQUM7SUFDSixDQUFDO0lBRWEsY0FBYzs7WUFDMUIsTUFBTSxXQUFXLEdBQ2Ysa0RBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDM0QsK0NBQVcsQ0FBQztZQUNkLE1BQU0sbURBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7S0FBQTs7QUE5MUthLGdCQUFZLEdBQXNCO0lBQzlDLHNFQUFzRTtJQUN0RSxTQUFTLEVBQUUsMkRBQWtCO0NBQzlCLENBQUM7QUE4MktKLElBQ0UsYUFBb0IsS0FBSyxpREFBUTtJQUNqQyxhQUFvQixLQUFLLHdEQUFlLEVBQ3hDO0lBQ0EsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFLLEVBQWtCLENBQUM7SUFFM0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDaEMsUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLElBQUk7WUFDbEIsR0FBRztnQkFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDdEQsQ0FBQztZQUNELEdBQUcsQ0FBQyxRQUE2QjtnQkFDL0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxDQUFDO1NBQ0Y7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUNELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MDA3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiO1xuXG5pbXBvcnQge1xuICBhY3Rpb25BZGRUb0xpYnJhcnksXG4gIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICBhY3Rpb25Db3B5LFxuICBhY3Rpb25Db3B5QXNQbmcsXG4gIGFjdGlvbkNvcHlBc1N2ZyxcbiAgYWN0aW9uQ29weVN0eWxlcyxcbiAgYWN0aW9uQ3V0LFxuICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uLFxuICBhY3Rpb25GaW5hbGl6ZSxcbiAgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gIGFjdGlvbkZsaXBWZXJ0aWNhbCxcbiAgYWN0aW9uR3JvdXAsXG4gIGFjdGlvblBhc3RlU3R5bGVzLFxuICBhY3Rpb25TZWxlY3RBbGwsXG4gIGFjdGlvblNlbmRCYWNrd2FyZCxcbiAgYWN0aW9uU2VuZFRvQmFjayxcbiAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gIGFjdGlvblRvZ2dsZVN0YXRzLFxuICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICBhY3Rpb25VbmJpbmRUZXh0LFxuICBhY3Rpb25Vbmdyb3VwLFxuICBhY3Rpb25MaW5rLFxufSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IEFjdGlvblJlc3VsdCB9IGZyb20gXCIuLi9hY3Rpb25zL3R5cGVzXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlLCBpc0VyYXNlckFjdGl2ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHtcbiAgY29weVRvQ2xpcGJvYXJkLFxuICBwYXJzZUNsaXBib2FyZCxcbiAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IsXG4gIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQsXG59IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULFxuICBERUZBVUxUX1VJX09QVElPTlMsXG4gIERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gIERSQUdHSU5HX1RIUkVTSE9MRCxcbiAgRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5ULFxuICBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVOVixcbiAgRVZFTlQsXG4gIEdSSURfU0laRSxcbiAgSU1BR0VfUkVOREVSX1RJTUVPVVQsXG4gIExJTkVfQ09ORklSTV9USFJFU0hPTEQsXG4gIE1BWF9BTExPV0VEX0ZJTEVfQllURVMsXG4gIE1JTUVfVFlQRVMsXG4gIE1RX01BWF9IRUlHSFRfTEFORFNDQVBFLFxuICBNUV9NQVhfV0lEVEhfTEFORFNDQVBFLFxuICBNUV9NQVhfV0lEVEhfUE9SVFJBSVQsXG4gIFBPSU5URVJfQlVUVE9OLFxuICBTQ1JPTExfVElNRU9VVCxcbiAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gIFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xELFxuICBUSEVNRSxcbiAgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCxcbiAgVVJMX0hBU0hfS0VZUyxcbiAgVVJMX1FVRVJZX0tFWVMsXG4gIFZFUlRJQ0FMX0FMSUdOLFxuICBaT09NX1NURVAsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvYWRGcm9tQmxvYiB9IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cywgcmVzdG9yZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7XG4gIGRyYWdOZXdFbGVtZW50LFxuICBkcmFnU2VsZWN0ZWRFbGVtZW50cyxcbiAgZHVwbGljYXRlRWxlbWVudCxcbiAgZ2V0Q29tbW9uQm91bmRzLFxuICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsXG4gIGdldERyYWdPZmZzZXRYWSxcbiAgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLFxuICBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbixcbiAgZ2V0UmVzaXplT2Zmc2V0WFksXG4gIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLFxuICBoaXRUZXN0LFxuICBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICBpc05vbkRlbGV0ZWRFbGVtZW50LFxuICBpc1RleHRFbGVtZW50LFxuICBuZXdFbGVtZW50LFxuICBuZXdMaW5lYXJFbGVtZW50LFxuICBuZXdUZXh0RWxlbWVudCxcbiAgbmV3SW1hZ2VFbGVtZW50LFxuICB0ZXh0V3lzaXd5ZyxcbiAgdHJhbnNmb3JtRWxlbWVudHMsXG4gIHVwZGF0ZVRleHRFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyxcbiAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uLFxuICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24sXG4gIGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nLFxuICBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcsXG4gIGlzQmluZGluZ0VuYWJsZWQsXG4gIGlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZCxcbiAgbWF5YmVCaW5kTGluZWFyRWxlbWVudCxcbiAgc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudCxcbiAgdW5iaW5kTGluZWFyRWxlbWVudHMsXG4gIHVwZGF0ZUJvdW5kRWxlbWVudHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaGFzQm91bmRUZXh0RWxlbWVudCxcbiAgaXNCaW5kaW5nRWxlbWVudCxcbiAgaXNCaW5kaW5nRWxlbWVudFR5cGUsXG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNJbWFnZUVsZW1lbnQsXG4gIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50VHlwZSxcbiAgaXNUZXh0QmluZGFibGVDb250YWluZXIsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRmlsZUlkLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q2VudGVyLCBnZXREaXN0YW5jZSB9IGZyb20gXCIuLi9nZXN0dXJlXCI7XG5pbXBvcnQge1xuICBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQsXG4gIGdldEVsZW1lbnRzSW5Hcm91cCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkcyxcbiAgaXNFbGVtZW50SW5Hcm91cCxcbiAgaXNTZWxlY3RlZFZpYUdyb3VwLFxuICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcsIGdldExhbmd1YWdlLCBsYW5ndWFnZXMsIHNldExhbmd1YWdlLCB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7XG4gIENPREVTLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvLFxuICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgaXNBcnJvd0tleSxcbiAgS0VZUyxcbiAgaXNBbmRyb2lkLFxufSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgZ2V0R3JpZFBvaW50LCBpc1BhdGhBTG9vcCB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlclwiO1xuaW1wb3J0IHtcbiAgY2xlYXJSZW5kZXJDYWNoZSxcbiAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCxcbn0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZVNjcm9sbENlbnRlcixcbiAgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbixcbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLFxuICBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbixcbiAgZ2V0Tm9ybWFsaXplZFpvb20sXG4gIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gIGhhc0JhY2tncm91bmQsXG4gIGlzT3ZlclNjcm9sbEJhcnMsXG4gIGlzU29tZUVsZW1lbnRTZWxlY3RlZCxcbn0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBSZW5kZXJDb25maWcsIFNjcm9sbEJhcnMgfSBmcm9tIFwiLi4vc2NlbmUvdHlwZXNcIjtcbmltcG9ydCB7IGdldFN0YXRlRm9yWm9vbSB9IGZyb20gXCIuLi9zY2VuZS96b29tXCI7XG5pbXBvcnQgeyBmaW5kU2hhcGVCeUtleSB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7XG4gIEFwcENsYXNzUHJvcGVydGllcyxcbiAgQXBwUHJvcHMsXG4gIEFwcFN0YXRlLFxuICBCaW5hcnlGaWxlRGF0YSxcbiAgRGF0YVVSTCxcbiAgRXhjYWxpZHJhd0ltcGVyYXRpdmVBUEksXG4gIEJpbmFyeUZpbGVzLFxuICBHZXN0dXJlLFxuICBHZXN0dXJlRXZlbnQsXG4gIExpYnJhcnlJdGVtcyxcbiAgUG9pbnRlckRvd25TdGF0ZSxcbiAgU2NlbmVEYXRhLFxuICBEZXZpY2VUeXBlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlYm91bmNlLFxuICBkaXN0YW5jZSxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsXG4gIGlzSW5wdXRMaWtlLFxuICBpc1Rvb2xJY29uLFxuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgcmVzZXRDdXJzb3IsXG4gIHJlc29sdmFibGVQcm9taXNlLFxuICBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsXG4gIHNldEN1cnNvcixcbiAgc2V0Q3Vyc29yRm9yU2hhcGUsXG4gIHR1cGxlVG9Db29ycyxcbiAgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLFxuICB3aXRoQmF0Y2hlZFVwZGF0ZXMsXG4gIHdyYXBFdmVudCxcbiAgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkLFxuICB1cGRhdGVPYmplY3QsXG4gIHNldEVyYXNlckN1cnNvcixcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUsIHsgQ29udGV4dE1lbnVPcHRpb24gfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHtcbiAgZGF0YVVSTFRvRmlsZSxcbiAgZ2VuZXJhdGVJZEZyb21GaWxlLFxuICBnZXREYXRhVVJMLFxuICBpc1N1cHBvcnRlZEltYWdlRmlsZSxcbiAgcmVzaXplSW1hZ2VGaWxlLFxuICBTVkdTdHJpbmdUb0ZpbGUsXG59IGZyb20gXCIuLi9kYXRhL2Jsb2JcIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgbG9hZEhUTUxJbWFnZUVsZW1lbnQsXG4gIG5vcm1hbGl6ZVNWRyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSBhcyBfdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwibG9kYXNoLnRocm90dGxlXCI7XG5pbXBvcnQgeyBmaWxlT3BlbiwgbmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCB9IGZyb20gXCIuLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB7XG4gIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24sXG4gIGdldEFwcHJveE1pbkxpbmVIZWlnaHQsXG4gIGdldEFwcHJveE1pbkxpbmVXaWR0aCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4uL2VsZW1lbnQvY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICBub3JtYWxpemVMaW5rLFxuICBzaG93SHlwZXJsaW5rVG9vbHRpcCxcbiAgaGlkZUh5cGVybGlua1Rvb2xpcCxcbiAgSHlwZXJsaW5rLFxuICBpc1BvaW50SGl0dGluZ0xpbmtJY29uLFxuICBpc0xvY2FsTGluayxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvSHlwZXJsaW5rXCI7XG5cbmNvbnN0IGRlZmF1bHREZXZpY2VUeXBlQ29udGV4dDogRGV2aWNlVHlwZSA9IHtcbiAgaXNNb2JpbGU6IGZhbHNlLFxuICBpc1RvdWNoU2NyZWVuOiBmYWxzZSxcbn07XG5jb25zdCBEZXZpY2VUeXBlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdERldmljZVR5cGVDb250ZXh0KTtcbmV4cG9ydCBjb25zdCB1c2VEZXZpY2VUeXBlID0gKCkgPT4gdXNlQ29udGV4dChEZXZpY2VUeXBlQ29udGV4dCk7XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8e1xuICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgaWQ/OiBzdHJpbmcgfCBudWxsO1xufT4oeyBjb250YWluZXI6IG51bGwsIGlkOiBudWxsIH0pO1xuZXhwb3J0IGNvbnN0IHVzZUV4Y2FsaWRyYXdDb250YWluZXIgPSAoKSA9PlxuICB1c2VDb250ZXh0KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0KTtcblxubGV0IGRpZFRhcFR3aWNlOiBib29sZWFuID0gZmFsc2U7XG5sZXQgdGFwcGVkVHdpY2VUaW1lciA9IDA7XG5sZXQgY3Vyc29yWCA9IDA7XG5sZXQgY3Vyc29yWSA9IDA7XG5sZXQgaXNIb2xkaW5nU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBpc1Bhbm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBpc0RyYWdnaW5nU2Nyb2xsQmFyOiBib29sZWFuID0gZmFsc2U7XG5sZXQgY3VycmVudFNjcm9sbEJhcnM6IFNjcm9sbEJhcnMgPSB7IGhvcml6b250YWw6IG51bGwsIHZlcnRpY2FsOiBudWxsIH07XG5sZXQgdG91Y2hUaW1lb3V0ID0gMDtcbmxldCBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcblxubGV0IGxhc3RQb2ludGVyVXA6ICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbmNvbnN0IGdlc3R1cmU6IEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBuZXcgTWFwKCksXG4gIGxhc3RDZW50ZXI6IG51bGwsXG4gIGluaXRpYWxEaXN0YW5jZTogbnVsbCxcbiAgaW5pdGlhbFNjYWxlOiBudWxsLFxufTtcblxuY2xhc3MgQXBwIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PEFwcFByb3BzLCBBcHBTdGF0ZT4ge1xuICBjYW52YXM6IEFwcENsYXNzUHJvcGVydGllc1tcImNhbnZhc1wiXSA9IG51bGw7XG4gIHJjOiBSb3VnaENhbnZhcyB8IG51bGwgPSBudWxsO1xuICB1bm1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aW9uTWFuYWdlcjogQWN0aW9uTWFuYWdlcjtcbiAgZGV2aWNlVHlwZTogRGV2aWNlVHlwZSA9IHtcbiAgICBpc01vYmlsZTogZmFsc2UsXG4gICAgaXNUb3VjaFNjcmVlbjogZmFsc2UsXG4gIH07XG4gIGRldGFjaElzTW9iaWxlTXFIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8QXBwUHJvcHM+ID0ge1xuICAgIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgfTtcblxuICBwcml2YXRlIHNjZW5lOiBTY2VuZTtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsaWJyYXJ5OiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJsaWJyYXJ5XCJdO1xuICBwdWJsaWMgbGlicmFyeUl0ZW1zRnJvbVN0b3JhZ2U6IExpYnJhcnlJdGVtcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpZDogc3RyaW5nO1xuICBwcml2YXRlIGhpc3Rvcnk6IEhpc3Rvcnk7XG4gIHByaXZhdGUgZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlOiB7XG4gICAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcblxuICBwdWJsaWMgZmlsZXM6IEJpbmFyeUZpbGVzID0ge307XG4gIHB1YmxpYyBpbWFnZUNhY2hlOiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJpbWFnZUNhY2hlXCJdID0gbmV3IE1hcCgpO1xuXG4gIGhpdExpbmtFbGVtZW50PzogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50O1xuICBsYXN0UG9pbnRlckRvd246IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4gfCBudWxsID0gbnVsbDtcbiAgbGFzdFBvaW50ZXJVcDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxFbGVtZW50PiB8IFBvaW50ZXJFdmVudCB8IG51bGwgPSBudWxsO1xuICBjb250ZXh0TWVudU9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgbGFzdFNjZW5lUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEFwcFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHplbk1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICBncmlkTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHRoZW1lID0gZGVmYXVsdEFwcFN0YXRlLnRoZW1lLFxuICAgICAgbmFtZSA9IGRlZmF1bHRBcHBTdGF0ZS5uYW1lLFxuICAgIH0gPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgLi4uZGVmYXVsdEFwcFN0YXRlLFxuICAgICAgdGhlbWUsXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICAuLi50aGlzLmdldENhbnZhc09mZnNldHMoKSxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgZ3JpZFNpemU6IGdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGwsXG4gICAgICBuYW1lLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID1cbiAgICAgICAgKFwiY3VycmVudFwiIGluIGV4Y2FsaWRyYXdSZWYgJiYgZXhjYWxpZHJhd1JlZi5jdXJyZW50Py5yZWFkeVByb21pc2UpIHx8XG4gICAgICAgIHJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPigpO1xuXG4gICAgICBjb25zdCBhcGk6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgYWRkRmlsZXM6IHRoaXMuYWRkRmlsZXMsXG4gICAgICAgIHJlc2V0U2NlbmU6IHRoaXMucmVzZXRTY2VuZSxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQsXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjbGVhcjogdGhpcy5yZXNldEhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICAgIHNjcm9sbFRvQ29udGVudDogdGhpcy5zY3JvbGxUb0NvbnRlbnQsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHM6IHRoaXMuZ2V0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgZ2V0QXBwU3RhdGU6ICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAgIGdldEZpbGVzOiAoKSA9PiB0aGlzLmZpbGVzLFxuICAgICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgICAgIGltcG9ydExpYnJhcnk6IHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwsXG4gICAgICAgIHNldFRvYXN0TWVzc2FnZTogdGhpcy5zZXRUb2FzdE1lc3NhZ2UsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBhcHA6IHRoaXMsXG4gICAgICB9IGFzIGNvbnN0O1xuICAgICAgaWYgKHR5cGVvZiBleGNhbGlkcmF3UmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZihhcGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZi5jdXJyZW50ID0gYXBpO1xuICAgICAgfVxuICAgICAgcmVhZHlQcm9taXNlLnJlc29sdmUoYXBpKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZSA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICB9O1xuXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIoXG4gICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQsXG4gICAgICAoKSA9PiB0aGlzLnN0YXRlLFxuICAgICAgKCkgPT4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBbGwoYWN0aW9ucyk7XG5cbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlVW5kb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlUmVkb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1NjYWxlID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXNET01XaWR0aCAqIGNhbnZhc1NjYWxlO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNhbnZhc0RPTUhlaWdodCAqIGNhbnZhc1NjYWxlO1xuICAgIGlmICh2aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxjYW52YXNcbiAgICAgICAgICBjbGFzc05hbWU9XCJleGNhbGlkcmF3X19jYW52YXNcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgICAgIGN1cnNvcjogQ1VSU09SX1RZUEUuR1JBQixcbiAgICAgICAgICB9fVxuICAgICAgICAgIHdpZHRoPXtjYW52YXNXaWR0aH1cbiAgICAgICAgICBoZWlnaHQ9e2NhbnZhc0hlaWdodH1cbiAgICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICAgIG9uQ29udGV4dE1lbnU9e3RoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnV9XG4gICAgICAgICAgb25Qb2ludGVyTW92ZT17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZX1cbiAgICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyVXB9XG4gICAgICAgICAgb25Qb2ludGVyQ2FuY2VsPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlckRvd249e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd259XG4gICAgICAgID5cbiAgICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgICA8L2NhbnZhcz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8Y2FudmFzXG4gICAgICAgIGNsYXNzTmFtZT1cImV4Y2FsaWRyYXdfX2NhbnZhc1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICB9fVxuICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgIGhlaWdodD17Y2FudmFzSGVpZ2h0fVxuICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICBvbkRvdWJsZUNsaWNrPXt0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrfVxuICAgICAgICBvblBvaW50ZXJNb3ZlPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlfVxuICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyVXB9XG4gICAgICAgIG9uUG9pbnRlckNhbmNlbD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICBvblRvdWNoTW92ZT17dGhpcy5oYW5kbGVUb3VjaE1vdmV9XG4gICAgICA+XG4gICAgICAgIHt0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIil9XG4gICAgICA8L2NhbnZhcz5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHplbk1vZGVFbmFibGVkLCB2aWV3TW9kZUVuYWJsZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCB7XG4gICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgIHJlbmRlckZvb3RlcixcbiAgICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFwiZXhjYWxpZHJhdyBleGNhbGlkcmF3LWNvbnRhaW5lclwiLCB7XG4gICAgICAgICAgXCJleGNhbGlkcmF3LS16ZW4tbW9kZVwiOiB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICBcImV4Y2FsaWRyYXctLXZpZXctbW9kZVwiOiB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgXCJleGNhbGlkcmF3LS1tb2JpbGVcIjogdGhpcy5kZXZpY2VUeXBlLmlzTW9iaWxlLFxuICAgICAgICB9KX1cbiAgICAgICAgcmVmPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWZ9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVBcHBPbkRyb3B9XG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e1xuICAgICAgICAgIHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlfVxuICAgICAgICA+XG4gICAgICAgICAgPERldmljZVR5cGVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt0aGlzLmRldmljZVR5cGV9PlxuICAgICAgICAgICAgPExheWVyVUlcbiAgICAgICAgICAgICAgb25Ib21lQnV0dG9uQ2xpY2s9e3RoaXMucHJvcHMub25Ib21lQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgIGNhbnZhcz17dGhpcy5jYW52YXN9XG4gICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICBmaWxlcz17dGhpcy5maWxlc31cbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI9e3RoaXMuYWN0aW9uTWFuYWdlcn1cbiAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKX1cbiAgICAgICAgICAgICAgb25Db2xsYWJCdXR0b25DbGljaz17b25Db2xsYWJCdXR0b25DbGlja31cbiAgICAgICAgICAgICAgb25Mb2NrVG9nZ2xlPXt0aGlzLnRvZ2dsZUxvY2t9XG4gICAgICAgICAgICAgIG9uUGVuTW9kZVRvZ2dsZT17dGhpcy50b2dnbGVQZW5Nb2RlfVxuICAgICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzPXsoZWxlbWVudHMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgZmlsZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZD17emVuTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIHRvZ2dsZVplbk1vZGU9e3RoaXMudG9nZ2xlWmVuTW9kZX1cbiAgICAgICAgICAgICAgbGFuZ0NvZGU9e2dldExhbmd1YWdlKCkuY29kZX1cbiAgICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXt0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZ31cbiAgICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVST17cmVuZGVyVG9wUmlnaHRVSX1cbiAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyPXtyZW5kZXJGb290ZXJ9XG4gICAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZD17dmlld01vZGVFbmFibGVkfVxuICAgICAgICAgICAgICBzaG93RXhpdFplbk1vZGVCdG49e1xuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzPy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvd1RoZW1lQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuY2FudmFzQWN0aW9ucy50aGVtZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw9e3RoaXMucHJvcHMubGlicmFyeVJldHVyblVybH1cbiAgICAgICAgICAgICAgVUlPcHRpb25zPXt0aGlzLnByb3BzLlVJT3B0aW9uc31cbiAgICAgICAgICAgICAgZm9jdXNDb250YWluZXI9e3RoaXMuZm9jdXNDb250YWluZXJ9XG4gICAgICAgICAgICAgIGxpYnJhcnk9e3RoaXMubGlicmFyeX1cbiAgICAgICAgICAgICAgaWQ9e3RoaXMuaWR9XG4gICAgICAgICAgICAgIG9uSW1hZ2VBY3Rpb249e3RoaXMub25JbWFnZUFjdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4Y2FsaWRyYXctY29udGV4dE1lbnVDb250YWluZXJcIiAvPlxuICAgICAgICAgICAge3NlbGVjdGVkRWxlbWVudC5sZW5ndGggPT09IDEgJiYgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXAgJiYgKFxuICAgICAgICAgICAgICA8SHlwZXJsaW5rXG4gICAgICAgICAgICAgICAga2V5PXtzZWxlY3RlZEVsZW1lbnRbMF0uaWR9XG4gICAgICAgICAgICAgICAgZWxlbWVudD17c2VsZWN0ZWRFbGVtZW50WzBdfVxuICAgICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlPXt0aGlzLnNldEFwcFN0YXRlfVxuICAgICAgICAgICAgICAgIG9uTGlua09wZW49e3RoaXMucHJvcHMub25MaW5rT3Blbn1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5zaG93U3RhdHMgJiYgKFxuICAgICAgICAgICAgICA8U3RhdHNcbiAgICAgICAgICAgICAgICBhcHBTdGF0ZT17dGhpcy5zdGF0ZX1cbiAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZT17dGhpcy5zZXRBcHBTdGF0ZX1cbiAgICAgICAgICAgICAgICBlbGVtZW50cz17dGhpcy5zY2VuZS5nZXRFbGVtZW50cygpfVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMudG9nZ2xlU3RhdHN9XG4gICAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tU3RhdHM9e3JlbmRlckN1c3RvbVN0YXRzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnRvYXN0TWVzc2FnZSAhPT0gbnVsbCAmJiAoXG4gICAgICAgICAgICAgIDxUb2FzdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUudG9hc3RNZXNzYWdlfVxuICAgICAgICAgICAgICAgIGNsZWFyVG9hc3Q9e3RoaXMuY2xlYXJUb2FzdH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8bWFpbj57dGhpcy5yZW5kZXJDYW52YXMoKX08L21haW4+XG4gICAgICAgICAgPC9EZXZpY2VUeXBlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgPC9FeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNDb250YWluZXI6IEFwcENsYXNzUHJvcGVydGllc1tcImZvY3VzQ29udGFpbmVyXCJdID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICB9O1xuXG4gIHByaXZhdGUgc3luY0FjdGlvblJlc3VsdCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAoYWN0aW9uUmVzdWx0OiBBY3Rpb25SZXN1bHQpID0+IHtcbiAgICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgd2hlbiBhY3Rpb24gdHJpZ2dlcmVkIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICAgIHRoaXMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBlZGl0aW5nRWxlbWVudDogQXBwU3RhdGVbXCJlZGl0aW5nRWxlbWVudFwiXSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5lbGVtZW50cykge1xuICAgICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQ/LmlkID09PSBlbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50ICYmXG4gICAgICAgICAgICBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5maWxlcykge1xuICAgICAgICB0aGlzLmZpbGVzID0gYWN0aW9uUmVzdWx0LnJlcGxhY2VGaWxlc1xuICAgICAgICAgID8gYWN0aW9uUmVzdWx0LmZpbGVzXG4gICAgICAgICAgOiB7IC4uLnRoaXMuZmlsZXMsIC4uLmFjdGlvblJlc3VsdC5maWxlcyB9O1xuICAgICAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IGVkaXRpbmdFbGVtZW50KSB7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZpZXdNb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnZpZXdNb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgbGV0IHplbk1vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uemVuTW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGxldCBncmlkU2l6ZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LmdyaWRTaXplIHx8IG51bGw7XG4gICAgICAgIGxldCB0aGVtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnRoZW1lIHx8IFRIRU1FLkxJR0hUO1xuICAgICAgICBsZXQgbmFtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lm5hbWUgPz8gdGhpcy5zdGF0ZS5uYW1lO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdmlld01vZGVFbmFibGVkID0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgZ3JpZFNpemUgPSB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudGhlbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aGVtZSA9IHRoaXMucHJvcHMudGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMubmFtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAgICAgLy8gcmVnYXJkaW5nIHRoZSByZXN1bHRpbmcgdHlwZSBhcyBub3QgY29udGFpbmluZyB1bmRlZmluZWRcbiAgICAgICAgICAgIC8vICh3aGljaCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2lsbCBuZXZlciBjb250YWluKVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OlxuICAgICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LnN5bmNIaXN0b3J5KSB7XG4gICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICAvLyBMaWZlY3ljbGVcblxuICBwcml2YXRlIG9uQmx1ciA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvblVubG9hZCA9ICgpID0+IHtcbiAgICB0aGlzLm9uQmx1cigpO1xuICB9O1xuXG4gIHByaXZhdGUgZGlzYWJsZUV2ZW50OiBFdmVudExpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBwcml2YXRlIG9uRm9udExvYWRlZCA9ICgpID0+IHtcbiAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHByaXZhdGUgaW1wb3J0TGlicmFyeUZyb21VcmwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaC5pbmNsdWRlcyhVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICBjb25zdCBoYXNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSk7XG4gICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBBUFBfTkFNRSwgYCMke2hhc2gudG9TdHJpbmcoKX1gKTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIHF1ZXJ5LmRlbGV0ZShVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KTtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgQVBQX05BTUUsIGA/JHtxdWVyeS50b1N0cmluZygpfWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goZGVjb2RlVVJJQ29tcG9uZW50KHVybCkpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlcXVlc3QuYmxvYigpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgYmxvYi50ZXh0KCkpO1xuICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdG9rZW4gPT09IHRoaXMuaWQgfHxcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgdChcImFsZXJ0cy5jb25maXJtQWRkTGlicmFyeVwiLCB7XG4gICAgICAgICAgICBudW1TaGFwZXM6IChqc29uLmxpYnJhcnlJdGVtcyB8fCBqc29uLmxpYnJhcnkgfHwgW10pLmxlbmd0aCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IsIFwicHVibGlzaGVkXCIpO1xuICAgICAgICAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHdpbmRvdy5hbGVydCh0KFwiYWxlcnRzLmVycm9yTG9hZGluZ0xpYnJhcnlcIikpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBzY2VuZSAmIGhpc3RvcnkuXG4gICAqICEgRG8gbm90IHVzZSB0byBjbGVhciBzY2VuZSB1c2VyIGFjdGlvbiAhXG4gICAqL1xuICBwcml2YXRlIHJlc2V0U2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKG9wdHM/OiB7IHJlc2V0TG9hZGluZ1N0YXRlOiBib29sZWFuIH0pID0+IHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXREZWZhdWx0QXBwU3RhdGUoKSxcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGluaXRpYWxpemVTY2VuZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKFxuICAgICAgICBhc3luYyAobGF1bmNoUGFyYW1zOiB7IGZpbGVzOiBhbnlbXSB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFsYXVuY2hQYXJhbXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYjogQmxvYiA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgICBibG9iLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKHNjZW5lKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgLi4uc2NlbmUsXG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihzY2VuZS5hcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgIH1cbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9IChhd2FpdCB0aGlzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuICAgICAgaWYgKGluaXRpYWxEYXRhPy5saWJyYXJ5SXRlbXMpIHtcbiAgICAgICAgdGhpcy5saWJyYXJ5SXRlbXNGcm9tU3RvcmFnZSA9IHJlc3RvcmVMaWJyYXJ5SXRlbXMoXG4gICAgICAgICAgaW5pdGlhbERhdGEubGlicmFyeUl0ZW1zLFxuICAgICAgICAgIFwidW5wdWJsaXNoZWRcIixcbiAgICAgICAgKSBhcyBMaWJyYXJ5SXRlbXM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBpbXBvcnRpbmcgb3IgcmVzdG9yaW5nIHNjZW5lIGRhdGFcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcblxuICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICBlbGVtZW50VHlwZTpcbiAgICAgICAgc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgID8gXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIDogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKGluaXRpYWxEYXRhPy5zY3JvbGxUb0NvbnRlbnQpIHtcbiAgICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICAgIHNjZW5lLmVsZW1lbnRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc3RhdGUud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc3RhdGUuaGVpZ2h0LFxuICAgICAgICAgICAgb2Zmc2V0VG9wOiB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgICAgIG9mZnNldExlZnQ6IHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChpbml0aWFsRGF0YT8uc2Nyb2xsWCAhPSBudWxsKSB7XG4gICAgICBzY2VuZS5hcHBTdGF0ZS5zY3JvbGxYID0gaW5pdGlhbERhdGEuc2Nyb2xsWDtcbiAgICB9XG4gICAgaWYgKGluaXRpYWxEYXRhPy5zY3JvbGxZICE9IG51bGwpIHtcbiAgICAgIHNjZW5lLmFwcFN0YXRlLnNjcm9sbFkgPSBpbml0aWFsRGF0YS5zY3JvbGxZO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgIC4uLnNjZW5lLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9XG4gICAgICAvLyBjdXJyZW50XG4gICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoXG4gICAgICAgIFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSxcbiAgICAgICkgfHxcbiAgICAgIC8vIGxlZ2FjeSwga2VwdCBmb3IgY29tcGF0IHJlYXNvbnNcbiAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFxuICAgICAgICBVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5LFxuICAgICAgKTtcblxuICAgIGlmIChsaWJyYXJ5VXJsKSB7XG4gICAgICBhd2FpdCB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsKGxpYnJhcnlVcmwpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy51bm1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZS5jb250YWluZXIgPVxuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbiAgICApIHtcbiAgICAgIGNvbnN0IHNldFN0YXRlID0gdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHNldFN0YXRlPikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLFxuICAgICAgICB9LFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjZW5lLmFkZENhbGxiYWNrKHRoaXMub25TY2VuZVVwZGF0ZWQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIC8vIGNvbXB1dGUgaXNNb2JpbGUgc3RhdGVcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID1cbiAgICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuZGV2aWNlVHlwZSA9IHVwZGF0ZU9iamVjdCh0aGlzLmRldmljZVR5cGUsIHtcbiAgICAgICAgICBpc01vYmlsZTpcbiAgICAgICAgICAgIHdpZHRoIDwgTVFfTUFYX1dJRFRIX1BPUlRSQUlUIHx8XG4gICAgICAgICAgICAoaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiZcbiAgICAgICAgICAgICAgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy51cGRhdGVET01SZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX1BPUlRSQUlUfXB4KSwgKG1heC1oZWlnaHQ6ICR7TVFfTUFYX0hFSUdIVF9MQU5EU0NBUEV9cHgpIGFuZCAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9MQU5EU0NBUEV9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRldmljZVR5cGUgPSB1cGRhdGVPYmplY3QodGhpcy5kZXZpY2VUeXBlLCB7XG4gICAgICAgICAgaXNNb2JpbGU6IG1lZGlhUXVlcnkubWF0Y2hlcyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSAoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICB0aGlzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCh0aGlzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclJlbmRlckNhY2hlKCk7XG5cbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcihcbiAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCxcbiAgICAgICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAoKSA9PiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICB0aGlzLnJjID0gbnVsbDtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0geyBjb250YWluZXI6IG51bGwsIGlkOiBcInVubW91bnRlZFwiIH07XG5cbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgdGhpcy5zY2VuZVxuICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAuZm9yRWFjaCgoZWxlbWVudCkgPT4gaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgIHRoaXMub25TY3JvbGwsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULk1PVVNFX01PVkUsXG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbixcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJBR19PVkVSLFxuICAgICAgdGhpcy5kaXNhYmxlRXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJPUCxcbiAgICAgIHRoaXMuZGlzYWJsZUV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5mb250cz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpO1xuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuXG4gICAgdGhpcy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlcj8uKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7IC8vICMzNTUzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgaWYgKHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXAsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuTU9VU0VfTU9WRSxcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLFxuICAgICk7XG4gICAgLy8gcmVyZW5kZXIgdGV4dCBlbGVtZW50cyBvbiBmb250IGxvYWQgdG8gZml4ICM2MzcgJiYgIzE1NTNcbiAgICBkb2N1bWVudC5mb250cz8uYWRkRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpO1xuICAgIC8vIFNhZmFyaS1vbmx5IGRlc2t0b3AgcGluY2ggem9vbVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX1NUQVJULFxuICAgICAgdGhpcy5vbkdlc3R1cmVTdGFydCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0NIQU5HRSxcbiAgICAgIHRoaXMub25HZXN0dXJlQ2hhbmdlIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfRU5ELFxuICAgICAgdGhpcy5vbkdlc3R1cmVFbmQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DVVQsIHRoaXMub25DdXQpO1xuICAgIGlmICh0aGlzLnByb3BzLmRldGVjdFNjcm9sbCkge1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciA9IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyKFxuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICApO1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5TQ1JPTEwsXG4gICAgICAgIHRoaXMub25TY3JvbGwsXG4gICAgICApO1xuICAgIH1cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJBR19PVkVSLFxuICAgICAgdGhpcy5kaXNhYmxlRXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJPUCxcbiAgICAgIHRoaXMuZGlzYWJsZUV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IEFwcFByb3BzLCBwcmV2U3RhdGU6IEFwcFN0YXRlKSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LmtleXModGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAmJlxuICAgICAgaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIiB9KTtcbiAgICB9XG4gICAgaWYgKHByZXZTdGF0ZS50aGVtZSAhPT0gdGhpcy5zdGF0ZS50aGVtZSkge1xuICAgICAgc2V0RXJhc2VyQ3Vyc29yKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLnRoZW1lKTtcbiAgICB9XG4gICAgLy8gSGlkZSBoeXBlcmxpbmsgcG9wdXAgaWYgc2hvd24gd2hlbiBlbGVtZW50IHR5cGUgaXMgbm90IHNlbGVjdGlvblxuICAgIGlmIChcbiAgICAgIHByZXZTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXBcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdGhlbWU6IHRoaXMucHJvcHMudGhlbWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICF0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zICYmXG4gICAgICB0aGlzLnN0YXRlLm9wZW5NZW51ID09PSBcImNhbnZhc1wiXG4gICAgKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgb3Blbk1lbnU6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5uYW1lICYmIHByZXZQcm9wcy5uYW1lICE9PSB0aGlzLnByb3BzLm5hbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAgIFwidGhlbWUtLWRhcmtcIixcbiAgICAgIHRoaXMuc3RhdGUudGhlbWUgPT09IFwiZGFya1wiLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWRdXG4gICAgKSB7XG4gICAgICAvLyBkZWZlciBzbyB0aGF0IHRoZSBjb21taXRUb0hpc3RvcnkgZmxhZyBpc24ndCByZXNldCB2aWEgY3VycmVudCB1cGRhdGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHByZXZTdGF0ZTtcbiAgICBpZiAoXG4gICAgICBwcmV2U3RhdGUuZWxlbWVudFR5cGUgIT09IHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgJiZcbiAgICAgIG11bHRpRWxlbWVudCAhPSBudWxsICYmXG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JCdXR0b246IHtcbiAgICAgIFtpZDogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH0gPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVmlld3BvcnRDb29yZHM6IFJlbmRlckNvbmZpZ1tcInJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkc1wiXSA9XG4gICAgICB7fTtcbiAgICBjb25zdCByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHM6IFJlbmRlckNvbmZpZ1tcInJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1wiXSA9XG4gICAgICB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlcm5hbWVzOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlclN0YXRlczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgdGhpcy5zdGF0ZS5jb2xsYWJvcmF0b3JzLmZvckVhY2goKHVzZXIsIHNvY2tldElkKSA9PiB7XG4gICAgICBpZiAodXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh1c2VyLnNlbGVjdGVkRWxlbWVudElkcykpIHtcbiAgICAgICAgICBpZiAoIShpZCBpbiByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0ucHVzaChzb2NrZXRJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdXNlci5wb2ludGVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyLnVzZXJuYW1lKSB7XG4gICAgICAgIHBvaW50ZXJVc2VybmFtZXNbc29ja2V0SWRdID0gdXNlci51c2VybmFtZTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyLnVzZXJTdGF0ZSkge1xuICAgICAgICBwb2ludGVyVXNlclN0YXRlc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHBvaW50ZXJWaWV3cG9ydENvb3Jkc1tzb2NrZXRJZF0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgIHtcbiAgICAgICAgICBzY2VuZVg6IHVzZXIucG9pbnRlci54LFxuICAgICAgICAgIHNjZW5lWTogdXNlci5wb2ludGVyLnksXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgY3Vyc29yQnV0dG9uW3NvY2tldElkXSA9IHVzZXIuYnV0dG9uO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBub3QgcGxhY2VkIG9uIGNhbnZhcyB5ZXQgKGJ1dCBpbiBlbGVtZW50cyBhcnJheSlcbiAgICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQgJiZcbiAgICAgICAgICBlbGVtZW50LmlkID09PSB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQuaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBkb24ndCByZW5kZXIgdGV4dCBlbGVtZW50IHRoYXQncyBiZWluZyBjdXJyZW50bHkgZWRpdGVkIChpdCdzXG4gICAgICAvLyByZW5kZXJlZCBvbiByZW1vdGUgb25seSlcbiAgICAgIHJldHVybiAoXG4gICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50IHx8XG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgZWxlbWVudC5pZCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCwgc2Nyb2xsQmFycyB9ID0gcmVuZGVyU2NlbmUoXG4gICAgICByZW5kZXJpbmdFbGVtZW50cyxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbkVsZW1lbnQsXG4gICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIHRoaXMucmMhLFxuICAgICAgdGhpcy5jYW52YXMhLFxuICAgICAge1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFgsXG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSxcbiAgICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yLFxuICAgICAgICB6b29tOiB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3JkczogcG9pbnRlclZpZXdwb3J0Q29vcmRzLFxuICAgICAgICByZW1vdGVQb2ludGVyQnV0dG9uOiBjdXJzb3JCdXR0b24sXG4gICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczogcG9pbnRlclVzZXJuYW1lcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHBvaW50ZXJVc2VyU3RhdGVzLFxuICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRoaXMuc3RhdGUuc2hvdWxkQ2FjaGVJZ25vcmVab29tLFxuICAgICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgICBpc0V4cG9ydGluZzogZmFsc2UsXG4gICAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2Nyb2xsQmFycykge1xuICAgICAgY3VycmVudFNjcm9sbEJhcnMgPSBzY3JvbGxCYXJzO1xuICAgIH1cbiAgICBjb25zdCBzY3JvbGxlZE91dHNpZGUgPVxuICAgICAgLy8gaGlkZSB3aGVuIGVkaXRpbmcgdGV4dFxuICAgICAgaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2Nyb2xsZWRPdXRzaWRlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG5cbiAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG5cbiAgICAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4oXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuZmlsZXMsXG4gICAgICAgIHRoaXMucHJvcHMuaWQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TY3JvbGwgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgY29uc3QgeyBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG5cbiAgLy8gQ29weS9wYXN0ZVxuXG4gIHByaXZhdGUgb25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3V0QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgY3V0QWxsID0gKCkgPT4ge1xuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlbGV0ZVNlbGVjdGVkKTtcbiAgfTtcblxuICBwcml2YXRlIGNvcHlBbGwgPSAoKSA9PiB7XG4gICAgY29weVRvQ2xpcGJvYXJkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSwgdGhpcy5maWxlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRhcFN0YXJ0ID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgLy8gZml4IGZvciBBcHBsZSBQZW5jaWwgU2NyaWJibGVcbiAgICAvLyBPbiBBbmRyb2lkLCBwcmV2ZW50aW5nIHRoZSBldmVudCB3b3VsZCBkaXNhYmxlIGNvbnRleHRNZW51IG9uIHRhcC1ob2xkXG4gICAgaWYgKCFpc0FuZHJvaWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKCFkaWRUYXBUd2ljZSkge1xuICAgICAgZGlkVGFwVHdpY2UgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgICAgdGFwcGVkVHdpY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICBBcHAucmVzZXRUYXBUd2ljZSxcbiAgICAgICAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpbnNlcnQgdGV4dCBvbmx5IGlmIHdlIHRhcHBlZCB0d2ljZSB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIC8vIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxIHdpbGwgYWxzbyBwcmV2ZW50IGluc2VydGluZyB0ZXh0IHdoZW4gdXNlcidzIHpvb21pbmdcbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICB9KTtcbiAgICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgfVxuICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uVGFwRW5kID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5wb2ludGVycy5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHBhc3RlRnJvbUNsaXBib2FyZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICBhc3luYyAoZXZlbnQ6IENsaXBib2FyZEV2ZW50IHwgbnVsbCkgPT4ge1xuICAgICAgLy8gIzY4NlxuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9XG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGN1cnNvclgsIGN1cnNvclkpO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAgIC8vIHRodXMgdGhlc2UgY2hlY2tzIGRvbid0IG1ha2Ugc2Vuc2VcbiAgICAgICAgZXZlbnQgJiZcbiAgICAgICAgKCEoZWxlbWVudFVuZGVyQ3Vyc29yIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHx8XG4gICAgICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGluIHRoZSBzYW1lIGZyYW1lICh0aHVzIGJlZm9yZSBhbnkgYXdhaXRzKSBhcyB0aGUgcGFzdGVcbiAgICAgIC8vIGV2ZW50IGVsc2Ugc29tZSBicm93c2VycyAoRkYuLi4pIHdpbGwgY2xlYXIgdGhlIGNsaXBib2FyZERhdGFcbiAgICAgIC8vIChzb21ldGhpbmcgc29tZXRoaW5nIHNlY3VyaXR5KVxuICAgICAgbGV0IGZpbGUgPSBldmVudD8uY2xpcGJvYXJkRGF0YT8uZmlsZXNbMF07XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcbiAgICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKFwiPHN2Z1wiKSAmJiBzdHJpbmcuZW5kc1dpdGgoXCI8L3N2Zz5cIikpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgU1ZHIHZhbGlkYXRpb24vbm9ybWFsaXphdGlvbiB3aGljaCB3aWxsIGJlIGRvbmUgZHVyaW5nIGltYWdlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb25cbiAgICAgICAgICBmaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcHJlZmVyIHNwcmVhZHNoZWV0IGRhdGEgb3ZlciBpbWFnZSBmaWxlIChNUyBPZmZpY2UvTGlicmUgT2ZmaWNlKVxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpICYmICFkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIGNvbnN0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICB7IGNsaWVudFg6IGN1cnNvclgsIGNsaWVudFk6IGN1cnNvclkgfSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHsgc2NlbmVYLCBzY2VuZVkgfSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlIH0gfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBhc3RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKChhd2FpdCB0aGlzLnByb3BzLm9uUGFzdGUoZGF0YSwgZXZlbnQpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgZWxlbWVudHM6IGRhdGEuZWxlbWVudHMsXG4gICAgICAgICAgZmlsZXM6IGRhdGEuZmlsZXMgfHwgbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogXCJjdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICB0aGlzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gKG9wdHM6IHtcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsO1xuICAgIHBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBcImN1cnNvclwiIHwgXCJjZW50ZXJcIjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKG9wdHMuZWxlbWVudHMsIG51bGwpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG5cbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuXG4gICAgY29uc3QgY2xpZW50WCA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WFxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JYXG4gICAgICAgIDogdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WVxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JZXG4gICAgICAgIDogdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WCwgY2xpZW50WSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZHggPSB4IC0gZWxlbWVudHNDZW50ZXJYO1xuICAgIGNvbnN0IGR5ID0geSAtIGVsZW1lbnRzQ2VudGVyWTtcbiAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgbmV3RWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICBncm91cElkTWFwLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB7XG4gICAgICAgICAgeDogZWxlbWVudC54ICsgZ3JpZFggLSBtaW5YLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIGdyaWRZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBuZXdFbGVtZW50LmlkKTtcbiAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH0pO1xuICAgIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24obmV3RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcbiAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgLi4ubmV3RWxlbWVudHMsXG4gICAgXTtcbiAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG5cbiAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4ub3B0cy5maWxlcyB9O1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRFbGVtZW50cyk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IG5ld0VsZW1lbnRzLnJlZHVjZSgobWFwLCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgICAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9LCB7fSBhcyBhbnkpLFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICApLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgfTtcblxuICBwcml2YXRlIGFkZFRleHRGcm9tUGFzdGUodGV4dDogYW55KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB7IGNsaWVudFg6IGN1cnNvclgsIGNsaWVudFk6IGN1cnNvclkgfSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgdGV4dCxcbiAgICAgIGZvbnRTaXplOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtlbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfVxuXG4gIC8vIENvbGxhYm9yYXRpb25cblxuICBzZXRBcHBTdGF0ZSA9IChvYmo6IGFueSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICByZW1vdmVQb2ludGVyID0gKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgaWYgKHRvdWNoVGltZW91dCkge1xuICAgICAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLnBvaW50ZXJzLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICB9O1xuXG4gIHRvZ2dsZUxvY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50TG9ja2VkOiAhcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwcmV2U3RhdGUuZWxlbWVudExvY2tlZFxuICAgICAgICAgID8gXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIDogcHJldlN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0b2dnbGVQZW5Nb2RlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGVuTW9kZTogIXByZXZTdGF0ZS5wZW5Nb2RlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0b2dnbGVaZW5Nb2RlID0gKCkgPT4ge1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblRvZ2dsZVplbk1vZGUpO1xuICB9O1xuXG4gIHRvZ2dsZVN0YXRzID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5zdGF0ZS5zaG93U3RhdHMpIHtcbiAgICAgIHRyYWNrRXZlbnQoXCJkaWFsb2dcIiwgXCJzdGF0c1wiKTtcbiAgICB9XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlU3RhdHMpO1xuICB9O1xuXG4gIHNjcm9sbFRvQ29udGVudCA9IChcbiAgICB0YXJnZXQ6XG4gICAgICB8IEV4Y2FsaWRyYXdFbGVtZW50XG4gICAgICB8IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICApLFxuICAgIH0pO1xuICB9O1xuXG4gIGNsZWFyVG9hc3QgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvYXN0TWVzc2FnZTogbnVsbCB9KTtcbiAgfTtcblxuICBzZXRUb2FzdE1lc3NhZ2UgPSAodG9hc3RNZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdG9hc3RNZXNzYWdlIH0pO1xuICB9O1xuXG4gIHJlc3RvcmVGaWxlRnJvbVNoYXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuXG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5tYXRjaChcInNoYXJlZC1maWxlXCIpO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IGZpbGUuYmxvYigpO1xuICAgICAgICB0aGlzLmxvYWRGaWxlVG9DYW52YXMoYmxvYik7XG4gICAgICAgIGF3YWl0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUuZGVsZXRlKFwic2hhcmVkLWZpbGVcIik7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBBUFBfTkFNRSwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKiogYWRkcyBzdXBwbGllZCBmaWxlcyB0byBleGlzdGluZyBmaWxlcyBpbiB0aGUgYXBwU3RhdGUgKi9cbiAgcHVibGljIGFkZEZpbGVzOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSVtcImFkZEZpbGVzXCJdID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChmaWxlcykgPT4ge1xuICAgICAgY29uc3QgZmlsZXNNYXAgPSBmaWxlcy5yZWR1Y2UoKGFjYywgZmlsZURhdGEpID0+IHtcbiAgICAgICAgYWNjLnNldChmaWxlRGF0YS5pZCwgZmlsZURhdGEpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcDxGaWxlSWQsIEJpbmFyeUZpbGVEYXRhPigpKTtcblxuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4uT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVzTWFwKSB9O1xuXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgIGZpbGVzTWFwLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlLmRlbGV0ZShlbGVtZW50LmZpbGVJZCk7XG4gICAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG5cbiAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgfSxcbiAgKTtcblxuICBwdWJsaWMgdXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBBcHBTdGF0ZT4oc2NlbmVEYXRhOiB7XG4gICAgICBlbGVtZW50cz86IFNjZW5lRGF0YVtcImVsZW1lbnRzXCJdO1xuICAgICAgYXBwU3RhdGU/OiBQaWNrPEFwcFN0YXRlLCBLPiB8IG51bGw7XG4gICAgICBjb2xsYWJvcmF0b3JzPzogU2NlbmVEYXRhW1wiY29sbGFib3JhdG9yc1wiXTtcbiAgICAgIGNvbW1pdFRvSGlzdG9yeT86IFNjZW5lRGF0YVtcImNvbW1pdFRvSGlzdG9yeVwiXTtcbiAgICAgIGxpYnJhcnlJdGVtcz86IFNjZW5lRGF0YVtcImxpYnJhcnlJdGVtc1wiXTtcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnMgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEubGlicmFyeUl0ZW1zKSB7XG4gICAgICAgIHRoaXMubGlicmFyeS5zYXZlTGlicmFyeShcbiAgICAgICAgICByZXN0b3JlTGlicmFyeUl0ZW1zKHNjZW5lRGF0YS5saWJyYXJ5SXRlbXMsIFwidW5wdWJsaXNoZWRcIiksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uU2NlbmVVcGRhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjdXJzb3JZID0gZXZlbnQuY2xpZW50WTtcbiAgICB9LFxuICApO1xuXG4gIC8vIElucHV0IGhhbmRsaW5nXG5cbiAgcHJpdmF0ZSBvbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuICAgICAgaWYgKFxuICAgICAgICBcIlByb3h5XCIgaW4gd2luZG93ICYmXG4gICAgICAgICgoIWV2ZW50LnNoaWZ0S2V5ICYmIC9eW0EtWl0kLy50ZXN0KGV2ZW50LmtleSkpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5ICYmIC9eW2Etel0kLy50ZXN0KGV2ZW50LmtleSkpKVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50ID0gbmV3IFByb3h5KGV2ZW50LCB7XG4gICAgICAgICAgZ2V0KGV2OiBhbnksIHByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZbcHJvcF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgLy8gZml4IGZvciBQcm94aWVzIGhpamFja2luZyBgdGhpc2BcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3AgPT09IFwia2V5XCJcbiAgICAgICAgICAgICAgPyAvLyBDYXBzTG9jayBpbnZlcnRzIGNhcGl0YWxpemF0aW9uIGJhc2VkIG9uIFNoaWZ0S2V5LCBzbyBpbnZlcnRcbiAgICAgICAgICAgICAgICAvLyBpdCBiYWNrXG4gICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgICAgICA/IGV2LmtleS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgOiBldi5rZXkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IHZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIChpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpICYmIGV2ZW50LmtleSAhPT0gS0VZUy5FU0NBUEUpIHx8XG4gICAgICAgIC8vIGNhc2U6IHVzaW5nIGFycm93cyB0byBtb3ZlIGJldHdlZW4gYnV0dG9uc1xuICAgICAgICAoaXNBcnJvd0tleShldmVudC5rZXkpICYmIGlzSW5wdXRMaWtlKGV2ZW50LnRhcmdldCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlFVRVNUSU9OX01BUkspIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2hvd0hlbHBEaWFsb2c6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3Rpb25NYW5hZ2VyLmhhbmRsZUtleURvd24oZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIHRoaXMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5aRVJPKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiAhdGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgICAgICh0aGlzLnN0YXRlLmdyaWRTaXplICYmXG4gICAgICAgICAgICAoZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgICAgPyBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlRcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLmdyaWRTaXplKSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UXG4gICAgICAgICAgICA6IEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0xFRlQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1JJR0hUKSB7XG4gICAgICAgICAgb2Zmc2V0WCA9IHN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgICAgb2Zmc2V0WSA9IC1zdGVwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19ET1dOKSB7XG4gICAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHg6IGVsZW1lbnQueCArIG9mZnNldFgsXG4gICAgICAgICAgICB5OiBlbGVtZW50LnkgKyBvZmZzZXRZLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNseVVwZGF0ZWQ6IHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAhaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgICBzaG91bGRCaW5kOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgICAgICFldmVudC5tZXRhS2V5ICYmXG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBmaW5kU2hhcGVCeUtleShldmVudC5rZXkpO1xuICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChzaGFwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUxvY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgaXNIb2xkaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICAgICFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnQua2V5ID09PSBLRVlTLkcgJiZcbiAgICAgICAgICAoaGFzQmFja2dyb3VuZCh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKSB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSkpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUykge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwic3Ryb2tlQ29sb3JQaWNrZXJcIiB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBvbktleVVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSlcbiAgICAgICAgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpXG4gICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3M6IFtdIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RTaGFwZVRvb2woZWxlbWVudFR5cGU6IEFwcFN0YXRlW1wiZWxlbWVudFR5cGVcIl0pIHtcbiAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICB0aGlzLm9uSW1hZ2VBY3Rpb24oKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZWxlbWVudFR5cGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkdlc3R1cmVTdGFydCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgIH0pO1xuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUNoYW5nZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBvbkdlc3R1cmVDaGFuZ2Ugb25seSBoYXMgem9vbSBmYWN0b3IgYnV0IG5vdCB0aGUgY2VudGVyLlxuICAgIC8vIElmIHdlJ3JlIG9uIGlQYWQgb3IgaVBob25lLCB0aGVuIHdlIHJlY29nbml6ZSBtdWx0aS10b3VjaCBhbmQgd2lsbFxuICAgIC8vIHpvb20gaW4gYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIG9uIHRoZSB0b3VjaE1vdmUgaGFuZGxlciBhbHJlYWR5LlxuICAgIC8vIE9uIE1hY2Jvb2ssIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA+PSAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+ICh7XG4gICAgICAgIC4uLmdldFN0YXRlRm9yWm9vbShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2aWV3cG9ydFg6IGN1cnNvclgsXG4gICAgICAgICAgICB2aWV3cG9ydFk6IGN1cnNvclksXG4gICAgICAgICAgICBuZXh0Wm9vbTogZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogZXZlbnQuc2NhbGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICksXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUVuZCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgfSk7XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIGhhbmRsZVRleHRXeXNpd3lnKFxuICAgIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgICB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKFxuICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgb3JpZ2luYWxUZXh0OiBzdHJpbmcsXG4gICAgICBpc0RlbGV0ZWQ6IGJvb2xlYW4sXG4gICAgKSA9PiB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChfZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9O1xuXG4gICAgdGV4dFd5c2l3eWcoe1xuICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4LCB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeDogdmlld3BvcnRYLCB5OiB2aWV3cG9ydFkgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY2VuZVg6IHgsXG4gICAgICAgICAgICBzY2VuZVk6IHksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHZpZXdwb3J0WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB2aWV3cG9ydFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogd2l0aEJhdGNoZWRVcGRhdGVzKCh0ZXh0KSA9PiB7XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgdGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgb25TdWJtaXQ6IHdpdGhCYXRjaGVkVXBkYXRlcygoeyB0ZXh0LCB2aWFLZXlib2FyZCwgb3JpZ2luYWxUZXh0IH0pID0+IHtcbiAgICAgICAgY29uc3QgaXNEZWxldGVkID0gIXRleHQudHJpbSgpO1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkKTtcbiAgICAgICAgLy8gc2VsZWN0IHRoZSBjcmVhdGVkIHRleHQgZWxlbWVudCBvbmx5IGlmIHN1Ym1pdHRpbmcgdmlhIGtleWJvYXJkXG4gICAgICAgIC8vICh3aGVuIHN1Ym1pdHRpbmcgdmlhIGNsaWNrIGl0IHNob3VsZCBhY3QgYXMgc2lnbmFsIHRvIGRlc2VsZWN0KVxuICAgICAgICBpZiAoIWlzRGVsZXRlZCAmJiB2aWFLZXlib2FyZCkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZFRvU2VsZWN0ID0gZWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICAgICAgPyBlbGVtZW50LmNvbnRhaW5lcklkXG4gICAgICAgICAgICA6IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgIFtlbGVtZW50SWRUb1NlbGVjdF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZWxldGVkKSB7XG4gICAgICAgICAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgW2VsZW1lbnRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRGVsZXRlZCB8fCBpc0V4aXN0aW5nRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGFwcDogdGhpcyxcbiAgICB9KTtcbiAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuXG4gICAgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0LCBlbGVtZW50Lm9yaWdpbmFsVGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0cz86IHtcbiAgICAgIC8qKiBpZiB0cnVlLCByZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50ICh3aXRoIGhpZ2hlc3Qgei1pbmRleClcbiAgICAgICAgb2YgYWxsIGhpdCBlbGVtZW50cyAqL1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbCB7XG4gICAgY29uc3QgYWxsSGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgb3B0cz8uaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKG9wdHM/LnByZWZlclNlbGVjdGVkKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPiAtMTsgaW5kZXgtLSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1thbGxIaXRFbGVtZW50c1tpbmRleF0uaWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID1cbiAgICAgICAgYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBJZiB3ZSdyZSBoaXR0aW5nIGVsZW1lbnQgd2l0aCBoaWdoZXN0IHotaW5kZXggb25seSBvbiBpdHMgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aGlsZSBhbHNvIGhpdHRpbmcgb3RoZXIgZWxlbWVudCBmaWd1cmUsIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICByZXR1cm4gaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICApXG4gICAgICAgID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1swXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRzQXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIGluY2x1ZGVCb3VuZFRleHRFbGVtZW50OiBib29sZWFuID0gZmFsc2UsXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnRcbiAgICAgID8gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpXG4gICAgICA6IHRoaXMuc2NlbmVcbiAgICAgICAgICAuZ2V0RWxlbWVudHMoKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlbWVudCkgPT4gIShpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQuY29udGFpbmVySWQpLFxuICAgICAgICAgICk7XG5cbiAgICByZXR1cm4gZ2V0RWxlbWVudHNBdFBvc2l0aW9uKGVsZW1lbnRzLCAoZWxlbWVudCkgPT5cbiAgICAgIGhpdFRlc3QoZWxlbWVudCwgdGhpcy5zdGF0ZSwgeCwgeSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUZXh0RWRpdGluZyA9ICh7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWSxcbiAgICBzaG91bGRCaW5kLFxuICAgIGluc2VydEF0UGFyZW50Q2VudGVyID0gdHJ1ZSxcbiAgfToge1xuICAgIC8qKiBYIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0IGF0ICovXG4gICAgc2NlbmVYOiBudW1iZXI7XG4gICAgLyoqIFkgcG9zaXRpb24gdG8gaW5zZXJ0IHRleHQgYXQgKi9cbiAgICBzY2VuZVk6IG51bWJlcjtcbiAgICBzaG91bGRCaW5kOiBib29sZWFuO1xuICAgIC8qKiB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gaW5zZXJ0IGF0IGVsZW1lbnQgY2VudGVyIGlmIGFwcGxpY2FibGUgKi9cbiAgICBpbnNlcnRBdFBhcmVudENlbnRlcj86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICBsZXQgcGFyZW50Q2VudGVyUG9zaXRpb24gPVxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiZcbiAgICAgIHRoaXMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICk7XG5cbiAgICBsZXQgZXhpc3RpbmdUZXh0RWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNvbnRhaW5lcjogRXhjYWxpZHJhd1RleHRDb250YWluZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgY29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleGlzdGluZ1RleHRFbGVtZW50ID1cbiAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPz8gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgLy8gYmluZCB0byBjb250YWluZXIgd2hlbiBzaG91bGRCaW5kIGlzIHRydWUgb3JcbiAgICAvLyBjbGlja2VkIG9uIGNlbnRlciBvZiBjb250YWluZXJcbiAgICBpZiAoXG4gICAgICAhY29udGFpbmVyICYmXG4gICAgICAhZXhpc3RpbmdUZXh0RWxlbWVudCAmJlxuICAgICAgKHNob3VsZEJpbmQgfHwgcGFyZW50Q2VudGVyUG9zaXRpb24pXG4gICAgKSB7XG4gICAgICBjb250YWluZXIgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKFxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKChlbGUpID0+ICFpc1RleHRFbGVtZW50KGVsZSkpLFxuICAgICAgICBzY2VuZVgsXG4gICAgICAgIHNjZW5lWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFleGlzdGluZ1RleHRFbGVtZW50ICYmIGNvbnRhaW5lcikge1xuICAgICAgY29uc3QgZm9udFN0cmluZyA9IHtcbiAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB9O1xuICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRBcHByb3hNaW5MaW5lV2lkdGgoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVyLmhlaWdodCwgbWluSGVpZ2h0KTtcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyLndpZHRoLCBtaW5XaWR0aCk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5ld0hlaWdodCwgd2lkdGg6IG5ld1dpZHRoIH0pO1xuICAgICAgc2NlbmVYID0gY29udGFpbmVyLnggKyBuZXdXaWR0aCAvIDI7XG4gICAgICBzY2VuZVkgPSBjb250YWluZXIueSArIG5ld0hlaWdodCAvIDI7XG4gICAgICBpZiAocGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgcGFyZW50Q2VudGVyUG9zaXRpb24gPSB0aGlzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgIHNjZW5lWSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBleGlzdGluZ1RleHRFbGVtZW50XG4gICAgICA/IGV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICAgIDogbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgICAgIHg6IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJYXG4gICAgICAgICAgICA6IHNjZW5lWCxcbiAgICAgICAgICB5OiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWVxuICAgICAgICAgICAgOiBzY2VuZVksXG4gICAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgICAgICB0ZXh0QWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFwiY2VudGVyXCJcbiAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBWRVJUSUNBTF9BTElHTi5NSURETEVcbiAgICAgICAgICAgIDogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgICAgICBjb250YWluZXJJZDogY29udGFpbmVyPy5pZCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZ3JvdXBJZHM6IGNvbnRhaW5lcj8uZ3JvdXBJZHMgPz8gW10sXG4gICAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmdFbGVtZW50OiBlbGVtZW50IH0pO1xuXG4gICAgaWYgKCFleGlzdGluZ1RleHRFbGVtZW50KSB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcblxuICAgICAgLy8gY2FzZTogY3JlYXRpbmcgbmV3IHRleHQgbm90IGNlbnRlcmVkIHRvIHBhcmVudCBlbGVtZW50IOKGkiBvZmZzZXQgWVxuICAgICAgLy8gc28gdGhhdCB0aGUgdGV4dCBpcyBjZW50ZXJlZCB0byBjdXJzb3IgcG9zaXRpb25cbiAgICAgIGlmICghcGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgeTogZWxlbWVudC55IC0gZWxlbWVudC5iYXNlbGluZSAvIDIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmhhbmRsZVRleHRXeXNpd3lnKGVsZW1lbnQsIHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50OiAhIWV4aXN0aW5nVGV4dEVsZW1lbnQsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNEb3VibGVDbGljayA9IChcbiAgICBldmVudDogUmVhY3QuTW91c2VFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIC8vIGNhc2U6IGRvdWJsZS1jbGlja2luZyB3aXRoIGFycm93L2xpbmUgdG9vbCBzZWxlY3RlZCB3b3VsZCBib3RoIGNyZWF0ZVxuICAgIC8vIHRleHQgYW5kIGVudGVyIG11bHRpRWxlbWVudCBtb2RlXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHdlIHNob3VsZCBvbmx5IGJlIGFibGUgdG8gZG91YmxlIGNsaWNrIHdoZW4gbW9kZSBpcyBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuXG4gICAgbGV0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIGV2ZW50LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHModGhpcy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9XG4gICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCB0aGlzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaGl0RWxlbWVudCEuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIXRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50KTtcbiAgICAgICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICAgICAgc2NlbmVYID0gc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgICAgIHNjZW5lWSA9IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICBzaG91bGRCaW5kOiBmYWxzZSxcbiAgICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50TGlua0F0UG9zaXRpb24gPSAoXG4gICAgc2NlbmVQb2ludGVyOiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIGhpdEVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4gICk6IEV4Y2FsaWRyYXdFbGVtZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgICAvLyBSZXZlcnNpbmcgc28gd2UgdHJhdmVyc2UgdGhlIGVsZW1lbnRzIGluIGRlY3JlYXNpbmcgb3JkZXJcbiAgICAvLyBvZiB6LWluZGV4XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgbGV0IGhpdEVsZW1lbnRJbmRleCA9IEluZmluaXR5O1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50LmlkKSB7XG4gICAgICAgIGhpdEVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZWxlbWVudC5saW5rICYmXG4gICAgICAgIGlzUG9pbnRIaXR0aW5nTGlua0ljb24oXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldLFxuICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSxcbiAgICAgICAgKSAmJlxuICAgICAgICBpbmRleCA8PSBoaXRFbGVtZW50SW5kZXhcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWRpcmVjdFRvTGluayA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBpc1RvdWNoU2NyZWVuOiBib29sZWFuLFxuICApID0+IHtcbiAgICBjb25zdCBkcmFnZ2VkRGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgdGhpcy5sYXN0UG9pbnRlckRvd24hLmNsaWVudFgsXG4gICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WSxcbiAgICAgIHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WCxcbiAgICAgIHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WSxcbiAgICApO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmhpdExpbmtFbGVtZW50IHx8XG4gICAgICAvLyBGb3IgdG91Y2ggc2NyZWVuIGFsbG93IGRyYWdnaW5nIHRocmVzaG9sZCBlbHNlIHN0cmljdCBjaGVja1xuICAgICAgKGlzVG91Y2hTY3JlZW4gJiYgZHJhZ2dlZERpc3RhbmNlID4gRFJBR0dJTkdfVEhSRVNIT0xEKSB8fFxuICAgICAgKCFpc1RvdWNoU2NyZWVuICYmIGRyYWdnZWREaXN0YW5jZSAhPT0gMClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgdGhpcy5sYXN0UG9pbnRlckRvd24hLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyRG93bkhpdHRpbmdMaW5rSWNvbiA9IGlzUG9pbnRIaXR0aW5nTGlua0ljb24oXG4gICAgICB0aGlzLmhpdExpbmtFbGVtZW50ISxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICBbbGFzdFBvaW50ZXJEb3duQ29vcmRzLngsIGxhc3RQb2ludGVyRG93bkNvb3Jkcy55XSxcbiAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCEsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgW2xhc3RQb2ludGVyVXBDb29yZHMueCwgbGFzdFBvaW50ZXJVcENvb3Jkcy55XSxcbiAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSxcbiAgICApO1xuICAgIGlmIChsYXN0UG9pbnRlckRvd25IaXR0aW5nTGlua0ljb24gJiYgbGFzdFBvaW50ZXJVcEhpdHRpbmdMaW5rSWNvbikge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5oaXRMaW5rRWxlbWVudC5saW5rO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICBsZXQgY3VzdG9tRXZlbnQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uTGlua09wZW4pIHtcbiAgICAgICAgICBjdXN0b21FdmVudCA9IHdyYXBFdmVudChFVkVOVC5FWENBTElEUkFXX0xJTkssIGV2ZW50Lm5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uTGlua09wZW4odGhpcy5oaXRMaW5rRWxlbWVudCwgY3VzdG9tRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VzdG9tRXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0xvY2FsTGluayh1cmwpID8gXCJfc2VsZlwiIDogXCJfYmxhbmtcIjtcbiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSB3aW5kb3cub3Blbih1bmRlZmluZWQsIHRhcmdldCk7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmdpdGh1Yi5pby9yZWwtbm9vcGVuZXIvXG4gICAgICAgICAgaWYgKG5ld1dpbmRvdykge1xuICAgICAgICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgICAgICAgICBuZXdXaW5kb3cubG9jYXRpb24gPSBub3JtYWxpemVMaW5rKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuICAgIGlmIChcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMiAmJlxuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyICYmXG4gICAgICBpbml0aWFsU2NhbGUgJiZcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlXG4gICAgKSB7XG4gICAgICBjb25zdCBjZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBjb25zdCBkZWx0YVggPSBjZW50ZXIueCAtIGdlc3R1cmUubGFzdENlbnRlci54O1xuICAgICAgY29uc3QgZGVsdGFZID0gY2VudGVyLnkgLSBnZXN0dXJlLmxhc3RDZW50ZXIueTtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGNlbnRlcjtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpKTtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID1cbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiICYmIHRoaXMuc3RhdGUucGVuTW9kZVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcblxuICAgICAgY29uc3QgbmV4dFpvb20gPSBzY2FsZUZhY3RvclxuICAgICAgICA/IGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIHNjYWxlRmFjdG9yKVxuICAgICAgICA6IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgem9vbVN0YXRlID0gZ2V0U3RhdGVGb3Jab29tKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZpZXdwb3J0WDogY2VudGVyLngsXG4gICAgICAgICAgICB2aWV3cG9ydFk6IGNlbnRlci55LFxuICAgICAgICAgICAgbmV4dFpvb20sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHpvb206IHpvb21TdGF0ZS56b29tLFxuICAgICAgICAgIHNjcm9sbFg6IHpvb21TdGF0ZS5zY3JvbGxYICsgZGVsdGFYIC8gbmV4dFpvb20sXG4gICAgICAgICAgc2Nyb2xsWTogem9vbVN0YXRlLnNjcm9sbFkgKyBkZWx0YVkgLyBuZXh0Wm9vbSxcbiAgICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID1cbiAgICAgICAgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UgPVxuICAgICAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9XG4gICAgICAgICAgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoXG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgeyB4OiBzY2VuZVBvaW50ZXJYLCB5OiBzY2VuZVBvaW50ZXJZIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nXG4gICAgKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZWRpdGluZ0xpbmVhckVsZW1lbnQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSkpIHtcbiAgICAgIC8vIEhvdmVyaW5nIHdpdGggYSBzZWxlY3RlZCB0b29sIG9yIGNyZWF0aW5nIG5ldyBsaW5lYXIgZWxlbWVudCB2aWEgY2xpY2tcbiAgICAgIC8vIGFuZCBwb2ludFxuICAgICAgY29uc3QgeyBkcmFnZ2luZ0VsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIFtzY2VuZVBvaW50ZXJdLFxuICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSB9ID0gbXVsdGlFbGVtZW50O1xuXG4gICAgICBjb25zdCB7IHBvaW50cywgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG5cbiAgICAgIGlmIChsYXN0UG9pbnQgPT09IGxhc3RDb21taXR0ZWRQb2ludCkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IHlldCBjcmVhdGVkIGEgdGVtcCBwb2ludCBhbmQgd2UncmUgYmV5b25kIGNvbW1pdC16b25lXG4gICAgICAgIC8vIHRocmVzaG9sZCwgYWRkIGEgcG9pbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXJYIC0gcngsXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gcnksXG4gICAgICAgICAgICBsYXN0UG9pbnRbMF0sXG4gICAgICAgICAgICBsYXN0UG9pbnRbMV0sXG4gICAgICAgICAgKSA+PSBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgICAgLy8gaW4gdGhpcyBicmFuY2gsIHdlJ3JlIGluc2lkZSB0aGUgY29tbWl0IHpvbmUsIGFuZCBubyB1bmNvbW1pdHRlZFxuICAgICAgICAgIC8vIHBvaW50IGV4aXN0cy4gVGh1cyBkbyBub3RoaW5nIChkb24ndCBhZGQvcmVtb3ZlIHBvaW50cykuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHBvaW50cy5sZW5ndGggPiAyICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogcG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNQYXRoQUxvb3AocG9pbnRzLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgbGFzdCB1bmNvbW1pdHRlZCBwb2ludFxuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZXNlbGVjdGVkQnV0dG9uID0gQm9vbGVhbihldmVudC5idXR0b25zKTtcbiAgICBpZiAoXG4gICAgICBoYXNEZXNlbGVjdGVkQnV0dG9uIHx8XG4gICAgICAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInRleHRcIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcImVyYXNlclwiKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihcbiAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgIGhpdEVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuaGl0TGlua0VsZW1lbnQuaWRdXG4gICAgKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgc2hvd0h5cGVybGlua1Rvb2x0aXAodGhpcy5oaXRMaW5rRWxlbWVudCwgdGhpcy5zdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGVIeXBlcmxpbmtUb29saXAoKTtcbiAgICAgIGlmIChcbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICBoaXRFbGVtZW50LmxpbmsgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0gJiZcbiAgICAgICAgIXRoaXMuY29udGV4dE1lbnVPcGVuICYmXG4gICAgICAgICF0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IFwiaW5mb1wiIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICBzZXRDdXJzb3IoXG4gICAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICAgaXNUZXh0RWxlbWVudChoaXRFbGVtZW50KSA/IENVUlNPUl9UWVBFLlRFWFQgOiBDVVJTT1JfVFlQRS5DUk9TU0hBSVIsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQgJiZcbiAgICAgICAgICBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50LCB0aGlzLnN0YXRlLCBbXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgICAgIF0pXG4gICAgICAgICkge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gaWYgdXNpbmcgY21kL2N0cmwsIHdlJ3JlIG5vdCBkcmFnZ2luZ1xuICAgICAgICAhZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGhpdEVsZW1lbnQgfHxcbiAgICAgICAgICB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUVyYXNlciA9IChcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICAgc2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnRJZHMgPSAoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pID0+IHtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWRzVG9VcGRhdGUucHVzaChlbGVtZW50LmlkKTtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgaWRzVG9VcGRhdGU6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnksXG4gICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICk7XG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgcG9pbnQgPSB7IC4uLnBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcyB9O1xuICAgIGxldCBzYW1wbGluZ0ludGVydmFsID0gMDtcbiAgICB3aGlsZSAoc2FtcGxpbmdJbnRlcnZhbCA8PSBkaXN0YW5jZSkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTtcbiAgICAgIHVwZGF0ZUVsZW1lbnRJZHMoaGl0RWxlbWVudHMpO1xuXG4gICAgICAvLyBFeGl0IHNpbmNlIHdlIHJlYWNoZWQgY3VycmVudCBwb2ludFxuICAgICAgaWYgKHNhbXBsaW5nSW50ZXJ2YWwgPT09IGRpc3RhbmNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgbmV4dCBwb2ludCBpbiB0aGUgbGluZSBhdCBhIGRpc3RhbmNlIG9mIHNhbXBsaW5nIGludGVydmFsXG4gICAgICBzYW1wbGluZ0ludGVydmFsID0gTWF0aC5taW4oc2FtcGxpbmdJbnRlcnZhbCArIHRocmVzaG9sZCwgZGlzdGFuY2UpO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZVJhdGlvID0gc2FtcGxpbmdJbnRlcnZhbCAvIGRpc3RhbmNlO1xuICAgICAgY29uc3QgbmV4dFggPVxuICAgICAgICAoMSAtIGRpc3RhbmNlUmF0aW8pICogcG9pbnQueCArIGRpc3RhbmNlUmF0aW8gKiBzY2VuZVBvaW50ZXIueDtcbiAgICAgIGNvbnN0IG5leHRZID1cbiAgICAgICAgKDEgLSBkaXN0YW5jZVJhdGlvKSAqIHBvaW50LnkgKyBkaXN0YW5jZVJhdGlvICogc2NlbmVQb2ludGVyLnk7XG4gICAgICBwb2ludC54ID0gbmV4dFg7XG4gICAgICBwb2ludC55ID0gbmV4dFk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkubWFwKChlbGUpID0+IHtcbiAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiYgaWRzVG9VcGRhdGUuaW5jbHVkZXMoZWxlLmNvbnRhaW5lcklkKVxuICAgICAgICAgID8gZWxlLmNvbnRhaW5lcklkXG4gICAgICAgICAgOiBlbGUuaWQ7XG4gICAgICBpZiAoaWRzVG9VcGRhdGUuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtpZF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHsgb3BhY2l0eTogMjAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHNjZW5lUG9pbnRlci54O1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gc2NlbmVQb2ludGVyLnk7XG4gIH07XG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuICAgIHRoaXMubWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KTtcblxuICAgIC8vZmlyZXMgb25seSBvbmNlLCBpZiBwZW4gaXMgZGV0ZWN0ZWQsIHBlbk1vZGUgaXMgZW5hYmxlZFxuICAgIC8vdGhlIHVzZXIgY2FuIGRpc2FibGUgdGhpcyBieSB0b2dnbGluZyB0aGUgcGVuTW9kZSBidXR0b25cbiAgICBpZiAoIXRoaXMuc3RhdGUucGVuRGV0ZWN0ZWQgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbk1vZGU6IHRydWUsXG4gICAgICAgICAgcGVuRGV0ZWN0ZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5kZXZpY2VUeXBlLmlzVG91Y2hTY3JlZW4gJiZcbiAgICAgIFtcInBlblwiLCBcInRvdWNoXCJdLmluY2x1ZGVzKGV2ZW50LnBvaW50ZXJUeXBlKVxuICAgICkge1xuICAgICAgdGhpcy5kZXZpY2VUeXBlID0gdXBkYXRlT2JqZWN0KHRoaXMuZGV2aWNlVHlwZSwgeyBpc1RvdWNoU2NyZWVuOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQb2ludGVyRG93biA9IGV2ZW50O1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG4gICAgaWYgKFxuICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgb24gcG9pbnRlciBkb3duIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd09uUG9pbnRlckRvd24gPVxuICAgICAgIXRoaXMuc3RhdGUucGVuTW9kZSB8fFxuICAgICAgZXZlbnQucG9pbnRlclR5cGUgIT09IFwidG91Y2hcIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIjtcblxuICAgIGlmICghYWxsb3dPblBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIlxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAvLyByZXNldCBpbWFnZSBwcmV2aWV3IG9uIHBvaW50ZXJkb3duXG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkNST1NTSEFJUik7XG5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsLFxuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgICAgbXV0YXRlRWxlbWVudCh0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICB0aGlzLmhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24oXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwiZXJhc2VyXCIpIHtcbiAgICAgIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID1cbiAgICAgIHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9XG4gICAgICB0aGlzLm9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGNvbnN0IG9uS2V5RG93biA9IHRoaXMub25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcbiAgICBjb25zdCBvbktleVVwID0gdGhpcy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlclVwID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLmxhc3RQb2ludGVyVXAgPSBldmVudDtcbiAgICBpZiAodGhpcy5kZXZpY2VUeXBlLmlzVG91Y2hTY3JlZW4pIHtcbiAgICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH0sXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICk7XG4gICAgICB0aGlzLmhpdExpbmtFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24oXG4gICAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgICAgaGl0RWxlbWVudCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLmhpdExpbmtFbGVtZW50LmlkXVxuICAgICkge1xuICAgICAgdGhpcy5yZWRpcmVjdFRvTGluayhldmVudCwgdGhpcy5kZXZpY2VUeXBlLmlzVG91Y2hTY3JlZW4pO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlUG9pbnRlcihldmVudCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgICAgICBpZiAoIWludmFsaWRhdGVDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBUT1VDSF9DVFhfTUVOVV9USU1FT1VUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldENvbnRleHRNZW51VGltZXIgPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlQ2xlYW51cEFmdGVyTWlzc2luZ1BvaW50ZXJVcChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGxhc3RQb2ludGVyVXAgIT09IG51bGwpIHtcbiAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHNvbWV0aW1lcyB3ZSBkb24ndCBnZXQgYSBwb2ludGVydXAgYWZ0ZXIgYSBwb2ludGVyZG93bixcbiAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29udGV4dHVhbCBtZW51IG9yIGFsZXJ0IGlzIHRyaWdnZXJlZC4gSW4gb3JkZXIgdG8gYXZvaWRcbiAgICAgIC8vIGJlaW5nIGluIGEgd2VpcmQgc3RhdGUsIHdlIGNsZWFuIHVwIG9uIHRoZSBuZXh0IHBvaW50ZXJkb3duXG4gICAgICBsYXN0UG9pbnRlclVwKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgcGFubmluZ1xuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwICYmXG4gICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLldIRUVMIHx8XG4gICAgICAgICAgKGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBpc0hvbGRpbmdTcGFjZSkgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZClcbiAgICAgICkgfHxcbiAgICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5cbiAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICBsZXQgeyBjbGllbnRYOiBsYXN0WCwgY2xpZW50WTogbGFzdFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgLypcbiAgICAgICAqIFByZXZlbnQgcGFzdGUgZXZlbnQgaWYgd2UgbW92ZSB3aGlsZSBtaWRkbGUgY2xpY2tpbmcgb24gTGludXguXG4gICAgICAgKiBTZWUgaXNzdWUgIzEzODMuXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgaXNMaW51eCAmJlxuICAgICAgICAhbmV4dFBhc3RlUHJldmVudGVkICYmXG4gICAgICAgIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSlcbiAgICAgICkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8qIFByZXZlbnQgdGhlIG5leHQgcGFzdGUgZXZlbnQgKi9cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlnaHQgY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVuYWJsZU5leHRQYXN0ZSA9ICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGRlbHRhWCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZGVsdGFZIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgICAobGFzdFBvaW50ZXJVcCA9ICgpID0+IHtcbiAgICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICAgICAgb25Qb2ludGVyTW92ZS5mbHVzaCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKFxuICAgICAgICBnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSxcbiAgICAgICksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKFxuICAgICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gZHVwbGljYXRlIGJlY2F1c2Ugd2UnbGwgYmUgdXBkYXRpbmcgdGhpcyBzdGF0ZVxuICAgICAgbGFzdENvb3JkczogeyAuLi5vcmlnaW4gfSxcbiAgICAgIG9yaWdpbmFsRWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkgYXMgUG9pbnRlckRvd25TdGF0ZVtcIm9yaWdpbmFsRWxlbWVudHNcIl0pLFxuICAgICAgcmVzaXplOiB7XG4gICAgICAgIGhhbmRsZVR5cGU6IGZhbHNlLFxuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIsXG4gICAgICAgIGNlbnRlcjogeyB4OiAobWF4WCArIG1pblgpIC8gMiwgeTogKG1heFkgKyBtaW5ZKSAvIDIgfSxcbiAgICAgIH0sXG4gICAgICBoaXQ6IHtcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgYWxsSGl0RWxlbWVudHM6IFtdLFxuICAgICAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czpcbiAgICAgICAgICB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICApLFxuICAgICAgICBoYXNIaXRFbGVtZW50SW5zaWRlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBkcmFnOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGJveFNlbGVjdGlvbjoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZWxlbWVudElkc1RvRXJhc2U6IHt9LFxuICAgIH07XG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgZHJhZ2dpbmcgYSBzY3JvbGxiYXJcbiAgcHJpdmF0ZSBoYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJFaXRoZXIgJiYgIXRoaXMuc3RhdGUubXVsdGlFbGVtZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gdHJ1ZTtcbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgICBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gZmFsc2U7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICAgIG9uUG9pbnRlck1vdmUuZmx1c2goKTtcbiAgICB9KTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdGlvbklmTm90VXNpbmdTZWxlY3Rpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHBvaW50ZXIgZXZlbnQgaGFzIGJlZW4gY29tcGxldGVseSBoYW5kbGVkXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbk9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSA9XG4gICAgICAgICAgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nRWxlbWVudDogZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLmVsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9XG4gICAgICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKFxuICAgICAgICAgIGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldFJlc2l6ZU9mZnNldFhZKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiZcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLnBvaW50cy5sZW5ndGggPT09IDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIChhcHBTdGF0ZSkgPT4gdGhpcy5zZXRTdGF0ZShhcHBTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGl0RWxlbWVudCBtYXkgYWxyZWFkeSBiZSBzZXQgYWJvdmUsIHNvIGNoZWNrIGZpcnN0XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPz9cbiAgICAgICAgICB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKTtcblxuICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgIC8vIEVhcmx5IHJldHVybiBpZiBwb2ludGVyIGlzIGhpdHRpbmcgbGluayBpY29uXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNQb2ludEhpdHRpbmdMaW5rSWNvbihcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnldLFxuICAgICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUgPVxuICAgICAgICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgY29uc3Qgc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkID1cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIElmIHdlIGNsaWNrIG9uIHNvbWV0aGluZ1xuICAgICAgICB9IGVsc2UgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGhpdEVsZW1lbnQubGluayA/IFwiaW5mb1wiIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBpc0FTZWxlY3RlZEVsZW1lbnQoaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXTtcbiAgfVxuXG4gIHByaXZhdGUgaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoXG4gICAgcG9pbnQ6IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4sXG4gICAgc2VsZWN0ZWRFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IHBpeGVscyBvZmYgdGhlIHNoYXBlIGJvdW5kYXJ5IHdlIHN0aWxsIGNvbnNpZGVyIGEgaGl0XG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgcG9pbnQueCA+IHgxIC0gdGhyZXNob2xkICYmXG4gICAgICBwb2ludC54IDwgeDIgKyB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPiB5MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueSA8IHkyICsgdGhyZXNob2xkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVGV4dE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gaWYgd2UncmUgY3VycmVudGx5IHN0aWxsIGVkaXRpbmcgdGV4dCwgY2xpY2tpbmcgb3V0c2lkZVxuICAgIC8vIHNob3VsZCBvbmx5IGZpbmFsaXplIGl0LCBub3QgY3JlYXRlIGFub3RoZXIgKGlycmVzcGVjdGl2ZVxuICAgIC8vIG9mIHN0YXRlLmVsZW1lbnRMb2NrZWQpXG4gICAgaWYgKGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNjZW5lWCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLng7XG4gICAgbGV0IHNjZW5lWSA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSwge1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICBzY2VuZVggPSBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9XG4gICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWSxcbiAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXksXG4gICAgfSk7XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkgPT4ge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHJlc3N1cmVzID0gZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgICA/IGVsZW1lbnQucHJlc3N1cmVzXG4gICAgICA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBwb2ludHM6IFtbMCwgMF1dLFxuICAgICAgcHJlc3N1cmVzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICB0aGlzLnNjZW5lLFxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIGVsZW1lbnQsXG4gICAgXSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUVsZW1lbnQgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gIH06IHtcbiAgICBzY2VuZVg6IG51bWJlcjtcbiAgICBzY2VuZVk6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHNjZW5lWCwgc2NlbmVZLCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdJbWFnZUVsZW1lbnQoe1xuICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIC8vIGZpbmFsaXplIGlmIGNvbXBsZXRpbmcgYSBsb29wXG4gICAgICBpZiAoXG4gICAgICAgIG11bHRpRWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICBpc1BhdGhBTG9vcChtdWx0aUVsZW1lbnQucG9pbnRzLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB4OiByeCwgeTogcnksIGxhc3RDb21taXR0ZWRQb2ludCB9ID0gbXVsdGlFbGVtZW50O1xuXG4gICAgICAvLyBjbGlja2luZyBpbnNpZGUgY29tbWl0IHpvbmUg4oaSIGZpbmFsaXplIGFycm93XG4gICAgICBpZiAoXG4gICAgICAgIG11bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoID4gMSAmJlxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQgJiZcbiAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHJ5LFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFswXSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMV0sXG4gICAgICAgICkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICBbbXVsdGlFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIGNsaWNraW5nIG91dHNpZGUgY29tbWl0IHpvbmUg4oaSIHVwZGF0ZSByZWZlcmVuY2UgZm9yIGxhc3QgY29tbWl0dGVkXG4gICAgICAvLyBwb2ludFxuICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICB9KTtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcblxuICAgICAgLyogSWYgYXJyb3cgaXMgcHJlLWFycm93aGVhZHMsIGl0IHdpbGwgaGF2ZSB1bmRlZmluZWQgZm9yIGJvdGggc3RhcnQgYW5kIGVuZCBhcnJvd2hlYWRzLlxuICAgICAgSWYgc28sIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3Igc3RhcnQgYW5kIFwiYXJyb3dcIiBmb3IgZW5kLiBJZiB0aGUgbGluZWFyIGl0ZW0gaXMgbm90XG4gICAgICBhbiBhcnJvdywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBib3RoLiBPdGhlcndpc2UsIHdlIHdhbnQgaXQgdG8gdXNlIHRoZVxuICAgICAgdmFsdWVzIGZyb20gYXBwU3RhdGUuICovXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBbc3RhcnRBcnJvd2hlYWQsIGVuZEFycm93aGVhZF0gPVxuICAgICAgICBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiXG4gICAgICAgICAgPyBbY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRdXG4gICAgICAgICAgOiBbbnVsbCwgbnVsbF07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHg6IGdyaWRYLFxuICAgICAgICB5OiBncmlkWSxcbiAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBbLi4uZWxlbWVudC5wb2ludHMsIFswLCAwXV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICApO1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBQcmV2ZW50cyBmb2N1cyBmcm9tIGVzY2FwaW5nIGV4Y2FsaWRyYXcgdGFiXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuQUxUICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuXG4gICAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcmFzZXIoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUsIHBvaW50ZXJDb29yZHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG5cbiAgICAgIC8vIGZvciBhcnJvd3MvbGluZXMsIGRvbid0IHN0YXJ0IGRyYWdnaW5nIHVudGlsIGEgZ2l2ZW4gdGhyZXNob2xkXG4gICAgICAvLyB0byBlbnN1cmUgd2UgZG9uJ3QgY3JlYXRlIGEgMi1wb2ludCBhcnJvdyBieSBtaXN0YWtlIHdoZW5cbiAgICAgIC8vIHVzZXIgY2xpY2tzIG1vdXNlIGluIGEgd2F5IHRoYXQgaXQgbW92ZXMgYSB0aW55IGJpdCAodGh1c1xuICAgICAgLy8gdHJpZ2dlcmluZyBwb2ludGVybW92ZSlcbiAgICAgIGlmIChcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJsaW5lXCIpXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApIDwgRFJBR0dJTkdfVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZykge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBwb2ludHNTY2VuZUNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGlkRHJhZykge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNIaXRBU2VsZWN0ZWRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMuc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+IHRoaXMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICAoaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSAmJlxuICAgICAgICAvLyB0aGlzIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgd2hlbiBjbGlja2luZyBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGxpbmUncyBib3VuZGluZyBib3hcbiAgICAgICAgKCF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFldmVudC5zaGlmdEtleSkgJiZcbiAgICAgICAgLy8gYm94LXNlbGVjdGluZyB3aXRob3V0IHNoaWZ0IHdoZW4gZWRpdGluZyBsaW5lLCBub3QgY2xpY2tpbmcgb24gYSBsaW5lXG4gICAgICAgICghdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmVsZW1lbnRJZCAhPT1cbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ/LmlkIHx8XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSlcbiAgICAgICkge1xuICAgICAgICAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCAmJiAhcG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsKSB7XG4gICAgICAgICAgY29uc3QgW2RyYWdYLCBkcmFnWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbXG4gICAgICAgICAgICBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54KSxcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBXZSBvbmx5IGRyYWcgaW4gb25lIGRpcmVjdGlvbiBpZiBzaGlmdCBpcyBwcmVzc2VkXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgICAgICAgZHJhZ1NlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdYLFxuICAgICAgICAgICAgZHJhZ1ksXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgICAgLy8gV2UgZHVwbGljYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlmIGFsdCBpcyBwcmVzc2VkIG9uIHBvaW50ZXIgbW92ZVxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcblxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9BcHBlbmQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHM6IEFycmF5PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+ID1cbiAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgdGhpcy5zdGF0ZSwgdHJ1ZSkubWFwKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dEVsZW1lbnRzLFxuICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLFxuICAgICAgICAgICAgICBvbGRJZFRvRHVwbGljYXRlZElkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dFNjZW5lRWxlbWVudHMsXG4gICAgICAgICAgICAgIGVsZW1lbnRzVG9BcHBlbmQsXG4gICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQsXG4gICAgICAgICAgICAgIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byByZWFkIHRoaXMuc3RhdGUgd2l0aGluIGVhY2ggbW92ZSBldmVudCxcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCByZWFkIGEgc3RhbGUgb25lIVxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzLmxlbmd0aCA+IDAgJiYgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBvaW50ID1cbiAgICAgICAgICBsYXN0UG9pbnQgJiYgbGFzdFBvaW50WzBdID09PSBkeCAmJiBsYXN0UG9pbnRbMV0gPT09IGR5O1xuXG4gICAgICAgIGlmICghZGlzY2FyZFBvaW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgICAgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBkeSxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHsgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2R4LCBkeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoXG4gICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBbcG9pbnRlckNvb3Jkc10sXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXJ0Qm91bmRFbGVtZW50LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFldmVudC5zaGlmdEtleSAmJlxuICAgICAgICAgIC8vIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgKHdpdGhvdXQgc2hpZnQpXG4gICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICAgICBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIHRoaXMuc3RhdGUpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYm94LXNlbGVjdCBsaW5lIGVkaXRvciBwb2ludHNcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZUJveFNlbGVjdGlvbihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHJlZ3VsYXIgYm94LXNlbGVjdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uID0gZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24oXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKChtYXAsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgIH0sIHt9IGFzIGFueSksXG4gICAgICAgICAgICAgICAgICAuLi4ocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzaW5nIGN0cmwvY21kLCBzZWxlY3QgdGhlIGhpdEVsZW1lbnQgb25seSBpZiB3ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQuaWRdOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDpcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb25bMF0ubGlua1xuICAgICAgICAgICAgICAgICAgICA/IFwiaW5mb1wiXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChjaGlsZEV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGlzUmVzaXppbmcsXG4gICAgICAgIGlzUm90YXRpbmcsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2UsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogbnVsbCxcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIC8vIHRleHQgZWxlbWVudHMgYXJlIHJlc2V0IG9uIGZpbmFsaXplLCBhbmQgcmVzZXR0aW5nIG9uIHBvaW50ZXJ1cFxuICAgICAgICAvLyBtYXkgY2F1c2UgaXNzdWVzIHdpdGggZG91YmxlIHRhcHNcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6XG4gICAgICAgICAgbXVsdGlFbGVtZW50IHx8IGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICAgICAgICAgID8gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudFxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoY2hpbGRFdmVudC5jbGllbnRYLCBjaGlsZEV2ZW50LmNsaWVudFksIFwidXBcIik7XG5cbiAgICAgIC8vIEhhbmRsZSBlbmQgb2YgZHJhZ2dpbmcgYSBwb2ludCBvZiBhIGxpbmVhciBlbGVtZW50LCBtaWdodCBjbG9zZSBhIGxvb3BcbiAgICAgIC8vIGFuZCBzZXRzIGJpbmRpbmcgZWxlbWVudFxuICAgICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAgIChwb2ludGVyRG93blN0YXRlLmhpdD8uZWxlbWVudD8uaWQgIT09XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCB8fFxuICAgICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKFxuICAgICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlLmZsdXNoKCk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5QT0lOVEVSX01PVkUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9VUCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZRE9XTixcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24hLFxuICAgICAgKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5LRVlVUCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwISxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQ/LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBsZXQgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgLy8gQWxsb3dzIGRvdHMgdG8gYXZvaWQgYmVpbmcgZmxhZ2dlZCBhcyBpbmZpbml0ZWx5IHNtYWxsXG4gICAgICAgIGlmIChkeCA9PT0gcG9pbnRzWzBdWzBdICYmIGR5ID09PSBwb2ludHNbMF1bMV0pIHtcbiAgICAgICAgICBkeSArPSAwLjAwMDE7XG4gICAgICAgICAgZHggKz0gMC4wMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgY2hpbGRFdmVudC5wcmVzc3VyZV07XG5cbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICBwcmVzc3VyZXMsXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBbZHgsIGR5XSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IGRyYWdnaW5nRWxlbWVudDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgICAgeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICAgIHRoaXMuc2NlbmVcbiAgICAgICAgICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbC5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50IS5wb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCAmJlxuICAgICAgICAgICFtdWx0aUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgICAuLi5kcmFnZ2luZ0VsZW1lbnQucG9pbnRzLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50LngsXG4gICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50LnksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbXVsdGlFbGVtZW50OiBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudDogdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICAgICAgICBpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10sIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsIH0pO1xuICAgICAgICAgIGlmICghZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCAmJlxuICAgICAgICBpc0ludmlzaWJseVNtYWxsRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVtb3ZlIGludmlzaWJsZSBlbGVtZW50IHdoaWNoIHdhcyBhZGRlZCBpbiBvblBvaW50ZXJEb3duXG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuc2xpY2UoMCwgLTEpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoZHJhZ2dpbmdFbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQgJiYgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQocmVzaXppbmdFbGVtZW50KSkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbC5pZCAhPT0gcmVzaXppbmdFbGVtZW50LmlkKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29kZSBiZWxvdyBoYW5kbGVzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnQocykgd2VyZW4ndFxuICAgICAgLy8gZHJhZyBvciBhZGRlZCB0byBzZWxlY3Rpb24gb24gcG9pbnRlciBkb3duIHBoYXNlLlxuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgY29uc3QgZHJhZ2dlZERpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WCxcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WSxcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLmNsaWVudFgsXG4gICAgICAgICAgdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRZLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkcmFnZ2VkRGlzdGFuY2UgPT09IDApIHtcbiAgICAgICAgICBjb25zdCBzY2VuZVBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WCxcbiAgICAgICAgICAgICAgY2xpZW50WTogdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRZLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgICAgICAgc2NlbmVQb2ludGVyLnksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSBoaXRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXJhc2VFbGVtZW50cyhwb2ludGVyRG93blN0YXRlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiAmJlxuICAgICAgICAvLyBpZiB3ZSdyZSBlZGl0aW5nIGEgbGluZSwgcG9pbnRlcnVwIHNob3VsZG4ndCBzd2l0Y2ggc2VsZWN0aW9uIGlmXG4gICAgICAgIC8vIGJveCBzZWxlY3RlZFxuICAgICAgICAoIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHxcbiAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQpXG4gICAgICApIHtcbiAgICAgICAgLy8gd2hlbiBpbnNpZGUgbGluZSBlZGl0b3IsIHNoaWZ0IHNlbGVjdHMgcG9pbnRzIGluc3RlYWRcbiAgICAgICAgaWYgKGNoaWxkRXZlbnQuc2hpZnRLZXkgJiYgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkVmlhR3JvdXAodGhpcy5zdGF0ZSwgaGl0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1bnNlbGVjdCBhbGwgZ3JvdXBzIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBncm91cHNcbiAgICAgICAgICAgICAgLy8gaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIGNvbnN0IGlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyA9IGhpdEVsZW1lbnQuZ3JvdXBJZHNcbiAgICAgICAgICAgICAgICAuZmxhdE1hcCgoZ3JvdXBJZCkgPT5cbiAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRzSW5Hcm91cCh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIGdyb3VwSWQpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiAoeyBbZWxlbWVudC5pZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZJZCwgYWNjKSA9PiAoeyAuLi5wcmV2SWQsIC4uLmFjYyB9KSwge30pO1xuXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge1xuICAgICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5oaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGdJZCkgPT4gKHsgW2dJZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChwcmV2LCBhY2MpID0+ICh7IC4uLnByZXYsIC4uLmFjYyB9KSwge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudCEuaWRdOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcblxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3ByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2hpdEVsZW1lbnQuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nICYmXG4gICAgICAgICgoaGl0RWxlbWVudCAmJlxuICAgICAgICAgIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChcbiAgICAgICAgICAgIGhpdEVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSkgfHxcbiAgICAgICAgICAoIWhpdEVsZW1lbnQgJiZcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSlcbiAgICAgICkge1xuICAgICAgICAvLyBEZXNlbGVjdCBzZWxlY3RlZCBlbGVtZW50c1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiICYmIGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiIHx8XG4gICAgICAgIGlzU29tZUVsZW1lbnRTZWxlY3RlZCh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkIHx8IGlzUmVzaXppbmcgfHwgaXNSb3RhdGluZykge1xuICAgICAgICAoaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKFxuICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlcmFzZUVsZW1lbnRzID0gKHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUpID0+IHtcbiAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5tYXAoKGVsZSkgPT4ge1xuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaGl0RWxlbWVudCAmJiBlbGUuaWQgPT09IGhpdEVsZW1lbnQuaWQpIHtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwgeyBpc0RlbGV0ZWQ6IHRydWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc0JvdW5kVG9Db250YWluZXIoZWxlKSAmJlxuICAgICAgICAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdIHx8XG4gICAgICAgICAgKGhpdEVsZW1lbnQgJiYgZWxlLmNvbnRhaW5lcklkID09PSBoaXRFbGVtZW50LmlkKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUltYWdlID0gYXN5bmMgKHtcbiAgICBpbWFnZUZpbGUsXG4gICAgaW1hZ2VFbGVtZW50OiBfaW1hZ2VFbGVtZW50LFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZSxcbiAgfToge1xuICAgIGltYWdlRmlsZTogRmlsZTtcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ7XG4gICAgc2hvd0N1cnNvckltYWdlUHJldmlldz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICAvLyBhdCB0aGlzIHBvaW50IHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgaW1hZ2UgZmlsZSwgYnV0IHdlIGRvIHRoaXMgY2hlY2tcbiAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGltYWdlRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnVuc3VwcG9ydGVkRmlsZVR5cGVcIikpO1xuICAgIH1cbiAgICBjb25zdCBtaW1lVHlwZSA9IGltYWdlRmlsZS50eXBlO1xuXG4gICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBcIndhaXRcIik7XG5cbiAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWFnZUZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoXG4gICAgICAgICAgYXdhaXQgbm9ybWFsaXplU1ZHKGF3YWl0IGltYWdlRmlsZS50ZXh0KCkpLFxuICAgICAgICAgIGltYWdlRmlsZS5uYW1lLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5zdmdJbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZW5lcmF0ZSBpbWFnZSBpZCAoYnkgZGVmYXVsdCB0aGUgZmlsZSBkaWdlc3QpIGJlZm9yZSBhbnlcbiAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcbiAgICBjb25zdCBmaWxlSWQgPSBhd2FpdCAoKHRoaXMucHJvcHMuZ2VuZXJhdGVJZEZvckZpbGU/LihcbiAgICAgIGltYWdlRmlsZSxcbiAgICApIGFzIFByb21pc2U8RmlsZUlkPikgfHwgZ2VuZXJhdGVJZEZyb21GaWxlKGltYWdlRmlsZSkpO1xuXG4gICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDb3VsZG4ndCBnZW5lcmF0ZSBmaWxlIGlkIG9yIHRoZSBzdXBwbGllZCBgZ2VuZXJhdGVJZEZvckZpbGVgIGRpZG4ndCByZXNvbHZlIHRvIG9uZS5cIixcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0ZpbGVEYXRhID0gdGhpcy5maWxlc1tmaWxlSWRdO1xuICAgIGlmICghZXhpc3RpbmdGaWxlRGF0YT8uZGF0YVVSTCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1hZ2VGaWxlID0gYXdhaXQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciB0cnlpbmcgdG8gcmVzaW5nIGltYWdlIGZpbGUgb24gaW5zZXJ0aW9uXCIsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgdChcImVycm9ycy5maWxlVG9vQmlnXCIsIHtcbiAgICAgICAgICAgIG1heFNpemU6IGAke01hdGgudHJ1bmMoTUFYX0FMTE9XRURfRklMRV9CWVRFUyAvIDEwMjQgLyAxMDI0KX1NQmAsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkw7XG4gICAgICAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGZ1bGwtc2l6ZSBmaWxlIGZvciBjdXJzb3IgcHJldmlld1xuICAgICAgLy8gKGl0J3MgbXVjaCBmYXN0ZXIgdG8gY29udmVydCB0aGUgcmVzaXplZCBkYXRhVVJMIHRvIEZpbGUpXG4gICAgICBjb25zdCByZXNpemVkRmlsZSA9IGRhdGFVUkwgJiYgZGF0YVVSTFRvRmlsZShkYXRhVVJMKTtcblxuICAgICAgdGhpcy5zZXRJbWFnZVByZXZpZXdDdXJzb3IocmVzaXplZEZpbGUgfHwgaW1hZ2VGaWxlKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVVJMID1cbiAgICAgIHRoaXMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTCB8fCAoYXdhaXQgZ2V0RGF0YVVSTChpbWFnZUZpbGUpKTtcblxuICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG11dGF0ZUVsZW1lbnQoXG4gICAgICBfaW1hZ2VFbGVtZW50LFxuICAgICAge1xuICAgICAgICBmaWxlSWQsXG4gICAgICB9LFxuICAgICAgZmFsc2UsXG4gICAgKSBhcyBOb25EZWxldGVkPEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudD47XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Tm9uRGVsZXRlZDxJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+PihcbiAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbGVzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5maWxlcyxcbiAgICAgICAgICAgIFtmaWxlSWRdOiB7XG4gICAgICAgICAgICAgIG1pbWVUeXBlLFxuICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNhY2hlZEltYWdlRGF0YSA9IHRoaXMuaW1hZ2VDYWNoZS5nZXQoZmlsZUlkKTtcbiAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgY2FjaGVkSW1hZ2VEYXRhLmltYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50Py5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShpbWFnZUVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIikpKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoIXNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogaW5zZXJ0cyBpbWFnZSBpbnRvIGVsZW1lbnRzIGFycmF5IGFuZCByZXJlbmRlcnNcbiAgICovXG4gIHByaXZhdGUgaW5zZXJ0SW1hZ2VFbGVtZW50ID0gYXN5bmMgKFxuICAgIGltYWdlRWxlbWVudDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgICBpbWFnZUZpbGU6IEZpbGUsXG4gICAgc2hvd0N1cnNvckltYWdlUHJldmlldz86IGJvb2xlYW4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICBpbWFnZUVsZW1lbnQsXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplSW1hZ2Uoe1xuICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgIGltYWdlRWxlbWVudCxcbiAgICAgICAgc2hvd0N1cnNvckltYWdlUHJldmlldyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIGlzRGVsZXRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCB0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIiksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRJbWFnZVByZXZpZXdDdXJzb3IgPSBhc3luYyAoaW1hZ2VGaWxlOiBGaWxlKSA9PiB7XG4gICAgLy8gbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiAxMjggcHhcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX0Jhc2ljX1VzZXJfSW50ZXJmYWNlL1VzaW5nX1VSTF92YWx1ZXNfZm9yX3RoZV9jdXJzb3JfcHJvcGVydHlcbiAgICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDk2O1xuXG4gICAgY29uc3QgaW1hZ2VQcmV2aWV3ID0gYXdhaXQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgbWF4V2lkdGhPckhlaWdodDogY3Vyc29ySW1hZ2VTaXplUHgsXG4gICAgfSk7XG5cbiAgICBsZXQgcHJldmlld0RhdGFVUkwgPSBhd2FpdCBnZXREYXRhVVJMKGltYWdlUHJldmlldyk7XG5cbiAgICAvLyBTVkcgY2Fubm90IGJlIHJlc2l6ZWQgdmlhIGByZXNpemVJbWFnZUZpbGVgIHNvIHdlIHJlc2l6ZSBieSByZW5kZXJpbmcgdG9cbiAgICAvLyBhIHNtYWxsIGNhbnZhc1xuICAgIGlmIChpbWFnZUZpbGUudHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgIGNvbnN0IGltZyA9IGF3YWl0IGxvYWRIVE1MSW1hZ2VFbGVtZW50KHByZXZpZXdEYXRhVVJMKTtcblxuICAgICAgbGV0IGhlaWdodCA9IE1hdGgubWluKGltZy5oZWlnaHQsIGN1cnNvckltYWdlU2l6ZVB4KTtcbiAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KTtcblxuICAgICAgaWYgKHdpZHRoID4gY3Vyc29ySW1hZ2VTaXplUHgpIHtcbiAgICAgICAgd2lkdGggPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoaW1nLmhlaWdodCAvIGltZy53aWR0aCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG5cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgIHByZXZpZXdEYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pIDQgNCwgYXV0b2ApO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uSW1hZ2VBY3Rpb24gPSBhc3luYyAoXG4gICAgeyBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5IH0gPSB7IGluc2VydE9uQ2FudmFzRGlyZWN0bHk6IGZhbHNlIH0sXG4gICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGllbnRYID0gdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgICBjb25zdCBjbGllbnRZID0gdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICB7IGNsaWVudFgsIGNsaWVudFkgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlRmlsZSA9IGF3YWl0IGZpbGVPcGVuKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgZXh0ZW5zaW9uczogW1wianBnXCIsIFwicG5nXCIsIFwic3ZnXCIsIFwiZ2lmXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICBzY2VuZVk6IHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChcbiAgICAgICAgICAgICAgaW1hZ2VFbGVtZW50LFxuICAgICAgICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgICAgICAgIC8qIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgKi8gdHJ1ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMgPSAoXG4gICAgaW1hZ2VFbGVtZW50OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICAgIGZvcmNlTmF0dXJhbFNpemUgPSBmYWxzZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgaW1hZ2UgPVxuICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQpICYmXG4gICAgICB0aGlzLmltYWdlQ2FjaGUuZ2V0KGltYWdlRWxlbWVudC5maWxlSWQpPy5pbWFnZTtcblxuICAgIGlmICghaW1hZ2UgfHwgaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSAmJlxuICAgICAgICBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJTaXplID0gMTAwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICAgIHg6IGltYWdlRWxlbWVudC54IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB5OiBpbWFnZUVsZW1lbnQueSAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgd2lkdGg6IHBsYWNlaG9sZGVyU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyU2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmb3JjZU5hdHVyYWxTaXplIHx8XG4gICAgICAvLyBpZiB1c2VyLWNyZWF0ZWQgYm91bmRpbmcgYm94IGlzIGJlbG93IHRocmVzaG9sZCwgYXNzdW1lIHRoZVxuICAgICAgLy8gaW50ZW50aW9uIHdhcyB0byBjbGljayBpbnN0ZWFkIG9mIGRyYWcsIGFuZCB1c2UgdGhlIGltYWdlJ3NcbiAgICAgIC8vIGludHJpbnNpYyBzaXplXG4gICAgICAoaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlICYmXG4gICAgICAgIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUpXG4gICAgKSB7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBNYXRoLm1heCh0aGlzLnN0YXRlLmhlaWdodCAtIDEyMCwgMTYwKTtcbiAgICAgIC8vIG1heCA2NSUgb2YgY2FudmFzIGhlaWdodCwgY2xhbXBlZCB0byA8MzAwcHgsIHZoIC0gMTIwcHg+XG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1pbihcbiAgICAgICAgbWluSGVpZ2h0LFxuICAgICAgICBNYXRoLmZsb29yKHRoaXMuc3RhdGUuaGVpZ2h0ICogMC41KSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKGltYWdlLm5hdHVyYWxIZWlnaHQsIG1heEhlaWdodCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGhlaWdodCAqIChpbWFnZS5uYXR1cmFsV2lkdGggLyBpbWFnZS5uYXR1cmFsSGVpZ2h0KTtcblxuICAgICAgLy8gYWRkIGN1cnJlbnQgaW1hZ2VFbGVtZW50IHdpZHRoL2hlaWdodCB0byBhY2NvdW50IGZvciBwcmV2aW91cyBjZW50ZXJpbmdcbiAgICAgIC8vIG9mIHRoZSBwbGFjZWhvbGRlciBpbWFnZVxuICAgICAgY29uc3QgeCA9IGltYWdlRWxlbWVudC54ICsgaW1hZ2VFbGVtZW50LndpZHRoIC8gMiAtIHdpZHRoIC8gMjtcbiAgICAgIGNvbnN0IHkgPSBpbWFnZUVsZW1lbnQueSArIGltYWdlRWxlbWVudC5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcblxuICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIHVwZGF0ZXMgaW1hZ2UgY2FjaGUsIHJlZnJlc2hpbmcgdXBkYXRlZCBlbGVtZW50cyBhbmQvb3Igc2V0dGluZyBzdGF0dXNcbiAgICAgIHRvIGVycm9yIGZvciBpbWFnZXMgdGhhdCBmYWlsIGR1cmluZyA8aW1nPiBlbGVtZW50IGNyZWF0aW9uICovXG4gIHByaXZhdGUgdXBkYXRlSW1hZ2VDYWNoZSA9IGFzeW5jIChcbiAgICBlbGVtZW50czogcmVhZG9ubHkgSW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W10sXG4gICAgZmlsZXMgPSB0aGlzLmZpbGVzLFxuICApID0+IHtcbiAgICBjb25zdCB7IHVwZGF0ZWRGaWxlcywgZXJyb3JlZEZpbGVzIH0gPSBhd2FpdCBfdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgICBpbWFnZUNhY2hlOiB0aGlzLmltYWdlQ2FjaGUsXG4gICAgICBmaWxlSWRzOiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkKSxcbiAgICAgIGZpbGVzLFxuICAgIH0pO1xuICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSB8fCBlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGlmICh1cGRhdGVkRmlsZXMuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9yZWRGaWxlcy5zaXplKSB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmXG4gICAgICAgICAgICBlcnJvcmVkRmlsZXMuaGFzKGVsZW1lbnQuZmlsZUlkKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB1cGRhdGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9O1xuICB9O1xuXG4gIC8qKiBhZGRzIG5ldyBpbWFnZXMgdG8gaW1hZ2VDYWNoZSBhbmQgcmUtcmVuZGVycyBpZiBuZWVkZWQgKi9cbiAgcHJpdmF0ZSBhZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUgPSBhc3luYyAoXG4gICAgaW1hZ2VFbGVtZW50czogSW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W10gPSBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgKSxcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgPSB0aGlzLmZpbGVzLFxuICApID0+IHtcbiAgICBjb25zdCB1bmNhY2hlZEltYWdlRWxlbWVudHMgPSBpbWFnZUVsZW1lbnRzLmZpbHRlcihcbiAgICAgIChlbGVtZW50KSA9PiAhZWxlbWVudC5pc0RlbGV0ZWQgJiYgIXRoaXMuaW1hZ2VDYWNoZS5oYXMoZWxlbWVudC5maWxlSWQpLFxuICAgICk7XG5cbiAgICBpZiAodW5jYWNoZWRJbWFnZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyB1cGRhdGVkRmlsZXMgfSA9IGF3YWl0IHRoaXMudXBkYXRlSW1hZ2VDYWNoZShcbiAgICAgICAgdW5jYWNoZWRJbWFnZUVsZW1lbnRzLFxuICAgICAgICBmaWxlcyxcbiAgICAgICk7XG4gICAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5pbmZvcm1NdXRhdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiogZ2VuZXJhbGx5IHlvdSBzaG91bGQgdXNlIGBhZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKWAgZGlyZWN0bHkgaWYgeW91IG5lZWRcbiAgICogIHRvIHJlbmRlciBuZXcgaW1hZ2VzLiBUaGlzIGlzIGp1c3QgYSBmYWlsc2FmZSAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZUltYWdlUmVmcmVzaCA9IHRocm90dGxlKCgpID0+IHtcbiAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9LCBJTUFHRV9SRU5ERVJfVElNRU9VVCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEVuYWJsZUJpbmRpbmcgPSBzaG91bGRFbmFibGVCaW5kaW5nRm9yUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZyB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3IgPSAocG9pbnRlckNvb3Jkczoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0pOiB2b2lkID0+IHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOlxuICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF0gOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzID0gKFxuICAgIGxpbmVhckVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIC8qKiBzY2VuZSBjb29yZHMgKi9cbiAgICBwb2ludGVyQ29vcmRzOiB7XG4gICAgICB4OiBudW1iZXI7XG4gICAgICB5OiBudW1iZXI7XG4gICAgfVtdLFxuICAgIC8vIER1cmluZyBsaW5lIGNyZWF0aW9uIHRoZSBzdGFydCBiaW5kaW5nIGhhc24ndCBiZWVuIHdyaXR0ZW4geWV0XG4gICAgLy8gaW50byBgbGluZWFyRWxlbWVudGBcbiAgICBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQ/OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50IHwgbnVsbCxcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKCFwb2ludGVyQ29vcmRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gcG9pbnRlckNvb3Jkcy5yZWR1Y2UoXG4gICAgICAoYWNjOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ+W10sIGNvb3JkcykgPT4ge1xuICAgICAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICAgIGNvb3JkcyxcbiAgICAgICAgICB0aGlzLnNjZW5lLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsICYmXG4gICAgICAgICAgIWlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZChcbiAgICAgICAgICAgIGxpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQ/LmlkLFxuICAgICAgICAgICAgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGFjYy5wdXNoKGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW10sXG4gICAgKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5ncyB9KTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoXG4gICAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc3VnZ2VzdGVkQmluZGluZ3MgPSBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3MgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2VsZWN0aW9uKGhpdEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgIC8vIENvbnRpbnVlIGVkaXRpbmcgdGhlIHNhbWUgZ3JvdXAgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgYSBkaWZmZXJlbnRcbiAgICAgIC8vIGVsZW1lbnQgZnJvbSBpdFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6XG4gICAgICAgIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCAmJlxuICAgICAgICBoaXRFbGVtZW50ICE9IG51bGwgJiZcbiAgICAgICAgaXNFbGVtZW50SW5Hcm91cChoaXRFbGVtZW50LCBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgPyBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWRcbiAgICAgICAgICA6IG51bGwsXG4gICAgfSkpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUmVmID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpID0+IHtcbiAgICAvLyBjYW52YXMgaXMgbnVsbCB3aGVuIHVubW91bnRpbmdcbiAgICBpZiAoY2FudmFzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcbiAgICAgIHRoaXMucmMgPSByb3VnaC5jYW52YXModGhpcy5jYW52YXMpO1xuXG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLmhhbmRsZVdoZWVsLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCB0aGlzLm9uVGFwU3RhcnQpO1xuICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9FTkQsIHRoaXMub25UYXBFbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgdGhpcy5oYW5kbGVXaGVlbCk7XG4gICAgICB0aGlzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgdGhpcy5vblRhcFN0YXJ0KTtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgdGhpcy5vblRhcEVuZCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQXBwT25Ecm9wID0gYXN5bmMgKGV2ZW50OiBSZWFjdC5EcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMuaXRlbSgwKTtcblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpKSB7XG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHNjZW5lIGZyb20gdGhlIGltYWdlIGlmIGl0J3MgZW1iZWRkZWRcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgaWYgKGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMucG5nIHx8IGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKFxuICAgICAgICAgICAgICAgICAgaXRlbSBhcyBhbnlcbiAgICAgICAgICAgICAgICApLmdldEFzRmlsZVN5c3RlbUhhbmRsZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNjZW5lID0gYXdhaXQgbG9hZEZyb21CbG9iKFxuICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgICAgIC4uLnNjZW5lLFxuICAgICAgICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgICAgICAgIC4uLihzY2VuZS5hcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZXBsYWNlRmlsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5uYW1lICE9PSBcIkVuY29kaW5nRXJyb3JcIikge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBubyBzY2VuZSBpcyBlbWJlZGRlZCBvciB3ZSBmYWlsIGZvciB3aGF0ZXZlciByZWFzb24sIGZhbGwgYmFja1xuICAgICAgICAvLyB0byBpbXBvcnRpbmcgYXMgcmVndWxhciBpbWFnZVxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCh7IHNjZW5lWCwgc2NlbmVZIH0pO1xuICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGxpYnJhcnlTaGFwZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIpO1xuICAgIGlmIChsaWJyYXJ5U2hhcGVzICE9PSBcIlwiKSB7XG4gICAgICB0aGlzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgZWxlbWVudHM6IEpTT04ucGFyc2UobGlicmFyeVNoYXBlcyksXG4gICAgICAgIHBvc2l0aW9uOiBldmVudCxcbiAgICAgICAgZmlsZXM6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcy5pdGVtKDApO1xuICAgIGlmIChcbiAgICAgIGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYiB8fFxuICAgICAgZmlsZT8ubmFtZT8uZW5kc1dpdGgoXCIuZXhjYWxpZHJhd2xpYlwiKVxuICAgICkge1xuICAgICAgdGhpcy5saWJyYXJ5XG4gICAgICAgIC5pbXBvcnRMaWJyYXJ5KGZpbGUpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBDbG9zZSBhbmQgdGhlbiBvcGVuIHRvIGdldCB0aGUgbGlicmFyaWVzIHVwZGF0ZWRcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogZmFsc2UgfSk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IHRydWUgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KSxcbiAgICAgICAgKTtcbiAgICAgIC8vIGRlZmF1bHQ6IGFzc3VtZSBhbiBFeGNhbGlkcmF3IGZpbGUgcmVnYXJkbGVzcyBvZiBleHRlbnNpb24vTWltZVR5cGVcbiAgICB9IGVsc2UgaWYgKGZpbGUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IHRydWUgfSk7XG4gICAgICBpZiAobmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgIC8vIGJ1dCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgb24gb2xkZXIgcmVsZWFzZXMuXG4gICAgICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtc1swXTtcbiAgICAgICAgICAoZmlsZSBhcyBhbnkpLmhhbmRsZSA9IGF3YWl0IChpdGVtIGFzIGFueSkuZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMubG9hZEZpbGVUb0NhbnZhcyhmaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgbG9hZEZpbGVUb0NhbnZhcyA9IChmaWxlOiBCbG9iKSA9PiB7XG4gICAgbG9hZEZyb21CbG9iKGZpbGUsIHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpXG4gICAgICAudGhlbigoc2NlbmUpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgICAgICAuLi5zY2VuZSxcbiAgICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgICAgLi4uKHNjZW5lLmFwcFN0YXRlIHx8IHRoaXMuc3RhdGUpLFxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcGxhY2VGaWxlczogdHJ1ZSxcbiAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoXG4gICAgICAoZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiB8fFxuICAgICAgICAoZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIgJiZcbiAgICAgICAgICAvLyBhbHdheXMgYWxsb3cgaWYgdXNlciB1c2VzIGEgcGVuIHNlY29uZGFyeSBidXR0b25cbiAgICAgICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlNFQ09OREFSWSkpICYmXG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIHsgcHJlZmVyU2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB0eXBlID0gZWxlbWVudCA/IFwiZWxlbWVudFwiIDogXCJjYW52YXNcIjtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ITtcbiAgICBjb25zdCB7IHRvcDogb2Zmc2V0VG9wLCBsZWZ0OiBvZmZzZXRMZWZ0IH0gPVxuICAgICAgY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGxlZnQgPSBldmVudC5jbGllbnRYIC0gb2Zmc2V0TGVmdDtcbiAgICBjb25zdCB0b3AgPSBldmVudC5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtlbGVtZW50LmlkXTogdHJ1ZSB9IH0sICgpID0+IHtcbiAgICAgICAgdGhpcy5fb3BlbkNvbnRleHRNZW51KHsgdG9wLCBsZWZ0IH0sIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudSh7IHRvcCwgbGVmdCB9LCB0eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZURyYWdOZXdHZW5lcmljRWxlbWVudCA9IChcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcztcbiAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGRyYWdOZXdFbGVtZW50KFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyQ29vcmRzLngpLFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBwb2ludGVyQ29vcmRzLnkpLFxuICAgICAgICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpbWFnZSA9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmltYWdlQ2FjaGUuZ2V0KGRyYWdnaW5nRWxlbWVudC5maWxlSWQpPy5pbWFnZTtcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID1cbiAgICAgICAgaW1hZ2UgJiYgIShpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgPyBpbWFnZS53aWR0aCAvIGltYWdlLmhlaWdodFxuICAgICAgICAgIDogbnVsbDtcblxuICAgICAgZHJhZ05ld0VsZW1lbnQoXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSxcbiAgICAgICAgZ3JpZFgsXG4gICAgICAgIGdyaWRZLFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSxcbiAgICAgICAgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KVxuICAgICAgICAgID8gIXNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpXG4gICAgICAgICAgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIGFzcGVjdFJhdGlvLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFtkcmFnZ2luZ0VsZW1lbnRdKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUhhbmRsZVJlc2l6ZSA9IChcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCxcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG4gICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlVHlwZSA9IHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAvLyBUT0RPOiByZW5hbWUgdGhpcyBzdGF0ZSBmaWVsZCB0byBcImlzU2NhbGluZ1wiIHRvIGRpc3Rpbmd1aXNoXG4gICAgICAvLyBpdCBmcm9tIHRoZSBnZW5lcmljIFwiaXNSZXNpemluZ1wiIHdoaWNoIGluY2x1ZGVzIHNjYWxpbmcgYW5kXG4gICAgICAvLyByb3RhdGluZ1xuICAgICAgaXNSZXNpemluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInJvdGF0aW9uXCIsXG4gICAgICBpc1JvdGF0aW5nOiB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInJvdGF0aW9uXCIsXG4gICAgfSk7XG4gICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcztcbiAgICBjb25zdCBbcmVzaXplWCwgcmVzaXplWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICBwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueCxcbiAgICAgIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldC55LFxuICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHRyYW5zZm9ybUVsZW1lbnRzKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5hcnJvd0RpcmVjdGlvbixcbiAgICAgICAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNJbWFnZUVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSlcbiAgICAgICAgICA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KVxuICAgICAgICAgIDogc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksXG4gICAgICAgIHJlc2l6ZVgsXG4gICAgICAgIHJlc2l6ZVksXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqIEBwcml2YXRlIHVzZSB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51ICovXG4gIHByaXZhdGUgX29wZW5Db250ZXh0TWVudSA9IChcbiAgICB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgIH06IHtcbiAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgIHRvcDogbnVtYmVyO1xuICAgIH0sXG4gICAgdHlwZTogXCJjYW52YXNcIiB8IFwiZWxlbWVudFwiLFxuICApID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IHRydWU7XG4gICAgY29uc3QgbWF5YmVHcm91cEFjdGlvbiA9IGFjdGlvbkdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZVVuZ3JvdXBBY3Rpb24gPSBhY3Rpb25Vbmdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBIb3Jpem9udGFsID0gYWN0aW9uRmxpcEhvcml6b250YWwuY29udGV4dEl0ZW1QcmVkaWNhdGUhKFxuICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCksXG4gICAgKTtcblxuICAgIGNvbnN0IG1heWJlRmxpcFZlcnRpY2FsID0gYWN0aW9uRmxpcFZlcnRpY2FsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBDb250ZXh0TWVudU9wdGlvbltdID0gW107XG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNQbmcpO1xuICAgIH1cblxuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNTdmcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgY29uc3Qgdmlld01vZGVPcHRpb25zID0gW1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgIGFjdGlvblRvZ2dsZVN0YXRzLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IHZpZXdNb2RlT3B0aW9ucyxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VUeXBlLmlzTW9iaWxlICYmXG4gICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgICAgICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJlxuICAgICAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGFjdGlvbkNvcHlBc1BuZyxcbiAgICAgICAgICAgIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiZcbiAgICAgICAgICAgICAgZWxlbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBhY3Rpb25Db3B5QXNTdmcsXG4gICAgICAgICAgICAoKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25TZWxlY3RBbGwsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzV2l0aFVuYmluZGVkVGV4dCA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKS5zb21lKChlbGVtZW50KSA9PiAhaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KSk7XG4gICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW25hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSwgLi4ub3B0aW9uc10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQhLFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSAmJiBhY3Rpb25DdXQsXG4gICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LFxuICAgICAgICAgICAgdGhpcy5kZXZpY2VUeXBlLmlzTW9iaWxlICYmXG4gICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgICAgICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIGFjdGlvbkNvcHlTdHlsZXMsXG4gICAgICAgICAgICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIG1heWJlR3JvdXBBY3Rpb24gJiYgYWN0aW9uR3JvdXAsXG4gICAgICAgICAgICAhZWxlbWVudHNXaXRoVW5iaW5kZWRUZXh0ICYmIGFjdGlvblVuYmluZFRleHQsXG4gICAgICAgICAgICBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCxcbiAgICAgICAgICAgIChtYXliZUdyb3VwQWN0aW9uIHx8IG1heWJlVW5ncm91cEFjdGlvbikgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uQWRkVG9MaWJyYXJ5LFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICAgICAgICAgICAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICAgICAgICAgICAgYWN0aW9uU2VuZFRvQmFjayxcbiAgICAgICAgICAgIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gICAgICAgICAgICBtYXliZUZsaXBWZXJ0aWNhbCAmJiBhY3Rpb25GbGlwVmVydGljYWwsXG4gICAgICAgICAgICAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uTGluay5jb250ZXh0SXRlbVByZWRpY2F0ZShlbGVtZW50cywgdGhpcy5zdGF0ZSkgJiYgYWN0aW9uTGluayxcbiAgICAgICAgICAgIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgICAgICAgICAgIGFjdGlvbkRlbGV0ZVNlbGVjdGVkLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQhLFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVXaGVlbCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRFbGVtZW50SWRzLCBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBub3RlIHRoYXQgZXZlbnQuY3RybEtleSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHBpbmNoIHpvb21pbmdcbiAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSB7XG4gICAgICBjb25zdCBzaWduID0gTWF0aC5zaWduKGRlbHRhWSk7XG4gICAgICBjb25zdCBNQVhfU1RFUCA9IDEwO1xuICAgICAgbGV0IGRlbHRhID0gTWF0aC5hYnMoZGVsdGFZKTtcbiAgICAgIGlmIChkZWx0YSA+IE1BWF9TVEVQKSB7XG4gICAgICAgIGRlbHRhID0gTUFYX1NURVA7XG4gICAgICB9XG4gICAgICBkZWx0YSAqPSBzaWduO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld1pvb20gPSB0aGlzLnN0YXRlLnpvb20udmFsdWUgLSBkZWx0YSAvIDEwMDtcbiAgICAgIC8vIGluY3JlYXNlIHpvb20gc3RlcHMgdGhlIG1vcmUgem9vbWVkLWluIHdlIGFyZSAoYXBwbGllcyB0byA+MTAwJSBvbmx5KVxuICAgICAgbmV3Wm9vbSArPSBNYXRoLmxvZzEwKE1hdGgubWF4KDEsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSkpICogLXNpZ247XG4gICAgICAvLyByb3VuZCB0byBuZWFyZXN0IHN0ZXBcbiAgICAgIG5ld1pvb20gPSBNYXRoLnJvdW5kKG5ld1pvb20gKiBaT09NX1NURVAgKiAxMDApIC8gKFpPT01fU1RFUCAqIDEwMCk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXRTdGF0ZUZvclpvb20oXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgICAgdmlld3BvcnRZOiBjdXJzb3JZLFxuICAgICAgICAgICAgbmV4dFpvb206IGdldE5vcm1hbGl6ZWRab29tKG5ld1pvb20pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICksXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOlxuICAgICAgICAgIE9iamVjdC5rZXlzKHNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICA/IHNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICAgICAgOiBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNjcm9sbCBob3Jpem9udGFsbHkgd2hlbiBzaGlmdCBwcmVzc2VkXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFggfSkgPT4gKHtcbiAgICAgICAgLy8gb24gTWFjLCBzaGlmdCt3aGVlbCB0ZW5kcyB0byByZXN1bHQgaW4gZGVsdGFYXG4gICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSAoZGVsdGFZIHx8IGRlbHRhWCkgLyB6b29tLnZhbHVlLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoKHsgem9vbSwgc2Nyb2xsWCwgc2Nyb2xsWSB9KSA9PiAoe1xuICAgICAgc2Nyb2xsWDogc2Nyb2xsWCAtIGRlbHRhWCAvIHpvb20udmFsdWUsXG4gICAgICBzY3JvbGxZOiBzY3JvbGxZIC0gZGVsdGFZIC8gem9vbS52YWx1ZSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgICBzY2FsZTogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50Q2xpY2tlZEluc2lkZSA9IGdldFRleHRCaW5kYWJsZUNvbnRhaW5lckF0UG9zaXRpb24oXG4gICAgICB0aGlzLnNjZW5lXG4gICAgICAgIC5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiAhaXNUZXh0RWxlbWVudChlbGVtZW50KSksXG4gICAgICB4LFxuICAgICAgeSxcbiAgICApO1xuICAgIGlmIChlbGVtZW50Q2xpY2tlZEluc2lkZSkge1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclggPVxuICAgICAgICBlbGVtZW50Q2xpY2tlZEluc2lkZS54ICsgZWxlbWVudENsaWNrZWRJbnNpZGUud2lkdGggLyAyO1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclkgPVxuICAgICAgICBlbGVtZW50Q2xpY2tlZEluc2lkZS55ICsgZWxlbWVudENsaWNrZWRJbnNpZGUuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlVG9DZW50ZXIgPSBNYXRoLmh5cG90KFxuICAgICAgICB4IC0gZWxlbWVudENlbnRlclgsXG4gICAgICAgIHkgLSBlbGVtZW50Q2VudGVyWSxcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1NuYXBwZWRUb0NlbnRlciA9XG4gICAgICAgIGRpc3RhbmNlVG9DZW50ZXIgPCBURVhUX1RPX0NFTlRFUl9TTkFQX1RIUkVTSE9MRDtcbiAgICAgIGlmIChpc1NuYXBwZWRUb0NlbnRlcikge1xuICAgICAgICBjb25zdCB7IHg6IHZpZXdwb3J0WCwgeTogdmlld3BvcnRZIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgICAgeyBzY2VuZVg6IGVsZW1lbnRDZW50ZXJYLCBzY2VuZVk6IGVsZW1lbnRDZW50ZXJZIH0sXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHZpZXdwb3J0WCwgdmlld3BvcnRZLCBlbGVtZW50Q2VudGVyWCwgZWxlbWVudENlbnRlclkgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVQb2ludGVyID0gKHg6IG51bWJlciwgeTogbnVtYmVyLCBidXR0b246IFwidXBcIiB8IFwiZG93blwiKSA9PiB7XG4gICAgaWYgKCF4IHx8ICF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGlmIChpc05hTihwb2ludGVyLngpIHx8IGlzTmFOKHBvaW50ZXIueSkpIHtcbiAgICAgIC8vIHNvbWV0aW1lcyB0aGUgcG9pbnRlciBnb2VzIG9mZiBzY3JlZW5cbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uUG9pbnRlclVwZGF0ZT8uKHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBidXR0b24sXG4gICAgICBwb2ludGVyc01hcDogZ2VzdHVyZS5wb2ludGVycyxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkID0gZGVib3VuY2UoKCkgPT4ge1xuICAgIGlmICghdGhpcy51bm1vdW50ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlIH0pO1xuICAgIH1cbiAgfSwgMzAwKTtcblxuICBwcml2YXRlIHVwZGF0ZURPTVJlY3QgPSAoY2I/OiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgY29uc3QgZXhjYWxpZHJhd0NvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICB0b3A6IG9mZnNldFRvcCxcbiAgICAgIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGN1cnJlbnRIZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogY3VycmVudE9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogY3VycmVudE9mZnNldExlZnQsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB3aWR0aCA9PT0gY3VycmVudFdpZHRoICYmXG4gICAgICAgIGhlaWdodCA9PT0gY3VycmVudEhlaWdodCAmJlxuICAgICAgICBvZmZzZXRMZWZ0ID09PSBjdXJyZW50T2Zmc2V0TGVmdCAmJlxuICAgICAgICBvZmZzZXRUb3AgPT09IGN1cnJlbnRPZmZzZXRUb3BcbiAgICAgICkge1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBvZmZzZXRMZWZ0LFxuICAgICAgICAgIG9mZnNldFRvcCxcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGNiICYmIGNiKCk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgcmVmcmVzaCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgLi4udGhpcy5nZXRDYW52YXNPZmZzZXRzKCkgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRDYW52YXNPZmZzZXRzKCk6IFBpY2s8QXBwU3RhdGUsIFwib2Zmc2V0VG9wXCIgfCBcIm9mZnNldExlZnRcIj4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0TGVmdDogbGVmdCxcbiAgICAgICAgb2Zmc2V0VG9wOiB0b3AsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0TGVmdDogMCxcbiAgICAgIG9mZnNldFRvcDogMCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVMYW5ndWFnZSgpIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZyA9XG4gICAgICBsYW5ndWFnZXMuZmluZCgobGFuZykgPT4gbGFuZy5jb2RlID09PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB8fFxuICAgICAgZGVmYXVsdExhbmc7XG4gICAgYXdhaXQgc2V0TGFuZ3VhZ2UoY3VycmVudExhbmcpO1xuICAgIHRoaXMuc2V0QXBwU3RhdGUoe30pO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBURVNUIEhPT0tTXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGg6IHtcbiAgICAgIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdO1xuICAgICAgc3RhdGU6IEFwcFN0YXRlO1xuICAgICAgc2V0U3RhdGU6IFJlYWN0LkNvbXBvbmVudDxhbnksIEFwcFN0YXRlPltcInNldFN0YXRlXCJdO1xuICAgICAgYXBwOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD47XG4gICAgICBoaXN0b3J5OiBIaXN0b3J5O1xuICAgIH07XG4gIH1cbn1cblxuaWYgKFxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHxcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVFxuKSB7XG4gIHdpbmRvdy5oID0gd2luZG93LmggfHwgKHt9IGFzIFdpbmRvd1tcImhcIl0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICAgICAgfSxcbiAgICAgIHNldChlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHAuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBBcHA7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
|
|
1616
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useDeviceType\": () => (/* binding */ useDeviceType),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.dev.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../renderer */ \"../../renderer/index.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Stats */ \"../../components/Stats.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../data/blob */ \"../../data/blob.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! lodash.throttle */ \"../../../node_modules/lodash.throttle/index.js\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_42__);\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/collision */ \"../../element/collision.ts\");\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/Hyperlink */ \"../../element/Hyperlink.tsx\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst defaultDeviceTypeContext = {\r\n isMobile: false,\r\n isTouchScreen: false,\r\n};\r\nconst DeviceTypeContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(defaultDeviceTypeContext);\r\nconst useDeviceType = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(DeviceTypeContext);\r\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\r\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\r\nlet didTapTwice = false;\r\nlet tappedTwiceTimer = 0;\r\nlet cursorX = 0;\r\nlet cursorY = 0;\r\nlet isHoldingSpace = false;\r\nlet isPanning = false;\r\nlet isDraggingScrollBar = false;\r\nlet currentScrollBars = { horizontal: null, vertical: null };\r\nlet touchTimeout = 0;\r\nlet invalidateContextMenu = false;\r\nlet lastPointerUp = null;\r\nconst gesture = {\r\n pointers: new Map(),\r\n lastCenter: null,\r\n initialDistance: null,\r\n initialScale: null,\r\n};\r\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\r\n constructor(props) {\r\n var _a;\r\n super(props);\r\n this.canvas = null;\r\n this.rc = null;\r\n this.unmounted = false;\r\n this.deviceType = {\r\n isMobile: false,\r\n isTouchScreen: false,\r\n };\r\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\r\n this.files = {};\r\n this.imageCache = new Map();\r\n this.lastPointerDown = null;\r\n this.lastPointerUp = null;\r\n this.contextMenuOpen = false;\r\n this.lastScenePointer = null;\r\n this.focusContainer = () => {\r\n var _a;\r\n if (this.props.autoFocus) {\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\r\n }\r\n };\r\n this.getSceneElementsIncludingDeleted = () => {\r\n return this.scene.getElementsIncludingDeleted();\r\n };\r\n this.getSceneElements = () => {\r\n return this.scene.getElements();\r\n };\r\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((actionResult) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n // Since context menu closes when action triggered so setting to false\r\n this.contextMenuOpen = false;\r\n if (this.unmounted || actionResult === false) {\r\n return;\r\n }\r\n let editingElement = null;\r\n if (actionResult.elements) {\r\n actionResult.elements.forEach((element) => {\r\n var _a;\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\r\n this.state.editingElement !== element &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n editingElement = element;\r\n }\r\n });\r\n this.scene.replaceAllElements(actionResult.elements);\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n }\r\n if (actionResult.files) {\r\n this.files = actionResult.replaceFiles\r\n ? actionResult.files\r\n : Object.assign(Object.assign({}, this.files), actionResult.files);\r\n this.addNewImagesToImageCache();\r\n }\r\n if (actionResult.appState || editingElement) {\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\r\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\r\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\r\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_11__.THEME.LIGHT;\r\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\r\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\r\n viewModeEnabled = this.props.viewModeEnabled;\r\n }\r\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\r\n zenModeEnabled = this.props.zenModeEnabled;\r\n }\r\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\r\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null;\r\n }\r\n if (typeof this.props.theme !== \"undefined\") {\r\n theme = this.props.theme;\r\n }\r\n if (typeof this.props.name !== \"undefined\") {\r\n name = this.props.name;\r\n }\r\n this.setState((state) => {\r\n var _a;\r\n // using Object.assign instead of spread to fool TS 4.2.2+ into\r\n // regarding the resulting type as not containing undefined\r\n // (which the following expression will never contain)\r\n return Object.assign(actionResult.appState || {}, {\r\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\r\n viewModeEnabled,\r\n zenModeEnabled,\r\n gridSize,\r\n theme,\r\n name,\r\n });\r\n }, () => {\r\n if (actionResult.syncHistory) {\r\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\r\n }\r\n });\r\n }\r\n });\r\n // Lifecycle\r\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isHoldingSpace = false;\r\n this.setState({ isBindingEnabled: true });\r\n });\r\n this.onUnload = () => {\r\n this.onBlur();\r\n };\r\n this.disableEvent = (event) => {\r\n event.preventDefault();\r\n };\r\n this.onFontLoaded = () => {\r\n this.scene.getElementsIncludingDeleted().forEach((element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.onSceneUpdated();\r\n };\r\n this.importLibraryFromUrl = (url, token) => __awaiter(this, void 0, void 0, function* () {\r\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary)) {\r\n const hash = new URLSearchParams(window.location.hash.slice(1));\r\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `#${hash.toString()}`);\r\n }\r\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary)) {\r\n const query = new URLSearchParams(window.location.search);\r\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `?${query.toString()}`);\r\n }\r\n try {\r\n const request = yield fetch(decodeURIComponent(url));\r\n const blob = yield request.blob();\r\n const json = JSON.parse(yield blob.text());\r\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_13__.isValidLibrary)(json)) {\r\n throw new Error();\r\n }\r\n if (token === this.id ||\r\n window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.confirmAddLibrary\", {\r\n numShapes: (json.libraryItems || json.library || []).length,\r\n }))) {\r\n yield this.library.importLibrary(blob, \"published\");\r\n // hack to rerender the library items after import\r\n if (this.state.isLibraryOpen) {\r\n this.setState({ isLibraryOpen: false });\r\n }\r\n this.setState({ isLibraryOpen: true });\r\n }\r\n }\r\n catch (error) {\r\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.errorLoadingLibrary\"));\r\n console.error(error);\r\n }\r\n finally {\r\n this.focusContainer();\r\n }\r\n });\r\n this.resetHistory = () => {\r\n this.history.clear();\r\n };\r\n /**\r\n * Resets scene & history.\r\n * ! Do not use to clear scene user action !\r\n */\r\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((opts) => {\r\n this.scene.replaceAllElements([]);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\r\n this.resetHistory();\r\n });\r\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\r\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\r\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\r\n if (!launchParams.files.length) {\r\n return;\r\n }\r\n const fileHandle = launchParams.files[0];\r\n const blob = yield fileHandle.getFile();\r\n blob.handle = fileHandle;\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(blob, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n }));\r\n }\r\n if (!this.state.isLoading) {\r\n this.setState({ isLoading: true });\r\n }\r\n let initialData = null;\r\n try {\r\n initialData = (yield this.props.initialData) || null;\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\r\n this.libraryItemsFromStorage = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreLibraryItems)(initialData.libraryItems, \"unpublished\");\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n initialData = {\r\n appState: {\r\n errorMessage: error.message ||\r\n \"Encountered an error during importing or restoring scene data\",\r\n },\r\n };\r\n }\r\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restore)(initialData, null, null);\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), { elementType: scene.appState.elementType === \"image\"\r\n ? \"selection\"\r\n : scene.appState.elementType, isLoading: false });\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\r\n }\r\n if ((initialData === null || initialData === void 0 ? void 0 : initialData.scrollX) != null) {\r\n scene.appState.scrollX = initialData.scrollX;\r\n }\r\n if ((initialData === null || initialData === void 0 ? void 0 : initialData.scrollY) != null) {\r\n scene.appState.scrollY = initialData.scrollY;\r\n }\r\n this.resetHistory();\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\r\n const libraryUrl = \r\n // current\r\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary) ||\r\n // legacy, kept for compat reasons\r\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n if (libraryUrl) {\r\n yield this.importLibraryFromUrl(libraryUrl);\r\n }\r\n });\r\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n this.scene\r\n .getElementsIncludingDeleted()\r\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element));\r\n this.setState({});\r\n });\r\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\r\n this.setState((state) => {\r\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\r\n return null;\r\n }\r\n return { offsetTop, offsetLeft };\r\n });\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.SCROLL_TIMEOUT);\r\n // Copy/paste\r\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.cutAll();\r\n event.preventDefault();\r\n });\r\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.copyAll();\r\n event.preventDefault();\r\n });\r\n this.cutAll = () => {\r\n this.copyAll();\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected);\r\n };\r\n this.copyAll = () => {\r\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.copyToClipboard)(this.scene.getElements(), this.state, this.files);\r\n };\r\n this.onTapStart = (event) => {\r\n // fix for Apple Pencil Scribble\r\n // On Android, preventing the event would disable contextMenu on tap-hold\r\n if (!_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\r\n event.preventDefault();\r\n }\r\n if (!didTapTwice) {\r\n didTapTwice = true;\r\n clearTimeout(tappedTwiceTimer);\r\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_11__.TAP_TWICE_TIMEOUT);\r\n return;\r\n }\r\n // insert text only if we tapped twice with a single finger\r\n // event.touches.length === 1 will also prevent inserting text when user's zooming\r\n if (didTapTwice && event.touches.length === 1) {\r\n const [touch] = event.touches;\r\n // @ts-ignore\r\n this.handleCanvasDoubleClick({\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n });\r\n didTapTwice = false;\r\n clearTimeout(tappedTwiceTimer);\r\n }\r\n if (_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\r\n event.preventDefault();\r\n }\r\n if (event.touches.length === 2) {\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n }\r\n };\r\n this.onTapEnd = (event) => {\r\n this.resetContextMenuTimer();\r\n if (event.touches.length > 0) {\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n }\r\n else {\r\n gesture.pointers.clear();\r\n }\r\n };\r\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\r\n var _b, _c;\r\n // #686\r\n const target = document.activeElement;\r\n const isExcalidrawActive = (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);\r\n if (!isExcalidrawActive) {\r\n return;\r\n }\r\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\r\n if (\r\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\r\n // thus these checks don't make sense\r\n event &&\r\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(target))) {\r\n return;\r\n }\r\n // must be called in the same frame (thus before any awaits) as the paste\r\n // event else some browsers (FF...) will clear the clipboardData\r\n // (something something security)\r\n let file = (_c = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _c === void 0 ? void 0 : _c.files[0];\r\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event);\r\n if (!file && data.text) {\r\n const string = data.text.trim();\r\n if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\r\n // ignore SVG validation/normalization which will be done during image\r\n // initialization\r\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(string);\r\n }\r\n }\r\n // prefer spreadsheet data over image file (MS Office/Libre Office)\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file) && !data.spreadsheet) {\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n if (this.props.onPaste) {\r\n try {\r\n if ((yield this.props.onPaste(data, event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n if (data.errorMessage) {\r\n this.setState({ errorMessage: data.errorMessage });\r\n }\r\n else if (data.spreadsheet) {\r\n this.setState({\r\n pasteDialog: {\r\n data: data.spreadsheet,\r\n shown: true,\r\n },\r\n });\r\n }\r\n else if (data.elements) {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: data.elements,\r\n files: data.files || null,\r\n position: \"cursor\",\r\n });\r\n }\r\n else if (data.text) {\r\n this.addTextFromPaste(data.text);\r\n }\r\n this.selectShapeTool(\"selection\");\r\n event === null || event === void 0 ? void 0 : event.preventDefault();\r\n }));\r\n this.addElementsFromPasteOrLibrary = (opts) => {\r\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreElements)(opts.elements, null);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(elements);\r\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minX, maxX) / 2;\r\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minY, maxY) / 2;\r\n const clientX = typeof opts.position === \"object\"\r\n ? opts.position.clientX\r\n : opts.position === \"cursor\"\r\n ? cursorX\r\n : this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = typeof opts.position === \"object\"\r\n ? opts.position.clientY\r\n : opts.position === \"cursor\"\r\n ? cursorY\r\n : this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const dx = x - elementsCenterX;\r\n const dy = y - elementsCenterY;\r\n const groupIdMap = new Map();\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(dx, dy, this.state.gridSize);\r\n const oldIdToDuplicatedId = new Map();\r\n const newElements = elements.map((element) => {\r\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\r\n x: element.x + gridX - minX,\r\n y: element.y + gridY - minY,\r\n });\r\n oldIdToDuplicatedId.set(element.id, newElement.id);\r\n return newElement;\r\n });\r\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\r\n const nextElements = [\r\n ...this.scene.getElementsIncludingDeleted(),\r\n ...newElements,\r\n ];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\r\n if (opts.files) {\r\n this.files = Object.assign(Object.assign({}, this.files), opts.files);\r\n }\r\n this.scene.replaceAllElements(nextElements);\r\n this.history.resumeRecording();\r\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: false, selectedElementIds: newElements.reduce((map, element) => {\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(element)) {\r\n map[element.id] = true;\r\n }\r\n return map;\r\n }, {}), selectedGroupIds: {} }), this.scene.getElements()), () => {\r\n if (opts.files) {\r\n this.addNewImagesToImageCache();\r\n }\r\n });\r\n this.selectShapeTool(\"selection\");\r\n };\r\n // Collaboration\r\n this.setAppState = (obj) => {\r\n this.setState(obj);\r\n };\r\n this.removePointer = (event) => {\r\n if (touchTimeout) {\r\n this.resetContextMenuTimer();\r\n }\r\n gesture.pointers.delete(event.pointerId);\r\n };\r\n this.toggleLock = () => {\r\n this.setState((prevState) => {\r\n return {\r\n elementLocked: !prevState.elementLocked,\r\n elementType: prevState.elementLocked\r\n ? \"selection\"\r\n : prevState.elementType,\r\n };\r\n });\r\n };\r\n this.togglePenMode = () => {\r\n this.setState((prevState) => {\r\n return {\r\n penMode: !prevState.penMode,\r\n };\r\n });\r\n };\r\n this.toggleZenMode = () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode);\r\n };\r\n this.toggleStats = () => {\r\n if (!this.state.showStats) {\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_8__.trackEvent)(\"dialog\", \"stats\");\r\n }\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats);\r\n };\r\n this.scrollToContent = (target = this.scene.getElements()) => {\r\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\r\n };\r\n this.clearToast = () => {\r\n this.setState({ toastMessage: null });\r\n };\r\n this.setToastMessage = (toastMessage) => {\r\n this.setState({ toastMessage });\r\n };\r\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const webShareTargetCache = yield caches.open(\"web-share-target\");\r\n const file = yield webShareTargetCache.match(\"shared-file\");\r\n if (file) {\r\n const blob = yield file.blob();\r\n this.loadFileToCanvas(blob);\r\n yield webShareTargetCache.delete(\"shared-file\");\r\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, window.location.pathname);\r\n }\r\n }\r\n catch (error) {\r\n this.setState({ errorMessage: error.message });\r\n }\r\n });\r\n /** adds supplied files to existing files in the appState */\r\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((files) => {\r\n const filesMap = files.reduce((acc, fileData) => {\r\n acc.set(fileData.id, fileData);\r\n return acc;\r\n }, new Map());\r\n this.files = Object.assign(Object.assign({}, this.files), Object.fromEntries(filesMap));\r\n this.scene.getElements().forEach((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\r\n filesMap.has(element.fileId)) {\r\n this.imageCache.delete(element.fileId);\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.scene.informMutation();\r\n this.addNewImagesToImageCache();\r\n });\r\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((sceneData) => {\r\n if (sceneData.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n if (sceneData.appState) {\r\n this.setState(sceneData.appState);\r\n }\r\n if (sceneData.elements) {\r\n this.scene.replaceAllElements(sceneData.elements);\r\n }\r\n if (sceneData.collaborators) {\r\n this.setState({ collaborators: sceneData.collaborators });\r\n }\r\n if (sceneData.libraryItems) {\r\n this.library.saveLibrary((0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreLibraryItems)(sceneData.libraryItems, \"unpublished\"));\r\n }\r\n });\r\n this.onSceneUpdated = () => {\r\n this.setState({});\r\n };\r\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n cursorX = event.clientX;\r\n cursorY = event.clientY;\r\n });\r\n // Input handling\r\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // normalize `event.key` when CapsLock is pressed #2372\r\n if (\"Proxy\" in window &&\r\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\r\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\r\n event = new Proxy(event, {\r\n get(ev, prop) {\r\n const value = ev[prop];\r\n if (typeof value === \"function\") {\r\n // fix for Proxies hijacking `this`\r\n return value.bind(ev);\r\n }\r\n return prop === \"key\"\r\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\r\n // it back\r\n event.shiftKey\r\n ? ev.key.toUpperCase()\r\n : ev.key.toLowerCase()\r\n : value;\r\n },\r\n });\r\n }\r\n if (((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ESCAPE) ||\r\n // case: using arrows to move between buttons\r\n ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isInputLike)(event.target))) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.QUESTION_MARK) {\r\n this.setState({\r\n showHelpDialog: true,\r\n });\r\n }\r\n if (this.actionManager.handleKeyDown(event)) {\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: false });\r\n }\r\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.ZERO) {\r\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const step = (this.state.gridSize &&\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT\r\n : this.state.gridSize)) ||\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state, true);\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_LEFT) {\r\n offsetX = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_RIGHT) {\r\n offsetX = step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_UP) {\r\n offsetY = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_DOWN) {\r\n offsetY = step;\r\n }\r\n selectedElements.forEach((element) => {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n x: element.x + offsetX,\r\n y: element.y + offsetY,\r\n });\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element, {\r\n simultaneouslyUpdated: selectedElements,\r\n });\r\n });\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n event.preventDefault();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ENTER) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n }\r\n else if (selectedElements.length === 1 &&\r\n !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n const selectedElement = selectedElements[0];\r\n this.startTextEditing({\r\n sceneX: selectedElement.x + selectedElement.width / 2,\r\n sceneY: selectedElement.y + selectedElement.height / 2,\r\n shouldBind: true,\r\n });\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n else if (!event.ctrlKey &&\r\n !event.altKey &&\r\n !event.metaKey &&\r\n this.state.draggingElement === null) {\r\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_33__.findShapeByKey)(event.key);\r\n if (shape) {\r\n this.selectShapeTool(shape);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.Q) {\r\n this.toggleLock();\r\n }\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE && gesture.pointers.size === 0) {\r\n isHoldingSpace = true;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n event.preventDefault();\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (this.state.elementType === \"selection\" &&\r\n !selectedElements.length) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G &&\r\n ((0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(this.state.elementType) ||\r\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(element.type)))) {\r\n this.setState({ openPopup: \"backgroundColorPicker\" });\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n this.setState({ openPopup: \"strokeColorPicker\" });\r\n }\r\n }\r\n });\r\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (this.state.elementType === \"selection\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n isHoldingSpace = false;\r\n }\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: true });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements)(selectedElements)\r\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)(selectedElements);\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n });\r\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n gesture.initialScale = this.state.zoom.value;\r\n });\r\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n // onGestureChange only has zoom factor but not the center.\r\n // If we're on iPad or iPhone, then we recognize multi-touch and will\r\n // zoom in at the right location on the touchMove handler already.\r\n // On Macbook, we don't have those events so will zoom in at the\r\n // current location instead.\r\n if (gesture.pointers.size >= 2) {\r\n return;\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (initialScale) {\r\n this.setState((state) => (Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\r\n viewportX: cursorX,\r\n viewportY: cursorY,\r\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * event.scale),\r\n }, state))));\r\n }\r\n });\r\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n gesture.initialScale = null;\r\n });\r\n this.startTextEditing = ({ sceneX, sceneY, shouldBind, insertAtParentCenter = true, }) => {\r\n var _a, _b;\r\n let parentCenterPosition = insertAtParentCenter &&\r\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n let existingTextElement = null;\r\n let container = null;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1) {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(selectedElements[0])) {\r\n existingTextElement = selectedElements[0];\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isTextBindableContainer)(selectedElements[0])) {\r\n container = selectedElements[0];\r\n existingTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getBoundTextElement)(container);\r\n }\r\n }\r\n existingTextElement =\r\n existingTextElement !== null && existingTextElement !== void 0 ? existingTextElement : this.getTextElementAtPosition(sceneX, sceneY);\r\n // bind to container when shouldBind is true or\r\n // clicked on center of container\r\n if (!container &&\r\n !existingTextElement &&\r\n (shouldBind || parentCenterPosition)) {\r\n container = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene.getElements().filter((ele) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(ele)), sceneX, sceneY);\r\n }\r\n if (!existingTextElement && container) {\r\n const fontString = {\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n };\r\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\r\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\r\n const newHeight = Math.max(container.height, minHeight);\r\n const newWidth = Math.max(container.width, minWidth);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(container, { height: newHeight, width: newWidth });\r\n sceneX = container.x + newWidth / 2;\r\n sceneY = container.y + newHeight / 2;\r\n if (parentCenterPosition) {\r\n parentCenterPosition = this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n }\r\n }\r\n const element = existingTextElement\r\n ? existingTextElement\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x: parentCenterPosition\r\n ? parentCenterPosition.elementCenterX\r\n : sceneX,\r\n y: parentCenterPosition\r\n ? parentCenterPosition.elementCenterY\r\n : sceneY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text: \"\",\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: parentCenterPosition\r\n ? \"center\"\r\n : this.state.currentItemTextAlign,\r\n verticalAlign: parentCenterPosition\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.VERTICAL_ALIGN.MIDDLE\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\r\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : [],\r\n });\r\n this.setState({ editingElement: element });\r\n if (!existingTextElement) {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n // case: creating new text not centered to parent element → offset Y\r\n // so that the text is centered to cursor position\r\n if (!parentCenterPosition) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n y: element.y - element.baseline / 2,\r\n });\r\n }\r\n }\r\n this.setState({\r\n editingElement: element,\r\n });\r\n this.handleTextWysiwyg(element, {\r\n isExistingElement: !!existingTextElement,\r\n });\r\n };\r\n this.handleCanvasDoubleClick = (event) => {\r\n // case: double-clicking with arrow/line tool selected would both create\r\n // text and enter multiElement mode\r\n if (this.state.multiElement) {\r\n return;\r\n }\r\n // we should only be able to double click when mode is selection\r\n if (this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n return;\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIds)(this.state);\r\n if (selectedGroupIds.length > 0) {\r\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\r\n const selectedGroupId = hitElement &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\r\n if (selectedGroupId) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getElements()));\r\n return;\r\n }\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1) {\r\n const selectedElement = selectedElements[0];\r\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(selectedElement);\r\n if (canBindText) {\r\n sceneX = selectedElement.x + selectedElement.width / 2;\r\n sceneY = selectedElement.y + selectedElement.height / 2;\r\n }\r\n }\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n shouldBind: false,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n }\r\n };\r\n this.getElementLinkAtPosition = (scenePointer, hitElement) => {\r\n // Reversing so we traverse the elements in decreasing order\r\n // of z-index\r\n const elements = this.scene.getElements().slice().reverse();\r\n let hitElementIndex = Infinity;\r\n return elements.find((element, index) => {\r\n if (hitElement && element.id === hitElement.id) {\r\n hitElementIndex = index;\r\n }\r\n return (element.link &&\r\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(element, this.state, [scenePointer.x, scenePointer.y], this.deviceType.isMobile) &&\r\n index <= hitElementIndex);\r\n });\r\n };\r\n this.redirectToLink = (event, isTouchScreen) => {\r\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\r\n if (!this.hitLinkElement ||\r\n // For touch screen allow dragging threshold else strict check\r\n (isTouchScreen && draggedDistance > _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD) ||\r\n (!isTouchScreen && draggedDistance !== 0)) {\r\n return;\r\n }\r\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerDown, this.state);\r\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerDownCoords.x, lastPointerDownCoords.y], this.deviceType.isMobile);\r\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerUp, this.state);\r\n const lastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerUpCoords.x, lastPointerUpCoords.y], this.deviceType.isMobile);\r\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\r\n const url = this.hitLinkElement.link;\r\n if (url) {\r\n let customEvent;\r\n if (this.props.onLinkOpen) {\r\n customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\r\n this.props.onLinkOpen(this.hitLinkElement, customEvent);\r\n }\r\n if (!(customEvent === null || customEvent === void 0 ? void 0 : customEvent.defaultPrevented)) {\r\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isLocalLink)(url) ? \"_self\" : \"_blank\";\r\n const newWindow = window.open(undefined, target);\r\n // https://mathiasbynens.github.io/rel-noopener/\r\n if (newWindow) {\r\n newWindow.opener = null;\r\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.normalizeLink)(url);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n this.handleCanvasPointerMove = (event) => {\r\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\r\n if (gesture.pointers.has(event.pointerId)) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (gesture.pointers.size === 2 &&\r\n gesture.lastCenter &&\r\n initialScale &&\r\n gesture.initialDistance) {\r\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n const deltaX = center.x - gesture.lastCenter.x;\r\n const deltaY = center.y - gesture.lastCenter.y;\r\n gesture.lastCenter = center;\r\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n const scaleFactor = this.state.elementType === \"freedraw\" && this.state.penMode\r\n ? 1\r\n : distance / gesture.initialDistance;\r\n const nextZoom = scaleFactor\r\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * scaleFactor)\r\n : this.state.zoom.value;\r\n this.setState((state) => {\r\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\r\n viewportX: center.x,\r\n viewportY: center.y,\r\n nextZoom,\r\n }, state);\r\n return {\r\n zoom: zoomState.zoom,\r\n scrollX: zoomState.scrollX + deltaX / nextZoom,\r\n scrollY: zoomState.scrollY + deltaY / nextZoom,\r\n shouldCacheIgnoreZoom: true,\r\n };\r\n });\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n }\r\n else {\r\n gesture.lastCenter =\r\n gesture.initialDistance =\r\n gesture.initialScale =\r\n null;\r\n }\r\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\r\n return;\r\n }\r\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\r\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\r\n if (!this.state.draggingElement && !this.state.multiElement) {\r\n if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n }\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\r\n if (this.state.editingLinearElement &&\r\n !this.state.editingLinearElement.isDragging) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({ editingLinearElement });\r\n }\r\n if (editingLinearElement.lastUncommittedPoint != null) {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n else {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElementType)(this.state.elementType)) {\r\n // Hovering with a selected tool or creating new linear element via click\r\n // and point\r\n const { draggingElement } = this.state;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], this.state.startBoundElement);\r\n }\r\n else {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n }\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n const { x: rx, y: ry } = multiElement;\r\n const { points, lastCommittedPoint } = multiElement;\r\n const lastPoint = points[points.length - 1];\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n if (lastPoint === lastCommittedPoint) {\r\n // if we haven't yet created a temp point and we're beyond commit-zone\r\n // threshold, add a point\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\r\n });\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n // in this branch, we're inside the commit zone, and no uncommitted\r\n // point exists. Thus do nothing (don't add/remove points).\r\n }\r\n }\r\n else if (points.length > 2 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: points.slice(0, -1),\r\n });\r\n }\r\n else {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(points, this.state.zoom.value)) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n // update last uncommitted point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [\r\n ...points.slice(0, -1),\r\n [scenePointerX - rx, scenePointerY - ry],\r\n ],\r\n });\r\n }\r\n return;\r\n }\r\n const hasDeselectedButton = Boolean(event.buttons);\r\n if (hasDeselectedButton ||\r\n (this.state.elementType !== \"selection\" &&\r\n this.state.elementType !== \"text\" &&\r\n this.state.elementType !== \"eraser\")) {\r\n return;\r\n }\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 &&\r\n !isOverScrollBar &&\r\n !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType &&\r\n elementWithTransformHandleType.transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)(elementWithTransformHandleType));\r\n return;\r\n }\r\n }\r\n else if (selectedElements.length > 1 && !isOverScrollBar) {\r\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType,\r\n }));\r\n return;\r\n }\r\n }\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\r\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n return;\r\n }\r\n if (this.hitLinkElement &&\r\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.showHyperlinkTooltip)(this.hitLinkElement, this.state);\r\n }\r\n else {\r\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.hideHyperlinkToolip)();\r\n if (hitElement &&\r\n hitElement.link &&\r\n this.state.selectedElementIds[hitElement.id] &&\r\n !this.contextMenuOpen &&\r\n !this.state.showHyperlinkPopup) {\r\n this.setState({ showHyperlinkPopup: \"info\" });\r\n }\r\n else if (this.state.elementType === \"text\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n }\r\n else if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n else if (this.state.editingLinearElement) {\r\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getElement(this.state.editingLinearElement.elementId);\r\n if (element &&\r\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(element, this.state, [\r\n scenePointer.x,\r\n scenePointer.y,\r\n ])) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n }\r\n else if (\r\n // if using cmd/ctrl, we're not dragging\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] &&\r\n (hitElement ||\r\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n }\r\n };\r\n this.handleEraser = (event, pointerDownState, scenePointer) => {\r\n const updateElementIds = (elements) => {\r\n elements.forEach((element) => {\r\n idsToUpdate.push(element.id);\r\n if (event.altKey) {\r\n if (pointerDownState.elementIdsToErase[element.id]) {\r\n pointerDownState.elementIdsToErase[element.id] = false;\r\n }\r\n }\r\n else {\r\n pointerDownState.elementIdsToErase[element.id] = true;\r\n }\r\n });\r\n };\r\n const idsToUpdate = [];\r\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);\r\n const threshold = 10 / this.state.zoom.value;\r\n const point = Object.assign({}, pointerDownState.lastCoords);\r\n let samplingInterval = 0;\r\n while (samplingInterval <= distance) {\r\n const hitElements = this.getElementsAtPosition(point.x, point.y);\r\n updateElementIds(hitElements);\r\n // Exit since we reached current point\r\n if (samplingInterval === distance) {\r\n break;\r\n }\r\n // Calculate next point in the line at a distance of sampling interval\r\n samplingInterval = Math.min(samplingInterval + threshold, distance);\r\n const distanceRatio = samplingInterval / distance;\r\n const nextX = (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\r\n const nextY = (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\r\n point.x = nextX;\r\n point.y = nextY;\r\n }\r\n const elements = this.scene.getElements().map((ele) => {\r\n const id = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) && idsToUpdate.includes(ele.containerId)\r\n ? ele.containerId\r\n : ele.id;\r\n if (idsToUpdate.includes(id)) {\r\n if (event.altKey) {\r\n if (pointerDownState.elementIdsToErase[id] === false) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\r\n opacity: this.state.currentItemOpacity,\r\n });\r\n }\r\n }\r\n else {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { opacity: 20 });\r\n }\r\n }\r\n return ele;\r\n });\r\n this.scene.replaceAllElements(elements);\r\n pointerDownState.lastCoords.x = scenePointer.x;\r\n pointerDownState.lastCoords.y = scenePointer.y;\r\n };\r\n // set touch moving for mobile context menu\r\n this.handleTouchMove = (event) => {\r\n invalidateContextMenu = true;\r\n };\r\n this.handleCanvasPointerDown = (event) => {\r\n // remove any active selection when we start to interact with canvas\r\n // (mainly, we care about removing selection outside the component which\r\n // would prevent our copy handling otherwise)\r\n const selection = document.getSelection();\r\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\r\n selection.removeAllRanges();\r\n }\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\r\n this.maybeCleanupAfterMissingPointerUp(event);\r\n //fires only once, if pen is detected, penMode is enabled\r\n //the user can disable this by toggling the penMode button\r\n if (!this.state.penDetected && event.pointerType === \"pen\") {\r\n this.setState((prevState) => {\r\n return {\r\n penMode: true,\r\n penDetected: true,\r\n };\r\n });\r\n }\r\n if (!this.deviceType.isTouchScreen &&\r\n [\"pen\", \"touch\"].includes(event.pointerType)) {\r\n this.deviceType = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.deviceType, { isTouchScreen: true });\r\n }\r\n if (isPanning) {\r\n return;\r\n }\r\n this.lastPointerDown = event;\r\n this.setState({\r\n lastPointerDownWith: event.pointerType,\r\n cursorButton: \"down\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"down\");\r\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\r\n return;\r\n }\r\n // only handle left mouse button or touch\r\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN &&\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.TOUCH) {\r\n return;\r\n }\r\n this.updateGestureOnPointerDown(event);\r\n // don't select while panning\r\n if (gesture.pointers.size > 1) {\r\n return;\r\n }\r\n // State for the duration of a pointer interaction, which starts with a\r\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\r\n const pointerDownState = this.initialPointerDownState(event);\r\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\r\n return;\r\n }\r\n // Since context menu closes on pointer down so setting to false\r\n this.contextMenuOpen = false;\r\n this.clearSelectionIfNotUsingSelection();\r\n this.updateBindingEnabledOnPointerMove(event);\r\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\r\n return;\r\n }\r\n const allowOnPointerDown = !this.state.penMode ||\r\n event.pointerType !== \"touch\" ||\r\n this.state.elementType === \"selection\" ||\r\n this.state.elementType === \"text\" ||\r\n this.state.elementType === \"image\";\r\n if (!allowOnPointerDown) {\r\n return;\r\n }\r\n if (this.state.elementType === \"text\") {\r\n this.handleTextOnPointerDown(event, pointerDownState);\r\n return;\r\n }\r\n else if (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\") {\r\n this.handleLinearElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType === \"image\") {\r\n // reset image preview on pointerdown\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n if (!this.state.pendingImageElement) {\r\n return;\r\n }\r\n this.setState({\r\n draggingElement: this.state.pendingImageElement,\r\n editingElement: this.state.pendingImageElement,\r\n pendingImageElement: null,\r\n multiElement: null,\r\n });\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(this.state.pendingImageElement, {\r\n x,\r\n y,\r\n });\r\n }\r\n else if (this.state.elementType === \"freedraw\") {\r\n this.handleFreeDrawElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType !== \"eraser\") {\r\n this.createGenericElementOnPointerDown(this.state.elementType, pointerDownState);\r\n }\r\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\r\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\r\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\r\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\r\n lastPointerUp = onPointerUp;\r\n if (!this.state.viewModeEnabled) {\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, onKeyDown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, onKeyUp);\r\n pointerDownState.eventListeners.onMove = onPointerMove;\r\n pointerDownState.eventListeners.onUp = onPointerUp;\r\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\r\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\r\n }\r\n };\r\n this.handleCanvasPointerUp = (event) => {\r\n this.lastPointerUp = event;\r\n if (this.deviceType.isTouchScreen) {\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: event.clientX, clientY: event.clientY }, this.state);\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\r\n }\r\n if (this.hitLinkElement &&\r\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\r\n this.redirectToLink(event, this.deviceType.isTouchScreen);\r\n }\r\n this.removePointer(event);\r\n };\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\r\n // deal with opening context menu on touch devices\r\n if (event.pointerType === \"touch\") {\r\n invalidateContextMenu = false;\r\n if (touchTimeout) {\r\n // If there's already a touchTimeout, this means that there's another\r\n // touch down and we are doing another touch, so we shouldn't open the\r\n // context menu.\r\n invalidateContextMenu = true;\r\n }\r\n else {\r\n // open the context menu with the first touch's clientX and clientY\r\n // if the touch is not moving\r\n touchTimeout = window.setTimeout(() => {\r\n touchTimeout = 0;\r\n if (!invalidateContextMenu) {\r\n this.handleCanvasContextMenu(event);\r\n }\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.TOUCH_CTX_MENU_TIMEOUT);\r\n }\r\n }\r\n };\r\n this.resetContextMenuTimer = () => {\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n invalidateContextMenu = false;\r\n };\r\n // Returns whether the event is a panning\r\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\r\n if (!(gesture.pointers.size === 0 &&\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.WHEEL ||\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\r\n this.state.viewModeEnabled)) ||\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\r\n return false;\r\n }\r\n isPanning = true;\r\n event.preventDefault();\r\n let nextPastePrevented = false;\r\n const isLinux = /Linux/.test(window.navigator.platform);\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n let { clientX: lastX, clientY: lastY } = event;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\r\n const deltaX = lastX - event.clientX;\r\n const deltaY = lastY - event.clientY;\r\n lastX = event.clientX;\r\n lastY = event.clientY;\r\n /*\r\n * Prevent paste event if we move while middle clicking on Linux.\r\n * See issue #1383.\r\n */\r\n if (isLinux &&\r\n !nextPastePrevented &&\r\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\r\n nextPastePrevented = true;\r\n /* Prevent the next paste event */\r\n const preventNextPaste = (event) => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n event.stopPropagation();\r\n };\r\n /*\r\n * Reenable next paste in case of disabled middle click paste for\r\n * any reason:\r\n * - right click paste\r\n * - empty clipboard\r\n */\r\n const enableNextPaste = () => {\r\n setTimeout(() => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }, 100);\r\n };\r\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }\r\n this.setState({\r\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\r\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\r\n });\r\n });\r\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((lastPointerUp = () => {\r\n lastPointerUp = null;\r\n isPanning = false;\r\n if (!isHoldingSpace) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n }\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n onPointerMove.flush();\r\n }));\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n return true;\r\n };\r\n this.clearSelectionIfNotUsingSelection = () => {\r\n if (this.state.elementType !== \"selection\") {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n };\r\n /**\r\n * @returns whether the pointer event has been completely handled\r\n */\r\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType != null) {\r\n this.setState({\r\n resizingElement: elementWithTransformHandleType.element,\r\n });\r\n pointerDownState.resize.handleType =\r\n elementWithTransformHandleType.transformHandleType;\r\n }\r\n }\r\n else if (selectedElements.length > 1) {\r\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n }\r\n if (pointerDownState.resize.handleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType: pointerDownState.resize.handleType,\r\n }));\r\n pointerDownState.resize.isResizing = true;\r\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0]) &&\r\n selectedElements[0].points.length === 2) {\r\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\r\n }\r\n }\r\n else {\r\n if (this.state.editingLinearElement) {\r\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\r\n if (ret.hitElement) {\r\n pointerDownState.hit.element = ret.hitElement;\r\n }\r\n if (ret.didAddPoint) {\r\n return true;\r\n }\r\n }\r\n // hitElement may already be set above, so check first\r\n pointerDownState.hit.element =\r\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n if (pointerDownState.hit.element) {\r\n // Early return if pointer is hitting link icon\r\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.isPointHittingLinkIcon)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y], this.deviceType.isMobile)) {\r\n return false;\r\n }\r\n pointerDownState.hit.hasHitElementInside =\r\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_45__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\r\n }\r\n // For overlapped elements one position may hit\r\n // multiple elements\r\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n const hitElement = pointerDownState.hit.element;\r\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hitElement === null || !someHitElementIsSelected) &&\r\n !event.shiftKey &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.clearSelection(hitElement);\r\n }\r\n if (this.state.editingLinearElement) {\r\n this.setState({\r\n selectedElementIds: {\r\n [this.state.editingLinearElement.elementId]: true,\r\n },\r\n });\r\n // If we click on something\r\n }\r\n else if (hitElement != null) {\r\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\r\n // mark as not completely handled so as to allow dragging etc.\r\n return false;\r\n }\r\n // deselect if item is selected\r\n // if shift is not clicked, this will always return true\r\n // otherwise, it will trigger selection based on current\r\n // state of the box\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n // if we are currently editing a group, exiting editing mode and deselect the group.\r\n if (this.state.editingGroupId &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n // Add hit element to selection. At this point if we're not holding\r\n // SHIFT the previously selected element(s) were deselected above\r\n // (make sure you use setState updater to use latest state)\r\n if (!someHitElementIsSelected &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.setState((prevState) => {\r\n return (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }), showHyperlinkPopup: hitElement.link ? \"info\" : false }), this.scene.getElements());\r\n });\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n }\r\n }\r\n this.setState({\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n }\r\n return false;\r\n };\r\n this.handleTextOnPointerDown = (event, pointerDownState) => {\r\n // if we're currently still editing text, clicking outside\r\n // should only finalize it, not create another (irrespective\r\n // of state.elementLocked)\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\r\n return;\r\n }\r\n let sceneX = pointerDownState.origin.x;\r\n let sceneY = pointerDownState.origin.y;\r\n const element = this.getElementAtPosition(sceneX, sceneY, {\r\n includeBoundTextElement: true,\r\n });\r\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(element);\r\n if (canBindText) {\r\n sceneX = element.x + element.width / 2;\r\n sceneY = element.y + element.height / 2;\r\n }\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n shouldBind: false,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!this.state.elementLocked) {\r\n this.setState({\r\n elementType: \"selection\",\r\n });\r\n }\r\n };\r\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n // Begin a mark capture. This does not have to update state yet.\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\r\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.newFreeDrawElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n simulatePressure: event.pressure === 0.5,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n const pressures = element.simulatePressure\r\n ? element.pressures\r\n : [...element.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [[0, 0]],\r\n pressures,\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n };\r\n this.createImageElement = ({ sceneX, sceneY, }) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(sceneX, sceneY, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newImageElement)({\r\n type: \"image\",\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n });\r\n return element;\r\n };\r\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n // finalize if completing a loop\r\n if (multiElement.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\r\n // clicking inside commit zone → finalize arrow\r\n if (multiElement.points.length > 1 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\r\n }));\r\n // clicking outside commit zone → update reference for last committed\r\n // point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\r\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\r\n an arrow, we want it to be null for both. Otherwise, we want it to use the\r\n values from appState. */\r\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\r\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\r\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\r\n : [null, null];\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newLinearElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n startArrowhead,\r\n endArrowhead,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [...element.points, [0, 0]],\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n };\r\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n });\r\n if (element.type === \"selection\") {\r\n this.setState({\r\n selectionElement: element,\r\n draggingElement: element,\r\n });\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n multiElement: null,\r\n draggingElement: element,\r\n editingElement: element,\r\n });\r\n }\r\n };\r\n this.eraseElements = (pointerDownState) => {\r\n const elements = this.scene.getElements().map((ele) => {\r\n if (pointerDownState.elementIdsToErase[ele.id]) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) &&\r\n pointerDownState.elementIdsToErase[ele.containerId]) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\r\n }\r\n return ele;\r\n });\r\n this.history.resumeRecording();\r\n this.scene.replaceAllElements(elements);\r\n };\r\n this.initializeImage = ({ imageFile, imageElement: _imageElement, showCursorImagePreview = false, }) => __awaiter(this, void 0, void 0, function* () {\r\n var _d, _e, _f, _g;\r\n // at this point this should be guaranteed image file, but we do this check\r\n // to satisfy TS down the line\r\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(imageFile)) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.unsupportedFileType\"));\r\n }\r\n const mimeType = imageFile.type;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, \"wait\");\r\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.normalizeSVG)(yield imageFile.text()), imageFile.name);\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.svgImageInsertError\"));\r\n }\r\n }\r\n // generate image id (by default the file digest) before any\r\n // resizing/compression takes place to keep it more portable\r\n const fileId = yield (((_e = (_d = this.props).generateIdForFile) === null || _e === void 0 ? void 0 : _e.call(_d, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.generateIdFromFile)(imageFile));\r\n if (!fileId) {\r\n console.warn(\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\");\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"));\r\n }\r\n const existingFileData = this.files[fileId];\r\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\r\n try {\r\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\r\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\r\n });\r\n }\r\n catch (error) {\r\n console.error(\"error trying to resing image file on insertion\", error);\r\n }\r\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.fileTooBig\", {\r\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\r\n }));\r\n }\r\n }\r\n if (showCursorImagePreview) {\r\n const dataURL = (_f = this.files[fileId]) === null || _f === void 0 ? void 0 : _f.dataURL;\r\n // optimization so that we don't unnecessarily resize the original\r\n // full-size file for cursor preview\r\n // (it's much faster to convert the resized dataURL to File)\r\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.dataURLToFile)(dataURL);\r\n this.setImagePreviewCursor(resizedFile || imageFile);\r\n }\r\n const dataURL = ((_g = this.files[fileId]) === null || _g === void 0 ? void 0 : _g.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imageFile));\r\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(_imageElement, {\r\n fileId,\r\n }, false);\r\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n var _h, _j;\r\n try {\r\n this.files = Object.assign(Object.assign({}, this.files), { [fileId]: {\r\n mimeType,\r\n id: fileId,\r\n dataURL,\r\n created: Date.now(),\r\n } });\r\n const cachedImageData = this.imageCache.get(fileId);\r\n if (!cachedImageData) {\r\n this.addNewImagesToImageCache();\r\n yield this.updateImageCache([imageElement]);\r\n }\r\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\r\n yield cachedImageData.image;\r\n }\r\n if (((_h = this.state.pendingImageElement) === null || _h === void 0 ? void 0 : _h.id) !== imageElement.id &&\r\n ((_j = this.state.draggingElement) === null || _j === void 0 ? void 0 : _j.id) !== imageElement.id) {\r\n this.initializeImageDimensions(imageElement, true);\r\n }\r\n resolve(imageElement);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\")));\r\n }\r\n finally {\r\n if (!showCursorImagePreview) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n }\r\n }));\r\n });\r\n /**\r\n * inserts image into elements array and rerenders\r\n */\r\n this.insertImageElement = (imageElement, imageFile, showCursorImagePreview) => __awaiter(this, void 0, void 0, function* () {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n imageElement,\r\n ]);\r\n try {\r\n yield this.initializeImage({\r\n imageFile,\r\n imageElement,\r\n showCursorImagePreview,\r\n });\r\n }\r\n catch (error) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n isDeleted: true,\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n this.setState({\r\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"),\r\n });\r\n }\r\n });\r\n this.setImagePreviewCursor = (imageFile) => __awaiter(this, void 0, void 0, function* () {\r\n // mustn't be larger than 128 px\r\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\r\n const cursorImageSizePx = 96;\r\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, {\r\n maxWidthOrHeight: cursorImageSizePx,\r\n });\r\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imagePreview);\r\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\r\n // a small canvas\r\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.loadHTMLImageElement)(previewDataURL);\r\n let height = Math.min(img.height, cursorImageSizePx);\r\n let width = height * (img.width / img.height);\r\n if (width > cursorImageSizePx) {\r\n width = cursorImageSizePx;\r\n height = width * (img.height / img.width);\r\n }\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.height = height;\r\n canvas.width = width;\r\n const context = canvas.getContext(\"2d\");\r\n context.drawImage(img, 0, 0, width, height);\r\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg);\r\n }\r\n if (this.state.pendingImageElement) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, `url(${previewDataURL}) 4 4, auto`);\r\n }\r\n });\r\n this.onImageAction = ({ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const clientX = this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.fileOpen)({\r\n description: \"Image\",\r\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\r\n });\r\n const imageElement = this.createImageElement({\r\n sceneX: x,\r\n sceneY: y,\r\n });\r\n if (insertOnCanvasDirectly) {\r\n this.insertImageElement(imageElement, imageFile);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({\r\n selectedElementIds: { [imageElement.id]: true },\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n else {\r\n this.setState({\r\n pendingImageElement: imageElement,\r\n }, () => {\r\n this.insertImageElement(imageElement, imageFile, \r\n /* showCursorImagePreview */ true);\r\n });\r\n }\r\n }\r\n catch (error) {\r\n if (error.name !== \"AbortError\") {\r\n console.error(error);\r\n }\r\n else {\r\n console.warn(error);\r\n }\r\n this.setState({\r\n pendingImageElement: null,\r\n editingElement: null,\r\n elementType: \"selection\",\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n });\r\n this.initializeImageDimensions = (imageElement, forceNaturalSize = false) => {\r\n var _a;\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(imageElement) &&\r\n ((_a = this.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n if (!image || image instanceof Promise) {\r\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value) {\r\n const placeholderSize = 100 / this.state.zoom.value;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n x: imageElement.x - placeholderSize / 2,\r\n y: imageElement.y - placeholderSize / 2,\r\n width: placeholderSize,\r\n height: placeholderSize,\r\n });\r\n }\r\n return;\r\n }\r\n if (forceNaturalSize ||\r\n // if user-created bounding box is below threshold, assume the\r\n // intention was to click instead of drag, and use the image's\r\n // intrinsic size\r\n (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value)) {\r\n const minHeight = Math.max(this.state.height - 120, 160);\r\n // max 65% of canvas height, clamped to <300px, vh - 120px>\r\n const maxHeight = Math.min(minHeight, Math.floor(this.state.height * 0.5) / this.state.zoom.value);\r\n const height = Math.min(image.naturalHeight, maxHeight);\r\n const width = height * (image.naturalWidth / image.naturalHeight);\r\n // add current imageElement width/height to account for previous centering\r\n // of the placeholder image\r\n const x = imageElement.x + imageElement.width / 2 - width / 2;\r\n const y = imageElement.y + imageElement.height / 2 - height / 2;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, { x, y, width, height });\r\n }\r\n };\r\n /** updates image cache, refreshing updated elements and/or setting status\r\n to error for images that fail during <img> element creation */\r\n this.updateImageCache = (elements, files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.updateImageCache)({\r\n imageCache: this.imageCache,\r\n fileIds: elements.map((element) => element.fileId),\r\n files,\r\n });\r\n if (updatedFiles.size || erroredFiles.size) {\r\n for (const element of elements) {\r\n if (updatedFiles.has(element.fileId)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n }\r\n }\r\n if (erroredFiles.size) {\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().map((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\r\n erroredFiles.has(element.fileId)) {\r\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(element, {\r\n status: \"error\",\r\n });\r\n }\r\n return element;\r\n }));\r\n }\r\n return { updatedFiles, erroredFiles };\r\n });\r\n /** adds new images to imageCache and re-renders if needed */\r\n this.addNewImagesToImageCache = (imageElements = (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.getInitializedImageElements)(this.scene.getElements()), files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const uncachedImageElements = imageElements.filter((element) => !element.isDeleted && !this.imageCache.has(element.fileId));\r\n if (uncachedImageElements.length) {\r\n const { updatedFiles } = yield this.updateImageCache(uncachedImageElements, files);\r\n if (updatedFiles.size) {\r\n this.scene.informMutation();\r\n }\r\n }\r\n });\r\n /** generally you should use `addNewImagesToImageCache()` directly if you need\r\n * to render new images. This is just a failsafe */\r\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default()(() => {\r\n this.addNewImagesToImageCache();\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.IMAGE_RENDER_TIMEOUT);\r\n this.updateBindingEnabledOnPointerMove = (event) => {\r\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.shouldEnableBindingForPointerEvent)(event);\r\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\r\n this.setState({ isBindingEnabled: shouldEnableBinding });\r\n }\r\n };\r\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\r\n });\r\n };\r\n this.maybeSuggestBindingsForLinearElementAtCoords = (linearElement, \r\n /** scene coords */\r\n pointerCoords, \r\n // During line creation the start binding hasn't been written yet\r\n // into `linearElement`\r\n oppositeBindingBoundElement) => {\r\n if (!pointerCoords.length) {\r\n return;\r\n }\r\n const suggestedBindings = pointerCoords.reduce((acc, coords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(coords, this.scene);\r\n if (hoveredBindableElement != null &&\r\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\r\n acc.push(hoveredBindableElement);\r\n }\r\n return acc;\r\n }, []);\r\n this.setState({ suggestedBindings });\r\n };\r\n this.handleCanvasRef = (canvas) => {\r\n var _a, _b, _c;\r\n // canvas is null when unmounting\r\n if (canvas !== null) {\r\n this.canvas = canvas;\r\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__[\"default\"].canvas(this.canvas);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel, {\r\n passive: false,\r\n });\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n else {\r\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel);\r\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n };\r\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\r\n var _k, _l;\r\n try {\r\n const file = event.dataTransfer.files.item(0);\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\r\n // first attempt to decode scene from the image if it's embedded\r\n // ---------------------------------------------------------------------\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted());\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n return;\r\n }\r\n catch (error) {\r\n if (error.name !== \"EncodingError\") {\r\n throw error;\r\n }\r\n }\r\n }\r\n // if no scene is embedded or we fail for whatever reason, fall back\r\n // to importing as regular image\r\n // ---------------------------------------------------------------------\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n return this.setState({\r\n isLoading: false,\r\n errorMessage: error.message,\r\n });\r\n }\r\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib);\r\n if (libraryShapes !== \"\") {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: JSON.parse(libraryShapes),\r\n position: event,\r\n files: null,\r\n });\r\n return;\r\n }\r\n const file = (_k = event.dataTransfer) === null || _k === void 0 ? void 0 : _k.files.item(0);\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib ||\r\n ((_l = file === null || file === void 0 ? void 0 : file.name) === null || _l === void 0 ? void 0 : _l.endsWith(\".excalidrawlib\"))) {\r\n this.library\r\n .importLibrary(file)\r\n .then(() => {\r\n // Close and then open to get the libraries updated\r\n this.setState({ isLibraryOpen: false });\r\n this.setState({ isLibraryOpen: true });\r\n })\r\n .catch((error) => this.setState({ isLoading: false, errorMessage: error.message }));\r\n // default: assume an Excalidraw file regardless of extension/MimeType\r\n }\r\n else if (file) {\r\n this.setState({ isLoading: true });\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n yield this.loadFileToCanvas(file);\r\n }\r\n });\r\n this.loadFileToCanvas = (file) => {\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n };\r\n this.handleCanvasContextMenu = (event) => {\r\n event.preventDefault();\r\n if ((event.nativeEvent.pointerType === \"touch\" ||\r\n (event.nativeEvent.pointerType === \"pen\" &&\r\n // always allow if user uses a pen secondary button\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.SECONDARY)) &&\r\n this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\r\n const type = element ? \"element\" : \"canvas\";\r\n const container = this.excalidrawContainerRef.current;\r\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\r\n const left = event.clientX - offsetLeft;\r\n const top = event.clientY - offsetTop;\r\n if (element && !this.state.selectedElementIds[element.id]) {\r\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\r\n this._openContextMenu({ top, left }, type);\r\n });\r\n }\r\n else {\r\n this._openContextMenu({ top, left }, type);\r\n }\r\n };\r\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\r\n var _a;\r\n const draggingElement = this.state.draggingElement;\r\n const pointerCoords = pointerDownState.lastCoords;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"selection\") {\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event));\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(draggingElement) &&\r\n ((_a = this.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n const aspectRatio = image && !(image instanceof Promise)\r\n ? image.width / image.height\r\n : null;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), aspectRatio);\r\n this.maybeSuggestBindingForAll([draggingElement]);\r\n }\r\n };\r\n this.maybeHandleResize = (pointerDownState, event) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const transformHandleType = pointerDownState.resize.handleType;\r\n this.setState({\r\n // TODO: rename this state field to \"isScaling\" to distinguish\r\n // it from the generic \"isResizing\" which includes scaling and\r\n // rotating\r\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\r\n isRotating: transformHandleType === \"rotation\",\r\n });\r\n const pointerCoords = pointerDownState.lastCoords;\r\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(selectedElements[0])\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n return true;\r\n }\r\n return false;\r\n };\r\n /** @private use this.handleCanvasContextMenu */\r\n this._openContextMenu = ({ left, top, }, type) => {\r\n if (this.state.showHyperlinkPopup) {\r\n this.setState({ showHyperlinkPopup: false });\r\n }\r\n this.contextMenuOpen = true;\r\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const mayBeAllowUnbinding = _actions__WEBPACK_IMPORTED_MODULE_4__.actionUnbindText.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const mayBeAllowBinding = _actions__WEBPACK_IMPORTED_MODULE_4__.actionBindText.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const separator = \"separator\";\r\n const elements = this.scene.getElements();\r\n const options = [];\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng);\r\n }\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg);\r\n }\r\n if (type === \"canvas\") {\r\n const viewModeOptions = [\r\n ...options,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ];\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: viewModeOptions,\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: [\r\n this.deviceType.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.deviceType.isMobile && navigator.clipboard && separator,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg,\r\n ((_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) ||\r\n (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0)) &&\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSelectAll,\r\n separator,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n }\r\n else if (type === \"element\") {\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy, ...options],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\r\n options: [\r\n this.deviceType.isMobile && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCut,\r\n this.deviceType.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy,\r\n this.deviceType.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.deviceType.isMobile && separator,\r\n ...options,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyStyles,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionPasteStyles,\r\n separator,\r\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup,\r\n mayBeAllowUnbinding && _actions__WEBPACK_IMPORTED_MODULE_4__.actionUnbindText,\r\n mayBeAllowBinding && _actions__WEBPACK_IMPORTED_MODULE_4__.actionBindText,\r\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup,\r\n (maybeGroupAction || maybeUngroupAction) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionAddToLibrary,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendBackward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringForward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendToBack,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringToFront,\r\n separator,\r\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal,\r\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical,\r\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionLink.contextItemPredicate(elements, this.state) && _actions__WEBPACK_IMPORTED_MODULE_4__.actionLink,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDuplicateSelection,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n elements,\r\n });\r\n }\r\n }\r\n };\r\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n if (isPanning) {\r\n return;\r\n }\r\n const { deltaX, deltaY } = event;\r\n const { selectedElementIds, previousSelectedElementIds } = this.state;\r\n // note that event.ctrlKey is necessary to handle pinch zooming\r\n if (event.metaKey || event.ctrlKey) {\r\n const sign = Math.sign(deltaY);\r\n const MAX_STEP = 10;\r\n let delta = Math.abs(deltaY);\r\n if (delta > MAX_STEP) {\r\n delta = MAX_STEP;\r\n }\r\n delta *= sign;\r\n if (Object.keys(previousSelectedElementIds).length !== 0) {\r\n setTimeout(() => {\r\n this.setState({\r\n selectedElementIds: previousSelectedElementIds,\r\n previousSelectedElementIds: {},\r\n });\r\n }, 1000);\r\n }\r\n let newZoom = this.state.zoom.value - delta / 100;\r\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\r\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\r\n // round to nearest step\r\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\r\n viewportX: cursorX,\r\n viewportY: cursorY,\r\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(newZoom),\r\n }, state)), { selectedElementIds: {}, previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0\r\n ? selectedElementIds\r\n : previousSelectedElementIds, shouldCacheIgnoreZoom: true })));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n return;\r\n }\r\n // scroll horizontally when shift pressed\r\n if (event.shiftKey) {\r\n this.setState(({ zoom, scrollX }) => ({\r\n // on Mac, shift+wheel tends to result in deltaX\r\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\r\n }));\r\n return;\r\n }\r\n this.setState(({ zoom, scrollX, scrollY }) => ({\r\n scrollX: scrollX - deltaX / zoom.value,\r\n scrollY: scrollY - deltaY / zoom.value,\r\n }));\r\n });\r\n this.savePointer = (x, y, button) => {\r\n var _a, _b;\r\n if (!x || !y) {\r\n return;\r\n }\r\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\r\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\r\n // sometimes the pointer goes off screen\r\n }\r\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n pointer,\r\n button,\r\n pointersMap: gesture.pointers,\r\n });\r\n };\r\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n if (!this.unmounted) {\r\n this.setState({ shouldCacheIgnoreZoom: false });\r\n }\r\n }, 300);\r\n this.updateDOMRect = (cb) => {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\r\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\r\n if (width === currentWidth &&\r\n height === currentHeight &&\r\n offsetLeft === currentOffsetLeft &&\r\n offsetTop === currentOffsetTop) {\r\n if (cb) {\r\n cb();\r\n }\r\n return;\r\n }\r\n this.setState({\r\n width,\r\n height,\r\n offsetLeft,\r\n offsetTop,\r\n }, () => {\r\n cb && cb();\r\n });\r\n }\r\n };\r\n this.refresh = () => {\r\n this.setState(Object.assign({}, this.getCanvasOffsets()));\r\n };\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)();\r\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\r\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\r\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight, showHyperlinkPopup: false });\r\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_47__.nanoid)();\r\n if (excalidrawRef) {\r\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resolvablePromise)();\r\n const api = {\r\n ready: true,\r\n readyPromise,\r\n updateScene: this.updateScene,\r\n addFiles: this.addFiles,\r\n resetScene: this.resetScene,\r\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\r\n history: {\r\n clear: this.resetHistory,\r\n },\r\n scrollToContent: this.scrollToContent,\r\n getSceneElements: this.getSceneElements,\r\n getAppState: () => this.state,\r\n getFiles: () => this.files,\r\n refresh: this.refresh,\r\n importLibrary: this.importLibraryFromUrl,\r\n setToastMessage: this.setToastMessage,\r\n id: this.id,\r\n app: this,\r\n };\r\n if (typeof excalidrawRef === \"function\") {\r\n excalidrawRef(api);\r\n }\r\n else {\r\n excalidrawRef.current = api;\r\n }\r\n readyPromise.resolve(api);\r\n }\r\n this.excalidrawContainerValue = {\r\n container: this.excalidrawContainerRef.current,\r\n id: this.id,\r\n };\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__[\"default\"]();\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this);\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__[\"default\"]();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_6__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_7__.actions);\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createUndoAction)(this.history));\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createRedoAction)(this.history));\r\n }\r\n renderCanvas() {\r\n const canvasScale = window.devicePixelRatio;\r\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\r\n const canvasWidth = canvasDOMWidth * canvasScale;\r\n const canvasHeight = canvasDOMHeight * canvasScale;\r\n if (viewModeEnabled) {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n cursor: _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n render() {\r\n var _a, _b;\r\n const { zenModeEnabled, viewModeEnabled } = this.state;\r\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\"excalidraw excalidraw-container\", {\r\n \"excalidraw--zen-mode\": zenModeEnabled,\r\n \"excalidraw--view-mode\": viewModeEnabled,\r\n \"excalidraw--mobile\": this.deviceType.isMobile,\r\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(DeviceTypeContext.Provider, Object.assign({ value: this.deviceType }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_36__[\"default\"], { onHomeButtonClick: this.props.onHomeButtonClick, canvas: this.canvas, appState: this.state, files: this.files, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onPenModeToggle: this.togglePenMode, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\r\n elements,\r\n position: \"center\",\r\n files: null,\r\n }), zenModeEnabled: zenModeEnabled, toggleZenMode: this.toggleZenMode, langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.getLanguage)().code, isCollaborating: this.props.isCollaborating, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, viewModeEnabled: viewModeEnabled, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\r\n zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\r\n this.props.UIOptions.canvasActions &&\r\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id, onImageAction: this.onImageAction }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }, void 0), selectedElement.length === 1 && this.state.showHyperlinkPopup && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_46__.Hyperlink, { element: selectedElement[0], appState: this.state, setAppState: this.setAppState, onLinkOpen: this.props.onLinkOpen }, selectedElement[0].id)), this.state.showStats && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_37__.Stats, { appState: this.state, setAppState: this.setAppState, elements: this.scene.getElements(), onClose: this.toggleStats, renderCustomStats: renderCustomStats }, void 0)), this.state.toastMessage !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_38__.Toast, { message: this.state.toastMessage, clearToast: this.clearToast }, void 0)), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() }, void 0)] }), void 0) }), void 0) }), void 0));\r\n }\r\n componentDidMount() {\r\n var _a, _b;\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.unmounted = false;\r\n this.excalidrawContainerValue.container =\r\n this.excalidrawContainerRef.current;\r\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n const setState = this.setState.bind(this);\r\n Object.defineProperties(window.h, {\r\n state: {\r\n configurable: true,\r\n get: () => {\r\n return this.state;\r\n },\r\n },\r\n setState: {\r\n configurable: true,\r\n value: (...args) => {\r\n return this.setState(...args);\r\n },\r\n },\r\n app: {\r\n configurable: true,\r\n value: this,\r\n },\r\n history: {\r\n configurable: true,\r\n value: this.history,\r\n },\r\n });\r\n }\r\n this.scene.addCallback(this.onSceneUpdated);\r\n this.addEventListeners();\r\n if (this.excalidrawContainerRef.current) {\r\n this.focusContainer();\r\n }\r\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // compute isMobile state\r\n // ---------------------------------------------------------------------\r\n const { width, height } = this.excalidrawContainerRef.current.getBoundingClientRect();\r\n this.deviceType = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.deviceType, {\r\n isMobile: width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT ||\r\n (height < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE &&\r\n width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE),\r\n });\r\n // refresh offsets\r\n // ---------------------------------------------------------------------\r\n this.updateDOMRect();\r\n });\r\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\r\n }\r\n else if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\r\n const handler = () => {\r\n this.deviceType = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.deviceType, {\r\n isMobile: mediaQuery.matches,\r\n });\r\n };\r\n mediaQuery.addListener(handler);\r\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\r\n }\r\n const searchParams = new URLSearchParams(window.location.search.slice(1));\r\n if (searchParams.has(\"web-share-target\")) {\r\n // Obtain a file that was shared via the Web Share Target API.\r\n this.restoreFileFromShare();\r\n }\r\n else {\r\n this.updateDOMRect(this.initializeScene);\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n var _a;\r\n this.files = {};\r\n this.imageCache.clear();\r\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.unmounted = true;\r\n this.removeEventListeners();\r\n this.scene.destroy();\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.clearRenderCache)();\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__[\"default\"]();\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__[\"default\"]();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_6__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this);\r\n this.canvas = null;\r\n this.rc = null;\r\n // @ts-ignore\r\n this.excalidrawContainerRef.current = undefined;\r\n this.nearestScrollableContainer = undefined;\r\n this.excalidrawContainerValue = { container: null, id: \"unmounted\" };\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n }\r\n removeEventListeners() {\r\n var _a, _b, _c, _d, _e, _f;\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n (_e = (_d = document.fonts) === null || _d === void 0 ? void 0 : _d.removeEventListener) === null || _e === void 0 ? void 0 : _e.call(_d, \"loadingdone\", this.onFontLoaded);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n (_f = this.detachIsMobileMqHandler) === null || _f === void 0 ? void 0 : _f.call(this);\r\n }\r\n addEventListeners() {\r\n var _a, _b, _c, _d;\r\n this.removeEventListeners();\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer); // #3553\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n if (this.props.handleKeyboardGlobally) {\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp, { passive: true });\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\r\n // rerender text elements on font load to fix #637 && #1553\r\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \"loadingdone\", this.onFontLoaded);\r\n // Safari-only desktop pinch zoom\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n if (this.props.detectScroll) {\r\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\r\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n }\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n }\r\n componentDidUpdate(prevProps, prevState) {\r\n var _a, _b, _c;\r\n if (Object.keys(this.state.selectedElementIds).length &&\r\n (0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n this.setState({ elementType: \"selection\" });\r\n }\r\n if (prevState.theme !== this.state.theme) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setEraserCursor)(this.canvas, this.state.theme);\r\n }\r\n // Hide hyperlink popup if shown when element type is not selection\r\n if (prevState.elementType === \"selection\" &&\r\n this.state.elementType !== \"selection\" &&\r\n this.state.showHyperlinkPopup) {\r\n this.setState({ showHyperlinkPopup: false });\r\n }\r\n if (prevProps.langCode !== this.props.langCode) {\r\n this.updateLanguage();\r\n }\r\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\r\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\r\n }\r\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\r\n this.addEventListeners();\r\n this.deselectElements();\r\n }\r\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\r\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\r\n }\r\n if (prevProps.theme !== this.props.theme && this.props.theme) {\r\n this.setState({ theme: this.props.theme });\r\n }\r\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\r\n this.setState({\r\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null,\r\n });\r\n }\r\n if (!this.props.UIOptions.canvasActions &&\r\n this.state.openMenu === \"canvas\") {\r\n this.setState({\r\n openMenu: null,\r\n });\r\n }\r\n if (this.props.name && prevProps.name !== this.props.name) {\r\n this.setState({\r\n name: this.props.name,\r\n });\r\n }\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\r\n if (this.state.editingLinearElement &&\r\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\r\n // defer so that the commitToHistory flag isn't reset via current update\r\n setTimeout(() => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n const { multiElement } = prevState;\r\n if (prevState.elementType !== this.state.elementType &&\r\n multiElement != null &&\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(multiElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\r\n }\r\n const cursorButton = {};\r\n const pointerViewportCoords = {};\r\n const remoteSelectedElementIds = {};\r\n const pointerUsernames = {};\r\n const pointerUserStates = {};\r\n this.state.collaborators.forEach((user, socketId) => {\r\n if (user.selectedElementIds) {\r\n for (const id of Object.keys(user.selectedElementIds)) {\r\n if (!(id in remoteSelectedElementIds)) {\r\n remoteSelectedElementIds[id] = [];\r\n }\r\n remoteSelectedElementIds[id].push(socketId);\r\n }\r\n }\r\n if (!user.pointer) {\r\n return;\r\n }\r\n if (user.username) {\r\n pointerUsernames[socketId] = user.username;\r\n }\r\n if (user.userState) {\r\n pointerUserStates[socketId] = user.userState;\r\n }\r\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: user.pointer.x,\r\n sceneY: user.pointer.y,\r\n }, this.state);\r\n cursorButton[socketId] = user.button;\r\n });\r\n const renderingElements = this.scene.getElements().filter((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(element)) {\r\n if (\r\n // not placed on canvas yet (but in elements array)\r\n this.state.pendingImageElement &&\r\n element.id === this.state.pendingImageElement.id) {\r\n return false;\r\n }\r\n }\r\n // don't render text element that's being currently edited (it's\r\n // rendered on remote only)\r\n return (!this.state.editingElement ||\r\n this.state.editingElement.type !== \"text\" ||\r\n element.id !== this.state.editingElement.id);\r\n });\r\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_28__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\r\n scrollX: this.state.scrollX,\r\n scrollY: this.state.scrollY,\r\n viewBackgroundColor: this.state.viewBackgroundColor,\r\n zoom: this.state.zoom,\r\n remotePointerViewportCoords: pointerViewportCoords,\r\n remotePointerButton: cursorButton,\r\n remoteSelectedElementIds,\r\n remotePointerUsernames: pointerUsernames,\r\n remotePointerUserStates: pointerUserStates,\r\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\r\n theme: this.state.theme,\r\n imageCache: this.imageCache,\r\n isExporting: false,\r\n renderScrollbars: !this.deviceType.isMobile,\r\n });\r\n if (scrollBars) {\r\n currentScrollBars = scrollBars;\r\n }\r\n const scrolledOutside = \r\n // hide when editing text\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\r\n ? false\r\n : !atLeastOneVisibleElement && renderingElements.length > 0;\r\n if (this.state.scrolledOutside !== scrolledOutside) {\r\n this.setState({ scrolledOutside });\r\n }\r\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\r\n this.scheduleImageRefresh();\r\n // Do not notify consumers if we're still loading the scene. Among other\r\n // potential issues, this fixes a case where the tab isn't focused during\r\n // init, which would trigger onChange with empty elements, which would then\r\n // override whatever is in localStorage currently.\r\n if (!this.state.isLoading) {\r\n (_c = (_b = this.props).onChange) === null || _c === void 0 ? void 0 : _c.call(_b, this.scene.getElementsIncludingDeleted(), this.state, this.files, this.props.id);\r\n }\r\n }\r\n static resetTapTwice() {\r\n didTapTwice = false;\r\n }\r\n addTextFromPaste(text) {\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x,\r\n y,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text,\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: this.state.currentItemTextAlign,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({ selectedElementIds: { [element.id]: true } });\r\n this.history.resumeRecording();\r\n }\r\n selectShapeTool(elementType) {\r\n if (!isHoldingSpace) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isToolIcon)(document.activeElement)) {\r\n this.focusContainer();\r\n }\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElementType)(elementType)) {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n if (elementType === \"image\") {\r\n this.onImageAction();\r\n }\r\n if (elementType !== \"selection\") {\r\n this.setState({\r\n elementType,\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n else {\r\n this.setState({ elementType });\r\n }\r\n }\r\n handleTextWysiwyg(element, { isExistingElement = false, }) {\r\n const updateElement = (text, originalText, isDeleted) => {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\r\n text,\r\n isDeleted,\r\n originalText,\r\n });\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n };\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.textWysiwyg)({\r\n id: element.id,\r\n canvas: this.canvas,\r\n getViewportCoords: (x, y) => {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: x,\r\n sceneY: y,\r\n }, this.state);\r\n return [\r\n viewportX - this.state.offsetLeft,\r\n viewportY - this.state.offsetTop,\r\n ];\r\n },\r\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((text) => {\r\n updateElement(text, text, false);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element);\r\n }\r\n }),\r\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(({ text, viaKeyboard, originalText }) => {\r\n const isDeleted = !text.trim();\r\n updateElement(text, originalText, isDeleted);\r\n // select the created text element only if submitting via keyboard\r\n // (when submitting via click it should act as signal to deselect)\r\n if (!isDeleted && viaKeyboard) {\r\n const elementIdToSelect = element.containerId\r\n ? element.containerId\r\n : element.id;\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [elementIdToSelect]: true }),\r\n }));\r\n }\r\n if (isDeleted) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDeletion)(this.scene.getElements(), [element]);\r\n }\r\n if (!isDeleted || isExistingElement) {\r\n this.history.resumeRecording();\r\n }\r\n this.setState({\r\n draggingElement: null,\r\n editingElement: null,\r\n });\r\n if (this.state.elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n }\r\n this.focusContainer();\r\n }),\r\n element,\r\n excalidrawContainer: this.excalidrawContainerRef.current,\r\n app: this,\r\n });\r\n // deselect all other elements when inserting text\r\n this.deselectElements();\r\n // do an initial update to re-initialize element position since we were\r\n // modifying element's x/y for sake of editor (case: syncing to remote)\r\n updateElement(element.text, element.originalText, false);\r\n }\r\n deselectElements() {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n getTextElementAtPosition(x, y) {\r\n const element = this.getElementAtPosition(x, y, {\r\n includeBoundTextElement: true,\r\n });\r\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && !element.isDeleted) {\r\n return element;\r\n }\r\n return null;\r\n }\r\n getElementAtPosition(x, y, opts) {\r\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement);\r\n if (allHitElements.length > 1) {\r\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\r\n for (let index = allHitElements.length - 1; index > -1; index--) {\r\n if (this.state.selectedElementIds[allHitElements[index].id]) {\r\n return allHitElements[index];\r\n }\r\n }\r\n }\r\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\r\n // If we're hitting element with highest z-index only on its bounding box\r\n // while also hitting other element figure, the latter should be considered.\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\r\n ? allHitElements[allHitElements.length - 2]\r\n : elementWithHighestZIndex;\r\n }\r\n if (allHitElements.length === 1) {\r\n return allHitElements[0];\r\n }\r\n return null;\r\n }\r\n getElementsAtPosition(x, y, includeBoundTextElement = false) {\r\n const elements = includeBoundTextElement\r\n ? this.scene.getElements()\r\n : this.scene\r\n .getElements()\r\n .filter((element) => !((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && element.containerId));\r\n return (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsAtPosition)(elements, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_16__.hitTest)(element, this.state, x, y));\r\n }\r\n maybeCleanupAfterMissingPointerUp(event) {\r\n if (lastPointerUp !== null) {\r\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\r\n // this can happen when a contextual menu or alert is triggered. In order to avoid\r\n // being in a weird state, we clean up on the next pointerdown\r\n lastPointerUp(event);\r\n }\r\n }\r\n updateGestureOnPointerDown(event) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n if (gesture.pointers.size === 2) {\r\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n gesture.initialScale = this.state.zoom.value;\r\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n }\r\n }\r\n initialPointerDownState(event) {\r\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return {\r\n origin,\r\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD],\r\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\r\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\r\n // we need to duplicate because we'll be updating this state\r\n lastCoords: Object.assign({}, origin),\r\n originalElements: this.scene.getElements().reduce((acc, element) => {\r\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.deepCopyElement)(element));\r\n return acc;\r\n }, new Map()),\r\n resize: {\r\n handleType: false,\r\n isResizing: false,\r\n offset: { x: 0, y: 0 },\r\n arrowDirection: \"origin\",\r\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\r\n },\r\n hit: {\r\n element: null,\r\n allHitElements: [],\r\n wasAddedToSelection: false,\r\n hasBeenDuplicated: false,\r\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\r\n hasHitElementInside: false,\r\n },\r\n drag: {\r\n hasOccurred: false,\r\n offset: null,\r\n },\r\n eventListeners: {\r\n onMove: null,\r\n onUp: null,\r\n onKeyUp: null,\r\n onKeyDown: null,\r\n },\r\n boxSelection: {\r\n hasOccurred: false,\r\n },\r\n elementIdsToErase: {},\r\n };\r\n }\r\n // Returns whether the event is a dragging a scrollbar\r\n handleDraggingScrollBar(event, pointerDownState) {\r\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\r\n return false;\r\n }\r\n isDraggingScrollBar = true;\r\n pointerDownState.lastCoords.x = event.clientX;\r\n pointerDownState.lastCoords.y = event.clientY;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\r\n });\r\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isDraggingScrollBar = false;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\r\n lastPointerUp = null;\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n onPointerMove.flush();\r\n });\r\n lastPointerUp = onPointerUp;\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n return true;\r\n }\r\n isASelectedElement(hitElement) {\r\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\r\n }\r\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\r\n if (selectedElements.length < 2) {\r\n return false;\r\n }\r\n // How many pixels off the shape boundary we still consider a hit\r\n const threshold = 10 / this.state.zoom.value;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return (point.x > x1 - threshold &&\r\n point.x < x2 + threshold &&\r\n point.y > y1 - threshold &&\r\n point.y < y2 + threshold);\r\n }\r\n onKeyDownFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onKeyUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // Prevents focus from escaping excalidraw tab\r\n event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ALT && event.preventDefault();\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onPointerMoveFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\r\n var _a, _b;\r\n // We need to initialize dragOffsetXY only after we've updated\r\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\r\n // event handler should hopefully ensure we're already working with\r\n // the updated state.\r\n if (pointerDownState.drag.offset === null) {\r\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\r\n }\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\r\n return;\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n this.handleEraser(event, pointerDownState, pointerCoords);\r\n return;\r\n }\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n // for arrows/lines, don't start dragging until a given threshold\r\n // to ensure we don't create a 2-point arrow by mistake when\r\n // user clicks mouse in a way that it moves a tiny bit (thus\r\n // triggering pointermove)\r\n if (!pointerDownState.drag.hasOccurred &&\r\n (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\")) {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD) {\r\n return;\r\n }\r\n }\r\n if (pointerDownState.resize.isResizing) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return true;\r\n }\r\n }\r\n if (this.state.editingLinearElement) {\r\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, pointsSceneCoords) => {\r\n this.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\r\n });\r\n if (didDrag) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n return;\r\n }\r\n }\r\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hasHitASelectedElement ||\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) &&\r\n // this allows for box-selecting points when clicking inside the\r\n // line's bounding box\r\n (!this.state.editingLinearElement || !event.shiftKey) &&\r\n // box-selecting without shift when editing line, not clicking on a line\r\n (!this.state.editingLinearElement ||\r\n ((_a = this.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !==\r\n ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) ||\r\n pointerDownState.hit.hasHitElementInside)) {\r\n // Marking that click was used for dragging to check\r\n // if elements should be deselected on pointerup\r\n pointerDownState.drag.hasOccurred = true;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\r\n // it would have weird results (stuff jumping all over the screen)\r\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\r\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n const [dragDistanceX, dragDistanceY] = [\r\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\r\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\r\n ];\r\n // We only drag in one direction if shift is pressed\r\n const lockDirection = event.shiftKey;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, this.state);\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n // We duplicate the selected element if alt is pressed on pointer move\r\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\r\n // Move the currently selected elements to the top of the z index stack, and\r\n // put the duplicates where the selected elements used to be.\r\n // (the origin point where the dragging started)\r\n pointerDownState.hit.hasBeenDuplicated = true;\r\n const nextElements = [];\r\n const elementsToAppend = [];\r\n const groupIdMap = new Map();\r\n const oldIdToDuplicatedId = new Map();\r\n const hitElement = pointerDownState.hit.element;\r\n const elements = this.scene.getElementsIncludingDeleted();\r\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state, true).map((element) => element.id);\r\n for (const element of elements) {\r\n if (selectedElementIds.includes(element.id) ||\r\n // case: the state.selectedElementIds might not have been\r\n // updated yet by the time this mousemove event is fired\r\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\r\n pointerDownState.hit.wasAddedToSelection)) {\r\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\r\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(duplicatedElement, {\r\n x: duplicatedElement.x + (originDragX - dragX),\r\n y: duplicatedElement.y + (originDragY - dragY),\r\n });\r\n nextElements.push(duplicatedElement);\r\n elementsToAppend.push(element);\r\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\r\n }\r\n else {\r\n nextElements.push(element);\r\n }\r\n }\r\n const nextSceneElements = [...nextElements, ...elementsToAppend];\r\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_44__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\r\n this.scene.replaceAllElements(nextSceneElements);\r\n }\r\n return;\r\n }\r\n }\r\n // It is very important to read this.state within each move event,\r\n // otherwise we would read a stale one!\r\n const draggingElement = this.state.draggingElement;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"freedraw\") {\r\n const points = draggingElement.points;\r\n const dx = pointerCoords.x - draggingElement.x;\r\n const dy = pointerCoords.y - draggingElement.y;\r\n const lastPoint = points.length > 0 && points[points.length - 1];\r\n const discardPoint = lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\r\n if (!discardPoint) {\r\n const pressures = draggingElement.simulatePressure\r\n ? draggingElement.pressures\r\n : [...draggingElement.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n }\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n pointerDownState.drag.hasOccurred = true;\r\n const points = draggingElement.points;\r\n let dx = gridX - draggingElement.x;\r\n let dy = gridY - draggingElement.y;\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\r\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.elementType, dx, dy));\r\n }\r\n if (points.length === 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\r\n }\r\n else if (points.length > 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points.slice(0, -1), [dx, dy]],\r\n });\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n // When creating a linear element by dragging\r\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], this.state.startBoundElement);\r\n }\r\n }\r\n else {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n }\r\n if (this.state.elementType === \"selection\") {\r\n pointerDownState.boxSelection.hasOccurred = true;\r\n const elements = this.scene.getElements();\r\n if (!event.shiftKey &&\r\n // allows for box-selecting points (without shift)\r\n !this.state.editingLinearElement &&\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(elements, this.state)) {\r\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\r\n [pointerDownState.hit.element.id]: true,\r\n } }), this.scene.getElements()));\r\n }\r\n else {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n }\r\n // box-select line editor points\r\n if (this.state.editingLinearElement) {\r\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handleBoxSelection(event, this.state, this.setState.bind(this));\r\n // regular box-select\r\n }\r\n else {\r\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsWithinSelection)(elements, draggingElement);\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {})), (pointerDownState.hit.element\r\n ? {\r\n // if using ctrl/cmd, select the hitElement only if we\r\n // haven't box-selected anything else\r\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length,\r\n }\r\n : null)), showHyperlinkPopup: elementsWithinSelection.length === 1 &&\r\n elementsWithinSelection[0].link\r\n ? \"info\"\r\n : false }), this.scene.getElements()));\r\n }\r\n }\r\n });\r\n }\r\n // Returns whether the pointer move happened over either scrollbar\r\n handlePointerMoveOverScrollbars(event, pointerDownState) {\r\n if (pointerDownState.scrollbars.isOverHorizontal) {\r\n const x = event.clientX;\r\n const dx = x - pointerDownState.lastCoords.x;\r\n this.setState({\r\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.x = x;\r\n return true;\r\n }\r\n if (pointerDownState.scrollbars.isOverVertical) {\r\n const y = event.clientY;\r\n const dy = y - pointerDownState.lastCoords.y;\r\n this.setState({\r\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.y = y;\r\n return true;\r\n }\r\n return false;\r\n }\r\n onPointerUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((childEvent) => {\r\n var _a, _b;\r\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating, } = this.state;\r\n this.setState({\r\n isResizing: false,\r\n isRotating: false,\r\n resizingElement: null,\r\n selectionElement: null,\r\n cursorButton: \"up\",\r\n // text elements are reset on finalize, and resetting on pointerup\r\n // may cause issues with double taps\r\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\r\n ? this.state.editingElement\r\n : null,\r\n });\r\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\r\n // Handle end of dragging a point of a linear element, might close a loop\r\n // and sets binding element\r\n if (this.state.editingLinearElement) {\r\n if (!pointerDownState.boxSelection.hasOccurred &&\r\n (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !==\r\n this.state.editingLinearElement.elementId ||\r\n !pointerDownState.hit.hasHitElementInside)) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n }\r\n else {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({\r\n editingLinearElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n }\r\n }\r\n lastPointerUp = null;\r\n if (pointerDownState.eventListeners.onMove) {\r\n pointerDownState.eventListeners.onMove.flush();\r\n }\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\r\n if (this.state.pendingImageElement) {\r\n this.setState({ pendingImageElement: null });\r\n }\r\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n const points = draggingElement.points;\r\n let dx = pointerCoords.x - draggingElement.x;\r\n let dy = pointerCoords.y - draggingElement.y;\r\n // Allows dots to avoid being flagged as infinitely small\r\n if (dx === points[0][0] && dy === points[0][1]) {\r\n dy += 0.0001;\r\n dx += 0.0001;\r\n }\r\n const pressures = draggingElement.simulatePressure\r\n ? []\r\n : [...draggingElement.pressures, childEvent.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n lastCommittedPoint: [dx, dy],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)) {\r\n const imageElement = draggingElement;\r\n try {\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n catch (error) {\r\n console.error(error);\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== imageElement.id));\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n }\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n if (draggingElement.points.length > 1) {\r\n this.history.resumeRecording();\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n if (!pointerDownState.drag.hasOccurred &&\r\n draggingElement &&\r\n !multiElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [\r\n ...draggingElement.points,\r\n [\r\n pointerCoords.x - draggingElement.x,\r\n pointerCoords.y - draggingElement.y,\r\n ],\r\n ],\r\n });\r\n this.setState({\r\n multiElement: draggingElement,\r\n editingElement: this.state.draggingElement,\r\n });\r\n }\r\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\r\n }\r\n this.setState({ suggestedBindings: [], startBoundElement: null });\r\n if (!elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n elementType: \"selection\",\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n else {\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n }\r\n return;\r\n }\r\n if (elementType !== \"selection\" &&\r\n draggingElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(draggingElement)) {\r\n // remove invisible element which was added in onPointerDown\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\r\n this.setState({\r\n draggingElement: null,\r\n });\r\n return;\r\n }\r\n if (draggingElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getNormalizedDimensions)(draggingElement));\r\n }\r\n if (resizingElement) {\r\n this.history.resumeRecording();\r\n }\r\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(resizingElement)) {\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== resizingElement.id));\r\n }\r\n // Code below handles selection when element(s) weren't\r\n // drag or added to selection on pointer down phase.\r\n const hitElement = pointerDownState.hit.element;\r\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_9__.isEraserActive)(this.state)) {\r\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\r\n if (draggedDistance === 0) {\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({\r\n clientX: this.lastPointerUp.clientX,\r\n clientY: this.lastPointerUp.clientY,\r\n }, this.state);\r\n const hitElements = this.getElementsAtPosition(scenePointer.x, scenePointer.y);\r\n hitElements.forEach((hitElement) => (pointerDownState.elementIdsToErase[hitElement.id] = true));\r\n }\r\n this.eraseElements(pointerDownState);\r\n return;\r\n }\r\n if (hitElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !pointerDownState.hit.wasAddedToSelection &&\r\n // if we're editing a line, pointerup shouldn't switch selection if\r\n // box selected\r\n (!this.state.editingLinearElement ||\r\n !pointerDownState.boxSelection.hasOccurred)) {\r\n // when inside line editor, shift selects points instead\r\n if (childEvent.shiftKey && !this.state.editingLinearElement) {\r\n if (this.state.selectedElementIds[hitElement.id]) {\r\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_23__.isSelectedViaGroup)(this.state, hitElement)) {\r\n // We want to unselect all groups hitElement is part of\r\n // as well as all elements that are part of the groups\r\n // hitElement is part of\r\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\r\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getElementsInGroup)(this.scene.getElements(), groupId))\r\n .map((element) => ({ [element.id]: false }))\r\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\r\n this.setState((_prevState) => ({\r\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\r\n .map((gId) => ({ [gId]: false }))\r\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\r\n }));\r\n }\r\n else {\r\n // remove element from selection while\r\n // keeping prev elements selected\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getElements()));\r\n }\r\n }\r\n else {\r\n // add element to selection while\r\n // keeping prev elements selected\r\n this.setState((_prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\r\n }));\r\n }\r\n }\r\n else {\r\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getElements()))));\r\n }\r\n }\r\n if (!this.state.editingLinearElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !this.state.isResizing &&\r\n ((hitElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\r\n (!hitElement &&\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\r\n // Deselect selected elements\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n return;\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\r\n }));\r\n }\r\n if (elementType !== \"selection\" ||\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(this.scene.getElements(), this.state)) {\r\n this.history.resumeRecording();\r\n }\r\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\r\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? _element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements\r\n : _element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state));\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n elementType: \"selection\",\r\n });\r\n }\r\n else {\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n });\r\n }\r\n });\r\n }\r\n maybeSuggestBindingForAll(selectedElements) {\r\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getEligibleElementsForBinding)(selectedElements);\r\n this.setState({ suggestedBindings });\r\n }\r\n clearSelection(hitElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n // Continue editing the same group if the user selected a different\r\n // element from it\r\n editingGroupId: prevState.editingGroupId &&\r\n hitElement != null &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, prevState.editingGroupId)\r\n ? prevState.editingGroupId\r\n : null,\r\n }));\r\n this.setState({\r\n selectedElementIds: {},\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\r\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)), x, y);\r\n if (elementClickedInside) {\r\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\r\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\r\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\r\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_11__.TEXT_TO_CENTER_SNAP_THRESHOLD;\r\n if (isSnappedToCenter) {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\r\n return { viewportX, viewportY, elementCenterX, elementCenterY };\r\n }\r\n }\r\n }\r\n getCanvasOffsets() {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { left, top } = excalidrawContainer.getBoundingClientRect();\r\n return {\r\n offsetLeft: left,\r\n offsetTop: top,\r\n };\r\n }\r\n return {\r\n offsetLeft: 0,\r\n offsetTop: 0,\r\n };\r\n }\r\n updateLanguage() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_25__.languages.find((lang) => lang.code === this.props.langCode) ||\r\n _i18n__WEBPACK_IMPORTED_MODULE_25__.defaultLang;\r\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.setLanguage)(currentLang);\r\n this.setAppState({});\r\n });\r\n }\r\n}\r\nApp.defaultProps = {\r\n // needed for tests to pass since we directly render App in many tests\r\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_UI_OPTIONS,\r\n};\r\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n window.h = window.h || {};\r\n Object.defineProperties(window.h, {\r\n elements: {\r\n configurable: true,\r\n get() {\r\n return this.app.scene.getElementsIncludingDeleted();\r\n },\r\n set(elements) {\r\n return this.app.scene.replaceAllElements(elements);\r\n },\r\n },\r\n });\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vY29tcG9uZW50cy9BcHAudHN4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUEwQztBQUVKO0FBQ2Q7QUFDUTtBQTRCWjtBQUMwRDtBQUMzQjtBQUNMO0FBRUo7QUFDdUI7QUFNM0M7QUE4QkE7QUFDaUI7QUFDTztBQUNSO0FBQzBDO0FBMEI1RDtBQWFRO0FBQ3lDO0FBQ0k7QUFDRztBQVc3QztBQWVxQjtBQVNqQztBQUNjO0FBQzZDO0FBUzdEO0FBQytDO0FBQ3RCO0FBSVA7QUFXakI7QUFDaUI7QUFFYTtBQUNMO0FBb0N6QjtBQUM2QztBQUMvQjtBQUNBO0FBQ0E7QUFDdUM7QUFRakQ7QUFNSTtBQUNhO0FBQ2tDO0FBTXpDO0FBQ2lEO0FBUW5EO0FBRTlCLE1BQU0sd0JBQXdCLEdBQWU7SUFDM0MsUUFBUSxFQUFFLEtBQUs7SUFDZixhQUFhLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FBRywwREFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLGlEQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNqRSxNQUFNLDBCQUEwQixHQUFHLDBEQUFtQixDQUduRCxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDM0IsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLEVBQUUsQ0FDekMsaURBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXpDLElBQUksV0FBVyxHQUFZLEtBQUssQ0FBQztBQUNqQyxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUN6QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLElBQUksY0FBYyxHQUFZLEtBQUssQ0FBQztBQUNwQyxJQUFJLFNBQVMsR0FBWSxLQUFLLENBQUM7QUFDL0IsSUFBSSxtQkFBbUIsR0FBWSxLQUFLLENBQUM7QUFDekMsSUFBSSxpQkFBaUIsR0FBZSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pFLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUVsQyxJQUFJLGFBQWEsR0FBa0MsSUFBSSxDQUFDO0FBQ3hELE1BQU0sT0FBTyxHQUFZO0lBQ3ZCLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtJQUNuQixVQUFVLEVBQUUsSUFBSTtJQUNoQixlQUFlLEVBQUUsSUFBSTtJQUNyQixZQUFZLEVBQUUsSUFBSTtDQUNuQixDQUFDO0FBRUYsTUFBTSxHQUFJLFNBQVEsd0RBQW1DO0lBdUNuRCxZQUFZLEtBQWU7O1FBQ3pCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQXZDZixXQUFNLEdBQWlDLElBQUksQ0FBQztRQUM1QyxPQUFFLEdBQXVCLElBQUksQ0FBQztRQUM5QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLGVBQVUsR0FBZTtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUM7UUFHTSwyQkFBc0IsR0FBRyxzREFBZSxFQUFrQixDQUFDO1FBbUI1RCxVQUFLLEdBQWdCLEVBQUUsQ0FBQztRQUN4QixlQUFVLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFHaEUsb0JBQWUsR0FBaUQsSUFBSSxDQUFDO1FBQ3JFLGtCQUFhLEdBQTBELElBQUksQ0FBQztRQUM1RSxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxxQkFBZ0IsR0FBb0MsSUFBSSxDQUFDO1FBa1BsRCxtQkFBYyxHQUF5QyxHQUFHLEVBQUU7O1lBQ2pFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hCLFVBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLDBDQUFFLEtBQUssRUFBRSxDQUFDO2FBQzlDO1FBQ0gsQ0FBQyxDQUFDO1FBRUsscUNBQWdDLEdBQUcsR0FBRyxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ2xELENBQUMsQ0FBQztRQUVLLHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBRU0scUJBQWdCLEdBQUcsMkRBQWtCLENBQzNDLENBQUMsWUFBMEIsRUFBRSxFQUFFOztZQUM3QixzRUFBc0U7WUFDdEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUU7Z0JBQzVDLE9BQU87YUFDUjtZQUVELElBQUksY0FBYyxHQUFzQyxJQUFJLENBQUM7WUFDN0QsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUN6QixZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFOztvQkFDeEMsSUFDRSxXQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsMENBQUUsRUFBRSxNQUFLLE9BQU8sQ0FBQyxFQUFFO3dCQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsS0FBSyxPQUFPO3dCQUNyQyw4REFBbUIsQ0FBQyxPQUFPLENBQUMsRUFDNUI7d0JBQ0EsY0FBYyxHQUFHLE9BQU8sQ0FBQztxQkFDMUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JELElBQUksWUFBWSxDQUFDLGVBQWUsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztpQkFDaEM7YUFDRjtZQUVELElBQUksWUFBWSxDQUFDLEtBQUssRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsWUFBWTtvQkFDcEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLO29CQUNwQixDQUFDLGlDQUFNLElBQUksQ0FBQyxLQUFLLEdBQUssWUFBWSxDQUFDLEtBQUssQ0FBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUNqQztZQUVELElBQUksWUFBWSxDQUFDLFFBQVEsSUFBSSxjQUFjLEVBQUU7Z0JBQzNDLElBQUksWUFBWSxDQUFDLGVBQWUsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztpQkFDaEM7Z0JBRUQsSUFBSSxlQUFlLEdBQUcsbUJBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxRQUFRLDBDQUFFLGVBQWUsS0FBSSxLQUFLLENBQUM7Z0JBQ3ZFLElBQUksY0FBYyxHQUFHLG1CQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsUUFBUSwwQ0FBRSxjQUFjLEtBQUksS0FBSyxDQUFDO2dCQUNyRSxJQUFJLFFBQVEsR0FBRyxtQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFFBQVEsMENBQUUsUUFBUSxLQUFJLElBQUksQ0FBQztnQkFDeEQsSUFBSSxLQUFLLEdBQUcsbUJBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxRQUFRLDBDQUFFLEtBQUssS0FBSSxvREFBVyxDQUFDO2dCQUN6RCxJQUFJLElBQUksR0FBRyx3QkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFFBQVEsMENBQUUsSUFBSSxtQ0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDM0QsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLFdBQVcsRUFBRTtvQkFDckQsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO2lCQUM5QztnQkFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEtBQUssV0FBVyxFQUFFO29CQUNwRCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7aUJBQzVDO2dCQUVELElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsS0FBSyxXQUFXLEVBQUU7b0JBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsa0RBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2lCQUMxRDtnQkFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO29CQUMzQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7aUJBQzFCO2dCQUVELElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7b0JBQzFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FDWCxDQUFDLEtBQUssRUFBRSxFQUFFOztvQkFDUiwrREFBK0Q7b0JBQy9ELDJEQUEyRDtvQkFDM0Qsc0RBQXNEO29CQUN0RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUU7d0JBQ2hELGNBQWMsRUFDWixjQUFjLEtBQUksa0JBQVksQ0FBQyxRQUFRLDBDQUFFLGNBQWMsS0FBSSxJQUFJO3dCQUNqRSxlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsUUFBUTt3QkFDUixLQUFLO3dCQUNMLElBQUk7cUJBQ0wsQ0FBQyxDQUFDO2dCQUNMLENBQUMsRUFDRCxHQUFHLEVBQUU7b0JBQ0gsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFO3dCQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FDMUIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQ3pDLENBQUM7cUJBQ0g7Z0JBQ0gsQ0FBQyxDQUNGLENBQUM7YUFDSDtRQUNILENBQUMsQ0FDRixDQUFDO1FBRUYsWUFBWTtRQUVKLFdBQU0sR0FBRywyREFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDdkMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVLLGFBQVEsR0FBRyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUVNLGlCQUFZLEdBQWtCLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDOUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQztRQUVNLGlCQUFZLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSx3REFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixtRkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDcEM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFFTSx5QkFBb0IsR0FBRyxDQUFPLEdBQVcsRUFBRSxLQUFxQixFQUFFLEVBQUU7WUFDMUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUVBQXdCLENBQUMsRUFBRTtnQkFDM0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsaUVBQXdCLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLGlEQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2xFO2lCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGtFQUF5QixDQUFDLEVBQUU7Z0JBQ3JFLE1BQU0sS0FBSyxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFELEtBQUssQ0FBQyxNQUFNLENBQUMsa0VBQXlCLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLGlEQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ25FO1lBRUQsSUFBSTtnQkFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsMkRBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDekIsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO2lCQUNuQjtnQkFDRCxJQUNFLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRTtvQkFDakIsTUFBTSxDQUFDLE9BQU8sQ0FDWix5Q0FBQyxDQUFDLDBCQUEwQixFQUFFO3dCQUM1QixTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtxQkFDNUQsQ0FBQyxDQUNILEVBQ0Q7b0JBQ0EsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3BELGtEQUFrRDtvQkFDbEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTt3QkFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3FCQUN6QztvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3hDO2FBQ0Y7WUFBQyxPQUFPLEtBQVUsRUFBRTtnQkFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyx5Q0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtvQkFBUztnQkFDUixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdkI7UUFDSCxDQUFDLEVBQUM7UUFFTSxpQkFBWSxHQUFHLEdBQUcsRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGOzs7V0FHRztRQUNLLGVBQVUsR0FBRywyREFBa0IsQ0FDckMsQ0FBQyxJQUFxQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxpQ0FDcEIsNkRBQWtCLEVBQUUsS0FDdkIsU0FBUyxFQUFFLEtBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxpQkFBaUIsRUFBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUM1RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQ3ZCLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQ0YsQ0FBQztRQUVNLG9CQUFlLEdBQUcsR0FBUyxFQUFFO1lBQ25DLElBQUksYUFBYSxJQUFJLE1BQU0sSUFBSSxjQUFjLElBQUksTUFBTSxFQUFFO2dCQUN0RCxNQUFjLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FDckMsQ0FBTyxZQUE4QixFQUFFLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDOUIsT0FBTztxQkFDUjtvQkFDRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLElBQUksR0FBUyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQ3pCLG9EQUFZLENBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUN6Qzt5QkFDRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZCxJQUFJLENBQUMsZ0JBQWdCLGlDQUNoQixLQUFLLEtBQ1IsUUFBUSxrQ0FDSCxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUNqQyxTQUFTLEVBQUUsS0FBSyxLQUVsQixlQUFlLEVBQUUsSUFBSSxJQUNyQixDQUFDO29CQUNMLENBQUMsQ0FBQzt5QkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7b0JBQ25FLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsRUFDRixDQUFDO2FBQ0g7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNwQztZQUNELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJO2dCQUNGLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBQ3JELElBQUksV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFlBQVksRUFBRTtvQkFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLG1FQUFtQixDQUNoRCxXQUFXLENBQUMsWUFBWSxFQUN4QixhQUFhLENBQ0UsQ0FBQztpQkFDbkI7YUFDRjtZQUFDLE9BQU8sS0FBVSxFQUFFO2dCQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixXQUFXLEdBQUc7b0JBQ1osUUFBUSxFQUFFO3dCQUNSLFlBQVksRUFDVixLQUFLLENBQUMsT0FBTzs0QkFDYiwrREFBK0Q7cUJBQ2xFO2lCQUNGLENBQUM7YUFDSDtZQUVELE1BQU0sS0FBSyxHQUFHLHVEQUFPLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUvQyxLQUFLLENBQUMsUUFBUSxtQ0FDVCxLQUFLLENBQUMsUUFBUSxLQUNqQixXQUFXLEVBQ1QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssT0FBTztvQkFDcEMsQ0FBQyxDQUFDLFdBQVc7b0JBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUNoQyxTQUFTLEVBQUUsS0FBSyxHQUNqQixDQUFDO1lBQ0YsSUFBSSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsZUFBZSxFQUFFO2dCQUNoQyxLQUFLLENBQUMsUUFBUSxtQ0FDVCxLQUFLLENBQUMsUUFBUSxHQUNkLDhEQUFxQixDQUN0QixLQUFLLENBQUMsUUFBUSxrQ0FFVCxLQUFLLENBQUMsUUFBUSxLQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMvQixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBRW5DLElBQUksQ0FDTCxDQUNGLENBQUM7YUFDSDtZQUVELElBQUksWUFBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLE9BQU8sS0FBSSxJQUFJLEVBQUU7Z0JBQ2hDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7YUFDOUM7WUFDRCxJQUFJLFlBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxPQUFPLEtBQUksSUFBSSxFQUFFO2dCQUNoQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO2FBQzlDO1lBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsaUNBQ2hCLEtBQUssS0FDUixlQUFlLEVBQUUsSUFBSSxJQUNyQixDQUFDO1lBRUgsTUFBTSxVQUFVO1lBQ2QsVUFBVTtZQUNWLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FDcEQsaUVBQXdCLENBQ3pCO2dCQUNELGtDQUFrQztnQkFDbEMsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQzdDLGtFQUF5QixDQUMxQixDQUFDO1lBRUosSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDN0M7UUFDSCxDQUFDLEVBQUM7UUFpSE0sYUFBUSxHQUFHLDJEQUFrQixDQUFDLEdBQUcsRUFBRTtZQUN6QyxJQUFJLENBQUMsS0FBSztpQkFDUCwyQkFBMkIsRUFBRTtpQkFDN0IsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxtRkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUEyVEssYUFBUSxHQUFHLGlEQUFRLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN0QixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO29CQUNwRSxPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLHVEQUFjLENBQUMsQ0FBQztRQUVuQixhQUFhO1FBRUwsVUFBSyxHQUFHLDJEQUFrQixDQUFDLENBQUMsS0FBcUIsRUFBRSxFQUFFOztZQUMzRCxNQUFNLGtCQUFrQixHQUFHLFVBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLDBDQUFFLFFBQVEsQ0FDdEUsUUFBUSxDQUFDLGFBQWEsQ0FDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxrQkFBa0IsSUFBSSwwREFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzFELE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUVLLFdBQU0sR0FBRywyREFBa0IsQ0FBQyxDQUFDLEtBQXFCLEVBQUUsRUFBRTs7WUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxVQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTywwQ0FBRSxRQUFRLENBQ3RFLFFBQVEsQ0FBQyxhQUFhLENBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLElBQUksMERBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMxRCxPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSyxXQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDBEQUFvQixDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDO1FBRU0sWUFBTyxHQUFHLEdBQUcsRUFBRTtZQUNyQiw0REFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDO1FBTU0sZUFBVSxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1lBQ3pDLGdDQUFnQztZQUNoQyx5RUFBeUU7WUFDekUsSUFBSSxDQUFDLDZDQUFTLEVBQUU7Z0JBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3hCO1lBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDaEIsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDbkIsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQy9CLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQ2xDLEdBQUcsQ0FBQyxhQUFhLEVBQ2pCLDBEQUFpQixDQUNsQixDQUFDO2dCQUNGLE9BQU87YUFDUjtZQUNELDJEQUEyRDtZQUMzRCxrRkFBa0Y7WUFDbEYsSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsYUFBYTtnQkFDYixJQUFJLENBQUMsdUJBQXVCLENBQUM7b0JBQzNCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztvQkFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2lCQUN2QixDQUFDLENBQUM7Z0JBQ0gsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDcEIsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDaEM7WUFDRCxJQUFJLDZDQUFTLEVBQUU7Z0JBQ2IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3hCO1lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osa0JBQWtCLEVBQUUsRUFBRTtpQkFDdkIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUM7UUFFTSxhQUFRLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osMEJBQTBCLEVBQUUsRUFBRTtvQkFDOUIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEI7aUJBQzFELENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUM7UUFFTSx1QkFBa0IsR0FBRywyREFBa0IsQ0FDN0MsQ0FBTyxLQUE0QixFQUFFLEVBQUU7O1lBQ3JDLE9BQU87WUFDUCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3RDLE1BQU0sa0JBQWtCLEdBQ3RCLFVBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLDBDQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3ZCLE9BQU87YUFDUjtZQUVELE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RTtZQUNFLHNFQUFzRTtZQUN0RSxxQ0FBcUM7WUFDckMsS0FBSztnQkFDTCxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsWUFBWSxpQkFBaUIsQ0FBQztvQkFDakQsMERBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDNUI7Z0JBQ0EsT0FBTzthQUNSO1lBRUQseUVBQXlFO1lBQ3pFLGdFQUFnRTtZQUNoRSxpQ0FBaUM7WUFDakMsSUFBSSxJQUFJLEdBQUcsV0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLGFBQWEsMENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sMkRBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMxRCxzRUFBc0U7b0JBQ3RFLGlCQUFpQjtvQkFDakIsSUFBSSxHQUFHLDREQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2hDO2FBQ0Y7WUFFRCxtRUFBbUU7WUFDbkUsSUFBSSxpRUFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ25ELE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxvRUFBMkIsQ0FDMUQsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO2dCQUVGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFbkUsT0FBTzthQUNSO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDdEIsSUFBSTtvQkFDRixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7d0JBQ3JELE9BQU87cUJBQ1I7aUJBQ0Y7Z0JBQUMsT0FBTyxLQUFVLEVBQUU7b0JBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7YUFDcEQ7aUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLFdBQVcsRUFBRTt3QkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVc7d0JBQ3RCLEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGLENBQUMsQ0FBQzthQUNKO2lCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLDZCQUE2QixDQUFDO29CQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7b0JBQ3pCLFFBQVEsRUFBRSxRQUFRO2lCQUNuQixDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEM7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xDLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDLEVBQ0YsQ0FBQztRQUVNLGtDQUE2QixHQUFHLENBQUMsSUFJeEMsRUFBRSxFQUFFO1lBQ0gsTUFBTSxRQUFRLEdBQUcsK0RBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRywwREFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTNELE1BQU0sZUFBZSxHQUFHLGlEQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxNQUFNLGVBQWUsR0FBRyxpREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFakQsTUFBTSxPQUFPLEdBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVE7Z0JBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87Z0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVE7b0JBQzVCLENBQUMsQ0FBQyxPQUFPO29CQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVE7Z0JBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87Z0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVE7b0JBQzVCLENBQUMsQ0FBQyxPQUFPO29CQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFFbkQsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxvRUFBMkIsQ0FDMUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQ3BCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztZQUVGLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDL0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBRTdCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsb0RBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0MsTUFBTSxVQUFVLEdBQUcsMkRBQWdCLENBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUN6QixVQUFVLEVBQ1YsT0FBTyxFQUNQO29CQUNFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJO29CQUMzQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSTtpQkFDNUIsQ0FDRixDQUFDO2dCQUNGLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxzRkFBK0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDNUUsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRTtnQkFDM0MsR0FBRyxXQUFXO2FBQ2YsQ0FBQztZQUNGLDhFQUEyQixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUV6RSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssbUNBQVEsSUFBSSxDQUFDLEtBQUssR0FBSyxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUM7YUFDL0M7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FDWCx5RUFBK0IsaUNBRXhCLElBQUksQ0FBQyxLQUFLLEtBQ2IsYUFBYSxFQUFFLEtBQUssRUFDcEIsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtvQkFDdEQsSUFBSSxDQUFDLHdFQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNoQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztxQkFDeEI7b0JBQ0QsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsQ0FBQyxFQUFFLEVBQVMsQ0FBQyxFQUNiLGdCQUFnQixFQUFFLEVBQUUsS0FFdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDekIsRUFDRCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNkLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2lCQUNqQztZQUNILENBQUMsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUM7UUFrQ0YsZ0JBQWdCO1FBRWhCLGdCQUFXLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQztRQUVGLGtCQUFhLEdBQUcsQ0FBQyxLQUFxRCxFQUFFLEVBQUU7WUFDeEUsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQzlCO1lBRUQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQztRQUVGLGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUMxQixPQUFPO29CQUNMLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhO29CQUN2QyxXQUFXLEVBQUUsU0FBUyxDQUFDLGFBQWE7d0JBQ2xDLENBQUMsQ0FBQyxXQUFXO3dCQUNiLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVztpQkFDMUIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsa0JBQWEsR0FBRyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUMxQixPQUFPO29CQUNMLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2lCQUM1QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixrQkFBYSxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyx5REFBbUIsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQztRQUVGLGdCQUFXLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDekIsc0RBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyx1REFBaUIsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQztRQUVGLG9CQUFlLEdBQUcsQ0FDaEIsU0FFbUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFDM0QsRUFBRTtZQUNGLElBQUksQ0FBQyxRQUFRLG1CQUNSLDhEQUFxQixDQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQ3pDLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FDWixFQUNELENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLENBQUMsWUFBb0IsRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztRQUVGLHlCQUFvQixHQUFHLEdBQVMsRUFBRTtZQUNoQyxJQUFJO2dCQUNGLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRWxFLE1BQU0sSUFBSSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLElBQUksRUFBRTtvQkFDUixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixNQUFNLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGlEQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDdkU7YUFDRjtZQUFDLE9BQU8sS0FBVSxFQUFFO2dCQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0gsQ0FBQyxFQUFDO1FBRUYsNERBQTREO1FBQ3JELGFBQVEsR0FBd0MsMkRBQWtCLENBQ3ZFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUM5QyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUEwQixDQUFDLENBQUM7WUFFdEMsSUFBSSxDQUFDLEtBQUssbUNBQVEsSUFBSSxDQUFDLEtBQUssR0FBSyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFFLENBQUM7WUFFaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0MsSUFDRSwrRUFBeUIsQ0FBQyxPQUFPLENBQUM7b0JBQ2xDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUM1QjtvQkFDQSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3ZDLG1GQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNwQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUU1QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQ0YsQ0FBQztRQUVLLGdCQUFXLEdBQUcsMkRBQWtCLENBQ3JDLENBQTJCLFNBTTFCLEVBQUUsRUFBRTtZQUNILElBQUksU0FBUyxDQUFDLGVBQWUsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUNoQztZQUVELElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkM7WUFFRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ25EO1lBRUQsSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFO2dCQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FDdEIsbUVBQW1CLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FDM0QsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUNGLENBQUM7UUFFTSxtQkFBYyxHQUFHLEdBQUcsRUFBRTtZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQztRQUVNLGdDQUEyQixHQUFHLDJEQUFrQixDQUN0RCxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUNwQixPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN4QixPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMxQixDQUFDLENBQ0YsQ0FBQztRQUVGLGlCQUFpQjtRQUVULGNBQVMsR0FBRywyREFBa0IsQ0FDcEMsQ0FBQyxLQUEwQyxFQUFFLEVBQUU7WUFDN0MsdURBQXVEO1lBQ3ZELElBQ0UsT0FBTyxJQUFJLE1BQU07Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQ2hEO2dCQUNBLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQ3ZCLEdBQUcsQ0FBQyxFQUFPLEVBQUUsSUFBSTt3QkFDZixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3ZCLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFOzRCQUMvQixtQ0FBbUM7NEJBQ25DLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt5QkFDdkI7d0JBQ0QsT0FBTyxJQUFJLEtBQUssS0FBSzs0QkFDbkIsQ0FBQyxDQUFDLCtEQUErRDtnQ0FDL0QsVUFBVTtnQ0FDVixLQUFLLENBQUMsUUFBUTtvQ0FDZCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7b0NBQ3RCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTs0QkFDeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDWixDQUFDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1lBRUQsSUFDRSxDQUFDLDBEQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLCtDQUFXLENBQUM7Z0JBQzlELDZDQUE2QztnQkFDN0MsQ0FBQyxrREFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxvREFBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNwRDtnQkFDQSxPQUFPO2FBQ1I7WUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssc0RBQWtCLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osY0FBYyxFQUFFLElBQUk7aUJBQ3JCLENBQUMsQ0FBQzthQUNKO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0MsT0FBTzthQUNSO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtnQkFDOUIsT0FBTzthQUNSO1lBRUQsSUFBSSxLQUFLLENBQUMsb0RBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO2dCQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM1QztZQUVELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyw4Q0FBVSxFQUFFO2dCQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2FBQzdEO1lBRUQsSUFBSSxrREFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEdBQ1IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7b0JBQ2xCLENBQUMsS0FBSyxDQUFDLFFBQVE7d0JBQ2IsQ0FBQyxDQUFDLGlFQUF3Qjt3QkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzNCLENBQUMsS0FBSyxDQUFDLFFBQVE7d0JBQ2IsQ0FBQyxDQUFDLHVFQUE4Qjt3QkFDaEMsQ0FBQyxDQUFDLGlFQUF3QixDQUFDLENBQUM7Z0JBRWhDLE1BQU0sZ0JBQWdCLEdBQUcsNERBQW1CLENBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQ3hCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUNMLENBQUM7Z0JBRUYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBRWhCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtREFBZSxFQUFFO29CQUNqQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ2pCO3FCQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxvREFBZ0IsRUFBRTtvQkFDekMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDaEI7cUJBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLGlEQUFhLEVBQUU7b0JBQ3RDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztpQkFDakI7cUJBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLG1EQUFlLEVBQUU7b0JBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ2hCO2dCQUVELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuQyxzRUFBYSxDQUFDLE9BQU8sRUFBRTt3QkFDckIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTzt3QkFDdEIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTztxQkFDdkIsQ0FBQyxDQUFDO29CQUVILHNFQUFtQixDQUFDLE9BQU8sRUFBRTt3QkFDM0IscUJBQXFCLEVBQUUsZ0JBQWdCO3FCQUN4QyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBRWpELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QjtpQkFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssOENBQVUsRUFBRTtnQkFDbkMsTUFBTSxnQkFBZ0IsR0FBRyw0REFBbUIsQ0FDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO2dCQUVGLElBQ0UsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzdCLHFFQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEM7b0JBQ0EsSUFDRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO3dCQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3BFO3dCQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQy9CLElBQUksQ0FBQyxRQUFRLENBQUM7NEJBQ1osb0JBQW9CLEVBQUUsSUFBSSw4RUFBbUIsQ0FDM0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQ25CLElBQUksQ0FBQyxLQUFLLENBQ1g7eUJBQ0YsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO3FCQUFNLElBQ0wsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzdCLENBQUMscUVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNyQztvQkFDQSxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUNwQixNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxHQUFHLENBQUM7d0JBQ3JELE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdEQsVUFBVSxFQUFFLElBQUk7cUJBQ2pCLENBQUMsQ0FBQztvQkFDSCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLE9BQU87aUJBQ1I7YUFDRjtpQkFBTSxJQUNMLENBQUMsS0FBSyxDQUFDLE9BQU87Z0JBQ2QsQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDYixDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksRUFDbkM7Z0JBQ0EsTUFBTSxLQUFLLEdBQUcsd0RBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksS0FBSyxFQUFFO29CQUNULElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzdCO3FCQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSywwQ0FBTSxFQUFFO29CQUMvQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQ25CO2FBQ0Y7WUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssOENBQVUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQzNELGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLGtEQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSw2REFBb0IsQ0FBQyxDQUFDO2dCQUM3QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7WUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssMENBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLDBDQUFNLEVBQUU7Z0JBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsNERBQW1CLENBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQ3hCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztnQkFDRixJQUNFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVc7b0JBQ3RDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUN4QjtvQkFDQSxPQUFPO2lCQUNSO2dCQUVELElBQ0UsS0FBSyxDQUFDLEdBQUcsS0FBSywwQ0FBTTtvQkFDcEIsQ0FBQyxzREFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO3dCQUNwQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLHNEQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbEU7b0JBQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7aUJBQ3ZEO2dCQUNELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSywwQ0FBTSxFQUFFO29CQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztpQkFDbkQ7YUFDRjtRQUNILENBQUMsQ0FDRixDQUFDO1FBRU0sWUFBTyxHQUFHLDJEQUFrQixDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO1lBQzVELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyw4Q0FBVSxFQUFFO2dCQUM1QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO29CQUM5QixrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseURBQWdCLENBQUMsQ0FBQztpQkFDMUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxXQUFXLEVBQUU7b0JBQ2pELG9EQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCwwREFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDWixrQkFBa0IsRUFBRSxFQUFFO3dCQUN0QixnQkFBZ0IsRUFBRSxFQUFFO3dCQUNwQixjQUFjLEVBQUUsSUFBSTtxQkFDckIsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELGNBQWMsR0FBRyxLQUFLLENBQUM7YUFDeEI7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLG9EQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO2dCQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUMzQztZQUNELElBQUksa0RBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsNERBQW1CLENBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQ3hCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztnQkFDRixtRUFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO29CQUMxQixDQUFDLENBQUMsK0VBQTRCLENBQUMsZ0JBQWdCLENBQUM7b0JBQ2hELENBQUMsQ0FBQyx1RUFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMxQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBMkJLLG1CQUFjLEdBQUcsMkRBQWtCLENBQUMsQ0FBQyxLQUFtQixFQUFFLEVBQUU7WUFDbEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osa0JBQWtCLEVBQUUsRUFBRTthQUN2QixDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVLLG9CQUFlLEdBQUcsMkRBQWtCLENBQUMsQ0FBQyxLQUFtQixFQUFFLEVBQUU7WUFDbkUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLDJEQUEyRDtZQUMzRCxxRUFBcUU7WUFDckUsa0VBQWtFO1lBQ2xFLGdFQUFnRTtZQUNoRSw0QkFBNEI7WUFDNUIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLE9BQU87YUFDUjtZQUVELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDMUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLG1CQUNwQiw2REFBZSxDQUNoQjtvQkFDRSxTQUFTLEVBQUUsT0FBTztvQkFDbEIsU0FBUyxFQUFFLE9BQU87b0JBQ2xCLFFBQVEsRUFBRSwwREFBaUIsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztpQkFDeEQsRUFDRCxLQUFLLENBQ04sRUFDRCxDQUFDLENBQUM7YUFDTDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUssaUJBQVksR0FBRywyREFBa0IsQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUNoRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWiwwQkFBMEIsRUFBRSxFQUFFO2dCQUM5QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjthQUMxRCxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQWtMSyxxQkFBZ0IsR0FBRyxDQUFDLEVBQzFCLE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUNWLG9CQUFvQixHQUFHLElBQUksR0FTNUIsRUFBRSxFQUFFOztZQUNILElBQUksb0JBQW9CLEdBQ3RCLG9CQUFvQjtnQkFDcEIsSUFBSSxDQUFDLHFDQUFxQyxDQUN4QyxNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sRUFDWCxNQUFNLENBQUMsZ0JBQWdCLENBQ3hCLENBQUM7WUFFSixJQUFJLG1CQUFtQixHQUE2QyxJQUFJLENBQUM7WUFDekUsSUFBSSxTQUFTLEdBQW1DLElBQUksQ0FBQztZQUVyRCxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUN4QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7WUFFRixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksd0RBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN0QyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0M7cUJBQU0sSUFBSSw2RUFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN2RCxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLG1CQUFtQixHQUFHLDBFQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUN0RDthQUNGO1lBRUQsbUJBQW1CO2dCQUNqQixtQkFBbUIsYUFBbkIsbUJBQW1CLGNBQW5CLG1CQUFtQixHQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdkUsK0NBQStDO1lBQy9DLGlDQUFpQztZQUNqQyxJQUNFLENBQUMsU0FBUztnQkFDVixDQUFDLG1CQUFtQjtnQkFDcEIsQ0FBQyxVQUFVLElBQUksb0JBQW9CLENBQUMsRUFDcEM7Z0JBQ0EsU0FBUyxHQUFHLDJFQUFrQyxDQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyx3REFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzdELE1BQU0sRUFDTixNQUFNLENBQ1AsQ0FBQzthQUNIO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFNBQVMsRUFBRTtnQkFDckMsTUFBTSxVQUFVLEdBQUc7b0JBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtvQkFDeEMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCO2lCQUM3QyxDQUFDO2dCQUNGLE1BQU0sUUFBUSxHQUFHLDRFQUFxQixDQUFDLHNEQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxTQUFTLEdBQUcsNkVBQXNCLENBQUMsc0RBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDckQsc0VBQWEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLG9CQUFvQixFQUFFO29CQUN4QixvQkFBb0IsR0FBRyxJQUFJLENBQUMscUNBQXFDLENBQy9ELE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxFQUNYLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDeEIsQ0FBQztpQkFDSDthQUNGO1lBRUQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CO2dCQUNqQyxDQUFDLENBQUMsbUJBQW1CO2dCQUNyQixDQUFDLENBQUMseURBQWMsQ0FBQztvQkFDYixDQUFDLEVBQUUsb0JBQW9CO3dCQUNyQixDQUFDLENBQUMsb0JBQW9CLENBQUMsY0FBYzt3QkFDckMsQ0FBQyxDQUFDLE1BQU07b0JBQ1YsQ0FBQyxFQUFFLG9CQUFvQjt3QkFDckIsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGNBQWM7d0JBQ3JDLENBQUMsQ0FBQyxNQUFNO29CQUNWLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtvQkFDOUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCO29CQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQzFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtvQkFDOUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCO29CQUM5QyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQzFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtvQkFDdEMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCO29CQUN0RCxJQUFJLEVBQUUsRUFBRTtvQkFDUixRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUI7b0JBQ3hDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQjtvQkFDNUMsU0FBUyxFQUFFLG9CQUFvQjt3QkFDN0IsQ0FBQyxDQUFDLFFBQVE7d0JBQ1YsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO29CQUNuQyxhQUFhLEVBQUUsb0JBQW9CO3dCQUNqQyxDQUFDLENBQUMsOERBQXFCO3dCQUN2QixDQUFDLENBQUMsK0RBQXNCO29CQUMxQixXQUFXLEVBQUUsZUFBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLEVBQUUsbUNBQUksU0FBUztvQkFDdkMsUUFBUSxFQUFFLGVBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxRQUFRLG1DQUFJLEVBQUU7aUJBQ3BDLENBQUMsQ0FBQztZQUVQLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUUzQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7b0JBQzVCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRTtvQkFDM0MsT0FBTztpQkFDUixDQUFDLENBQUM7Z0JBRUgsb0VBQW9FO2dCQUNwRSxrREFBa0Q7Z0JBQ2xELElBQUksQ0FBQyxvQkFBb0IsRUFBRTtvQkFDekIsc0VBQWEsQ0FBQyxPQUFPLEVBQUU7d0JBQ3JCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQztxQkFDcEMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLGNBQWMsRUFBRSxPQUFPO2FBQ3hCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlCLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxtQkFBbUI7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRU0sNEJBQXVCLEdBQUcsQ0FDaEMsS0FBMEMsRUFDMUMsRUFBRTtZQUNGLHdFQUF3RTtZQUN4RSxtQ0FBbUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDM0IsT0FBTzthQUNSO1lBQ0QsZ0VBQWdFO1lBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFO2dCQUMxQyxPQUFPO2FBQ1I7WUFFRCxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUN4QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7WUFFRixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUkscUVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN6RSxJQUNFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsU0FBUyxLQUFLLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDcEU7b0JBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDWixvQkFBb0IsRUFBRSxJQUFJLDhFQUFtQixDQUMzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FDWDtxQkFDRixDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsT0FBTzthQUNSO1lBRUQsb0RBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFekIsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLG9FQUEyQixDQUN4RCxLQUFLLEVBQ0wsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBRUYsTUFBTSxnQkFBZ0IsR0FBRyw2REFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUU3RCxNQUFNLGVBQWUsR0FDbkIsVUFBVTtvQkFDVixzRUFBNEIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUV4RSxJQUFJLGVBQWUsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzFCLHlFQUErQixpQ0FFeEIsU0FBUyxLQUNaLGNBQWMsRUFBRSxlQUFlLEVBQy9CLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxVQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQzlDLGdCQUFnQixFQUFFLEVBQUUsS0FFdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDekIsQ0FDRixDQUFDO29CQUNGLE9BQU87aUJBQ1I7YUFDRjtZQUVELG9EQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsb0RBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO2dCQUMzRCxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUN4QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7Z0JBQ0YsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNqQyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsTUFBTSxXQUFXLEdBQUcseUVBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3pELElBQUksV0FBVyxFQUFFO3dCQUNmLE1BQU0sR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUN2RCxNQUFNLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztxQkFDekQ7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDO29CQUNwQixNQUFNO29CQUNOLE1BQU07b0JBQ04sVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLG9CQUFvQixFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU07aUJBQ3BDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDO1FBRU0sNkJBQXdCLEdBQUcsQ0FDakMsWUFBZ0QsRUFDaEQsVUFBOEMsRUFDZixFQUFFO1lBQ2pDLDREQUE0RDtZQUM1RCxhQUFhO1lBQ2IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1RCxJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUM7WUFFL0IsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN0QyxJQUFJLFVBQVUsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxFQUFFLEVBQUU7b0JBQzlDLGVBQWUsR0FBRyxLQUFLLENBQUM7aUJBQ3pCO2dCQUNELE9BQU8sQ0FDTCxPQUFPLENBQUMsSUFBSTtvQkFDWiwyRUFBc0IsQ0FDcEIsT0FBTyxFQUNQLElBQUksQ0FBQyxLQUFLLEVBQ1YsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQ3pCO29CQUNELEtBQUssSUFBSSxlQUFlLENBQ3pCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVNLG1CQUFjLEdBQUcsQ0FDdkIsS0FBNEMsRUFDNUMsYUFBc0IsRUFDdEIsRUFBRTtZQUNGLE1BQU0sZUFBZSxHQUFHLGtEQUFVLENBQ2hDLElBQUksQ0FBQyxlQUFnQixDQUFDLE9BQU8sRUFDN0IsSUFBSSxDQUFDLGVBQWdCLENBQUMsT0FBTyxFQUM3QixJQUFJLENBQUMsYUFBYyxDQUFDLE9BQU8sRUFDM0IsSUFBSSxDQUFDLGFBQWMsQ0FBQyxPQUFPLENBQzVCLENBQUM7WUFDRixJQUNFLENBQUMsSUFBSSxDQUFDLGNBQWM7Z0JBQ3BCLDhEQUE4RDtnQkFDOUQsQ0FBQyxhQUFhLElBQUksZUFBZSxHQUFHLDJEQUFrQixDQUFDO2dCQUN2RCxDQUFDLENBQUMsYUFBYSxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUMsRUFDekM7Z0JBQ0EsT0FBTzthQUNSO1lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxvRUFBMkIsQ0FDdkQsSUFBSSxDQUFDLGVBQWdCLEVBQ3JCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztZQUNGLE1BQU0sOEJBQThCLEdBQUcsMkVBQXNCLENBQzNELElBQUksQ0FBQyxjQUFlLEVBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQ1YsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUN6QixDQUFDO1lBQ0YsTUFBTSxtQkFBbUIsR0FBRyxvRUFBMkIsQ0FDckQsSUFBSSxDQUFDLGFBQWMsRUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBQ0YsTUFBTSw0QkFBNEIsR0FBRywyRUFBc0IsQ0FDekQsSUFBSSxDQUFDLGNBQWUsRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQ3pCLENBQUM7WUFDRixJQUFJLDhCQUE4QixJQUFJLDRCQUE0QixFQUFFO2dCQUNsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDckMsSUFBSSxHQUFHLEVBQUU7b0JBQ1AsSUFBSSxXQUFXLENBQUM7b0JBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7d0JBQ3pCLFdBQVcsR0FBRyxrREFBUyxDQUFDLDhEQUFxQixFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztxQkFDekQ7b0JBQ0QsSUFBSSxDQUFDLFlBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxnQkFBZ0IsR0FBRTt3QkFDbEMsTUFBTSxNQUFNLEdBQUcsZ0VBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7d0JBQ3JELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUNqRCxnREFBZ0Q7d0JBQ2hELElBQUksU0FBUyxFQUFFOzRCQUNiLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOzRCQUN4QixTQUFTLENBQUMsUUFBUSxHQUFHLGtFQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ3pDO3FCQUNGO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUM7UUFFTSw0QkFBdUIsR0FBRyxDQUNoQyxLQUE0QyxFQUM1QyxFQUFFO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4RSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDekMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtvQkFDcEMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUNoQixDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQ2pCLENBQUMsQ0FBQzthQUNKO1lBRUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUMxQyxJQUNFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQixZQUFZO2dCQUNaLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCO2dCQUNBLE1BQU0sTUFBTSxHQUFHLG9EQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztnQkFFNUIsTUFBTSxRQUFRLEdBQUcsc0RBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO29CQUN6RCxDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBRXpDLE1BQU0sUUFBUSxHQUFHLFdBQVc7b0JBQzFCLENBQUMsQ0FBQywwREFBaUIsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO29CQUMvQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUUxQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3RCLE1BQU0sU0FBUyxHQUFHLDZEQUFlLENBQy9CO3dCQUNFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUNuQixRQUFRO3FCQUNULEVBQ0QsS0FBSyxDQUNOLENBQUM7b0JBRUYsT0FBTzt3QkFDTCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7d0JBQ3BCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxHQUFHLE1BQU0sR0FBRyxRQUFRO3dCQUM5QyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLEdBQUcsUUFBUTt3QkFDOUMscUJBQXFCLEVBQUUsSUFBSTtxQkFDNUIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQzthQUM1QztpQkFBTTtnQkFDTCxPQUFPLENBQUMsVUFBVTtvQkFDaEIsT0FBTyxDQUFDLGVBQWU7d0JBQ3ZCLE9BQU8sQ0FBQyxZQUFZOzRCQUNsQixJQUFJLENBQUM7YUFDVjtZQUVELElBQUksY0FBYyxJQUFJLFNBQVMsSUFBSSxtQkFBbUIsRUFBRTtnQkFDdEQsT0FBTzthQUNSO1lBRUQsTUFBTSx1QkFBdUIsR0FBRyx5REFBZ0IsQ0FDOUMsaUJBQWlCLEVBQ2pCLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQ3JDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQ3JDLENBQUM7WUFDRixNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxZQUFZLENBQUM7WUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7Z0JBQzNELElBQUksZUFBZSxFQUFFO29CQUNuQixvREFBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDMUI7cUJBQU07b0JBQ0wsMERBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVDO2FBQ0Y7WUFFRCxNQUFNLFlBQVksR0FBRyxvRUFBMkIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUFZLENBQUM7WUFFNUQsSUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQjtnQkFDL0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFDM0M7Z0JBQ0EsTUFBTSxvQkFBb0IsR0FBRyxnR0FBcUMsQ0FDaEUsS0FBSyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ3BCLENBQUM7Z0JBQ0YsSUFBSSxvQkFBb0IsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO29CQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO2lCQUN6QztnQkFDRCxJQUFJLG9CQUFvQixDQUFDLG9CQUFvQixJQUFJLElBQUksRUFBRTtvQkFDckQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNoRDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDMUM7YUFDRjtZQUVELElBQUksMEVBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDaEQseUVBQXlFO2dCQUN6RSxZQUFZO2dCQUNaLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxJQUFJLHNFQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMsNENBQTRDLENBQy9DLGVBQWUsRUFDZixDQUFDLFlBQVksQ0FBQyxFQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDM0IsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUM7Z0JBRXRDLE1BQU0sRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxZQUFZLENBQUM7Z0JBQ3BELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUU1QywwREFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0MsSUFBSSxTQUFTLEtBQUssa0JBQWtCLEVBQUU7b0JBQ3BDLHNFQUFzRTtvQkFDdEUseUJBQXlCO29CQUN6QixJQUNFLGtEQUFVLENBQ1IsYUFBYSxHQUFHLEVBQUUsRUFDbEIsYUFBYSxHQUFHLEVBQUUsRUFDbEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNaLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDYixJQUFJLCtEQUFzQixFQUMzQjt3QkFDQSxzRUFBYSxDQUFDLFlBQVksRUFBRTs0QkFDMUIsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxhQUFhLEdBQUcsRUFBRSxFQUFFLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQzt5QkFDOUQsQ0FBQyxDQUFDO3FCQUNKO3lCQUFNO3dCQUNMLGtEQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSw0REFBbUIsQ0FBQyxDQUFDO3dCQUM1QyxtRUFBbUU7d0JBQ25FLDJEQUEyRDtxQkFDNUQ7aUJBQ0Y7cUJBQU0sSUFDTCxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ2pCLGtCQUFrQjtvQkFDbEIsa0RBQVUsQ0FDUixhQUFhLEdBQUcsRUFBRSxFQUNsQixhQUFhLEdBQUcsRUFBRSxFQUNsQixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFDckIsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQ3RCLEdBQUcsK0RBQXNCLEVBQzFCO29CQUNBLGtEQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSw0REFBbUIsQ0FBQyxDQUFDO29CQUM1QyxzRUFBYSxDQUFDLFlBQVksRUFBRTt3QkFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUM1QixDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxtREFBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDOUMsa0RBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLDREQUFtQixDQUFDLENBQUM7cUJBQzdDO29CQUNELGdDQUFnQztvQkFDaEMsc0VBQWEsQ0FBQyxZQUFZLEVBQUU7d0JBQzFCLE1BQU0sRUFBRTs0QkFDTixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUN0QixDQUFDLGFBQWEsR0FBRyxFQUFFLEVBQUUsYUFBYSxHQUFHLEVBQUUsQ0FBQzt5QkFDekM7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO2dCQUVELE9BQU87YUFDUjtZQUVELE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxJQUNFLG1CQUFtQjtnQkFDbkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxXQUFXO29CQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNO29CQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsRUFDdEM7Z0JBQ0EsT0FBTzthQUNSO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUUxQyxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsSUFDRSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDN0IsQ0FBQyxlQUFlO2dCQUNoQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQ2hDO2dCQUNBLE1BQU0sOEJBQThCLEdBQUcsNEVBQWlDLENBQ3RFLFFBQVEsRUFDUixJQUFJLENBQUMsS0FBSyxFQUNWLGFBQWEsRUFDYixhQUFhLEVBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQ2YsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQztnQkFDRixJQUNFLDhCQUE4QjtvQkFDOUIsOEJBQThCLENBQUMsbUJBQW1CLEVBQ2xEO29CQUNBLGtEQUFTLENBQ1AsSUFBSSxDQUFDLE1BQU0sRUFDWCxzRUFBMkIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUM1RCxDQUFDO29CQUNGLE9BQU87aUJBQ1I7YUFDRjtpQkFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQzFELE1BQU0sbUJBQW1CLEdBQUcsMkVBQWdDLENBQzFELDBEQUFlLENBQUMsZ0JBQWdCLENBQUMsRUFDakMsYUFBYSxFQUNiLGFBQWEsRUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFDZixLQUFLLENBQUMsV0FBVyxDQUNsQixDQUFDO2dCQUNGLElBQUksbUJBQW1CLEVBQUU7b0JBQ3ZCLGtEQUFTLENBQ1AsSUFBSSxDQUFDLE1BQU0sRUFDWCxzRUFBMkIsQ0FBQzt3QkFDMUIsbUJBQW1CO3FCQUNwQixDQUFDLENBQ0gsQ0FBQztvQkFDRixPQUFPO2lCQUNSO2FBQ0Y7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQzFDLFlBQVksQ0FBQyxDQUFDLEVBQ2QsWUFBWSxDQUFDLENBQUMsQ0FDZixDQUFDO1lBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQ2pELFlBQVksRUFDWixVQUFVLENBQ1gsQ0FBQztZQUNGLElBQUkseURBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU87YUFDUjtZQUNELElBQ0UsSUFBSSxDQUFDLGNBQWM7Z0JBQ25CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUN0RDtnQkFDQSxrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsNERBQW1CLENBQUMsQ0FBQztnQkFDNUMseUVBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkQ7aUJBQU07Z0JBQ0wsd0VBQW1CLEVBQUUsQ0FBQztnQkFDdEIsSUFDRSxVQUFVO29CQUNWLFVBQVUsQ0FBQyxJQUFJO29CQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsQ0FBQyxJQUFJLENBQUMsZUFBZTtvQkFDckIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUM5QjtvQkFDQSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDL0M7cUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7b0JBQzVDLGtEQUFTLENBQ1AsSUFBSSxDQUFDLE1BQU0sRUFDWCx3REFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5REFBZ0IsQ0FBQyxDQUFDLENBQUMsOERBQXFCLENBQ3JFLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtvQkFDckMsa0RBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHlEQUFnQixDQUFDLENBQUM7aUJBQzFDO3FCQUFNLElBQUksZUFBZSxFQUFFO29CQUMxQixrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseURBQWdCLENBQUMsQ0FBQztpQkFDMUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO29CQUMxQyxNQUFNLE9BQU8sR0FBRyx5RkFBOEIsQ0FDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQzFDLENBQUM7b0JBRUYsSUFDRSxPQUFPO3dCQUNQLDhGQUF5QyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFOzRCQUM3RCxZQUFZLENBQUMsQ0FBQzs0QkFDZCxZQUFZLENBQUMsQ0FBQzt5QkFDZixDQUFDLEVBQ0Y7d0JBQ0Esa0RBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHlEQUFnQixDQUFDLENBQUM7cUJBQzFDO3lCQUFNO3dCQUNMLGtEQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSx5REFBZ0IsQ0FBQyxDQUFDO3FCQUMxQztpQkFDRjtxQkFBTTtnQkFDTCx3Q0FBd0M7Z0JBQ3hDLENBQUMsS0FBSyxDQUFDLG9EQUFnQixDQUFDO29CQUN4QixDQUFDLFVBQVU7d0JBQ1QsSUFBSSxDQUFDLDRDQUE0QyxDQUMvQyxZQUFZLEVBQ1osZ0JBQWdCLENBQ2pCLENBQUMsRUFDSjtvQkFDQSxrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseURBQWdCLENBQUMsQ0FBQztpQkFDMUM7cUJBQU07b0JBQ0wsa0RBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHlEQUFnQixDQUFDLENBQUM7aUJBQzFDO2FBQ0Y7UUFDSCxDQUFDLENBQUM7UUFFTSxpQkFBWSxHQUFHLENBQ3JCLEtBQW1CLEVBQ25CLGdCQUFrQyxFQUNsQyxZQUFzQyxFQUN0QyxFQUFFO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQTZCLEVBQUUsRUFBRTtnQkFDekQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO3dCQUNoQixJQUFJLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTs0QkFDbEQsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQzt5QkFDeEQ7cUJBQ0Y7eUJBQU07d0JBQ0wsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztxQkFDdkQ7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBa0IsRUFBRSxDQUFDO1lBRXRDLE1BQU0sUUFBUSxHQUFHLGtEQUFVLENBQ3pCLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQzdCLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQzdCLFlBQVksQ0FBQyxDQUFDLEVBQ2QsWUFBWSxDQUFDLENBQUMsQ0FDZixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM3QyxNQUFNLEtBQUsscUJBQVEsZ0JBQWdCLENBQUMsVUFBVSxDQUFFLENBQUM7WUFDakQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDekIsT0FBTyxnQkFBZ0IsSUFBSSxRQUFRLEVBQUU7Z0JBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRTlCLHNDQUFzQztnQkFDdEMsSUFBSSxnQkFBZ0IsS0FBSyxRQUFRLEVBQUU7b0JBQ2pDLE1BQU07aUJBQ1A7Z0JBRUQsc0VBQXNFO2dCQUN0RSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFcEUsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO2dCQUNsRCxNQUFNLEtBQUssR0FDVCxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLEtBQUssR0FDVCxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDakI7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNwRCxNQUFNLEVBQUUsR0FDTix3RUFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7b0JBQzlELENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVztvQkFDakIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUM1QixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7d0JBQ2hCLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFOzRCQUNwRCxPQUFPLHVFQUFjLENBQUMsR0FBRyxFQUFFO2dDQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7NkJBQ3ZDLENBQUMsQ0FBQzt5QkFDSjtxQkFDRjt5QkFBTTt3QkFDTCxPQUFPLHVFQUFjLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQzdDO2lCQUNGO2dCQUNELE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXhDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUMvQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDO1FBQ0YsMkNBQTJDO1FBQ25DLG9CQUFlLEdBQUcsQ0FBQyxLQUEwQyxFQUFFLEVBQUU7WUFDdkUscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUVNLDRCQUF1QixHQUFHLENBQ2hDLEtBQTRDLEVBQzVDLEVBQUU7WUFDRixvRUFBb0U7WUFDcEUsd0VBQXdFO1lBQ3hFLDhDQUE4QztZQUM5QyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUMsSUFBSSxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsVUFBVSxFQUFFO2dCQUN6QixTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDN0I7WUFDRCxJQUFJLENBQUMsa0RBQWtELENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlDLHlEQUF5RDtZQUN6RCwwREFBMEQ7WUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssS0FBSyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQzFCLE9BQU87d0JBQ0wsT0FBTyxFQUFFLElBQUk7d0JBQ2IsV0FBVyxFQUFFLElBQUk7cUJBQ2xCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELElBQ0UsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWE7Z0JBQzlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQzVDO2dCQUNBLElBQUksQ0FBQyxVQUFVLEdBQUcscURBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDMUU7WUFFRCxJQUFJLFNBQVMsRUFBRTtnQkFDYixPQUFPO2FBQ1I7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUN0QyxZQUFZLEVBQUUsTUFBTTthQUNyQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2RCxJQUFJLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDcEQsT0FBTzthQUNSO1lBRUQseUNBQXlDO1lBQ3pDLElBQ0UsS0FBSyxDQUFDLE1BQU0sS0FBSyw0REFBbUI7Z0JBQ3BDLEtBQUssQ0FBQyxNQUFNLEtBQUssNkRBQW9CLEVBQ3JDO2dCQUNBLE9BQU87YUFDUjtZQUVELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV2Qyw2QkFBNkI7WUFDN0IsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLE9BQU87YUFDUjtZQUVELHVFQUF1RTtZQUN2RSwwRUFBMEU7WUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3pELE9BQU87YUFDUjtZQUVELGdFQUFnRTtZQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUMsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7Z0JBQzlELE9BQU87YUFDUjtZQUVELE1BQU0sa0JBQWtCLEdBQ3RCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUNuQixLQUFLLENBQUMsV0FBVyxLQUFLLE9BQU87Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVc7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLE1BQU07Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQztZQUVyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3ZCLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3RELE9BQU87YUFDUjtpQkFBTSxJQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLE9BQU87Z0JBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLE1BQU0sRUFDakM7Z0JBQ0EsSUFBSSxDQUFDLGdDQUFnQyxDQUNuQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQ3RCLGdCQUFnQixDQUNqQixDQUFDO2FBQ0g7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxPQUFPLEVBQUU7Z0JBQzdDLHFDQUFxQztnQkFDckMsa0RBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLDhEQUFxQixDQUFDLENBQUM7Z0JBRTlDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFO29CQUNuQyxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CO29CQUMvQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUI7b0JBQzlDLG1CQUFtQixFQUFFLElBQUk7b0JBQ3pCLFlBQVksRUFBRSxJQUFJO2lCQUNuQixDQUFDLENBQUM7Z0JBRUgsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxvRUFBMkIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxzRUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7b0JBQzVDLENBQUM7b0JBQ0QsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLGtDQUFrQyxDQUNyQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQ3RCLGdCQUFnQixDQUNqQixDQUFDO2FBQ0g7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxpQ0FBaUMsQ0FDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQ3RCLGdCQUFnQixDQUNqQixDQUFDO2FBQ0g7WUFFRCxNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFN0QsTUFBTSxXQUFXLEdBQ2YsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFckUsYUFBYSxHQUFHLFdBQVcsQ0FBQztZQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7Z0JBQy9CLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQywyREFBa0IsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHlEQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsc0RBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9EQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO2dCQUN2RCxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztnQkFDbkQsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ2xELGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQ3ZEO1FBQ0gsQ0FBQyxDQUFDO1FBRU0sMEJBQXFCLEdBQUcsQ0FDOUIsS0FBNEMsRUFDNUMsRUFBRTtZQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7Z0JBQ2pDLE1BQU0sWUFBWSxHQUFHLG9FQUEyQixDQUM5QyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQ2xELElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztnQkFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQzFDLFlBQVksQ0FBQyxDQUFDLEVBQ2QsWUFBWSxDQUFDLENBQUMsQ0FDZixDQUFDO2dCQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUNqRCxZQUFZLEVBQ1osVUFBVSxDQUNYLENBQUM7YUFDSDtZQUNELElBQ0UsSUFBSSxDQUFDLGNBQWM7Z0JBQ25CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUN0RDtnQkFDQSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFFTSx1REFBa0QsR0FBRyxDQUMzRCxLQUE0QyxFQUN0QyxFQUFFO1lBQ1Isa0RBQWtEO1lBQ2xELElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxPQUFPLEVBQUU7Z0JBQ2pDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztnQkFFOUIsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLHFFQUFxRTtvQkFDckUsc0VBQXNFO29CQUN0RSxnQkFBZ0I7b0JBQ2hCLHFCQUFxQixHQUFHLElBQUksQ0FBQztpQkFDOUI7cUJBQU07b0JBQ0wsbUVBQW1FO29CQUNuRSw2QkFBNkI7b0JBQzdCLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDcEMsWUFBWSxHQUFHLENBQUMsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLHFCQUFxQixFQUFFOzRCQUMxQixJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3JDO29CQUNILENBQUMsRUFBRSwrREFBc0IsQ0FBQyxDQUFDO2lCQUM1QjthQUNGO1FBQ0gsQ0FBQyxDQUFDO1FBRU0sMEJBQXFCLEdBQUcsR0FBRyxFQUFFO1lBQ25DLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzQixZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNoQyxDQUFDLENBQUM7UUFhRix5Q0FBeUM7UUFDakMseUNBQW9DLEdBQUcsQ0FDN0MsS0FBNEMsRUFDbkMsRUFBRTtZQUNYLElBQ0UsQ0FBQyxDQUNDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUM7Z0JBQzNCLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyw2REFBb0I7b0JBQ3BDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyw0REFBbUIsSUFBSSxjQUFjLENBQUM7b0JBQ3hELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQzlCO2dCQUNELHdEQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFDeEM7Z0JBQ0EsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDakIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV4RCxrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsNkRBQW9CLENBQUMsQ0FBQztZQUM3QyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQy9DLE1BQU0sYUFBYSxHQUFHLG9FQUEyQixDQUFDLENBQUMsS0FBbUIsRUFBRSxFQUFFO2dCQUN4RSxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDckMsTUFBTSxNQUFNLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ3JDLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUN0QixLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFFdEI7OzttQkFHRztnQkFDSCxJQUNFLE9BQU87b0JBQ1AsQ0FBQyxrQkFBa0I7b0JBQ25CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDOUM7b0JBQ0Esa0JBQWtCLEdBQUcsSUFBSSxDQUFDO29CQUUxQixrQ0FBa0M7b0JBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFxQixFQUFFLEVBQUU7d0JBQ2pELFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0RBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUNqRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQzFCLENBQUMsQ0FBQztvQkFFRjs7Ozs7dUJBS0c7b0JBQ0gsTUFBTSxlQUFlLEdBQUcsR0FBRyxFQUFFO3dCQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFOzRCQUNkLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0RBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDOzRCQUNqRSxNQUFNLENBQUMsbUJBQW1CLENBQUMseURBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7d0JBQ2hFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDVixDQUFDLENBQUM7b0JBRUYsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvREFBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFDNUQ7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDWixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUs7b0JBQzVELE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSztpQkFDN0QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRywyREFBa0IsQ0FDakMsQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFO2dCQUNwQixhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFO29CQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO3dCQUM5QixrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseURBQWdCLENBQUMsQ0FBQztxQkFDMUM7eUJBQU07d0JBQ0wsMERBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzVDO2lCQUNGO2dCQUNELElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osWUFBWSxFQUFFLElBQUk7aUJBQ25CLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLDJEQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLENBQUMsbUJBQW1CLENBQUMseURBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxtREFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRCxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxtREFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQywyREFBa0IsRUFBRSxhQUFhLEVBQUU7Z0JBQ3pELE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHlEQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBNEhNLHNDQUFpQyxHQUFHLEdBQVMsRUFBRTtZQUNyRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDWixrQkFBa0IsRUFBRSxFQUFFO29CQUN0QixnQkFBZ0IsRUFBRSxFQUFFO29CQUNwQixjQUFjLEVBQUUsSUFBSTtpQkFDckIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUM7UUFFRjs7V0FFRztRQUNLLGlDQUE0QixHQUFHLENBQ3JDLEtBQTRDLEVBQzVDLGdCQUFrQyxFQUN6QixFQUFFOztZQUNYLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25FLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUU7b0JBQ3JFLE1BQU0sOEJBQThCLEdBQ2xDLDRFQUFpQyxDQUMvQixRQUFRLEVBQ1IsSUFBSSxDQUFDLEtBQUssRUFDVixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFDZixLQUFLLENBQUMsV0FBVyxDQUNsQixDQUFDO29CQUNKLElBQUksOEJBQThCLElBQUksSUFBSSxFQUFFO3dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDOzRCQUNaLGVBQWUsRUFBRSw4QkFBOEIsQ0FBQyxPQUFPO3lCQUN4RCxDQUFDLENBQUM7d0JBQ0gsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVU7NEJBQ2hDLDhCQUE4QixDQUFDLG1CQUFtQixDQUFDO3FCQUN0RDtpQkFDRjtxQkFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsMkVBQWdDLENBQ25FLDBEQUFlLENBQUMsZ0JBQWdCLENBQUMsRUFDakMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDekIsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQ2YsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7b0JBQ3RDLGtEQUFTLENBQ1AsSUFBSSxDQUFDLE1BQU0sRUFDWCxzRUFBMkIsQ0FBQzt3QkFDMUIsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVU7cUJBQ3hELENBQUMsQ0FDSCxDQUFDO29CQUNGLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO29CQUMxQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLHFEQUFZLENBQzNDLDREQUFpQixDQUNmLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ2xDLGdCQUFnQixFQUNoQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUMxQixDQUNGLENBQUM7b0JBQ0YsSUFDRSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQzt3QkFDN0IscUVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3ZDO3dCQUNBLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsa0VBQXVCLENBQzlELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ2xDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO3FCQUNIO2lCQUNGO3FCQUFNO29CQUNMLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTt3QkFDbkMsTUFBTSxHQUFHLEdBQUcsZ0dBQXFDLENBQy9DLEtBQUssRUFDTCxJQUFJLENBQUMsS0FBSyxFQUNWLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUNyQyxJQUFJLENBQUMsT0FBTyxFQUNaLGdCQUFnQixDQUFDLE1BQU0sQ0FDeEIsQ0FBQzt3QkFDRixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUU7NEJBQ2xCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQzt5QkFDL0M7d0JBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFOzRCQUNuQixPQUFPLElBQUksQ0FBQzt5QkFDYjtxQkFDRjtvQkFDRCxzREFBc0Q7b0JBQ3RELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPO3dCQUMxQixzQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxtQ0FDNUIsSUFBSSxDQUFDLG9CQUFvQixDQUN2QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUMxQixDQUFDO29CQUVKLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTt3QkFDaEMsK0NBQStDO3dCQUMvQyxJQUNFLDJFQUFzQixDQUNwQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUM1QixJQUFJLENBQUMsS0FBSyxFQUNWLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ3RELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUN6QixFQUNEOzRCQUNBLE9BQU8sS0FBSyxDQUFDO3lCQUNkO3dCQUNELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7NEJBQ3RDLDhGQUF5QyxDQUN2QyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUM1QixJQUFJLENBQUMsS0FBSyxFQUNWLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ3ZELENBQUM7cUJBQ0w7b0JBRUQsK0NBQStDO29CQUMvQyxvQkFBb0I7b0JBQ3BCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUM5RCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUMxQixDQUFDO29CQUVGLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7b0JBQ2hELE1BQU0sd0JBQXdCLEdBQzVCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUNqQyxDQUFDO29CQUNKLElBQ0UsQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUM7d0JBQ2xELENBQUMsS0FBSyxDQUFDLFFBQVE7d0JBQ2YsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMseUNBQXlDLEVBQy9EO3dCQUNBLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ2pDO29CQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTt3QkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQzs0QkFDWixrQkFBa0IsRUFBRTtnQ0FDbEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUk7NkJBQ2xEO3lCQUNGLENBQUMsQ0FBQzt3QkFDSCwyQkFBMkI7cUJBQzVCO3lCQUFNLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTt3QkFDN0IsbUVBQW1FO3dCQUNuRSxJQUFJLEtBQUssQ0FBQyxvREFBZ0IsQ0FBQyxFQUFFOzRCQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0NBQ2pELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7NkJBQ2pEOzRCQUNELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLGlDQUN4QixxRUFBMkIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEtBQ3JELDBCQUEwQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLElBQ3pELENBQUMsQ0FBQzs0QkFDSiw4REFBOEQ7NEJBQzlELE9BQU8sS0FBSyxDQUFDO3lCQUNkO3dCQUVELCtCQUErQjt3QkFDL0Isd0RBQXdEO3dCQUN4RCx3REFBd0Q7d0JBQ3hELG1CQUFtQjt3QkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFOzRCQUNqRCxvRkFBb0Y7NEJBQ3BGLElBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjO2dDQUN6QixDQUFDLDBEQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUN4RDtnQ0FDQSxJQUFJLENBQUMsUUFBUSxDQUFDO29DQUNaLGtCQUFrQixFQUFFLEVBQUU7b0NBQ3RCLGdCQUFnQixFQUFFLEVBQUU7b0NBQ3BCLGNBQWMsRUFBRSxJQUFJO2lDQUNyQixDQUFDLENBQUM7NkJBQ0o7NEJBRUQsbUVBQW1FOzRCQUNuRSxpRUFBaUU7NEJBQ2pFLDJEQUEyRDs0QkFDM0QsSUFDRSxDQUFDLHdCQUF3QjtnQ0FDekIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMseUNBQXlDLEVBQy9EO2dDQUNBLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQ0FDMUIsT0FBTyx5RUFBK0IsaUNBRS9CLFNBQVMsS0FDWixrQkFBa0Isa0NBQ2IsU0FBUyxDQUFDLGtCQUFrQixLQUMvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEtBRXZCLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUV0RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUN6QixDQUFDO2dDQUNKLENBQUMsQ0FBQyxDQUFDO2dDQUNILGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7NkJBQ2pEO3lCQUNGO3FCQUNGO29CQUVELElBQUksQ0FBQyxRQUFRLENBQUM7d0JBQ1osMEJBQTBCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7cUJBQzFELENBQUMsQ0FBQztpQkFDSjthQUNGO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUF5Qk0sNEJBQXVCLEdBQUcsQ0FDaEMsS0FBNEMsRUFDNUMsZ0JBQWtDLEVBQzVCLEVBQUU7WUFDUiwwREFBMEQ7WUFDMUQsNERBQTREO1lBQzVELDBCQUEwQjtZQUMxQixJQUFJLHdEQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDNUMsT0FBTzthQUNSO1lBQ0QsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO2dCQUN4RCx1QkFBdUIsRUFBRSxJQUFJO2FBQzlCLENBQUMsQ0FBQztZQUVILE1BQU0sV0FBVyxHQUFHLHlFQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELElBQUksV0FBVyxFQUFFO2dCQUNmLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUN6QztZQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEIsTUFBTTtnQkFDTixNQUFNO2dCQUNOLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNO2FBQ3BDLENBQUMsQ0FBQztZQUVILG9EQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDWixXQUFXLEVBQUUsV0FBVztpQkFDekIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUM7UUFFTSx1Q0FBa0MsR0FBRyxDQUMzQyxLQUE0QyxFQUM1QyxXQUE4QyxFQUM5QyxnQkFBa0MsRUFDbEMsRUFBRTtZQUNGLGdFQUFnRTtZQUNoRSxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLG9EQUFZLENBQ2pDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ3pCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ3pCLElBQUksQ0FDTCxDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsd0VBQWtCLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxXQUFXO2dCQUNqQixDQUFDLEVBQUUsS0FBSztnQkFDUixDQUFDLEVBQUUsS0FBSztnQkFDUixXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQzlDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjtnQkFDdEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2dCQUMxQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtnQkFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2dCQUMxQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7Z0JBQ3RDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdDQUFnQztnQkFDNUQsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFFBQVEsS0FBSyxHQUFHO2FBQ3pDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLGtCQUFrQixrQ0FDYixTQUFTLENBQUMsa0JBQWtCLEtBQy9CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FDcEI7YUFDRixDQUFDLENBQUMsQ0FBQztZQUVKLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0I7Z0JBQ3hDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUztnQkFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUzQyxzRUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDckIsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLFNBQVM7YUFDVixDQUFDLENBQUM7WUFFSCxNQUFNLFlBQVksR0FBRyw4RUFBMkIsQ0FDOUMsZ0JBQWdCLENBQUMsTUFBTSxFQUN2QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO2dCQUM1QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUU7Z0JBQzNDLE9BQU87YUFDUixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLGVBQWUsRUFBRSxPQUFPO2dCQUN4QixjQUFjLEVBQUUsT0FBTztnQkFDdkIsaUJBQWlCLEVBQUUsWUFBWTtnQkFDL0IsaUJBQWlCLEVBQUUsRUFBRTthQUN0QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFTSx1QkFBa0IsR0FBRyxDQUFDLEVBQzVCLE1BQU0sRUFDTixNQUFNLEdBSVAsRUFBRSxFQUFFO1lBQ0gsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxvREFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV6RSxNQUFNLE9BQU8sR0FBRywwREFBZSxDQUFDO2dCQUM5QixJQUFJLEVBQUUsT0FBTztnQkFDYixDQUFDLEVBQUUsS0FBSztnQkFDUixDQUFDLEVBQUUsS0FBSztnQkFDUixXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQzlDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjtnQkFDdEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2dCQUMxQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtnQkFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2dCQUMxQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7Z0JBQ3RDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdDQUFnQzthQUM3RCxDQUFDLENBQUM7WUFFSCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7UUFFTSxxQ0FBZ0MsR0FBRyxDQUN6QyxLQUE0QyxFQUM1QyxXQUE0QyxFQUM1QyxnQkFBa0MsRUFDNUIsRUFBRTtZQUNSLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7Z0JBQzNCLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUVwQyxnQ0FBZ0M7Z0JBQ2hDLElBQ0UsWUFBWSxDQUFDLElBQUksS0FBSyxNQUFNO29CQUM1QixtREFBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ3ZEO29CQUNBLHNFQUFhLENBQUMsWUFBWSxFQUFFO3dCQUMxQixrQkFBa0IsRUFDaEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7cUJBQ3RELENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvREFBYyxDQUFDLENBQUM7b0JBQ2pELE9BQU87aUJBQ1I7Z0JBRUQsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFlBQVksQ0FBQztnQkFFMUQsK0NBQStDO2dCQUMvQyxJQUNFLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQzlCLGtCQUFrQjtvQkFDbEIsa0RBQVUsQ0FDUixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFDOUIsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQzlCLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUNyQixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FDdEIsR0FBRywrREFBc0IsRUFDMUI7b0JBQ0EsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsb0RBQWMsQ0FBQyxDQUFDO29CQUNqRCxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVCLGtCQUFrQixrQ0FDYixTQUFTLENBQUMsa0JBQWtCLEtBQy9CLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FDeEI7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0oscUVBQXFFO2dCQUNyRSxRQUFRO2dCQUNSLHNFQUFhLENBQUMsWUFBWSxFQUFFO29CQUMxQixrQkFBa0IsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDeEUsQ0FBQyxDQUFDO2dCQUNILGtEQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSw0REFBbUIsQ0FBQyxDQUFDO2FBQzdDO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsb0RBQVksQ0FDakMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDekIsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ3BCLENBQUM7Z0JBRUY7Ozt3Q0FHd0I7Z0JBRXhCLE1BQU0sRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEdBQ2xDLFdBQVcsS0FBSyxPQUFPO29CQUNyQixDQUFDLENBQUMsQ0FBQyx5QkFBeUIsRUFBRSx1QkFBdUIsQ0FBQztvQkFDdEQsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUVuQixNQUFNLE9BQU8sR0FBRywyREFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLENBQUMsRUFBRSxLQUFLO29CQUNSLENBQUMsRUFBRSxLQUFLO29CQUNSLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtvQkFDOUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCO29CQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQzFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtvQkFDOUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCO29CQUM5QyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQzFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtvQkFDdEMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0NBQWdDO29CQUM1RCxjQUFjO29CQUNkLFlBQVk7aUJBQ2IsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVCLGtCQUFrQixrQ0FDYixTQUFTLENBQUMsa0JBQWtCLEtBQy9CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FDcEI7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osc0VBQWEsQ0FBQyxPQUFPLEVBQUU7b0JBQ3JCLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDcEMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sWUFBWSxHQUFHLDhFQUEyQixDQUM5QyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztnQkFDRixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO29CQUM1QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUU7b0JBQzNDLE9BQU87aUJBQ1IsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osZUFBZSxFQUFFLE9BQU87b0JBQ3hCLGNBQWMsRUFBRSxPQUFPO29CQUN2QixpQkFBaUIsRUFBRSxZQUFZO29CQUMvQixpQkFBaUIsRUFBRSxFQUFFO2lCQUN0QixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQztRQUVNLHNDQUFpQyxHQUFHLENBQzFDLFdBQTZDLEVBQzdDLGdCQUFrQyxFQUM1QixFQUFFO1lBQ1IsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxvREFBWSxDQUNqQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDcEIsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLHFEQUFVLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxXQUFXO2dCQUNqQixDQUFDLEVBQUUsS0FBSztnQkFDUixDQUFDLEVBQUUsS0FBSztnQkFDUixXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQzlDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjtnQkFDdEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2dCQUMxQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtnQkFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2dCQUMxQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7Z0JBQ3RDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjthQUN2RCxDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLGdCQUFnQixFQUFFLE9BQU87b0JBQ3pCLGVBQWUsRUFBRSxPQUFPO2lCQUN6QixDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO29CQUM1QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUU7b0JBQzNDLE9BQU87aUJBQ1IsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ1osWUFBWSxFQUFFLElBQUk7b0JBQ2xCLGVBQWUsRUFBRSxPQUFPO29CQUN4QixjQUFjLEVBQUUsT0FBTztpQkFDeEIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUM7UUFneUJNLGtCQUFhLEdBQUcsQ0FBQyxnQkFBa0MsRUFBRSxFQUFFO1lBQzdELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUM5QyxPQUFPLHVFQUFjLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ2pEO3FCQUFNLElBQ0wsd0VBQWtCLENBQUMsR0FBRyxDQUFDO29CQUN2QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQ25EO29CQUNBLE9BQU8sdUVBQWMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDakQ7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7UUFFTSxvQkFBZSxHQUFHLENBQU8sRUFDL0IsU0FBUyxFQUNULFlBQVksRUFBRSxhQUFhLEVBQzNCLHNCQUFzQixHQUFHLEtBQUssR0FLL0IsRUFBRSxFQUFFOztZQUNILDJFQUEyRTtZQUMzRSw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLGlFQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUVoQyxrREFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFL0IsSUFBSSxRQUFRLEtBQUssdURBQWMsRUFBRTtnQkFDL0IsSUFBSTtvQkFDRixTQUFTLEdBQUcsNERBQWUsQ0FDekIsTUFBTSw2REFBWSxDQUFDLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQ2YsQ0FBQztpQkFDSDtnQkFBQyxPQUFPLEtBQVUsRUFBRTtvQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztpQkFDbEQ7YUFDRjtZQUVELDREQUE0RDtZQUM1RCw0REFBNEQ7WUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsZ0JBQUksQ0FBQyxLQUFLLEVBQUMsaUJBQWlCLG1EQUNqRCxTQUFTLENBQ1UsS0FBSSwrREFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLElBQUksQ0FDVixzRkFBc0YsQ0FDdkYsQ0FBQztnQkFDRixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO2FBQy9DO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxpQkFBZ0IsYUFBaEIsZ0JBQWdCLHVCQUFoQixnQkFBZ0IsQ0FBRSxPQUFPLEdBQUU7Z0JBQzlCLElBQUk7b0JBQ0YsU0FBUyxHQUFHLE1BQU0sNERBQWUsQ0FBQyxTQUFTLEVBQUU7d0JBQzNDLGdCQUFnQixFQUFFLDBFQUFpQztxQkFDcEQsQ0FBQyxDQUFDO2lCQUNKO2dCQUFDLE9BQU8sS0FBVSxFQUFFO29CQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN4RTtnQkFFRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsK0RBQXNCLEVBQUU7b0JBQzNDLE1BQU0sSUFBSSxLQUFLLENBQ2IseUNBQUMsQ0FBQyxtQkFBbUIsRUFBRTt3QkFDckIsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywrREFBc0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUk7cUJBQ2pFLENBQUMsQ0FDSCxDQUFDO2lCQUNIO2FBQ0Y7WUFFRCxJQUFJLHNCQUFzQixFQUFFO2dCQUMxQixNQUFNLE9BQU8sR0FBRyxVQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQywwQ0FBRSxPQUFPLENBQUM7Z0JBQzVDLGtFQUFrRTtnQkFDbEUsb0NBQW9DO2dCQUNwQyw0REFBNEQ7Z0JBQzVELE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSwwREFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDO2FBQ3REO1lBRUQsTUFBTSxPQUFPLEdBQ1gsV0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsMENBQUUsT0FBTyxLQUFJLENBQUMsTUFBTSx1REFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFL0QsTUFBTSxZQUFZLEdBQUcsc0VBQWEsQ0FDaEMsYUFBYSxFQUNiO2dCQUNFLE1BQU07YUFDUCxFQUNELEtBQUssQ0FDMkMsQ0FBQztZQUVuRCxPQUFPLElBQUksT0FBTyxDQUNoQixDQUFPLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTs7Z0JBQ3hCLElBQUk7b0JBQ0YsSUFBSSxDQUFDLEtBQUssbUNBQ0wsSUFBSSxDQUFDLEtBQUssS0FDYixDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUNSLFFBQVE7NEJBQ1IsRUFBRSxFQUFFLE1BQU07NEJBQ1YsT0FBTzs0QkFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTt5QkFDcEIsR0FDRixDQUFDO29CQUNGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNwRCxJQUFJLENBQUMsZUFBZSxFQUFFO3dCQUNwQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUM3QztvQkFDRCxJQUFJLGdCQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUUsS0FBSyxhQUFZLE9BQU8sRUFBRTt3QkFDN0MsTUFBTSxlQUFlLENBQUMsS0FBSyxDQUFDO3FCQUM3QjtvQkFDRCxJQUNFLFdBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLDBDQUFFLEVBQUUsTUFBSyxZQUFZLENBQUMsRUFBRTt3QkFDdEQsV0FBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLDBDQUFFLEVBQUUsTUFBSyxZQUFZLENBQUMsRUFBRSxFQUNsRDt3QkFDQSxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUNwRDtvQkFDRCxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3ZCO2dCQUFDLE9BQU8sS0FBVSxFQUFFO29CQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMseUNBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDakQ7d0JBQVM7b0JBQ1IsSUFBSSxDQUFDLHNCQUFzQixFQUFFO3dCQUMzQixvREFBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDMUI7aUJBQ0Y7WUFDSCxDQUFDLEVBQ0YsQ0FBQztRQUNKLENBQUMsRUFBQztRQUVGOztXQUVHO1FBQ0ssdUJBQWtCLEdBQUcsQ0FDM0IsWUFBb0MsRUFDcEMsU0FBZSxFQUNmLHNCQUFnQyxFQUNoQyxFQUFFO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQkFDNUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFO2dCQUMzQyxZQUFZO2FBQ2IsQ0FBQyxDQUFDO1lBRUgsSUFBSTtnQkFDRixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7b0JBQ3pCLFNBQVM7b0JBQ1QsWUFBWTtvQkFDWixzQkFBc0I7aUJBQ3ZCLENBQUMsQ0FBQzthQUNKO1lBQUMsT0FBTyxLQUFVLEVBQUU7Z0JBQ25CLHNFQUFhLENBQUMsWUFBWSxFQUFFO29CQUMxQixTQUFTLEVBQUUsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLG9EQUFjLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDWixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSx5Q0FBQyxDQUFDLHlCQUF5QixDQUFDO2lCQUM1RCxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsRUFBQztRQUVNLDBCQUFxQixHQUFHLENBQU8sU0FBZSxFQUFFLEVBQUU7WUFDeEQsZ0NBQWdDO1lBQ2hDLHFIQUFxSDtZQUNySCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUU3QixNQUFNLFlBQVksR0FBRyxNQUFNLDREQUFlLENBQUMsU0FBUyxFQUFFO2dCQUNwRCxnQkFBZ0IsRUFBRSxpQkFBaUI7YUFDcEMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxjQUFjLEdBQUcsTUFBTSx1REFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXBELDJFQUEyRTtZQUMzRSxpQkFBaUI7WUFDakIsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLHVEQUFjLEVBQUU7Z0JBQ3JDLE1BQU0sR0FBRyxHQUFHLE1BQU0scUVBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRXZELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFOUMsSUFBSSxLQUFLLEdBQUcsaUJBQWlCLEVBQUU7b0JBQzdCLEtBQUssR0FBRyxpQkFBaUIsQ0FBQztvQkFDMUIsTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMzQztnQkFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDdkIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7Z0JBRXpDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUU1QyxjQUFjLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyx1REFBYyxDQUFZLENBQUM7YUFDOUQ7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ2xDLGtEQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLGNBQWMsYUFBYSxDQUFDLENBQUM7YUFDNUQ7UUFDSCxDQUFDLEVBQUM7UUFFTSxrQkFBYSxHQUFHLENBQ3RCLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxFQUM5RCxFQUFFO1lBQ0YsSUFBSTtnQkFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFFN0QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxvRUFBMkIsQ0FDMUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQ3BCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztnQkFFRixNQUFNLFNBQVMsR0FBRyxNQUFNLDJEQUFRLENBQUM7b0JBQy9CLFdBQVcsRUFBRSxPQUFPO29CQUNwQixVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7aUJBQ3pDLENBQUMsQ0FBQztnQkFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7b0JBQzNDLE1BQU0sRUFBRSxDQUFDO29CQUNULE1BQU0sRUFBRSxDQUFDO2lCQUNWLENBQUMsQ0FBQztnQkFFSCxJQUFJLHNCQUFzQixFQUFFO29CQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNqRCxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQ1g7d0JBQ0Usa0JBQWtCLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUU7cUJBQ2hELEVBQ0QsR0FBRyxFQUFFO3dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLG9EQUFjLENBQUMsQ0FBQztvQkFDbkQsQ0FBQyxDQUNGLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FDWDt3QkFDRSxtQkFBbUIsRUFBRSxZQUFZO3FCQUNsQyxFQUNELEdBQUcsRUFBRTt3QkFDSCxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLFlBQVksRUFDWixTQUFTO3dCQUNULDRCQUE0QixDQUFDLElBQUksQ0FDbEMsQ0FBQztvQkFDSixDQUFDLENBQ0YsQ0FBQztpQkFDSDthQUNGO1lBQUMsT0FBTyxLQUFVLEVBQUU7Z0JBQ25CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7b0JBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3JCO2dCQUNELElBQUksQ0FBQyxRQUFRLENBQ1g7b0JBQ0UsbUJBQW1CLEVBQUUsSUFBSTtvQkFDekIsY0FBYyxFQUFFLElBQUk7b0JBQ3BCLFdBQVcsRUFBRSxXQUFXO2lCQUN6QixFQUNELEdBQUcsRUFBRTtvQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvREFBYyxDQUFDLENBQUM7Z0JBQ25ELENBQUMsQ0FDRixDQUFDO2FBQ0g7UUFDSCxDQUFDLEVBQUM7UUFFTSw4QkFBeUIsR0FBRyxDQUNsQyxZQUFvQyxFQUNwQyxnQkFBZ0IsR0FBRyxLQUFLLEVBQ3hCLEVBQUU7O1lBQ0YsTUFBTSxLQUFLLEdBQ1QsK0VBQXlCLENBQUMsWUFBWSxDQUFDO2lCQUN2QyxVQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLDBDQUFFLEtBQUssRUFBQztZQUVsRCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssWUFBWSxPQUFPLEVBQUU7Z0JBQ3RDLElBQ0UsWUFBWSxDQUFDLEtBQUssR0FBRywyREFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUMvRCxZQUFZLENBQUMsTUFBTSxHQUFHLDJEQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFDaEU7b0JBQ0EsTUFBTSxlQUFlLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDcEQsc0VBQWEsQ0FBQyxZQUFZLEVBQUU7d0JBQzFCLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLGVBQWUsR0FBRyxDQUFDO3dCQUN2QyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsR0FBRyxlQUFlLEdBQUcsQ0FBQzt3QkFDdkMsS0FBSyxFQUFFLGVBQWU7d0JBQ3RCLE1BQU0sRUFBRSxlQUFlO3FCQUN4QixDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsT0FBTzthQUNSO1lBRUQsSUFDRSxnQkFBZ0I7Z0JBQ2hCLDhEQUE4RDtnQkFDOUQsOERBQThEO2dCQUM5RCxpQkFBaUI7Z0JBQ2pCLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRywyREFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUM5RCxZQUFZLENBQUMsTUFBTSxHQUFHLDJEQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNuRTtnQkFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDekQsMkRBQTJEO2dCQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUN4QixTQUFTLEVBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQzVELENBQUM7Z0JBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFbEUsMEVBQTBFO2dCQUMxRSwyQkFBMkI7Z0JBQzNCLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUVoRSxzRUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDdEQ7UUFDSCxDQUFDLENBQUM7UUFFRjswRUFDa0U7UUFDMUQscUJBQWdCLEdBQUcsQ0FDekIsUUFBc0QsRUFDdEQsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQ2xCLEVBQUU7WUFDRixNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0saUVBQWlCLENBQUM7Z0JBQzdELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELEtBQUs7YUFDTixDQUFDLENBQUM7WUFDSCxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRTtnQkFDMUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUU7b0JBQzlCLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ3BDLG1GQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNwQztpQkFDRjthQUNGO1lBQ0QsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO2dCQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3ZELElBQ0UsK0VBQXlCLENBQUMsT0FBTyxDQUFDO3dCQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDaEM7d0JBQ0EsT0FBTyx1RUFBYyxDQUFDLE9BQU8sRUFBRTs0QkFDN0IsTUFBTSxFQUFFLE9BQU87eUJBQ2hCLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxPQUFPLE9BQU8sQ0FBQztnQkFDakIsQ0FBQyxDQUFDLENBQ0gsQ0FBQzthQUNIO1lBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUN4QyxDQUFDLEVBQUM7UUFFRiw2REFBNkQ7UUFDckQsNkJBQXdCLEdBQUcsQ0FDakMsZ0JBQXFELDRFQUEyQixDQUM5RSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUN6QixFQUNELFFBQXFCLElBQUksQ0FBQyxLQUFLLEVBQy9CLEVBQUU7WUFDRixNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ2hELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQ3hFLENBQUM7WUFFRixJQUFJLHFCQUFxQixDQUFDLE1BQU0sRUFBRTtnQkFDaEMsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUNsRCxxQkFBcUIsRUFDckIsS0FBSyxDQUNOLENBQUM7Z0JBQ0YsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO29CQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUM3QjthQUNGO1FBQ0gsQ0FBQyxFQUFDO1FBRUY7NkRBQ3FEO1FBQzdDLHlCQUFvQixHQUFHLHVEQUFRLENBQUMsR0FBRyxFQUFFO1lBQzNDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2xDLENBQUMsRUFBRSw2REFBb0IsQ0FBQyxDQUFDO1FBRWpCLHNDQUFpQyxHQUFHLENBQzFDLEtBQTRDLEVBQzVDLEVBQUU7WUFDRixNQUFNLG1CQUFtQixHQUFHLHFGQUFrQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxtQkFBbUIsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQzthQUMxRDtRQUNILENBQUMsQ0FBQztRQUVNLGdDQUEyQixHQUFHLENBQUMsYUFHdEMsRUFBUSxFQUFFO1lBQ1QsTUFBTSxzQkFBc0IsR0FBRyw4RUFBMkIsQ0FDeEQsYUFBYSxFQUNiLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osaUJBQWlCLEVBQ2Ysc0JBQXNCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDakUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRU0saURBQTRDLEdBQUcsQ0FDckQsYUFBa0Q7UUFDbEQsbUJBQW1CO1FBQ25CLGFBR0c7UUFDSCxpRUFBaUU7UUFDakUsdUJBQXVCO1FBQ3ZCLDJCQUE4RCxFQUN4RCxFQUFFO1lBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3pCLE9BQU87YUFDUjtZQUVELE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxHQUE0QyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN2RCxNQUFNLHNCQUFzQixHQUFHLDhFQUEyQixDQUN4RCxNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO2dCQUNGLElBQ0Usc0JBQXNCLElBQUksSUFBSTtvQkFDOUIsQ0FBQyx1RkFBb0MsQ0FDbkMsYUFBYSxFQUNiLDJCQUEyQixhQUEzQiwyQkFBMkIsdUJBQTNCLDJCQUEyQixDQUFFLEVBQUUsRUFDL0Isc0JBQXNCLENBQ3ZCLEVBQ0Q7b0JBQ0EsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2lCQUNsQztnQkFDRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDO1FBNEJNLG9CQUFlLEdBQUcsQ0FBQyxNQUF5QixFQUFFLEVBQUU7O1lBQ3RELGlDQUFpQztZQUNqQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUNyQixJQUFJLENBQUMsRUFBRSxHQUFHLGdFQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUVwQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9EQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDMUQsT0FBTyxFQUFFLEtBQUs7aUJBQ2YsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsMERBQWlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHdEQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlEO2lCQUFNO2dCQUNMLFVBQUksQ0FBQyxNQUFNLDBDQUFFLG1CQUFtQixDQUFDLG9EQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRSxVQUFJLENBQUMsTUFBTSwwQ0FBRSxtQkFBbUIsQ0FBQywwREFBaUIsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JFLFVBQUksQ0FBQyxNQUFNLDBDQUFFLG1CQUFtQixDQUFDLHdEQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2xFO1FBQ0gsQ0FBQyxDQUFDO1FBRU0sb0JBQWUsR0FBRyxDQUFPLEtBQXNDLEVBQUUsRUFBRTs7WUFDekUsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTlDLElBQUksaUVBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzlCLGdFQUFnRTtvQkFDaEUsd0VBQXdFO29CQUV4RSxJQUFJLEtBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxJQUFJLE1BQUssdURBQWMsSUFBSSxLQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSxNQUFLLHVEQUFjLEVBQUU7d0JBQ2xFLElBQUk7NEJBQ0YsSUFBSSx3RUFBeUIsRUFBRTtnQ0FDN0IsSUFBSTtvQ0FDRix1Q0FBdUM7b0NBQ3ZDLCtDQUErQztvQ0FDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ3hDLElBQVksQ0FBQyxNQUFNLEdBQUcsTUFDckIsSUFDRCxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUNBQzNCO2dDQUFDLE9BQU8sS0FBVSxFQUFFO29DQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lDQUN6Qzs2QkFDRjs0QkFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLG9EQUFZLENBQzlCLElBQUksRUFDSixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FDekMsQ0FBQzs0QkFDRixJQUFJLENBQUMsZ0JBQWdCLGlDQUNoQixLQUFLLEtBQ1IsUUFBUSxrQ0FDSCxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUNqQyxTQUFTLEVBQUUsS0FBSyxLQUVsQixZQUFZLEVBQUUsSUFBSSxFQUNsQixlQUFlLEVBQUUsSUFBSSxJQUNyQixDQUFDOzRCQUNILE9BQU87eUJBQ1I7d0JBQUMsT0FBTyxLQUFVLEVBQUU7NEJBQ25CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUU7Z0NBQ2xDLE1BQU0sS0FBSyxDQUFDOzZCQUNiO3lCQUNGO3FCQUNGO29CQUVELG9FQUFvRTtvQkFDcEUsZ0NBQWdDO29CQUNoQyx3RUFBd0U7b0JBRXhFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxvRUFBMkIsQ0FDMUQsS0FBSyxFQUNMLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztvQkFFRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDakUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBRW5FLE9BQU87aUJBQ1I7YUFDRjtZQUFDLE9BQU8sS0FBVSxFQUFFO2dCQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ25CLFNBQVMsRUFBRSxLQUFLO29CQUNoQixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQzVCLENBQUMsQ0FBQzthQUNKO1lBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUVBQXdCLENBQUMsQ0FBQztZQUMzRSxJQUFJLGFBQWEsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztvQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO29CQUNuQyxRQUFRLEVBQUUsS0FBSztvQkFDZixLQUFLLEVBQUUsSUFBSTtpQkFDWixDQUFDLENBQUM7Z0JBQ0gsT0FBTzthQUNSO1lBRUQsTUFBTSxJQUFJLEdBQUcsV0FBSyxDQUFDLFlBQVksMENBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUNFLEtBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxJQUFJLE1BQUssaUVBQXdCO2lCQUN2QyxVQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSwwQ0FBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FDdEM7Z0JBQ0EsSUFBSSxDQUFDLE9BQU87cUJBQ1QsYUFBYSxDQUFDLElBQUksQ0FBQztxQkFDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDVCxtREFBbUQ7b0JBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDZixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQ2pFLENBQUM7Z0JBQ0osc0VBQXNFO2FBQ3ZFO2lCQUFNLElBQUksSUFBSSxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsSUFBSSx3RUFBeUIsRUFBRTtvQkFDN0IsSUFBSTt3QkFDRix1Q0FBdUM7d0JBQ3ZDLCtDQUErQzt3QkFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3hDLElBQVksQ0FBQyxNQUFNLEdBQUcsTUFBTyxJQUFZLENBQUMscUJBQXFCLEVBQUUsQ0FBQztxQkFDcEU7b0JBQUMsT0FBTyxLQUFVLEVBQUU7d0JBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3pDO2lCQUNGO2dCQUNELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxFQUFDO1FBRUYscUJBQWdCLEdBQUcsQ0FBQyxJQUFVLEVBQUUsRUFBRTtZQUNoQyxvREFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztpQkFDckUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGdCQUFnQixpQ0FDaEIsS0FBSyxLQUNSLFFBQVEsa0NBQ0gsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FDakMsU0FBUyxFQUFFLEtBQUssS0FFbEIsWUFBWSxFQUFFLElBQUksRUFDbEIsZUFBZSxFQUFFLElBQUksSUFDckIsQ0FBQztZQUNMLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUM7UUFFTSw0QkFBdUIsR0FBRyxDQUNoQyxLQUE0QyxFQUM1QyxFQUFFO1lBQ0YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLElBQ0UsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQVcsS0FBSyxPQUFPO2dCQUN4QyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxLQUFLLEtBQUs7b0JBQ3RDLG1EQUFtRDtvQkFDbkQsS0FBSyxDQUFDLE1BQU0sS0FBSyxpRUFBd0IsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxXQUFXLEVBQ3RDO2dCQUNBLE9BQU87YUFDUjtZQUVELE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsb0VBQTJCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTFFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFFNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQVEsQ0FBQztZQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQ3hDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBRXRDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFO29CQUNqRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzVDO1FBQ0gsQ0FBQyxDQUFDO1FBRU0sK0JBQTBCLEdBQUcsQ0FDbkMsZ0JBQWtDLEVBQ2xDLEtBQWlDLEVBQzNCLEVBQUU7O1lBQ1IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDbkQsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBQ2xELElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BCLE9BQU87YUFDUjtZQUNELElBQUksZUFBZSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7Z0JBQ3hDLHlEQUFjLENBQ1osZUFBZSxFQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUN0QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixhQUFhLENBQUMsQ0FBQyxFQUNmLGFBQWEsQ0FBQyxDQUFDLEVBQ2YsaURBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFDcEQsaURBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFDcEQsaUVBQXlCLENBQUMsS0FBSyxDQUFDLEVBQ2hDLDhEQUFzQixDQUFDLEtBQUssQ0FBQyxDQUM5QixDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxvREFBWSxDQUNqQyxhQUFhLENBQUMsQ0FBQyxFQUNmLGFBQWEsQ0FBQyxDQUFDLEVBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ3BCLENBQUM7Z0JBRUYsTUFBTSxLQUFLLEdBQ1QsK0VBQXlCLENBQUMsZUFBZSxDQUFDO3FCQUMxQyxVQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLDBDQUFFLEtBQUssRUFBQztnQkFDckQsTUFBTSxXQUFXLEdBQ2YsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksT0FBTyxDQUFDO29CQUNsQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTTtvQkFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFFWCx5REFBYyxDQUNaLGVBQWUsRUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDdEIsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDL0IsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDL0IsS0FBSyxFQUNMLEtBQUssRUFDTCxpREFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQ2hELGlEQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDaEQsb0VBQWMsQ0FBQyxlQUFlLENBQUM7b0JBQzdCLENBQUMsQ0FBQyxDQUFDLGlFQUF5QixDQUFDLEtBQUssQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLGlFQUF5QixDQUFDLEtBQUssQ0FBQyxFQUNwQyw4REFBc0IsQ0FBQyxLQUFLLENBQUMsRUFDN0IsV0FBVyxDQUNaLENBQUM7Z0JBRUYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzthQUNuRDtRQUNILENBQUMsQ0FBQztRQUVNLHNCQUFpQixHQUFHLENBQzFCLGdCQUFrQyxFQUNsQyxLQUFpQyxFQUN4QixFQUFFO1lBQ1gsTUFBTSxnQkFBZ0IsR0FBRyw0REFBbUIsQ0FDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBQ0YsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9ELElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osOERBQThEO2dCQUM5RCw4REFBOEQ7Z0JBQzlELFdBQVc7Z0JBQ1gsVUFBVSxFQUFFLG1CQUFtQixJQUFJLG1CQUFtQixLQUFLLFVBQVU7Z0JBQ3JFLFVBQVUsRUFBRSxtQkFBbUIsS0FBSyxVQUFVO2FBQy9DLENBQUMsQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztZQUNsRCxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLG9EQUFZLENBQ3JDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ2xELGFBQWEsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUNwQixDQUFDO1lBQ0YsSUFDRSw0REFBaUIsQ0FDZixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUN0QyxxRUFBNkIsQ0FBQyxLQUFLLENBQUMsRUFDcEMsOERBQXNCLENBQUMsS0FBSyxDQUFDLEVBQzdCLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksb0VBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLENBQUMsaUVBQXlCLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxDQUFDLENBQUMsaUVBQXlCLENBQUMsS0FBSyxDQUFDLEVBQ3BDLE9BQU8sRUFDUCxPQUFPLEVBQ1AsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ2hDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNqQyxFQUNEO2dCQUNBLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFRixnREFBZ0Q7UUFDeEMscUJBQWdCLEdBQUcsQ0FDekIsRUFDRSxJQUFJLEVBQ0osR0FBRyxHQUlKLEVBQ0QsSUFBMEIsRUFDMUIsRUFBRTtZQUNGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDOUM7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixNQUFNLGdCQUFnQixHQUFHLHNFQUFpQyxDQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQ2pDLENBQUM7WUFFRixNQUFNLGtCQUFrQixHQUFHLHdFQUFtQyxDQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQ2pDLENBQUM7WUFFRixNQUFNLG1CQUFtQixHQUFHLCtFQUEwQyxDQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQ2pDLENBQUM7WUFFRixNQUFNLGlCQUFpQixHQUFHLDZFQUF3QyxDQUNoRSxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQ2pDLENBQUM7WUFFRixNQUFNLG1CQUFtQixHQUFHLDJFQUFxQyxDQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQ2pDLENBQUM7WUFFRixNQUFNLGlCQUFpQixHQUFHLHlFQUFtQyxDQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQ2pDLENBQUM7WUFFRixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7WUFFOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUUxQyxNQUFNLE9BQU8sR0FBd0IsRUFBRSxDQUFDO1lBQ3hDLElBQUksc0VBQTZCLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQUMscURBQWUsQ0FBQyxDQUFDO2FBQy9CO1lBRUQsSUFBSSwyRUFBa0MsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBZSxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3JCLE1BQU0sZUFBZSxHQUFHO29CQUN0QixHQUFHLE9BQU87b0JBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsS0FBSyxXQUFXO3dCQUMvQywwREFBb0I7b0JBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEtBQUssV0FBVyxJQUFJLHlEQUFtQjtvQkFDdkUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsS0FBSyxXQUFXO3dCQUMvQyxnRkFBb0I7b0JBQ3RCLHVEQUFpQjtpQkFDbEIsQ0FBQztnQkFFRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO29CQUM5QiwwREFBZ0IsQ0FBQzt3QkFDZixPQUFPLEVBQUUsZUFBZTt3QkFDeEIsR0FBRzt3QkFDSCxJQUFJO3dCQUNKLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTt3QkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLO3dCQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQVE7d0JBQy9DLFFBQVE7cUJBQ1QsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNO29CQUNMLDBEQUFnQixDQUFDO3dCQUNmLE9BQU8sRUFBRTs0QkFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7Z0NBQ3RCLFNBQVMsQ0FBQyxTQUFTLElBQUk7Z0NBQ3JCLElBQUksRUFBRSxPQUFPO2dDQUNiLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRTtvQ0FDL0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM5QixPQUFPO3dDQUNMLGVBQWUsRUFBRSxLQUFLO3FDQUN2QixDQUFDO2dDQUNKLENBQUM7Z0NBQ0QsZ0JBQWdCLEVBQUUsY0FBYzs2QkFDakM7NEJBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTOzRCQUM1RCxzRUFBNkI7Z0NBQzNCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQ0FDbkIscURBQWU7NEJBQ2pCLDJFQUFrQztnQ0FDaEMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dDQUNuQixxREFBZTs0QkFDakIsQ0FBQyxDQUFDLHNFQUE2QixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dDQUNyRCxDQUFDLDJFQUFrQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0NBQzVELFNBQVM7NEJBQ1gscURBQWU7NEJBQ2YsU0FBUzs0QkFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLFdBQVc7Z0NBQy9DLDBEQUFvQjs0QkFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsS0FBSyxXQUFXO2dDQUM5Qyx5REFBbUI7NEJBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEtBQUssV0FBVztnQ0FDL0MsZ0ZBQW9COzRCQUN0Qix1REFBaUI7eUJBQ2xCO3dCQUNELEdBQUc7d0JBQ0gsSUFBSTt3QkFDSixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFRO3dCQUMvQyxRQUFRO3FCQUNULENBQUMsQ0FBQztpQkFDSjthQUNGO2lCQUFNLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtvQkFDOUIsMERBQWdCLENBQUM7d0JBQ2YsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxnREFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO3dCQUN4RCxHQUFHO3dCQUNILElBQUk7d0JBQ0osYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBUTt3QkFDL0MsUUFBUTtxQkFDVCxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsMERBQWdCLENBQUM7d0JBQ2YsT0FBTyxFQUFFOzRCQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLCtDQUFTOzRCQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLGdEQUFVOzRCQUM3RCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7Z0NBQ3RCLFNBQVMsQ0FBQyxTQUFTLElBQUk7Z0NBQ3JCLElBQUksRUFBRSxPQUFPO2dDQUNiLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRTtvQ0FDL0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM5QixPQUFPO3dDQUNMLGVBQWUsRUFBRSxLQUFLO3FDQUN2QixDQUFDO2dDQUNKLENBQUM7Z0NBQ0QsZ0JBQWdCLEVBQUUsY0FBYzs2QkFDakM7NEJBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksU0FBUzs0QkFDckMsR0FBRyxPQUFPOzRCQUNWLFNBQVM7NEJBQ1Qsc0RBQWdCOzRCQUNoQix1REFBaUI7NEJBQ2pCLFNBQVM7NEJBQ1QsZ0JBQWdCLElBQUksaURBQVc7NEJBQy9CLG1CQUFtQixJQUFJLHNEQUFnQjs0QkFDdkMsaUJBQWlCLElBQUksb0RBQWM7NEJBQ25DLGtCQUFrQixJQUFJLG1EQUFhOzRCQUNuQyxDQUFDLGdCQUFnQixJQUFJLGtCQUFrQixDQUFDLElBQUksU0FBUzs0QkFDckQsd0RBQWtCOzRCQUNsQixTQUFTOzRCQUNULHdEQUFrQjs0QkFDbEIsd0RBQWtCOzRCQUNsQixzREFBZ0I7NEJBQ2hCLHdEQUFrQjs0QkFDbEIsU0FBUzs0QkFDVCxtQkFBbUIsSUFBSSwwREFBb0I7NEJBQzNDLGlCQUFpQixJQUFJLHdEQUFrQjs0QkFDdkMsQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLFNBQVM7NEJBQ3ZELHFFQUErQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksZ0RBQVU7NEJBQ25FLDhEQUF3Qjs0QkFDeEIsMERBQW9CO3lCQUNyQjt3QkFDRCxHQUFHO3dCQUNILElBQUk7d0JBQ0osYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBUTt3QkFDL0MsUUFBUTtxQkFDVCxDQUFDLENBQUM7aUJBQ0o7YUFDRjtRQUNILENBQUMsQ0FBQztRQUVNLGdCQUFXLEdBQUcsMkRBQWtCLENBQUMsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDN0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU87YUFDUjtZQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdEUsK0RBQStEO1lBQy9ELElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdCLElBQUksS0FBSyxHQUFHLFFBQVEsRUFBRTtvQkFDcEIsS0FBSyxHQUFHLFFBQVEsQ0FBQztpQkFDbEI7Z0JBQ0QsS0FBSyxJQUFJLElBQUksQ0FBQztnQkFDZCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN4RCxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLElBQUksQ0FBQyxRQUFRLENBQUM7NEJBQ1osa0JBQWtCLEVBQUUsMEJBQTBCOzRCQUM5QywwQkFBMEIsRUFBRSxFQUFFO3lCQUMvQixDQUFDLENBQUM7b0JBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNWO2dCQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO2dCQUNsRCx3RUFBd0U7Z0JBQ3hFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xFLHdCQUF3QjtnQkFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGtEQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxrREFBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxpQ0FDcEIsNkRBQWUsQ0FDaEI7b0JBQ0UsU0FBUyxFQUFFLE9BQU87b0JBQ2xCLFNBQVMsRUFBRSxPQUFPO29CQUNsQixRQUFRLEVBQUUsMERBQWlCLENBQUMsT0FBTyxDQUFDO2lCQUNyQyxFQUNELEtBQUssQ0FDTixLQUNELGtCQUFrQixFQUFFLEVBQUUsRUFDdEIsMEJBQTBCLEVBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQzt3QkFDMUMsQ0FBQyxDQUFDLGtCQUFrQjt3QkFDcEIsQ0FBQyxDQUFDLDBCQUEwQixFQUNoQyxxQkFBcUIsRUFBRSxJQUFJLElBQzNCLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztnQkFDM0MsT0FBTzthQUNSO1lBRUQseUNBQXlDO1lBQ3pDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNwQyxnREFBZ0Q7b0JBQ2hELE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUs7aUJBQ25ELENBQUMsQ0FBQyxDQUFDO2dCQUNKLE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sRUFBRSxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLO2dCQUN0QyxPQUFPLEVBQUUsT0FBTyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSzthQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBcUNLLGdCQUFXLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLE1BQXFCLEVBQUUsRUFBRTs7WUFDcEUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDWixPQUFPO2FBQ1I7WUFDRCxNQUFNLE9BQU8sR0FBRyxvRUFBMkIsQ0FDekMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBRUYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hDLHdDQUF3QzthQUN6QztZQUVELGdCQUFJLENBQUMsS0FBSyxFQUFDLGVBQWUsbURBQUc7Z0JBQzNCLE9BQU87Z0JBQ1AsTUFBTTtnQkFDTixXQUFXLEVBQUUsT0FBTyxDQUFDLFFBQVE7YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRU0sd0NBQW1DLEdBQUcsaURBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2pEO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRUEsa0JBQWEsR0FBRyxDQUFDLEVBQWUsRUFBRSxFQUFFOztZQUMxQyxJQUFJLFVBQUksQ0FBQyxzQkFBc0IsMENBQUUsT0FBTyxFQUFFO2dCQUN4QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hFLE1BQU0sRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUNOLElBQUksRUFBRSxVQUFVLEVBQ2hCLEdBQUcsRUFBRSxTQUFTLEdBQ2YsR0FBRyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLEVBQ0osS0FBSyxFQUFFLFlBQVksRUFDbkIsTUFBTSxFQUFFLGFBQWEsRUFDckIsU0FBUyxFQUFFLGdCQUFnQixFQUMzQixVQUFVLEVBQUUsaUJBQWlCLEdBQzlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFFZixJQUNFLEtBQUssS0FBSyxZQUFZO29CQUN0QixNQUFNLEtBQUssYUFBYTtvQkFDeEIsVUFBVSxLQUFLLGlCQUFpQjtvQkFDaEMsU0FBUyxLQUFLLGdCQUFnQixFQUM5QjtvQkFDQSxJQUFJLEVBQUUsRUFBRTt3QkFDTixFQUFFLEVBQUUsQ0FBQztxQkFDTjtvQkFDRCxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxRQUFRLENBQ1g7b0JBQ0UsS0FBSztvQkFDTCxNQUFNO29CQUNOLFVBQVU7b0JBQ1YsU0FBUztpQkFDVixFQUNELEdBQUcsRUFBRTtvQkFDSCxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ2IsQ0FBQyxDQUNGLENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQztRQUVLLFlBQU8sR0FBRyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsbUJBQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUcsQ0FBQztRQUNoRCxDQUFDLENBQUM7UUFqektBLE1BQU0sZUFBZSxHQUFHLDZEQUFrQixFQUFFLENBQUM7UUFDN0MsTUFBTSxFQUNKLGFBQWEsRUFDYixlQUFlLEdBQUcsS0FBSyxFQUN2QixjQUFjLEdBQUcsS0FBSyxFQUN0QixlQUFlLEdBQUcsS0FBSyxFQUN2QixLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFDN0IsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEdBQzVCLEdBQUcsS0FBSyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEtBQUssK0RBQ0wsZUFBZSxLQUNsQixLQUFLLEVBQ0wsU0FBUyxFQUFFLElBQUksS0FDWixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FDMUIsZUFBZTtZQUNmLGNBQWMsRUFDZCxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxrREFBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQzVDLElBQUksRUFDSixLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFDeEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQzFCLGtCQUFrQixFQUFFLEtBQUssR0FDMUIsQ0FBQztRQUVGLElBQUksQ0FBQyxFQUFFLEdBQUcsK0NBQU0sRUFBRSxDQUFDO1FBRW5CLElBQUksYUFBYSxFQUFFO1lBQ2pCLE1BQU0sWUFBWSxHQUNoQixDQUFDLFNBQVMsSUFBSSxhQUFhLEtBQUksbUJBQWEsQ0FBQyxPQUFPLDBDQUFFLFlBQVksRUFBQztnQkFDbkUsMERBQWlCLEVBQTJCLENBQUM7WUFFL0MsTUFBTSxHQUFHLEdBQTRCO2dCQUNuQyxLQUFLLEVBQUUsSUFBSTtnQkFDWCxZQUFZO2dCQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLGdDQUFnQyxFQUFFLElBQUksQ0FBQyxnQ0FBZ0M7Z0JBQ3ZFLE9BQU8sRUFBRTtvQkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7aUJBQ3pCO2dCQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDckMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtnQkFDdkMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUM3QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3hDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDckMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNYLEdBQUcsRUFBRSxJQUFJO2FBQ0QsQ0FBQztZQUNYLElBQUksT0FBTyxhQUFhLEtBQUssVUFBVSxFQUFFO2dCQUN2QyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0wsYUFBYSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7YUFDN0I7WUFDRCxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO1FBRUQsSUFBSSxDQUFDLHdCQUF3QixHQUFHO1lBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTztZQUM5QyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDWixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLHFEQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksc0RBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaURBQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSwyREFBYSxDQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFDOUMsSUFBSSxDQUNMLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxzREFBTyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsd0VBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsd0VBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVPLFlBQVk7UUFDbEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQzVDLE1BQU0sRUFDSixLQUFLLEVBQUUsY0FBYyxFQUNyQixNQUFNLEVBQUUsZUFBZSxFQUN2QixlQUFlLEdBQ2hCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNmLE1BQU0sV0FBVyxHQUFHLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFDakQsTUFBTSxZQUFZLEdBQUcsZUFBZSxHQUFHLFdBQVcsQ0FBQztRQUNuRCxJQUFJLGVBQWUsRUFBRTtZQUNuQixPQUFPLENBQ0wsaUZBQ0UsU0FBUyxFQUFDLG9CQUFvQixFQUM5QixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLGNBQWM7b0JBQ3JCLE1BQU0sRUFBRSxlQUFlO29CQUN2QixNQUFNLEVBQUUseURBQWdCO2lCQUN6QixFQUNELEtBQUssRUFBRSxXQUFXLEVBQ2xCLE1BQU0sRUFBRSxZQUFZLEVBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUMzQyxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUN2QyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsdUJBQXVCLGdCQUUxQyx5Q0FBQyxDQUFDLHNCQUFzQixDQUFDLFlBQ25CLENBQ1YsQ0FBQztTQUNIO1FBQ0QsT0FBTyxDQUNMLGlGQUNFLFNBQVMsRUFBQyxvQkFBb0IsRUFDOUIsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxjQUFjO2dCQUNyQixNQUFNLEVBQUUsZUFBZTthQUN4QixFQUNELEtBQUssRUFBRSxXQUFXLEVBQ2xCLE1BQU0sRUFBRSxZQUFZLEVBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUMzQyxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUN2QyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLGdCQUVoQyx5Q0FBQyxDQUFDLHNCQUFzQixDQUFDLFlBQ25CLENBQ1YsQ0FBQztJQUNKLENBQUM7SUFFTSxNQUFNOztRQUNYLE1BQU0sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2RCxNQUFNLGVBQWUsR0FBRyw0REFBbUIsQ0FDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1FBQ0YsTUFBTSxFQUNKLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGlCQUFpQixHQUNsQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFZixPQUFPLENBQ0wsOEVBQ0UsU0FBUyxFQUFFLGdEQUFJLENBQUMsaUNBQWlDLEVBQUU7Z0JBQ2pELHNCQUFzQixFQUFFLGNBQWM7Z0JBQ3RDLHVCQUF1QixFQUFFLGVBQWU7Z0JBQ3hDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTthQUMvQyxDQUFDLEVBQ0YsR0FBRyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQzVCLFFBQVEsRUFBRSxDQUFDLEVBQ1gsU0FBUyxFQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsZ0JBR2hFLHVEQUFDLDBCQUEwQixDQUFDLFFBQVEsa0JBQ2xDLEtBQUssRUFBRSxJQUFJLENBQUMsd0JBQXdCLGdCQUVwQyx3REFBQyxpQkFBaUIsQ0FBQyxRQUFRLGtCQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxpQkFDaEQsdURBQUMsaURBQU8sSUFDTixpQkFBaUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUMvQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUNsQyxtQkFBbUIsRUFBRSxtQkFBbUIsRUFDeEMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQzdCLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUNuQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzdCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztnQ0FDakMsUUFBUTtnQ0FDUixRQUFRLEVBQUUsUUFBUTtnQ0FDbEIsS0FBSyxFQUFFLElBQUk7NkJBQ1osQ0FBQyxFQUVKLGNBQWMsRUFBRSxjQUFjLEVBQzlCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUNqQyxRQUFRLEVBQUUsbURBQVcsRUFBRSxDQUFDLElBQUksRUFDNUIsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUMzQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsa0JBQWtCLEVBQUUsWUFBWSxFQUNoQyxlQUFlLEVBQUUsZUFBZSxFQUNoQyxrQkFBa0IsRUFDaEIsT0FBTyxXQUFJLENBQUMsS0FBSywwQ0FBRSxjQUFjLE1BQUssV0FBVztnQ0FDakQsY0FBYyxFQUVoQixZQUFZLEVBQ1YsT0FBTyxXQUFJLENBQUMsS0FBSywwQ0FBRSxLQUFLLE1BQUssV0FBVztnQ0FDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYTtnQ0FDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssRUFFMUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDN0MsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMvQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFDbkMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQ3JCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUNYLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxXQUNqQyxFQUNGLGdFQUFLLFNBQVMsRUFBQyxnQ0FBZ0MsV0FBRyxFQUNsRCxnRUFBSyxTQUFTLEVBQUMsaUNBQWlDLFdBQUcsRUFDbEQsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUNoRSx1REFBQywwREFBUyxJQUVSLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUo1QixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUsxQixDQUNILEVBQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FDdkIsdURBQUMsMENBQUssSUFDSixRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFDekIsaUJBQWlCLEVBQUUsaUJBQWlCLFdBQ3BDLENBQ0gsRUFDQSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksQ0FDbkMsdURBQUMsMENBQUssSUFDSixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxXQUMzQixDQUNILEVBQ0QsMkVBQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFRLGFBQ1AsWUFDTyxZQUNsQyxDQUNQLENBQUM7SUFDSixDQUFDO0lBNFNZLGlCQUFpQjs7O1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTO2dCQUNyQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDO1lBRXRDLElBQ0UsYUFBb0IsS0FBSyxpREFBUTtnQkFDakMsYUFBb0IsS0FBSyx3REFBZSxFQUN4QztnQkFDQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7b0JBQ2hDLEtBQUssRUFBRTt3QkFDTCxZQUFZLEVBQUUsSUFBSTt3QkFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRTs0QkFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7d0JBQ3BCLENBQUM7cUJBQ0Y7b0JBQ0QsUUFBUSxFQUFFO3dCQUNSLFlBQVksRUFBRSxJQUFJO3dCQUNsQixLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQWlDLEVBQUUsRUFBRTs0QkFDOUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7d0JBQ2hDLENBQUM7cUJBQ0Y7b0JBQ0QsR0FBRyxFQUFFO3dCQUNILFlBQVksRUFBRSxJQUFJO3dCQUNsQixLQUFLLEVBQUUsSUFBSTtxQkFDWjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWSxFQUFFLElBQUk7d0JBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTztxQkFDcEI7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFekIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdkI7WUFFRCxJQUFJLGdCQUFnQixJQUFJLE1BQU0sS0FBSSxVQUFJLENBQUMsc0JBQXNCLDBDQUFFLE9BQU8sR0FBRTtnQkFDdEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUU7b0JBQzVDLHlCQUF5QjtvQkFDekIsd0VBQXdFO29CQUN4RSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBUSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcscURBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUM5QyxRQUFRLEVBQ04sS0FBSyxHQUFHLDhEQUFxQjs0QkFDN0IsQ0FBQyxNQUFNLEdBQUcsZ0VBQXVCO2dDQUMvQixLQUFLLEdBQUcsK0RBQXNCLENBQUM7cUJBQ3BDLENBQUMsQ0FBQztvQkFDSCxrQkFBa0I7b0JBQ2xCLHdFQUF3RTtvQkFDeEUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQztnQkFDSCxVQUFJLENBQUMsY0FBYywwQ0FBRSxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ25FO2lCQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDNUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FDbEMsZUFBZSw4REFBcUIscUJBQXFCLGdFQUF1Qix1QkFBdUIsK0RBQXNCLEtBQUssQ0FDbkksQ0FBQztnQkFDRixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcscURBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUM5QyxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU87cUJBQzdCLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUM7Z0JBQ0YsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDekU7WUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUxRSxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRTtnQkFDeEMsOERBQThEO2dCQUM5RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzthQUM3QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMxQzs7S0FDRjtJQUVNLG9CQUFvQjs7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixVQUFJLENBQUMsY0FBYywwQ0FBRSxVQUFVLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLDBFQUFnQixFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLHFEQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaURBQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSwyREFBYSxDQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFDOUMsSUFBSSxDQUNMLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksc0RBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUVmLGFBQWE7UUFDYixJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUNoRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxDQUFDO1FBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBRXJFLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQixZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFTTyxvQkFBb0I7O1FBQzFCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyx5REFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLG1EQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxvREFBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25FLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxrREFBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxVQUFJLENBQUMsMEJBQTBCLDBDQUFFLG1CQUFtQixDQUNsRCxxREFBWSxFQUNaLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztRQUNGLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxzREFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsUUFBUSxDQUFDLG1CQUFtQixDQUMxQix5REFBZ0IsRUFDaEIsSUFBSSxDQUFDLDJCQUEyQixFQUNoQyxLQUFLLENBQ04sQ0FBQztRQUNGLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxvREFBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsbUJBQW1CLENBQUMscURBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxxREFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLG1EQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxVQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTywwQ0FBRSxtQkFBbUIsQ0FDdEQsd0RBQWUsRUFDZixJQUFJLENBQUMsWUFBWSxFQUNqQixLQUFLLENBQ04sQ0FBQztRQUNGLFVBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLDBDQUFFLG1CQUFtQixDQUN0RCxtREFBVSxFQUNWLElBQUksQ0FBQyxZQUFZLEVBQ2pCLEtBQUssQ0FDTixDQUFDO1FBQ0Ysb0JBQVEsQ0FBQyxLQUFLLDBDQUFFLG1CQUFtQixtREFBRyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXhFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsNERBQW1CLEVBQ25CLElBQUksQ0FBQyxjQUFxQixFQUMxQixLQUFLLENBQ04sQ0FBQztRQUNGLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsNkRBQW9CLEVBQ3BCLElBQUksQ0FBQyxlQUFzQixFQUMzQixLQUFLLENBQ04sQ0FBQztRQUNGLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsMERBQWlCLEVBQ2pCLElBQUksQ0FBQyxZQUFtQixFQUN4QixLQUFLLENBQ04sQ0FBQztRQUVGLFVBQUksQ0FBQyx1QkFBdUIsK0NBQTVCLElBQUksQ0FBNEIsQ0FBQztJQUNuQyxDQUFDO0lBRU8saUJBQWlCOztRQUN2QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsZ0JBQWdCLENBQUMseURBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUN6RSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsbURBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxzREFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakU7UUFDRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsb0RBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEUsUUFBUSxDQUFDLGdCQUFnQixDQUN2Qix5REFBZ0IsRUFDaEIsSUFBSSxDQUFDLDJCQUEyQixDQUNqQyxDQUFDO1FBQ0YsMkRBQTJEO1FBQzNELG9CQUFRLENBQUMsS0FBSywwQ0FBRSxnQkFBZ0IsbURBQUcsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxpQ0FBaUM7UUFDakMsUUFBUSxDQUFDLGdCQUFnQixDQUN2Qiw0REFBbUIsRUFDbkIsSUFBSSxDQUFDLGNBQXFCLEVBQzFCLEtBQUssQ0FDTixDQUFDO1FBQ0YsUUFBUSxDQUFDLGdCQUFnQixDQUN2Qiw2REFBb0IsRUFDcEIsSUFBSSxDQUFDLGVBQXNCLEVBQzNCLEtBQUssQ0FDTixDQUFDO1FBQ0YsUUFBUSxDQUFDLGdCQUFnQixDQUN2QiwwREFBaUIsRUFDakIsSUFBSSxDQUFDLFlBQW1CLEVBQ3hCLEtBQUssQ0FDTixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFFRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsb0RBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0RBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtZQUMzQixJQUFJLENBQUMsMEJBQTBCLEdBQUcsc0VBQTZCLENBQzdELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFRLENBQ3JDLENBQUM7WUFDRixJQUFJLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQzlDLHFEQUFZLEVBQ1osSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFDO1NBQ0g7UUFDRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMscURBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG1EQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxVQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTywwQ0FBRSxnQkFBZ0IsQ0FDbkQsd0RBQWUsRUFDZixJQUFJLENBQUMsWUFBWSxFQUNqQixLQUFLLENBQ04sQ0FBQztRQUNGLFVBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLDBDQUFFLGdCQUFnQixDQUNuRCxtREFBVSxFQUNWLElBQUksQ0FBQyxZQUFZLEVBQ2pCLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQixDQUFDLFNBQW1CLEVBQUUsU0FBbUI7O1FBQ3pELElBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTTtZQUNqRCx5REFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDMUI7WUFDQSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDN0M7UUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDeEMsd0RBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxtRUFBbUU7UUFDbkUsSUFDRSxTQUFTLENBQUMsV0FBVyxLQUFLLFdBQVc7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssV0FBVztZQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUM3QjtZQUNBLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQzlDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtRQUVELElBQUksU0FBUyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFFRCxJQUFJLFNBQVMsQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDNUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7UUFFRCxJQUFJLFNBQVMsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxTQUFTLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxrREFBUyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ3hELENBQUMsQ0FBQztTQUNKO1FBRUQsSUFDRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWE7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUNoQztZQUNBLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7YUFDdEIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxVQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTywwQ0FBRSxTQUFTLENBQUMsTUFBTSxDQUNuRCxhQUFhLEVBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUM1QixDQUFDO1FBRUYsSUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQjtZQUMvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFDekU7WUFDQSx3RUFBd0U7WUFDeEUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvREFBYyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDbkMsSUFDRSxTQUFTLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztZQUNoRCxZQUFZLElBQUksSUFBSTtZQUNwQixtRUFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzVCLHNFQUFnQixDQUFDLFlBQVksQ0FBQyxFQUM5QjtZQUNBLHlFQUFzQixDQUNwQixZQUFZLEVBQ1osSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsS0FBSyxFQUNWLHFEQUFZLENBQ1YsK0dBQW9ELENBQ2xELFlBQVksRUFDWixDQUFDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FBQztTQUNIO1FBRUQsTUFBTSxZQUFZLEdBRWQsRUFBRSxDQUFDO1FBQ1AsTUFBTSxxQkFBcUIsR0FDekIsRUFBRSxDQUFDO1FBQ0wsTUFBTSx3QkFBd0IsR0FDNUIsRUFBRSxDQUFDO1FBQ0wsTUFBTSxnQkFBZ0IsR0FBNkIsRUFBRSxDQUFDO1FBQ3RELE1BQU0saUJBQWlCLEdBQTZCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDbEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTtvQkFDckQsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLHdCQUF3QixDQUFDLEVBQUU7d0JBQ3JDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDbkM7b0JBQ0Qsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM3QzthQUNGO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLE9BQU87YUFDUjtZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUM1QztZQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUM5QztZQUNELHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxHQUFHLG9FQUEyQixDQUMzRDtnQkFDRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZCLEVBQ0QsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBQ0YsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDcEUsSUFBSSxvRUFBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQjtnQkFDRSxtREFBbUQ7Z0JBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CO29CQUM5QixPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUNoRDtvQkFDQSxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsZ0VBQWdFO1lBQ2hFLDJCQUEyQjtZQUMzQixPQUFPLENBQ0wsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7Z0JBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUN6QyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FDNUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxHQUFHLHVEQUFXLENBQzFELGlCQUFpQixFQUNqQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQzNCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsSUFBSSxDQUFDLEVBQUcsRUFDUixJQUFJLENBQUMsTUFBTyxFQUNaO1lBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTztZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQzNCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CO1lBQ25ELElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDckIsMkJBQTJCLEVBQUUscUJBQXFCO1lBQ2xELG1CQUFtQixFQUFFLFlBQVk7WUFDakMsd0JBQXdCO1lBQ3hCLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4Qyx1QkFBdUIsRUFBRSxpQkFBaUI7WUFDMUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUI7WUFDdkQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsV0FBVyxFQUFFLEtBQUs7WUFDbEIsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7U0FDNUMsQ0FDRixDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUU7WUFDZCxpQkFBaUIsR0FBRyxVQUFVLENBQUM7U0FDaEM7UUFDRCxNQUFNLGVBQWU7UUFDbkIseUJBQXlCO1FBQ3pCLHdEQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDdEMsQ0FBQyxDQUFDLEtBQUs7WUFDUCxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEtBQUssZUFBZSxFQUFFO1lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUU1Qix3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ3pCLGdCQUFJLENBQUMsS0FBSyxFQUFDLFFBQVEsbURBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFDeEMsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNkLENBQUM7U0FDSDtJQUNILENBQUM7SUE2Q08sTUFBTSxDQUFDLGFBQWE7UUFDMUIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBK05PLGdCQUFnQixDQUFDLElBQVM7UUFDaEMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxvRUFBMkIsQ0FDMUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcseURBQWMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsQ0FBQztZQUNELFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtZQUM5QyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEI7WUFDdEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO1lBQzFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtZQUM5QyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7WUFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO1lBQzFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtZQUN0QyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEI7WUFDdEQsSUFBSTtZQUNKLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtZQUN4QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUI7WUFDNUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO1lBQzFDLGFBQWEsRUFBRSwrREFBc0I7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUM1QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUU7WUFDM0MsT0FBTztTQUNSLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUE2V08sZUFBZSxDQUFDLFdBQW9DO1FBQzFELElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkIsMERBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLG1EQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyx5RUFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksV0FBVyxLQUFLLE9BQU8sRUFBRTtZQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7UUFDRCxJQUFJLFdBQVcsS0FBSyxXQUFXLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixXQUFXO2dCQUNYLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ3RCLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2FBQ3JCLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUE4Q08saUJBQWlCLENBQ3ZCLE9BQThCLEVBQzlCLEVBQ0UsaUJBQWlCLEdBQUcsS0FBSyxHQUcxQjtRQUVELE1BQU0sYUFBYSxHQUFHLENBQ3BCLElBQVksRUFDWixZQUFvQixFQUNwQixTQUFrQixFQUNsQixFQUFFO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQkFDNUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQzNELElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLHdEQUFhLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3pELE9BQU8sNERBQWlCLENBQUMsUUFBUSxFQUFFOzRCQUNqQyxJQUFJOzRCQUNKLFNBQVM7NEJBQ1QsWUFBWTt5QkFDYixDQUFDLENBQUM7cUJBQ0o7b0JBQ0QsT0FBTyxRQUFRLENBQUM7Z0JBQ2xCLENBQUMsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLHNEQUFXLENBQUM7WUFDVixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxvRUFBMkIsQ0FDaEU7b0JBQ0UsTUFBTSxFQUFFLENBQUM7b0JBQ1QsTUFBTSxFQUFFLENBQUM7aUJBQ1YsRUFDRCxJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7Z0JBQ0YsT0FBTztvQkFDTCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO29CQUNqQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztZQUNELFFBQVEsRUFBRSwyREFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNwQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakMsSUFBSSw4REFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDaEMsc0VBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzlCO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsUUFBUSxFQUFFLDJEQUFrQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7Z0JBQ25FLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvQixhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDN0Msa0VBQWtFO2dCQUNsRSxrRUFBa0U7Z0JBQ2xFLElBQUksQ0FBQyxTQUFTLElBQUksV0FBVyxFQUFFO29CQUM3QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxXQUFXO3dCQUMzQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVc7d0JBQ3JCLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQzVCLGtCQUFrQixrQ0FDYixTQUFTLENBQUMsa0JBQWtCLEtBQy9CLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLEdBQzFCO3FCQUNGLENBQUMsQ0FBQyxDQUFDO2lCQUNMO2dCQUNELElBQUksU0FBUyxFQUFFO29CQUNiLDJFQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtnQkFDRCxJQUFJLENBQUMsU0FBUyxJQUFJLGlCQUFpQixFQUFFO29CQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUNoQztnQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLGVBQWUsRUFBRSxJQUFJO29CQUNyQixjQUFjLEVBQUUsSUFBSTtpQkFDckIsQ0FBQyxDQUFDO2dCQUNILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7b0JBQzVCLDBEQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1QztnQkFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDO1lBQ0YsT0FBTztZQUNQLG1CQUFtQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPO1lBQ3hELEdBQUcsRUFBRSxJQUFJO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsY0FBYyxFQUFFLElBQUk7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHdCQUF3QixDQUM5QixDQUFTLEVBQ1QsQ0FBUztRQUVULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzlDLHVCQUF1QixFQUFFLElBQUk7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxPQUFPLElBQUksd0RBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDM0QsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsQ0FBUyxFQUNULENBQVMsRUFDVCxJQUtDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUMvQyxDQUFDLEVBQ0QsQ0FBQyxFQUNELElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSx1QkFBdUIsQ0FDOUIsQ0FBQztRQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsY0FBYyxFQUFFO2dCQUN4QixLQUFLLElBQUksS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDL0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDM0QsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzlCO2lCQUNGO2FBQ0Y7WUFDRCxNQUFNLHdCQUF3QixHQUM1QixjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1Qyx5RUFBeUU7WUFDekUsNEVBQTRFO1lBQzVFLE9BQU8sMkZBQWdELENBQ3JELHdCQUF3QixFQUN4QixJQUFJLENBQUMsS0FBSyxFQUNWLENBQUMsRUFDRCxDQUFDLENBQ0Y7Z0JBQ0MsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxDQUFDLHdCQUF3QixDQUFDO1NBQzlCO1FBQ0QsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMvQixPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLHFCQUFxQixDQUMzQixDQUFTLEVBQ1QsQ0FBUyxFQUNULDBCQUFtQyxLQUFLO1FBRXhDLE1BQU0sUUFBUSxHQUFHLHVCQUF1QjtZQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO2lCQUNQLFdBQVcsRUFBRTtpQkFDYixNQUFNLENBQ0wsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyx3REFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDOUQsQ0FBQztRQUVSLE9BQU8sOERBQXFCLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDakQsa0RBQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ25DLENBQUM7SUFDSixDQUFDO0lBdzRCTyxpQ0FBaUMsQ0FDdkMsS0FBNEM7UUFFNUMsSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzFCLHlFQUF5RTtZQUN6RSxrRkFBa0Y7WUFDbEYsOERBQThEO1lBQzlELGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjtJQUNILENBQUM7SUFtR08sMEJBQTBCLENBQ2hDLEtBQTRDO1FBRTVDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDcEMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ2hCLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTztTQUNqQixDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUMvQixPQUFPLENBQUMsVUFBVSxHQUFHLG9EQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsc0RBQVcsQ0FDbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQ3RDLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyx1QkFBdUIsQ0FDN0IsS0FBNEM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsb0VBQTJCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUN4QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsMERBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRW5FLE9BQU87WUFDTCxNQUFNO1lBQ04sYUFBYSxFQUFFLEtBQUssQ0FBQyxvREFBZ0IsQ0FBQztZQUN0QyxZQUFZLEVBQUUscURBQVksQ0FDeEIsb0RBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FDdEQ7WUFDRCxVQUFVLEVBQUUseURBQWdCLENBQzFCLGlCQUFpQixFQUNqQixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUNyQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUNyQztZQUNELDREQUE0RDtZQUM1RCxVQUFVLG9CQUFPLE1BQU0sQ0FBRTtZQUN6QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDakUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLHFFQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQTBDLENBQUM7WUFDckQsTUFBTSxFQUFFO2dCQUNOLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixVQUFVLEVBQUUsS0FBSztnQkFDakIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QixjQUFjLEVBQUUsUUFBUTtnQkFDeEIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2FBQ3ZEO1lBQ0QsR0FBRyxFQUFFO2dCQUNILE9BQU8sRUFBRSxJQUFJO2dCQUNiLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixtQkFBbUIsRUFBRSxLQUFLO2dCQUMxQixpQkFBaUIsRUFBRSxLQUFLO2dCQUN4Qix5Q0FBeUMsRUFDdkMsSUFBSSxDQUFDLDRDQUE0QyxDQUMvQyxNQUFNLEVBQ04sZ0JBQWdCLENBQ2pCO2dCQUNILG1CQUFtQixFQUFFLEtBQUs7YUFDM0I7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJO2FBQ2I7WUFDRCxjQUFjLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLElBQUk7Z0JBQ1osSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsU0FBUyxFQUFFLElBQUk7YUFDaEI7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osV0FBVyxFQUFFLEtBQUs7YUFDbkI7WUFDRCxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsc0RBQXNEO0lBQzlDLHVCQUF1QixDQUM3QixLQUE0QyxFQUM1QyxnQkFBa0M7UUFFbEMsSUFDRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQ3ZFO1lBQ0EsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMzQixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDOUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzlDLE1BQU0sYUFBYSxHQUFHLG9FQUEyQixDQUFDLENBQUMsS0FBbUIsRUFBRSxFQUFFO1lBQ3hFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLFdBQVcsQ0FBQyxFQUFFO2dCQUNwQyxPQUFPO2FBQ1I7WUFFRCxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRywyREFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQzVCLDBEQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsMkRBQWtCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDOUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLHlEQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzFELGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVILGFBQWEsR0FBRyxXQUFXLENBQUM7UUFFNUIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLDJEQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFpTk8sa0JBQWtCLENBQUMsVUFBb0M7UUFDN0QsT0FBTyxVQUFVLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTyw0Q0FBNEMsQ0FDbEQsS0FBeUMsRUFDekMsZ0JBQThDO1FBRTlDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsaUVBQWlFO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDN0MsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLDBEQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQ0wsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUztZQUN4QixLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO1lBQ3hCLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVM7WUFDeEIsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUN6QixDQUFDO0lBQ0osQ0FBQztJQWtSTywrQkFBK0IsQ0FDckMsZ0JBQWtDO1FBRWxDLE9BQU8sMkRBQWtCLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDakQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ25ELE9BQU87YUFDUjtZQUNELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw2QkFBNkIsQ0FDbkMsZ0JBQWtDO1FBRWxDLE9BQU8sMkRBQWtCLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDakQsOENBQThDO1lBQzlDLEtBQUssQ0FBQyxHQUFHLEtBQUssNENBQVEsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ25ELE9BQU87YUFDUjtZQUNELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQ0FBbUMsQ0FDekMsZ0JBQWtDO1FBRWxDLE9BQU8sb0VBQTJCLENBQUMsQ0FBQyxLQUFtQixFQUFFLEVBQUU7O1lBQ3pELDhEQUE4RDtZQUM5RCwwRUFBMEU7WUFDMUUsbUVBQW1FO1lBQ25FLHFCQUFxQjtZQUNyQixJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUN6QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLHFEQUFZLENBQ3pDLDBEQUFlLENBQ2IsNERBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ3pELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ3pCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQzFCLENBQ0YsQ0FBQzthQUNIO1lBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksV0FBVyxDQUFDLEVBQUU7Z0JBQ3BDLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUNqRSxPQUFPO2FBQ1I7WUFFRCxNQUFNLGFBQWEsR0FBRyxvRUFBMkIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXJFLElBQUkseURBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPO2FBQ1I7WUFFRCxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLG9EQUFZLENBQ2pDLGFBQWEsQ0FBQyxDQUFDLEVBQ2YsYUFBYSxDQUFDLENBQUMsRUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDcEIsQ0FBQztZQUVGLGlFQUFpRTtZQUNqRSw0REFBNEQ7WUFDNUQsNERBQTREO1lBQzVELDBCQUEwQjtZQUMxQixJQUNFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVc7Z0JBQ2xDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssT0FBTztvQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLEVBQ3BDO2dCQUNBLElBQ0Usa0RBQVUsQ0FDUixhQUFhLENBQUMsQ0FBQyxFQUNmLGFBQWEsQ0FBQyxDQUFDLEVBQ2YsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDekIsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDMUIsR0FBRywyREFBa0IsRUFDdEI7b0JBQ0EsT0FBTztpQkFDUjthQUNGO1lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUN0QyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ25ELE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ25DLE1BQU0sT0FBTyxHQUFHLGtHQUF1QyxDQUNyRCxJQUFJLENBQUMsS0FBSyxFQUNWLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUNyQyxhQUFhLENBQUMsQ0FBQyxFQUNmLGFBQWEsQ0FBQyxDQUFDLEVBQ2YsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLDRDQUE0QyxDQUMvQyxPQUFPLEVBQ1AsaUJBQWlCLENBQ2xCLENBQUM7Z0JBQ0osQ0FBQyxDQUNGLENBQUM7Z0JBRUYsSUFBSSxPQUFPLEVBQUU7b0JBQ1gsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQ2hELE9BQU87aUJBQ1I7YUFDRjtZQUVELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3JFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQzlDLENBQUM7WUFFRixJQUNFLENBQUMsc0JBQXNCO2dCQUNyQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMseUNBQXlDLENBQUM7Z0JBQ2pFLGdFQUFnRTtnQkFDaEUsc0JBQXNCO2dCQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELHdFQUF3RTtnQkFDeEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO29CQUMvQixXQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQiwwQ0FBRSxTQUFTO3lCQUN4QyxzQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTywwQ0FBRSxFQUFFO29CQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFDM0M7Z0JBQ0Esb0RBQW9EO2dCQUNwRCxnREFBZ0Q7Z0JBQ2hELGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN6QyxNQUFNLGdCQUFnQixHQUFHLDREQUFtQixDQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUN4QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7Z0JBQ0Ysc0VBQXNFO2dCQUN0RSxrRUFBa0U7Z0JBQ2xFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRTtvQkFDbEUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxvREFBWSxDQUNqQyxhQUFhLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNoRCxhQUFhLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDcEIsQ0FBQztvQkFFRixNQUFNLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7cUJBQ3RELENBQUM7b0JBRUYsb0RBQW9EO29CQUNwRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUVyQywrREFBb0IsQ0FDbEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsS0FBSyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsYUFBYSxFQUNiLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztvQkFDRixJQUFJLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFFakQsc0VBQXNFO29CQUN0RSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUU7d0JBQzNELDRFQUE0RTt3QkFDNUUsNkRBQTZEO3dCQUM3RCxnREFBZ0Q7d0JBRWhELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7d0JBRTlDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7d0JBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQzdCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQzt3QkFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO3dCQUMxRCxNQUFNLGtCQUFrQixHQUN0Qiw0REFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQ2pELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUN4QixDQUFDO3dCQUVKLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFOzRCQUM5QixJQUNFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dDQUN2Qyx5REFBeUQ7Z0NBQ3pELHdEQUF3RDtnQ0FDeEQsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFLLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxFQUFFO29DQUM1QixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFDM0M7Z0NBQ0EsTUFBTSxpQkFBaUIsR0FBRywyREFBZ0IsQ0FDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQ3pCLFVBQVUsRUFDVixPQUFPLENBQ1IsQ0FBQztnQ0FDRixNQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHLG9EQUFZLENBQzdDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzFELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUNwQixDQUFDO2dDQUNGLHNFQUFhLENBQUMsaUJBQWlCLEVBQUU7b0NBQy9CLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO29DQUM5QyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztpQ0FDL0MsQ0FBQyxDQUFDO2dDQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQ0FDckMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dDQUMvQixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDM0Q7aUNBQU07Z0NBQ0wsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs2QkFDNUI7eUJBQ0Y7d0JBQ0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDakUsc0ZBQStCLENBQzdCLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsbUJBQW1CLENBQ3BCLENBQUM7d0JBQ0YsOEVBQTJCLENBQ3pCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLHNCQUFzQixDQUN2QixDQUFDO3dCQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDbEQ7b0JBQ0QsT0FBTztpQkFDUjthQUNGO1lBRUQsa0VBQWtFO1lBQ2xFLHVDQUF1QztZQUN2QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQixPQUFPO2FBQ1I7WUFFRCxJQUFJLGVBQWUsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO2dCQUN2QyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO2dCQUN0QyxNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFFL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sWUFBWSxHQUNoQixTQUFTLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUUxRCxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNqQixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsZ0JBQWdCO3dCQUNoRCxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVM7d0JBQzNCLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRW5ELHNFQUFhLENBQUMsZUFBZSxFQUFFO3dCQUM3QixNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDN0IsU0FBUztxQkFDVixDQUFDLENBQUM7aUJBQ0o7YUFDRjtpQkFBTSxJQUFJLHFFQUFlLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzNDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO2dCQUN0QyxJQUFJLEVBQUUsR0FBRyxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLEdBQUcsS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBRW5DLElBQUkscUVBQTZCLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQy9ELENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxnRUFBcUIsQ0FDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQ3RCLEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQyxDQUFDO2lCQUNKO2dCQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3ZCLHNFQUFhLENBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ25FO3FCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzVCLHNFQUFhLENBQUMsZUFBZSxFQUFFO3dCQUM3QixNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQzNDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxJQUFJLHNFQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUNyQyw2Q0FBNkM7b0JBQzdDLElBQUksQ0FBQyw0Q0FBNEMsQ0FDL0MsZUFBZSxFQUNmLENBQUMsYUFBYSxDQUFDLEVBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0IsQ0FBQztpQkFDSDthQUNGO2lCQUFNO2dCQUNMLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDMUQ7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRTtnQkFDMUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBRWpELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFDLElBQ0UsQ0FBQyxLQUFLLENBQUMsUUFBUTtvQkFDZixrREFBa0Q7b0JBQ2xELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQ2hDLDhEQUFxQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQzNDO29CQUNBLElBQUksZ0JBQWdCLENBQUMsYUFBYSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7d0JBQ2xFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUMxQix5RUFBK0IsaUNBRXhCLFNBQVMsS0FDWixrQkFBa0IsRUFBRTtnQ0FDbEIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUk7NkJBQ3pDLEtBRUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDekIsQ0FDRixDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxRQUFRLENBQUM7NEJBQ1osa0JBQWtCLEVBQUUsRUFBRTs0QkFDdEIsZ0JBQWdCLEVBQUUsRUFBRTs0QkFDcEIsY0FBYyxFQUFFLElBQUk7eUJBQ3JCLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtnQkFDRCxnQ0FBZ0M7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTtvQkFDbkMsaUdBQXNDLENBQ3BDLEtBQUssRUFDTCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUN6QixDQUFDO29CQUNGLHFCQUFxQjtpQkFDdEI7cUJBQU07b0JBQ0wsTUFBTSx1QkFBdUIsR0FBRyxtRUFBMEIsQ0FDeEQsUUFBUSxFQUNSLGVBQWUsQ0FDaEIsQ0FBQztvQkFDRixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDMUIseUVBQStCLGlDQUV4QixTQUFTLEtBQ1osa0JBQWtCLGdEQUNiLFNBQVMsQ0FBQyxrQkFBa0IsR0FDNUIsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFOzRCQUNqRCxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzs0QkFDdkIsT0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQyxFQUFFLEVBQVMsQ0FBQyxHQUNWLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU87NEJBQzlCLENBQUMsQ0FBQztnQ0FDRSxzREFBc0Q7Z0NBQ3RELHFDQUFxQztnQ0FDckMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUMvQixDQUFDLHVCQUF1QixDQUFDLE1BQU07NkJBQ2xDOzRCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsR0FFWCxrQkFBa0IsRUFDaEIsdUJBQXVCLENBQUMsTUFBTSxLQUFLLENBQUM7NEJBQ3BDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7NEJBQzdCLENBQUMsQ0FBQyxNQUFNOzRCQUNSLENBQUMsQ0FBQyxLQUFLLEtBRWIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDekIsQ0FDRixDQUFDO2lCQUNIO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrRUFBa0U7SUFDMUQsK0JBQStCLENBQ3JDLEtBQW1CLEVBQ25CLGdCQUFrQztRQUVsQyxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNoRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO2FBQ3pELENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUU7WUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSzthQUN6RCxDQUFDLENBQUM7WUFDSCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8saUNBQWlDLENBQ3ZDLGdCQUFrQztRQUVsQyxPQUFPLDJEQUFrQixDQUFDLENBQUMsVUFBd0IsRUFBRSxFQUFFOztZQUNyRCxNQUFNLEVBQ0osZUFBZSxFQUNmLGVBQWUsRUFDZixZQUFZLEVBQ1osV0FBVyxFQUNYLGFBQWEsRUFDYixVQUFVLEVBQ1YsVUFBVSxHQUNYLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixlQUFlLEVBQUUsSUFBSTtnQkFDckIsZ0JBQWdCLEVBQUUsSUFBSTtnQkFDdEIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLGtFQUFrRTtnQkFDbEUsb0NBQW9DO2dCQUNwQyxjQUFjLEVBQ1osWUFBWSxJQUFJLHdEQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7b0JBQ3RELENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7b0JBQzNCLENBQUMsQ0FBQyxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFL0QseUVBQXlFO1lBQ3pFLDJCQUEyQjtZQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ25DLElBQ0UsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVztvQkFDMUMsQ0FBQyw2QkFBZ0IsQ0FBQyxHQUFHLDBDQUFFLE9BQU8sMENBQUUsRUFBRTt3QkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTO3dCQUN6QyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUM1QztvQkFDQSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvREFBYyxDQUFDLENBQUM7aUJBQ2xEO3FCQUFNO29CQUNMLE1BQU0sb0JBQW9CLEdBQUcsOEZBQW1DLENBQzlELFVBQVUsRUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUMvQixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7b0JBQ0YsSUFBSSxvQkFBb0IsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO3dCQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDOzRCQUNaLG9CQUFvQjs0QkFDcEIsaUJBQWlCLEVBQUUsRUFBRTt5QkFDdEIsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2FBQ0Y7WUFFRCxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBRXJCLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRTtnQkFDMUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNoRDtZQUVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FDeEIsMkRBQWtCLEVBQ2xCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxNQUFPLENBQ3hDLENBQUM7WUFDRixNQUFNLENBQUMsbUJBQW1CLENBQ3hCLHlEQUFnQixFQUNoQixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSyxDQUN0QyxDQUFDO1lBQ0YsTUFBTSxDQUFDLG1CQUFtQixDQUN4QixzREFBYSxFQUNiLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxTQUFVLENBQzNDLENBQUM7WUFDRixNQUFNLENBQUMsbUJBQW1CLENBQ3hCLG9EQUFXLEVBQ1gsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQVEsQ0FDekMsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDOUM7WUFFRCxJQUFJLGdCQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUUsSUFBSSxNQUFLLFVBQVUsRUFBRTtnQkFDeEMsTUFBTSxhQUFhLEdBQUcsb0VBQTJCLENBQy9DLFVBQVUsRUFDVixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7Z0JBRUYsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztnQkFDdEMsSUFBSSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBRTdDLHlEQUF5RDtnQkFDekQsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzlDLEVBQUUsSUFBSSxNQUFNLENBQUM7b0JBQ2IsRUFBRSxJQUFJLE1BQU0sQ0FBQztpQkFDZDtnQkFFRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsZ0JBQWdCO29CQUNoRCxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUV4RCxzRUFBYSxDQUFDLGVBQWUsRUFBRTtvQkFDN0IsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzdCLFNBQVM7b0JBQ1Qsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO2lCQUM3QixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsb0RBQWMsQ0FBQyxDQUFDO2dCQUVqRCxPQUFPO2FBQ1I7WUFDRCxJQUFJLG9FQUFjLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ25DLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQztnQkFDckMsSUFBSTtvQkFDRixJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQ1gsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQ25ELEdBQUcsRUFBRTt3QkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvREFBYyxDQUFDLENBQUM7b0JBQ25ELENBQUMsQ0FDRixDQUFDO2lCQUNIO2dCQUFDLE9BQU8sS0FBVSxFQUFFO29CQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUMzQixJQUFJLENBQUMsS0FBSzt5QkFDUCwyQkFBMkIsRUFBRTt5QkFDN0IsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FDN0MsQ0FBQztvQkFDRixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvREFBYyxDQUFDLENBQUM7aUJBQ2xEO2dCQUNELE9BQU87YUFDUjtZQUVELElBQUkscUVBQWUsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxlQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUNoQztnQkFDRCxNQUFNLGFBQWEsR0FBRyxvRUFBMkIsQ0FDL0MsVUFBVSxFQUNWLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztnQkFFRixJQUNFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVc7b0JBQ2xDLGVBQWU7b0JBQ2YsQ0FBQyxZQUFZLEVBQ2I7b0JBQ0Esc0VBQWEsQ0FBQyxlQUFlLEVBQUU7d0JBQzdCLE1BQU0sRUFBRTs0QkFDTixHQUFHLGVBQWUsQ0FBQyxNQUFNOzRCQUN6QjtnQ0FDRSxhQUFhLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO2dDQUNuQyxhQUFhLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDOzZCQUNwQzt5QkFDRjtxQkFDRixDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDWixZQUFZLEVBQUUsZUFBZTt3QkFDN0IsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtxQkFDM0MsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDN0QsSUFDRSxtRUFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3dCQUM1QixzRUFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFDakM7d0JBQ0EseUVBQXNCLENBQ3BCLGVBQWUsRUFDZixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxLQUFLLEVBQ1YsYUFBYSxDQUNkLENBQUM7cUJBQ0g7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLENBQUMsYUFBYSxFQUFFO3dCQUNsQixvREFBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDNUIsZUFBZSxFQUFFLElBQUk7NEJBQ3JCLFdBQVcsRUFBRSxXQUFXOzRCQUN4QixrQkFBa0Isa0NBQ2IsU0FBUyxDQUFDLGtCQUFrQixLQUMvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZ0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQ3ZDO3lCQUNGLENBQUMsQ0FBQyxDQUFDO3FCQUNMO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQzVCLGVBQWUsRUFBRSxJQUFJOzRCQUNyQixrQkFBa0Isa0NBQ2IsU0FBUyxDQUFDLGtCQUFrQixLQUMvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZ0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQ3ZDO3lCQUNGLENBQUMsQ0FBQyxDQUFDO3FCQUNMO2lCQUNGO2dCQUNELE9BQU87YUFDUjtZQUVELElBQ0UsV0FBVyxLQUFLLFdBQVc7Z0JBQzNCLGVBQWU7Z0JBQ2Ysa0VBQXVCLENBQUMsZUFBZSxDQUFDLEVBQ3hDO2dCQUNBLDREQUE0RDtnQkFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FBQztnQkFDRixJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLGVBQWUsRUFBRSxJQUFJO2lCQUN0QixDQUFDLENBQUM7Z0JBQ0gsT0FBTzthQUNSO1lBRUQsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLHNFQUFhLENBQ1gsZUFBZSxFQUNmLGtFQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUN6QyxDQUFDO2FBQ0g7WUFFRCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUNoQztZQUVELElBQUksZUFBZSxJQUFJLGtFQUF1QixDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUMzQixJQUFJLENBQUMsS0FBSztxQkFDUCwyQkFBMkIsRUFBRTtxQkFDN0IsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FDaEQsQ0FBQzthQUNIO1lBRUQsdURBQXVEO1lBQ3ZELG9EQUFvRDtZQUNwRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ2hELElBQUkseURBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sZUFBZSxHQUFHLGtEQUFVLENBQ2hDLElBQUksQ0FBQyxlQUFnQixDQUFDLE9BQU8sRUFDN0IsSUFBSSxDQUFDLGVBQWdCLENBQUMsT0FBTyxFQUM3QixJQUFJLENBQUMsYUFBYyxDQUFDLE9BQU8sRUFDM0IsSUFBSSxDQUFDLGFBQWMsQ0FBQyxPQUFPLENBQzVCLENBQUM7Z0JBRUYsSUFBSSxlQUFlLEtBQUssQ0FBQyxFQUFFO29CQUN6QixNQUFNLFlBQVksR0FBRyxvRUFBMkIsQ0FDOUM7d0JBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFjLENBQUMsT0FBTzt3QkFDcEMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFjLENBQUMsT0FBTztxQkFDckMsRUFDRCxJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7b0JBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUM1QyxZQUFZLENBQUMsQ0FBQyxFQUNkLFlBQVksQ0FBQyxDQUFDLENBQ2YsQ0FBQztvQkFFRixXQUFXLENBQUMsT0FBTyxDQUNqQixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQ2IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQzdELENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPO2FBQ1I7WUFFRCxJQUNFLFVBQVU7Z0JBQ1YsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFDbEMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsbUJBQW1CO2dCQUN6QyxtRUFBbUU7Z0JBQ25FLGVBQWU7Z0JBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO29CQUMvQixDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFDN0M7Z0JBQ0Esd0RBQXdEO2dCQUN4RCxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO29CQUMzRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO3dCQUNoRCxJQUFJLDREQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7NEJBQzlDLHVEQUF1RDs0QkFDdkQsc0RBQXNEOzRCQUN0RCx3QkFBd0I7NEJBQ3hCLE1BQU0sb0NBQW9DLEdBQUcsVUFBVSxDQUFDLFFBQVE7aUNBQzdELE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ25CLDREQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQ3REO2lDQUNBLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aUNBQzNDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGlDQUFNLE1BQU0sR0FBSyxHQUFHLEVBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFFeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQ0FDN0IsZ0JBQWdCLGtDQUNYLFVBQVUsQ0FBQyxrQkFBa0IsR0FDN0IsVUFBVSxDQUFDLFFBQVE7cUNBQ25CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztxQ0FDaEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsaUNBQU0sSUFBSSxHQUFLLEdBQUcsRUFBRyxFQUFFLEVBQUUsQ0FBQyxDQUNwRDtnQ0FDRCxrQkFBa0Isa0NBQ2IsVUFBVSxDQUFDLGtCQUFrQixHQUM3QixvQ0FBb0MsQ0FDeEM7NkJBQ0YsQ0FBQyxDQUFDLENBQUM7eUJBQ0w7NkJBQU07NEJBQ0wsc0NBQXNDOzRCQUN0QyxpQ0FBaUM7NEJBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUMxQix5RUFBK0IsaUNBRXhCLFNBQVMsS0FDWixrQkFBa0Isa0NBQ2IsU0FBUyxDQUFDLGtCQUFrQixLQUMvQixDQUFDLFVBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFFBRzNCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQ3pCLENBQ0YsQ0FBQzt5QkFDSDtxQkFDRjt5QkFBTTt3QkFDTCxpQ0FBaUM7d0JBQ2pDLGlDQUFpQzt3QkFFakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDN0Isa0JBQWtCLGtDQUNiLFVBQVUsQ0FBQyxrQkFBa0IsS0FDaEMsQ0FBQyxVQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUN2Qjt5QkFDRixDQUFDLENBQUMsQ0FBQztxQkFDTDtpQkFDRjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxtQkFDeEIseUVBQStCLGlDQUUzQixTQUFTLEtBQ1osa0JBQWtCLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FFL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDekIsRUFDRCxDQUFDLENBQUM7aUJBQ0w7YUFDRjtZQUVELElBQ0UsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQjtnQkFDaEMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFDbEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQ3RCLENBQUMsQ0FBQyxVQUFVO29CQUNWLDJGQUFnRCxDQUM5QyxVQUFVLEVBQ1YsSUFBSSxDQUFDLEtBQUssRUFDVixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUMxQixDQUFDO29CQUNGLENBQUMsQ0FBQyxVQUFVO3dCQUNWLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQ3BFO2dCQUNBLDZCQUE2QjtnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDWixrQkFBa0IsRUFBRSxFQUFFO29CQUN0QixnQkFBZ0IsRUFBRSxFQUFFO29CQUNwQixjQUFjLEVBQUUsSUFBSTtpQkFDckIsQ0FBQyxDQUFDO2dCQUVILE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxhQUFhLElBQUksV0FBVyxLQUFLLFVBQVUsSUFBSSxlQUFlLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVCLGtCQUFrQixrQ0FDYixTQUFTLENBQUMsa0JBQWtCLEtBQy9CLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FDM0I7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7YUFDTDtZQUVELElBQ0UsV0FBVyxLQUFLLFdBQVc7Z0JBQzNCLDhEQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUMzRDtnQkFDQSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ2hDO1lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLFVBQVUsSUFBSSxVQUFVLEVBQUU7Z0JBQ2pFLENBQUMsbUVBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDM0IsQ0FBQyxDQUFDLDJFQUE0QjtvQkFDOUIsQ0FBQyxDQUFDLG1FQUFvQixDQUFDLENBQ3ZCLDREQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUMxRCxDQUFDO2FBQ0g7WUFFRCxJQUFJLENBQUMsYUFBYSxJQUFJLFdBQVcsS0FBSyxVQUFVLEVBQUU7Z0JBQ2hELG9EQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLGVBQWUsRUFBRSxJQUFJO29CQUNyQixpQkFBaUIsRUFBRSxFQUFFO29CQUNyQixXQUFXLEVBQUUsV0FBVztpQkFDekIsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDWixlQUFlLEVBQUUsSUFBSTtvQkFDckIsaUJBQWlCLEVBQUUsRUFBRTtpQkFDdEIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUF1Y08seUJBQXlCLENBQy9CLGdCQUFpRDtRQUVqRCxNQUFNLGlCQUFpQixHQUFHLGdGQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sY0FBYyxDQUFDLFVBQW9DO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUIsa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BCLG1FQUFtRTtZQUNuRSxrQkFBa0I7WUFDbEIsY0FBYyxFQUNaLFNBQVMsQ0FBQyxjQUFjO2dCQUN4QixVQUFVLElBQUksSUFBSTtnQkFDbEIsMERBQWdCLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYztnQkFDMUIsQ0FBQyxDQUFDLElBQUk7U0FDWCxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLDBCQUEwQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7SUF3aEJPLHFDQUFxQyxDQUMzQyxDQUFTLEVBQ1QsQ0FBUyxFQUNULFFBQWtCLEVBQ2xCLE1BQWdDLEVBQ2hDLEtBQWE7UUFFYixNQUFNLG9CQUFvQixHQUFHLDJFQUFrQyxDQUM3RCxJQUFJLENBQUMsS0FBSzthQUNQLDJCQUEyQixFQUFFO2FBQzdCLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyx3REFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQy9DLENBQUMsRUFDRCxDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksb0JBQW9CLEVBQUU7WUFDeEIsTUFBTSxjQUFjLEdBQ2xCLG9CQUFvQixDQUFDLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sY0FBYyxHQUNsQixvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQ2pDLENBQUMsR0FBRyxjQUFjLEVBQ2xCLENBQUMsR0FBRyxjQUFjLENBQ25CLENBQUM7WUFDRixNQUFNLGlCQUFpQixHQUNyQixnQkFBZ0IsR0FBRyxzRUFBNkIsQ0FBQztZQUNuRCxJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsb0VBQTJCLENBQ2hFLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQ2xELFFBQVEsQ0FDVCxDQUFDO2dCQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsQ0FBQzthQUNqRTtTQUNGO0lBQ0gsQ0FBQztJQTBFTyxnQkFBZ0I7O1FBQ3RCLElBQUksVUFBSSxDQUFDLHNCQUFzQiwwQ0FBRSxPQUFPLEVBQUU7WUFDeEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDO1lBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsbUJBQW1CLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNsRSxPQUFPO2dCQUNMLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixTQUFTLEVBQUUsR0FBRzthQUNmLENBQUM7U0FDSDtRQUNELE9BQU87WUFDTCxVQUFVLEVBQUUsQ0FBQztZQUNiLFNBQVMsRUFBRSxDQUFDO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFYSxjQUFjOztZQUMxQixNQUFNLFdBQVcsR0FDZixrREFBYyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUMzRCwrQ0FBVyxDQUFDO1lBQ2QsTUFBTSxtREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztLQUFBOztBQXAyS2EsZ0JBQVksR0FBc0I7SUFDOUMsc0VBQXNFO0lBQ3RFLFNBQVMsRUFBRSwyREFBa0I7Q0FDOUIsQ0FBQztBQW8zS0osSUFDRSxhQUFvQixLQUFLLGlEQUFRO0lBQ2pDLGFBQW9CLEtBQUssd0RBQWUsRUFDeEM7SUFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUssRUFBa0IsQ0FBQztJQUUzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHO2dCQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsR0FBRyxDQUFDLFFBQTZCO2dCQUMvQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7U0FDRjtLQUNGLENBQUMsQ0FBQztDQUNKO0FBQ0QsaUVBQWUsR0FBRyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQXBwLnRzeD8wMDcwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb3VnaENhbnZhcyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jYW52YXNcIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCBjbHN4IGZyb20gXCJjbHN4XCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5cbmltcG9ydCB7XG4gIGFjdGlvbkFkZFRvTGlicmFyeSxcbiAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICBhY3Rpb25CcmluZ1RvRnJvbnQsXG4gIGFjdGlvbkNvcHksXG4gIGFjdGlvbkNvcHlBc1BuZyxcbiAgYWN0aW9uQ29weUFzU3ZnLFxuICBhY3Rpb25Db3B5U3R5bGVzLFxuICBhY3Rpb25DdXQsXG4gIGFjdGlvbkRlbGV0ZVNlbGVjdGVkLFxuICBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sXG4gIGFjdGlvbkZpbmFsaXplLFxuICBhY3Rpb25GbGlwSG9yaXpvbnRhbCxcbiAgYWN0aW9uRmxpcFZlcnRpY2FsLFxuICBhY3Rpb25Hcm91cCxcbiAgYWN0aW9uUGFzdGVTdHlsZXMsXG4gIGFjdGlvblNlbGVjdEFsbCxcbiAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICBhY3Rpb25TZW5kVG9CYWNrLFxuICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gIGFjdGlvblVuYmluZFRleHQsXG4gIGFjdGlvbkJpbmRUZXh0LFxuICBhY3Rpb25Vbmdyb3VwLFxuICBhY3Rpb25MaW5rLFxufSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IEFjdGlvblJlc3VsdCB9IGZyb20gXCIuLi9hY3Rpb25zL3R5cGVzXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlLCBpc0VyYXNlckFjdGl2ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHtcbiAgY29weVRvQ2xpcGJvYXJkLFxuICBwYXJzZUNsaXBib2FyZCxcbiAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IsXG4gIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQsXG59IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULFxuICBERUZBVUxUX1VJX09QVElPTlMsXG4gIERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gIERSQUdHSU5HX1RIUkVTSE9MRCxcbiAgRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5ULFxuICBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVOVixcbiAgRVZFTlQsXG4gIEdSSURfU0laRSxcbiAgSU1BR0VfUkVOREVSX1RJTUVPVVQsXG4gIExJTkVfQ09ORklSTV9USFJFU0hPTEQsXG4gIE1BWF9BTExPV0VEX0ZJTEVfQllURVMsXG4gIE1JTUVfVFlQRVMsXG4gIE1RX01BWF9IRUlHSFRfTEFORFNDQVBFLFxuICBNUV9NQVhfV0lEVEhfTEFORFNDQVBFLFxuICBNUV9NQVhfV0lEVEhfUE9SVFJBSVQsXG4gIFBPSU5URVJfQlVUVE9OLFxuICBTQ1JPTExfVElNRU9VVCxcbiAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gIFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xELFxuICBUSEVNRSxcbiAgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCxcbiAgVVJMX0hBU0hfS0VZUyxcbiAgVVJMX1FVRVJZX0tFWVMsXG4gIFZFUlRJQ0FMX0FMSUdOLFxuICBaT09NX1NURVAsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvYWRGcm9tQmxvYiB9IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cywgcmVzdG9yZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7XG4gIGRyYWdOZXdFbGVtZW50LFxuICBkcmFnU2VsZWN0ZWRFbGVtZW50cyxcbiAgZHVwbGljYXRlRWxlbWVudCxcbiAgZ2V0Q29tbW9uQm91bmRzLFxuICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsXG4gIGdldERyYWdPZmZzZXRYWSxcbiAgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLFxuICBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbixcbiAgZ2V0UmVzaXplT2Zmc2V0WFksXG4gIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLFxuICBoaXRUZXN0LFxuICBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICBpc05vbkRlbGV0ZWRFbGVtZW50LFxuICBpc1RleHRFbGVtZW50LFxuICBuZXdFbGVtZW50LFxuICBuZXdMaW5lYXJFbGVtZW50LFxuICBuZXdUZXh0RWxlbWVudCxcbiAgbmV3SW1hZ2VFbGVtZW50LFxuICB0ZXh0V3lzaXd5ZyxcbiAgdHJhbnNmb3JtRWxlbWVudHMsXG4gIHVwZGF0ZVRleHRFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyxcbiAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uLFxuICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24sXG4gIGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nLFxuICBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcsXG4gIGlzQmluZGluZ0VuYWJsZWQsXG4gIGlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZCxcbiAgbWF5YmVCaW5kTGluZWFyRWxlbWVudCxcbiAgc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudCxcbiAgdW5iaW5kTGluZWFyRWxlbWVudHMsXG4gIHVwZGF0ZUJvdW5kRWxlbWVudHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaGFzQm91bmRUZXh0RWxlbWVudCxcbiAgaXNCaW5kaW5nRWxlbWVudCxcbiAgaXNCaW5kaW5nRWxlbWVudFR5cGUsXG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNJbWFnZUVsZW1lbnQsXG4gIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50VHlwZSxcbiAgaXNUZXh0QmluZGFibGVDb250YWluZXIsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRmlsZUlkLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q2VudGVyLCBnZXREaXN0YW5jZSB9IGZyb20gXCIuLi9nZXN0dXJlXCI7XG5pbXBvcnQge1xuICBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQsXG4gIGdldEVsZW1lbnRzSW5Hcm91cCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkcyxcbiAgaXNFbGVtZW50SW5Hcm91cCxcbiAgaXNTZWxlY3RlZFZpYUdyb3VwLFxuICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcsIGdldExhbmd1YWdlLCBsYW5ndWFnZXMsIHNldExhbmd1YWdlLCB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7XG4gIENPREVTLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvLFxuICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgaXNBcnJvd0tleSxcbiAgS0VZUyxcbiAgaXNBbmRyb2lkLFxufSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgZ2V0R3JpZFBvaW50LCBpc1BhdGhBTG9vcCB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlclwiO1xuaW1wb3J0IHtcbiAgY2xlYXJSZW5kZXJDYWNoZSxcbiAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCxcbn0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZVNjcm9sbENlbnRlcixcbiAgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbixcbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLFxuICBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbixcbiAgZ2V0Tm9ybWFsaXplZFpvb20sXG4gIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gIGhhc0JhY2tncm91bmQsXG4gIGlzT3ZlclNjcm9sbEJhcnMsXG4gIGlzU29tZUVsZW1lbnRTZWxlY3RlZCxcbn0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBSZW5kZXJDb25maWcsIFNjcm9sbEJhcnMgfSBmcm9tIFwiLi4vc2NlbmUvdHlwZXNcIjtcbmltcG9ydCB7IGdldFN0YXRlRm9yWm9vbSB9IGZyb20gXCIuLi9zY2VuZS96b29tXCI7XG5pbXBvcnQgeyBmaW5kU2hhcGVCeUtleSB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7XG4gIEFwcENsYXNzUHJvcGVydGllcyxcbiAgQXBwUHJvcHMsXG4gIEFwcFN0YXRlLFxuICBCaW5hcnlGaWxlRGF0YSxcbiAgRGF0YVVSTCxcbiAgRXhjYWxpZHJhd0ltcGVyYXRpdmVBUEksXG4gIEJpbmFyeUZpbGVzLFxuICBHZXN0dXJlLFxuICBHZXN0dXJlRXZlbnQsXG4gIExpYnJhcnlJdGVtcyxcbiAgUG9pbnRlckRvd25TdGF0ZSxcbiAgU2NlbmVEYXRhLFxuICBEZXZpY2VUeXBlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlYm91bmNlLFxuICBkaXN0YW5jZSxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsXG4gIGlzSW5wdXRMaWtlLFxuICBpc1Rvb2xJY29uLFxuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgcmVzZXRDdXJzb3IsXG4gIHJlc29sdmFibGVQcm9taXNlLFxuICBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsXG4gIHNldEN1cnNvcixcbiAgc2V0Q3Vyc29yRm9yU2hhcGUsXG4gIHR1cGxlVG9Db29ycyxcbiAgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLFxuICB3aXRoQmF0Y2hlZFVwZGF0ZXMsXG4gIHdyYXBFdmVudCxcbiAgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkLFxuICB1cGRhdGVPYmplY3QsXG4gIHNldEVyYXNlckN1cnNvcixcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUsIHsgQ29udGV4dE1lbnVPcHRpb24gfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHtcbiAgZGF0YVVSTFRvRmlsZSxcbiAgZ2VuZXJhdGVJZEZyb21GaWxlLFxuICBnZXREYXRhVVJMLFxuICBpc1N1cHBvcnRlZEltYWdlRmlsZSxcbiAgcmVzaXplSW1hZ2VGaWxlLFxuICBTVkdTdHJpbmdUb0ZpbGUsXG59IGZyb20gXCIuLi9kYXRhL2Jsb2JcIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgbG9hZEhUTUxJbWFnZUVsZW1lbnQsXG4gIG5vcm1hbGl6ZVNWRyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSBhcyBfdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwibG9kYXNoLnRocm90dGxlXCI7XG5pbXBvcnQgeyBmaWxlT3BlbiwgbmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCB9IGZyb20gXCIuLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB7XG4gIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24sXG4gIGdldEFwcHJveE1pbkxpbmVIZWlnaHQsXG4gIGdldEFwcHJveE1pbkxpbmVXaWR0aCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4uL2VsZW1lbnQvY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICBub3JtYWxpemVMaW5rLFxuICBzaG93SHlwZXJsaW5rVG9vbHRpcCxcbiAgaGlkZUh5cGVybGlua1Rvb2xpcCxcbiAgSHlwZXJsaW5rLFxuICBpc1BvaW50SGl0dGluZ0xpbmtJY29uLFxuICBpc0xvY2FsTGluayxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvSHlwZXJsaW5rXCI7XG5cbmNvbnN0IGRlZmF1bHREZXZpY2VUeXBlQ29udGV4dDogRGV2aWNlVHlwZSA9IHtcbiAgaXNNb2JpbGU6IGZhbHNlLFxuICBpc1RvdWNoU2NyZWVuOiBmYWxzZSxcbn07XG5jb25zdCBEZXZpY2VUeXBlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdERldmljZVR5cGVDb250ZXh0KTtcbmV4cG9ydCBjb25zdCB1c2VEZXZpY2VUeXBlID0gKCkgPT4gdXNlQ29udGV4dChEZXZpY2VUeXBlQ29udGV4dCk7XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8e1xuICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgaWQ/OiBzdHJpbmcgfCBudWxsO1xufT4oeyBjb250YWluZXI6IG51bGwsIGlkOiBudWxsIH0pO1xuZXhwb3J0IGNvbnN0IHVzZUV4Y2FsaWRyYXdDb250YWluZXIgPSAoKSA9PlxuICB1c2VDb250ZXh0KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0KTtcblxubGV0IGRpZFRhcFR3aWNlOiBib29sZWFuID0gZmFsc2U7XG5sZXQgdGFwcGVkVHdpY2VUaW1lciA9IDA7XG5sZXQgY3Vyc29yWCA9IDA7XG5sZXQgY3Vyc29yWSA9IDA7XG5sZXQgaXNIb2xkaW5nU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBpc1Bhbm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBpc0RyYWdnaW5nU2Nyb2xsQmFyOiBib29sZWFuID0gZmFsc2U7XG5sZXQgY3VycmVudFNjcm9sbEJhcnM6IFNjcm9sbEJhcnMgPSB7IGhvcml6b250YWw6IG51bGwsIHZlcnRpY2FsOiBudWxsIH07XG5sZXQgdG91Y2hUaW1lb3V0ID0gMDtcbmxldCBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcblxubGV0IGxhc3RQb2ludGVyVXA6ICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbmNvbnN0IGdlc3R1cmU6IEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBuZXcgTWFwKCksXG4gIGxhc3RDZW50ZXI6IG51bGwsXG4gIGluaXRpYWxEaXN0YW5jZTogbnVsbCxcbiAgaW5pdGlhbFNjYWxlOiBudWxsLFxufTtcblxuY2xhc3MgQXBwIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PEFwcFByb3BzLCBBcHBTdGF0ZT4ge1xuICBjYW52YXM6IEFwcENsYXNzUHJvcGVydGllc1tcImNhbnZhc1wiXSA9IG51bGw7XG4gIHJjOiBSb3VnaENhbnZhcyB8IG51bGwgPSBudWxsO1xuICB1bm1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aW9uTWFuYWdlcjogQWN0aW9uTWFuYWdlcjtcbiAgZGV2aWNlVHlwZTogRGV2aWNlVHlwZSA9IHtcbiAgICBpc01vYmlsZTogZmFsc2UsXG4gICAgaXNUb3VjaFNjcmVlbjogZmFsc2UsXG4gIH07XG4gIGRldGFjaElzTW9iaWxlTXFIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8QXBwUHJvcHM+ID0ge1xuICAgIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgfTtcblxuICBwcml2YXRlIHNjZW5lOiBTY2VuZTtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsaWJyYXJ5OiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJsaWJyYXJ5XCJdO1xuICBwdWJsaWMgbGlicmFyeUl0ZW1zRnJvbVN0b3JhZ2U6IExpYnJhcnlJdGVtcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpZDogc3RyaW5nO1xuICBwcml2YXRlIGhpc3Rvcnk6IEhpc3Rvcnk7XG4gIHByaXZhdGUgZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlOiB7XG4gICAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcblxuICBwdWJsaWMgZmlsZXM6IEJpbmFyeUZpbGVzID0ge307XG4gIHB1YmxpYyBpbWFnZUNhY2hlOiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJpbWFnZUNhY2hlXCJdID0gbmV3IE1hcCgpO1xuXG4gIGhpdExpbmtFbGVtZW50PzogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50O1xuICBsYXN0UG9pbnRlckRvd246IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4gfCBudWxsID0gbnVsbDtcbiAgbGFzdFBvaW50ZXJVcDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxFbGVtZW50PiB8IFBvaW50ZXJFdmVudCB8IG51bGwgPSBudWxsO1xuICBjb250ZXh0TWVudU9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgbGFzdFNjZW5lUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEFwcFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHplbk1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICBncmlkTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHRoZW1lID0gZGVmYXVsdEFwcFN0YXRlLnRoZW1lLFxuICAgICAgbmFtZSA9IGRlZmF1bHRBcHBTdGF0ZS5uYW1lLFxuICAgIH0gPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgLi4uZGVmYXVsdEFwcFN0YXRlLFxuICAgICAgdGhlbWUsXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICAuLi50aGlzLmdldENhbnZhc09mZnNldHMoKSxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgZ3JpZFNpemU6IGdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGwsXG4gICAgICBuYW1lLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID1cbiAgICAgICAgKFwiY3VycmVudFwiIGluIGV4Y2FsaWRyYXdSZWYgJiYgZXhjYWxpZHJhd1JlZi5jdXJyZW50Py5yZWFkeVByb21pc2UpIHx8XG4gICAgICAgIHJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPigpO1xuXG4gICAgICBjb25zdCBhcGk6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgYWRkRmlsZXM6IHRoaXMuYWRkRmlsZXMsXG4gICAgICAgIHJlc2V0U2NlbmU6IHRoaXMucmVzZXRTY2VuZSxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQsXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjbGVhcjogdGhpcy5yZXNldEhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICAgIHNjcm9sbFRvQ29udGVudDogdGhpcy5zY3JvbGxUb0NvbnRlbnQsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHM6IHRoaXMuZ2V0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgZ2V0QXBwU3RhdGU6ICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAgIGdldEZpbGVzOiAoKSA9PiB0aGlzLmZpbGVzLFxuICAgICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgICAgIGltcG9ydExpYnJhcnk6IHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwsXG4gICAgICAgIHNldFRvYXN0TWVzc2FnZTogdGhpcy5zZXRUb2FzdE1lc3NhZ2UsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBhcHA6IHRoaXMsXG4gICAgICB9IGFzIGNvbnN0O1xuICAgICAgaWYgKHR5cGVvZiBleGNhbGlkcmF3UmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZihhcGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZi5jdXJyZW50ID0gYXBpO1xuICAgICAgfVxuICAgICAgcmVhZHlQcm9taXNlLnJlc29sdmUoYXBpKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZSA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICB9O1xuXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIoXG4gICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQsXG4gICAgICAoKSA9PiB0aGlzLnN0YXRlLFxuICAgICAgKCkgPT4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBbGwoYWN0aW9ucyk7XG5cbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlVW5kb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlUmVkb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1NjYWxlID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXNET01XaWR0aCAqIGNhbnZhc1NjYWxlO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNhbnZhc0RPTUhlaWdodCAqIGNhbnZhc1NjYWxlO1xuICAgIGlmICh2aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxjYW52YXNcbiAgICAgICAgICBjbGFzc05hbWU9XCJleGNhbGlkcmF3X19jYW52YXNcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgICAgIGN1cnNvcjogQ1VSU09SX1RZUEUuR1JBQixcbiAgICAgICAgICB9fVxuICAgICAgICAgIHdpZHRoPXtjYW52YXNXaWR0aH1cbiAgICAgICAgICBoZWlnaHQ9e2NhbnZhc0hlaWdodH1cbiAgICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICAgIG9uQ29udGV4dE1lbnU9e3RoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnV9XG4gICAgICAgICAgb25Qb2ludGVyTW92ZT17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZX1cbiAgICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyVXB9XG4gICAgICAgICAgb25Qb2ludGVyQ2FuY2VsPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlckRvd249e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd259XG4gICAgICAgID5cbiAgICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgICA8L2NhbnZhcz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8Y2FudmFzXG4gICAgICAgIGNsYXNzTmFtZT1cImV4Y2FsaWRyYXdfX2NhbnZhc1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICB9fVxuICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgIGhlaWdodD17Y2FudmFzSGVpZ2h0fVxuICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICBvbkRvdWJsZUNsaWNrPXt0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrfVxuICAgICAgICBvblBvaW50ZXJNb3ZlPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlfVxuICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyVXB9XG4gICAgICAgIG9uUG9pbnRlckNhbmNlbD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICBvblRvdWNoTW92ZT17dGhpcy5oYW5kbGVUb3VjaE1vdmV9XG4gICAgICA+XG4gICAgICAgIHt0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIil9XG4gICAgICA8L2NhbnZhcz5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHplbk1vZGVFbmFibGVkLCB2aWV3TW9kZUVuYWJsZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCB7XG4gICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgIHJlbmRlckZvb3RlcixcbiAgICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFwiZXhjYWxpZHJhdyBleGNhbGlkcmF3LWNvbnRhaW5lclwiLCB7XG4gICAgICAgICAgXCJleGNhbGlkcmF3LS16ZW4tbW9kZVwiOiB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICBcImV4Y2FsaWRyYXctLXZpZXctbW9kZVwiOiB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgXCJleGNhbGlkcmF3LS1tb2JpbGVcIjogdGhpcy5kZXZpY2VUeXBlLmlzTW9iaWxlLFxuICAgICAgICB9KX1cbiAgICAgICAgcmVmPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWZ9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVBcHBPbkRyb3B9XG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e1xuICAgICAgICAgIHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlfVxuICAgICAgICA+XG4gICAgICAgICAgPERldmljZVR5cGVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt0aGlzLmRldmljZVR5cGV9PlxuICAgICAgICAgICAgPExheWVyVUlcbiAgICAgICAgICAgICAgb25Ib21lQnV0dG9uQ2xpY2s9e3RoaXMucHJvcHMub25Ib21lQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgIGNhbnZhcz17dGhpcy5jYW52YXN9XG4gICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICBmaWxlcz17dGhpcy5maWxlc31cbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI9e3RoaXMuYWN0aW9uTWFuYWdlcn1cbiAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKX1cbiAgICAgICAgICAgICAgb25Db2xsYWJCdXR0b25DbGljaz17b25Db2xsYWJCdXR0b25DbGlja31cbiAgICAgICAgICAgICAgb25Mb2NrVG9nZ2xlPXt0aGlzLnRvZ2dsZUxvY2t9XG4gICAgICAgICAgICAgIG9uUGVuTW9kZVRvZ2dsZT17dGhpcy50b2dnbGVQZW5Nb2RlfVxuICAgICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzPXsoZWxlbWVudHMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgZmlsZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZD17emVuTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIHRvZ2dsZVplbk1vZGU9e3RoaXMudG9nZ2xlWmVuTW9kZX1cbiAgICAgICAgICAgICAgbGFuZ0NvZGU9e2dldExhbmd1YWdlKCkuY29kZX1cbiAgICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXt0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZ31cbiAgICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVST17cmVuZGVyVG9wUmlnaHRVSX1cbiAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyPXtyZW5kZXJGb290ZXJ9XG4gICAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZD17dmlld01vZGVFbmFibGVkfVxuICAgICAgICAgICAgICBzaG93RXhpdFplbk1vZGVCdG49e1xuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzPy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvd1RoZW1lQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuY2FudmFzQWN0aW9ucy50aGVtZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw9e3RoaXMucHJvcHMubGlicmFyeVJldHVyblVybH1cbiAgICAgICAgICAgICAgVUlPcHRpb25zPXt0aGlzLnByb3BzLlVJT3B0aW9uc31cbiAgICAgICAgICAgICAgZm9jdXNDb250YWluZXI9e3RoaXMuZm9jdXNDb250YWluZXJ9XG4gICAgICAgICAgICAgIGxpYnJhcnk9e3RoaXMubGlicmFyeX1cbiAgICAgICAgICAgICAgaWQ9e3RoaXMuaWR9XG4gICAgICAgICAgICAgIG9uSW1hZ2VBY3Rpb249e3RoaXMub25JbWFnZUFjdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4Y2FsaWRyYXctY29udGV4dE1lbnVDb250YWluZXJcIiAvPlxuICAgICAgICAgICAge3NlbGVjdGVkRWxlbWVudC5sZW5ndGggPT09IDEgJiYgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXAgJiYgKFxuICAgICAgICAgICAgICA8SHlwZXJsaW5rXG4gICAgICAgICAgICAgICAga2V5PXtzZWxlY3RlZEVsZW1lbnRbMF0uaWR9XG4gICAgICAgICAgICAgICAgZWxlbWVudD17c2VsZWN0ZWRFbGVtZW50WzBdfVxuICAgICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlPXt0aGlzLnNldEFwcFN0YXRlfVxuICAgICAgICAgICAgICAgIG9uTGlua09wZW49e3RoaXMucHJvcHMub25MaW5rT3Blbn1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5zaG93U3RhdHMgJiYgKFxuICAgICAgICAgICAgICA8U3RhdHNcbiAgICAgICAgICAgICAgICBhcHBTdGF0ZT17dGhpcy5zdGF0ZX1cbiAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZT17dGhpcy5zZXRBcHBTdGF0ZX1cbiAgICAgICAgICAgICAgICBlbGVtZW50cz17dGhpcy5zY2VuZS5nZXRFbGVtZW50cygpfVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMudG9nZ2xlU3RhdHN9XG4gICAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tU3RhdHM9e3JlbmRlckN1c3RvbVN0YXRzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnRvYXN0TWVzc2FnZSAhPT0gbnVsbCAmJiAoXG4gICAgICAgICAgICAgIDxUb2FzdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUudG9hc3RNZXNzYWdlfVxuICAgICAgICAgICAgICAgIGNsZWFyVG9hc3Q9e3RoaXMuY2xlYXJUb2FzdH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8bWFpbj57dGhpcy5yZW5kZXJDYW52YXMoKX08L21haW4+XG4gICAgICAgICAgPC9EZXZpY2VUeXBlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgPC9FeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNDb250YWluZXI6IEFwcENsYXNzUHJvcGVydGllc1tcImZvY3VzQ29udGFpbmVyXCJdID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICB9O1xuXG4gIHByaXZhdGUgc3luY0FjdGlvblJlc3VsdCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAoYWN0aW9uUmVzdWx0OiBBY3Rpb25SZXN1bHQpID0+IHtcbiAgICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgd2hlbiBhY3Rpb24gdHJpZ2dlcmVkIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICAgIHRoaXMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBlZGl0aW5nRWxlbWVudDogQXBwU3RhdGVbXCJlZGl0aW5nRWxlbWVudFwiXSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5lbGVtZW50cykge1xuICAgICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQ/LmlkID09PSBlbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50ICYmXG4gICAgICAgICAgICBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5maWxlcykge1xuICAgICAgICB0aGlzLmZpbGVzID0gYWN0aW9uUmVzdWx0LnJlcGxhY2VGaWxlc1xuICAgICAgICAgID8gYWN0aW9uUmVzdWx0LmZpbGVzXG4gICAgICAgICAgOiB7IC4uLnRoaXMuZmlsZXMsIC4uLmFjdGlvblJlc3VsdC5maWxlcyB9O1xuICAgICAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IGVkaXRpbmdFbGVtZW50KSB7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZpZXdNb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnZpZXdNb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgbGV0IHplbk1vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uemVuTW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGxldCBncmlkU2l6ZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LmdyaWRTaXplIHx8IG51bGw7XG4gICAgICAgIGxldCB0aGVtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnRoZW1lIHx8IFRIRU1FLkxJR0hUO1xuICAgICAgICBsZXQgbmFtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lm5hbWUgPz8gdGhpcy5zdGF0ZS5uYW1lO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdmlld01vZGVFbmFibGVkID0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgZ3JpZFNpemUgPSB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudGhlbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aGVtZSA9IHRoaXMucHJvcHMudGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMubmFtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAgICAgLy8gcmVnYXJkaW5nIHRoZSByZXN1bHRpbmcgdHlwZSBhcyBub3QgY29udGFpbmluZyB1bmRlZmluZWRcbiAgICAgICAgICAgIC8vICh3aGljaCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2lsbCBuZXZlciBjb250YWluKVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OlxuICAgICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LnN5bmNIaXN0b3J5KSB7XG4gICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICAvLyBMaWZlY3ljbGVcblxuICBwcml2YXRlIG9uQmx1ciA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvblVubG9hZCA9ICgpID0+IHtcbiAgICB0aGlzLm9uQmx1cigpO1xuICB9O1xuXG4gIHByaXZhdGUgZGlzYWJsZUV2ZW50OiBFdmVudExpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBwcml2YXRlIG9uRm9udExvYWRlZCA9ICgpID0+IHtcbiAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHByaXZhdGUgaW1wb3J0TGlicmFyeUZyb21VcmwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaC5pbmNsdWRlcyhVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICBjb25zdCBoYXNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSk7XG4gICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBBUFBfTkFNRSwgYCMke2hhc2gudG9TdHJpbmcoKX1gKTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIHF1ZXJ5LmRlbGV0ZShVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KTtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgQVBQX05BTUUsIGA/JHtxdWVyeS50b1N0cmluZygpfWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goZGVjb2RlVVJJQ29tcG9uZW50KHVybCkpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlcXVlc3QuYmxvYigpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgYmxvYi50ZXh0KCkpO1xuICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdG9rZW4gPT09IHRoaXMuaWQgfHxcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgdChcImFsZXJ0cy5jb25maXJtQWRkTGlicmFyeVwiLCB7XG4gICAgICAgICAgICBudW1TaGFwZXM6IChqc29uLmxpYnJhcnlJdGVtcyB8fCBqc29uLmxpYnJhcnkgfHwgW10pLmxlbmd0aCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IsIFwicHVibGlzaGVkXCIpO1xuICAgICAgICAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHdpbmRvdy5hbGVydCh0KFwiYWxlcnRzLmVycm9yTG9hZGluZ0xpYnJhcnlcIikpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBzY2VuZSAmIGhpc3RvcnkuXG4gICAqICEgRG8gbm90IHVzZSB0byBjbGVhciBzY2VuZSB1c2VyIGFjdGlvbiAhXG4gICAqL1xuICBwcml2YXRlIHJlc2V0U2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKG9wdHM/OiB7IHJlc2V0TG9hZGluZ1N0YXRlOiBib29sZWFuIH0pID0+IHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXREZWZhdWx0QXBwU3RhdGUoKSxcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGluaXRpYWxpemVTY2VuZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKFxuICAgICAgICBhc3luYyAobGF1bmNoUGFyYW1zOiB7IGZpbGVzOiBhbnlbXSB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFsYXVuY2hQYXJhbXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYjogQmxvYiA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgICBibG9iLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKHNjZW5lKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgLi4uc2NlbmUsXG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihzY2VuZS5hcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgIH1cbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9IChhd2FpdCB0aGlzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuICAgICAgaWYgKGluaXRpYWxEYXRhPy5saWJyYXJ5SXRlbXMpIHtcbiAgICAgICAgdGhpcy5saWJyYXJ5SXRlbXNGcm9tU3RvcmFnZSA9IHJlc3RvcmVMaWJyYXJ5SXRlbXMoXG4gICAgICAgICAgaW5pdGlhbERhdGEubGlicmFyeUl0ZW1zLFxuICAgICAgICAgIFwidW5wdWJsaXNoZWRcIixcbiAgICAgICAgKSBhcyBMaWJyYXJ5SXRlbXM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBpbXBvcnRpbmcgb3IgcmVzdG9yaW5nIHNjZW5lIGRhdGFcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcblxuICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICBlbGVtZW50VHlwZTpcbiAgICAgICAgc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgID8gXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIDogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKGluaXRpYWxEYXRhPy5zY3JvbGxUb0NvbnRlbnQpIHtcbiAgICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICAgIHNjZW5lLmVsZW1lbnRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc3RhdGUud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc3RhdGUuaGVpZ2h0LFxuICAgICAgICAgICAgb2Zmc2V0VG9wOiB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgICAgIG9mZnNldExlZnQ6IHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChpbml0aWFsRGF0YT8uc2Nyb2xsWCAhPSBudWxsKSB7XG4gICAgICBzY2VuZS5hcHBTdGF0ZS5zY3JvbGxYID0gaW5pdGlhbERhdGEuc2Nyb2xsWDtcbiAgICB9XG4gICAgaWYgKGluaXRpYWxEYXRhPy5zY3JvbGxZICE9IG51bGwpIHtcbiAgICAgIHNjZW5lLmFwcFN0YXRlLnNjcm9sbFkgPSBpbml0aWFsRGF0YS5zY3JvbGxZO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgIC4uLnNjZW5lLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9XG4gICAgICAvLyBjdXJyZW50XG4gICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoXG4gICAgICAgIFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSxcbiAgICAgICkgfHxcbiAgICAgIC8vIGxlZ2FjeSwga2VwdCBmb3IgY29tcGF0IHJlYXNvbnNcbiAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFxuICAgICAgICBVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5LFxuICAgICAgKTtcblxuICAgIGlmIChsaWJyYXJ5VXJsKSB7XG4gICAgICBhd2FpdCB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsKGxpYnJhcnlVcmwpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy51bm1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZS5jb250YWluZXIgPVxuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbiAgICApIHtcbiAgICAgIGNvbnN0IHNldFN0YXRlID0gdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHNldFN0YXRlPikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLFxuICAgICAgICB9LFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjZW5lLmFkZENhbGxiYWNrKHRoaXMub25TY2VuZVVwZGF0ZWQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIC8vIGNvbXB1dGUgaXNNb2JpbGUgc3RhdGVcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID1cbiAgICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuZGV2aWNlVHlwZSA9IHVwZGF0ZU9iamVjdCh0aGlzLmRldmljZVR5cGUsIHtcbiAgICAgICAgICBpc01vYmlsZTpcbiAgICAgICAgICAgIHdpZHRoIDwgTVFfTUFYX1dJRFRIX1BPUlRSQUlUIHx8XG4gICAgICAgICAgICAoaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiZcbiAgICAgICAgICAgICAgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy51cGRhdGVET01SZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX1BPUlRSQUlUfXB4KSwgKG1heC1oZWlnaHQ6ICR7TVFfTUFYX0hFSUdIVF9MQU5EU0NBUEV9cHgpIGFuZCAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9MQU5EU0NBUEV9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRldmljZVR5cGUgPSB1cGRhdGVPYmplY3QodGhpcy5kZXZpY2VUeXBlLCB7XG4gICAgICAgICAgaXNNb2JpbGU6IG1lZGlhUXVlcnkubWF0Y2hlcyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSAoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICB0aGlzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCh0aGlzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclJlbmRlckNhY2hlKCk7XG5cbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcihcbiAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCxcbiAgICAgICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAoKSA9PiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICB0aGlzLnJjID0gbnVsbDtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0geyBjb250YWluZXI6IG51bGwsIGlkOiBcInVubW91bnRlZFwiIH07XG5cbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgdGhpcy5zY2VuZVxuICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAuZm9yRWFjaCgoZWxlbWVudCkgPT4gaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgIHRoaXMub25TY3JvbGwsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULk1PVVNFX01PVkUsXG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbixcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJBR19PVkVSLFxuICAgICAgdGhpcy5kaXNhYmxlRXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJPUCxcbiAgICAgIHRoaXMuZGlzYWJsZUV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5mb250cz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpO1xuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuXG4gICAgdGhpcy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlcj8uKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7IC8vICMzNTUzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgaWYgKHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXAsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuTU9VU0VfTU9WRSxcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLFxuICAgICk7XG4gICAgLy8gcmVyZW5kZXIgdGV4dCBlbGVtZW50cyBvbiBmb250IGxvYWQgdG8gZml4ICM2MzcgJiYgIzE1NTNcbiAgICBkb2N1bWVudC5mb250cz8uYWRkRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpO1xuICAgIC8vIFNhZmFyaS1vbmx5IGRlc2t0b3AgcGluY2ggem9vbVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX1NUQVJULFxuICAgICAgdGhpcy5vbkdlc3R1cmVTdGFydCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0NIQU5HRSxcbiAgICAgIHRoaXMub25HZXN0dXJlQ2hhbmdlIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfRU5ELFxuICAgICAgdGhpcy5vbkdlc3R1cmVFbmQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DVVQsIHRoaXMub25DdXQpO1xuICAgIGlmICh0aGlzLnByb3BzLmRldGVjdFNjcm9sbCkge1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciA9IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyKFxuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICApO1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5TQ1JPTEwsXG4gICAgICAgIHRoaXMub25TY3JvbGwsXG4gICAgICApO1xuICAgIH1cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJBR19PVkVSLFxuICAgICAgdGhpcy5kaXNhYmxlRXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuRFJPUCxcbiAgICAgIHRoaXMuZGlzYWJsZUV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IEFwcFByb3BzLCBwcmV2U3RhdGU6IEFwcFN0YXRlKSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LmtleXModGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAmJlxuICAgICAgaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIiB9KTtcbiAgICB9XG4gICAgaWYgKHByZXZTdGF0ZS50aGVtZSAhPT0gdGhpcy5zdGF0ZS50aGVtZSkge1xuICAgICAgc2V0RXJhc2VyQ3Vyc29yKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLnRoZW1lKTtcbiAgICB9XG4gICAgLy8gSGlkZSBoeXBlcmxpbmsgcG9wdXAgaWYgc2hvd24gd2hlbiBlbGVtZW50IHR5cGUgaXMgbm90IHNlbGVjdGlvblxuICAgIGlmIChcbiAgICAgIHByZXZTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXBcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdGhlbWU6IHRoaXMucHJvcHMudGhlbWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICF0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zICYmXG4gICAgICB0aGlzLnN0YXRlLm9wZW5NZW51ID09PSBcImNhbnZhc1wiXG4gICAgKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgb3Blbk1lbnU6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5uYW1lICYmIHByZXZQcm9wcy5uYW1lICE9PSB0aGlzLnByb3BzLm5hbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAgIFwidGhlbWUtLWRhcmtcIixcbiAgICAgIHRoaXMuc3RhdGUudGhlbWUgPT09IFwiZGFya1wiLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWRdXG4gICAgKSB7XG4gICAgICAvLyBkZWZlciBzbyB0aGF0IHRoZSBjb21taXRUb0hpc3RvcnkgZmxhZyBpc24ndCByZXNldCB2aWEgY3VycmVudCB1cGRhdGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHByZXZTdGF0ZTtcbiAgICBpZiAoXG4gICAgICBwcmV2U3RhdGUuZWxlbWVudFR5cGUgIT09IHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgJiZcbiAgICAgIG11bHRpRWxlbWVudCAhPSBudWxsICYmXG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JCdXR0b246IHtcbiAgICAgIFtpZDogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH0gPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVmlld3BvcnRDb29yZHM6IFJlbmRlckNvbmZpZ1tcInJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkc1wiXSA9XG4gICAgICB7fTtcbiAgICBjb25zdCByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHM6IFJlbmRlckNvbmZpZ1tcInJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1wiXSA9XG4gICAgICB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlcm5hbWVzOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlclN0YXRlczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgdGhpcy5zdGF0ZS5jb2xsYWJvcmF0b3JzLmZvckVhY2goKHVzZXIsIHNvY2tldElkKSA9PiB7XG4gICAgICBpZiAodXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh1c2VyLnNlbGVjdGVkRWxlbWVudElkcykpIHtcbiAgICAgICAgICBpZiAoIShpZCBpbiByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0ucHVzaChzb2NrZXRJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdXNlci5wb2ludGVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyLnVzZXJuYW1lKSB7XG4gICAgICAgIHBvaW50ZXJVc2VybmFtZXNbc29ja2V0SWRdID0gdXNlci51c2VybmFtZTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyLnVzZXJTdGF0ZSkge1xuICAgICAgICBwb2ludGVyVXNlclN0YXRlc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHBvaW50ZXJWaWV3cG9ydENvb3Jkc1tzb2NrZXRJZF0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgIHtcbiAgICAgICAgICBzY2VuZVg6IHVzZXIucG9pbnRlci54LFxuICAgICAgICAgIHNjZW5lWTogdXNlci5wb2ludGVyLnksXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgY3Vyc29yQnV0dG9uW3NvY2tldElkXSA9IHVzZXIuYnV0dG9uO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBub3QgcGxhY2VkIG9uIGNhbnZhcyB5ZXQgKGJ1dCBpbiBlbGVtZW50cyBhcnJheSlcbiAgICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQgJiZcbiAgICAgICAgICBlbGVtZW50LmlkID09PSB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQuaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBkb24ndCByZW5kZXIgdGV4dCBlbGVtZW50IHRoYXQncyBiZWluZyBjdXJyZW50bHkgZWRpdGVkIChpdCdzXG4gICAgICAvLyByZW5kZXJlZCBvbiByZW1vdGUgb25seSlcbiAgICAgIHJldHVybiAoXG4gICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50IHx8XG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgZWxlbWVudC5pZCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCwgc2Nyb2xsQmFycyB9ID0gcmVuZGVyU2NlbmUoXG4gICAgICByZW5kZXJpbmdFbGVtZW50cyxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbkVsZW1lbnQsXG4gICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIHRoaXMucmMhLFxuICAgICAgdGhpcy5jYW52YXMhLFxuICAgICAge1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFgsXG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSxcbiAgICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yLFxuICAgICAgICB6b29tOiB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3JkczogcG9pbnRlclZpZXdwb3J0Q29vcmRzLFxuICAgICAgICByZW1vdGVQb2ludGVyQnV0dG9uOiBjdXJzb3JCdXR0b24sXG4gICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczogcG9pbnRlclVzZXJuYW1lcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHBvaW50ZXJVc2VyU3RhdGVzLFxuICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRoaXMuc3RhdGUuc2hvdWxkQ2FjaGVJZ25vcmVab29tLFxuICAgICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgICBpc0V4cG9ydGluZzogZmFsc2UsXG4gICAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2Nyb2xsQmFycykge1xuICAgICAgY3VycmVudFNjcm9sbEJhcnMgPSBzY3JvbGxCYXJzO1xuICAgIH1cbiAgICBjb25zdCBzY3JvbGxlZE91dHNpZGUgPVxuICAgICAgLy8gaGlkZSB3aGVuIGVkaXRpbmcgdGV4dFxuICAgICAgaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2Nyb2xsZWRPdXRzaWRlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG5cbiAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG5cbiAgICAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4oXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuZmlsZXMsXG4gICAgICAgIHRoaXMucHJvcHMuaWQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TY3JvbGwgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgY29uc3QgeyBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG5cbiAgLy8gQ29weS9wYXN0ZVxuXG4gIHByaXZhdGUgb25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3V0QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgY3V0QWxsID0gKCkgPT4ge1xuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlbGV0ZVNlbGVjdGVkKTtcbiAgfTtcblxuICBwcml2YXRlIGNvcHlBbGwgPSAoKSA9PiB7XG4gICAgY29weVRvQ2xpcGJvYXJkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSwgdGhpcy5maWxlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRhcFN0YXJ0ID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgLy8gZml4IGZvciBBcHBsZSBQZW5jaWwgU2NyaWJibGVcbiAgICAvLyBPbiBBbmRyb2lkLCBwcmV2ZW50aW5nIHRoZSBldmVudCB3b3VsZCBkaXNhYmxlIGNvbnRleHRNZW51IG9uIHRhcC1ob2xkXG4gICAgaWYgKCFpc0FuZHJvaWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKCFkaWRUYXBUd2ljZSkge1xuICAgICAgZGlkVGFwVHdpY2UgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgICAgdGFwcGVkVHdpY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICBBcHAucmVzZXRUYXBUd2ljZSxcbiAgICAgICAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpbnNlcnQgdGV4dCBvbmx5IGlmIHdlIHRhcHBlZCB0d2ljZSB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIC8vIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxIHdpbGwgYWxzbyBwcmV2ZW50IGluc2VydGluZyB0ZXh0IHdoZW4gdXNlcidzIHpvb21pbmdcbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICB9KTtcbiAgICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgfVxuICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uVGFwRW5kID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5wb2ludGVycy5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHBhc3RlRnJvbUNsaXBib2FyZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICBhc3luYyAoZXZlbnQ6IENsaXBib2FyZEV2ZW50IHwgbnVsbCkgPT4ge1xuICAgICAgLy8gIzY4NlxuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9XG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGN1cnNvclgsIGN1cnNvclkpO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAgIC8vIHRodXMgdGhlc2UgY2hlY2tzIGRvbid0IG1ha2Ugc2Vuc2VcbiAgICAgICAgZXZlbnQgJiZcbiAgICAgICAgKCEoZWxlbWVudFVuZGVyQ3Vyc29yIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHx8XG4gICAgICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGluIHRoZSBzYW1lIGZyYW1lICh0aHVzIGJlZm9yZSBhbnkgYXdhaXRzKSBhcyB0aGUgcGFzdGVcbiAgICAgIC8vIGV2ZW50IGVsc2Ugc29tZSBicm93c2VycyAoRkYuLi4pIHdpbGwgY2xlYXIgdGhlIGNsaXBib2FyZERhdGFcbiAgICAgIC8vIChzb21ldGhpbmcgc29tZXRoaW5nIHNlY3VyaXR5KVxuICAgICAgbGV0IGZpbGUgPSBldmVudD8uY2xpcGJvYXJkRGF0YT8uZmlsZXNbMF07XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcbiAgICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKFwiPHN2Z1wiKSAmJiBzdHJpbmcuZW5kc1dpdGgoXCI8L3N2Zz5cIikpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgU1ZHIHZhbGlkYXRpb24vbm9ybWFsaXphdGlvbiB3aGljaCB3aWxsIGJlIGRvbmUgZHVyaW5nIGltYWdlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb25cbiAgICAgICAgICBmaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcHJlZmVyIHNwcmVhZHNoZWV0IGRhdGEgb3ZlciBpbWFnZSBmaWxlIChNUyBPZmZpY2UvTGlicmUgT2ZmaWNlKVxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpICYmICFkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIGNvbnN0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICB7IGNsaWVudFg6IGN1cnNvclgsIGNsaWVudFk6IGN1cnNvclkgfSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHsgc2NlbmVYLCBzY2VuZVkgfSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlIH0gfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBhc3RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKChhd2FpdCB0aGlzLnByb3BzLm9uUGFzdGUoZGF0YSwgZXZlbnQpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgZWxlbWVudHM6IGRhdGEuZWxlbWVudHMsXG4gICAgICAgICAgZmlsZXM6IGRhdGEuZmlsZXMgfHwgbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogXCJjdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICB0aGlzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gKG9wdHM6IHtcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsO1xuICAgIHBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBcImN1cnNvclwiIHwgXCJjZW50ZXJcIjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKG9wdHMuZWxlbWVudHMsIG51bGwpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG5cbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuXG4gICAgY29uc3QgY2xpZW50WCA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WFxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JYXG4gICAgICAgIDogdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WVxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JZXG4gICAgICAgIDogdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WCwgY2xpZW50WSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZHggPSB4IC0gZWxlbWVudHNDZW50ZXJYO1xuICAgIGNvbnN0IGR5ID0geSAtIGVsZW1lbnRzQ2VudGVyWTtcbiAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgbmV3RWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICBncm91cElkTWFwLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB7XG4gICAgICAgICAgeDogZWxlbWVudC54ICsgZ3JpZFggLSBtaW5YLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIGdyaWRZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBuZXdFbGVtZW50LmlkKTtcbiAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH0pO1xuICAgIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24obmV3RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcbiAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgLi4ubmV3RWxlbWVudHMsXG4gICAgXTtcbiAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG5cbiAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4ub3B0cy5maWxlcyB9O1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRFbGVtZW50cyk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IG5ld0VsZW1lbnRzLnJlZHVjZSgobWFwLCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgICAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9LCB7fSBhcyBhbnkpLFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICApLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgfTtcblxuICBwcml2YXRlIGFkZFRleHRGcm9tUGFzdGUodGV4dDogYW55KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB7IGNsaWVudFg6IGN1cnNvclgsIGNsaWVudFk6IGN1cnNvclkgfSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgdGV4dCxcbiAgICAgIGZvbnRTaXplOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtlbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfVxuXG4gIC8vIENvbGxhYm9yYXRpb25cblxuICBzZXRBcHBTdGF0ZSA9IChvYmo6IGFueSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICByZW1vdmVQb2ludGVyID0gKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgaWYgKHRvdWNoVGltZW91dCkge1xuICAgICAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLnBvaW50ZXJzLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICB9O1xuXG4gIHRvZ2dsZUxvY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50TG9ja2VkOiAhcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwcmV2U3RhdGUuZWxlbWVudExvY2tlZFxuICAgICAgICAgID8gXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIDogcHJldlN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0b2dnbGVQZW5Nb2RlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGVuTW9kZTogIXByZXZTdGF0ZS5wZW5Nb2RlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0b2dnbGVaZW5Nb2RlID0gKCkgPT4ge1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblRvZ2dsZVplbk1vZGUpO1xuICB9O1xuXG4gIHRvZ2dsZVN0YXRzID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5zdGF0ZS5zaG93U3RhdHMpIHtcbiAgICAgIHRyYWNrRXZlbnQoXCJkaWFsb2dcIiwgXCJzdGF0c1wiKTtcbiAgICB9XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlU3RhdHMpO1xuICB9O1xuXG4gIHNjcm9sbFRvQ29udGVudCA9IChcbiAgICB0YXJnZXQ6XG4gICAgICB8IEV4Y2FsaWRyYXdFbGVtZW50XG4gICAgICB8IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICApLFxuICAgIH0pO1xuICB9O1xuXG4gIGNsZWFyVG9hc3QgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvYXN0TWVzc2FnZTogbnVsbCB9KTtcbiAgfTtcblxuICBzZXRUb2FzdE1lc3NhZ2UgPSAodG9hc3RNZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdG9hc3RNZXNzYWdlIH0pO1xuICB9O1xuXG4gIHJlc3RvcmVGaWxlRnJvbVNoYXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuXG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5tYXRjaChcInNoYXJlZC1maWxlXCIpO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IGZpbGUuYmxvYigpO1xuICAgICAgICB0aGlzLmxvYWRGaWxlVG9DYW52YXMoYmxvYik7XG4gICAgICAgIGF3YWl0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUuZGVsZXRlKFwic2hhcmVkLWZpbGVcIik7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBBUFBfTkFNRSwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKiogYWRkcyBzdXBwbGllZCBmaWxlcyB0byBleGlzdGluZyBmaWxlcyBpbiB0aGUgYXBwU3RhdGUgKi9cbiAgcHVibGljIGFkZEZpbGVzOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSVtcImFkZEZpbGVzXCJdID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChmaWxlcykgPT4ge1xuICAgICAgY29uc3QgZmlsZXNNYXAgPSBmaWxlcy5yZWR1Y2UoKGFjYywgZmlsZURhdGEpID0+IHtcbiAgICAgICAgYWNjLnNldChmaWxlRGF0YS5pZCwgZmlsZURhdGEpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcDxGaWxlSWQsIEJpbmFyeUZpbGVEYXRhPigpKTtcblxuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4uT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVzTWFwKSB9O1xuXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgIGZpbGVzTWFwLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlLmRlbGV0ZShlbGVtZW50LmZpbGVJZCk7XG4gICAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG5cbiAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgfSxcbiAgKTtcblxuICBwdWJsaWMgdXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBBcHBTdGF0ZT4oc2NlbmVEYXRhOiB7XG4gICAgICBlbGVtZW50cz86IFNjZW5lRGF0YVtcImVsZW1lbnRzXCJdO1xuICAgICAgYXBwU3RhdGU/OiBQaWNrPEFwcFN0YXRlLCBLPiB8IG51bGw7XG4gICAgICBjb2xsYWJvcmF0b3JzPzogU2NlbmVEYXRhW1wiY29sbGFib3JhdG9yc1wiXTtcbiAgICAgIGNvbW1pdFRvSGlzdG9yeT86IFNjZW5lRGF0YVtcImNvbW1pdFRvSGlzdG9yeVwiXTtcbiAgICAgIGxpYnJhcnlJdGVtcz86IFNjZW5lRGF0YVtcImxpYnJhcnlJdGVtc1wiXTtcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnMgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEubGlicmFyeUl0ZW1zKSB7XG4gICAgICAgIHRoaXMubGlicmFyeS5zYXZlTGlicmFyeShcbiAgICAgICAgICByZXN0b3JlTGlicmFyeUl0ZW1zKHNjZW5lRGF0YS5saWJyYXJ5SXRlbXMsIFwidW5wdWJsaXNoZWRcIiksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uU2NlbmVVcGRhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjdXJzb3JZID0gZXZlbnQuY2xpZW50WTtcbiAgICB9LFxuICApO1xuXG4gIC8vIElucHV0IGhhbmRsaW5nXG5cbiAgcHJpdmF0ZSBvbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuICAgICAgaWYgKFxuICAgICAgICBcIlByb3h5XCIgaW4gd2luZG93ICYmXG4gICAgICAgICgoIWV2ZW50LnNoaWZ0S2V5ICYmIC9eW0EtWl0kLy50ZXN0KGV2ZW50LmtleSkpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5ICYmIC9eW2Etel0kLy50ZXN0KGV2ZW50LmtleSkpKVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50ID0gbmV3IFByb3h5KGV2ZW50LCB7XG4gICAgICAgICAgZ2V0KGV2OiBhbnksIHByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZbcHJvcF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgLy8gZml4IGZvciBQcm94aWVzIGhpamFja2luZyBgdGhpc2BcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3AgPT09IFwia2V5XCJcbiAgICAgICAgICAgICAgPyAvLyBDYXBzTG9jayBpbnZlcnRzIGNhcGl0YWxpemF0aW9uIGJhc2VkIG9uIFNoaWZ0S2V5LCBzbyBpbnZlcnRcbiAgICAgICAgICAgICAgICAvLyBpdCBiYWNrXG4gICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgICAgICA/IGV2LmtleS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgOiBldi5rZXkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IHZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIChpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpICYmIGV2ZW50LmtleSAhPT0gS0VZUy5FU0NBUEUpIHx8XG4gICAgICAgIC8vIGNhc2U6IHVzaW5nIGFycm93cyB0byBtb3ZlIGJldHdlZW4gYnV0dG9uc1xuICAgICAgICAoaXNBcnJvd0tleShldmVudC5rZXkpICYmIGlzSW5wdXRMaWtlKGV2ZW50LnRhcmdldCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlFVRVNUSU9OX01BUkspIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2hvd0hlbHBEaWFsb2c6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3Rpb25NYW5hZ2VyLmhhbmRsZUtleURvd24oZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIHRoaXMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5aRVJPKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiAhdGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgICAgICh0aGlzLnN0YXRlLmdyaWRTaXplICYmXG4gICAgICAgICAgICAoZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgICAgPyBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlRcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLmdyaWRTaXplKSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UXG4gICAgICAgICAgICA6IEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0xFRlQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1JJR0hUKSB7XG4gICAgICAgICAgb2Zmc2V0WCA9IHN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgICAgb2Zmc2V0WSA9IC1zdGVwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19ET1dOKSB7XG4gICAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHg6IGVsZW1lbnQueCArIG9mZnNldFgsXG4gICAgICAgICAgICB5OiBlbGVtZW50LnkgKyBvZmZzZXRZLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNseVVwZGF0ZWQ6IHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAhaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgICBzaG91bGRCaW5kOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgICAgICFldmVudC5tZXRhS2V5ICYmXG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBmaW5kU2hhcGVCeUtleShldmVudC5rZXkpO1xuICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChzaGFwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUxvY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgaXNIb2xkaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICAgICFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnQua2V5ID09PSBLRVlTLkcgJiZcbiAgICAgICAgICAoaGFzQmFja2dyb3VuZCh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKSB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSkpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUykge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwic3Ryb2tlQ29sb3JQaWNrZXJcIiB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBvbktleVVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSlcbiAgICAgICAgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpXG4gICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3M6IFtdIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RTaGFwZVRvb2woZWxlbWVudFR5cGU6IEFwcFN0YXRlW1wiZWxlbWVudFR5cGVcIl0pIHtcbiAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICB0aGlzLm9uSW1hZ2VBY3Rpb24oKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZWxlbWVudFR5cGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkdlc3R1cmVTdGFydCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgIH0pO1xuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUNoYW5nZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBvbkdlc3R1cmVDaGFuZ2Ugb25seSBoYXMgem9vbSBmYWN0b3IgYnV0IG5vdCB0aGUgY2VudGVyLlxuICAgIC8vIElmIHdlJ3JlIG9uIGlQYWQgb3IgaVBob25lLCB0aGVuIHdlIHJlY29nbml6ZSBtdWx0aS10b3VjaCBhbmQgd2lsbFxuICAgIC8vIHpvb20gaW4gYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIG9uIHRoZSB0b3VjaE1vdmUgaGFuZGxlciBhbHJlYWR5LlxuICAgIC8vIE9uIE1hY2Jvb2ssIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA+PSAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+ICh7XG4gICAgICAgIC4uLmdldFN0YXRlRm9yWm9vbShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2aWV3cG9ydFg6IGN1cnNvclgsXG4gICAgICAgICAgICB2aWV3cG9ydFk6IGN1cnNvclksXG4gICAgICAgICAgICBuZXh0Wm9vbTogZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogZXZlbnQuc2NhbGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICksXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUVuZCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgfSk7XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIGhhbmRsZVRleHRXeXNpd3lnKFxuICAgIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgICB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKFxuICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgb3JpZ2luYWxUZXh0OiBzdHJpbmcsXG4gICAgICBpc0RlbGV0ZWQ6IGJvb2xlYW4sXG4gICAgKSA9PiB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChfZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9O1xuXG4gICAgdGV4dFd5c2l3eWcoe1xuICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4LCB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeDogdmlld3BvcnRYLCB5OiB2aWV3cG9ydFkgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY2VuZVg6IHgsXG4gICAgICAgICAgICBzY2VuZVk6IHksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHZpZXdwb3J0WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB2aWV3cG9ydFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogd2l0aEJhdGNoZWRVcGRhdGVzKCh0ZXh0KSA9PiB7XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgdGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgb25TdWJtaXQ6IHdpdGhCYXRjaGVkVXBkYXRlcygoeyB0ZXh0LCB2aWFLZXlib2FyZCwgb3JpZ2luYWxUZXh0IH0pID0+IHtcbiAgICAgICAgY29uc3QgaXNEZWxldGVkID0gIXRleHQudHJpbSgpO1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkKTtcbiAgICAgICAgLy8gc2VsZWN0IHRoZSBjcmVhdGVkIHRleHQgZWxlbWVudCBvbmx5IGlmIHN1Ym1pdHRpbmcgdmlhIGtleWJvYXJkXG4gICAgICAgIC8vICh3aGVuIHN1Ym1pdHRpbmcgdmlhIGNsaWNrIGl0IHNob3VsZCBhY3QgYXMgc2lnbmFsIHRvIGRlc2VsZWN0KVxuICAgICAgICBpZiAoIWlzRGVsZXRlZCAmJiB2aWFLZXlib2FyZCkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZFRvU2VsZWN0ID0gZWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICAgICAgPyBlbGVtZW50LmNvbnRhaW5lcklkXG4gICAgICAgICAgICA6IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgIFtlbGVtZW50SWRUb1NlbGVjdF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZWxldGVkKSB7XG4gICAgICAgICAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgW2VsZW1lbnRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRGVsZXRlZCB8fCBpc0V4aXN0aW5nRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGFwcDogdGhpcyxcbiAgICB9KTtcbiAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuXG4gICAgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0LCBlbGVtZW50Lm9yaWdpbmFsVGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0cz86IHtcbiAgICAgIC8qKiBpZiB0cnVlLCByZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50ICh3aXRoIGhpZ2hlc3Qgei1pbmRleClcbiAgICAgICAgb2YgYWxsIGhpdCBlbGVtZW50cyAqL1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbCB7XG4gICAgY29uc3QgYWxsSGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgb3B0cz8uaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKG9wdHM/LnByZWZlclNlbGVjdGVkKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPiAtMTsgaW5kZXgtLSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1thbGxIaXRFbGVtZW50c1tpbmRleF0uaWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID1cbiAgICAgICAgYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBJZiB3ZSdyZSBoaXR0aW5nIGVsZW1lbnQgd2l0aCBoaWdoZXN0IHotaW5kZXggb25seSBvbiBpdHMgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aGlsZSBhbHNvIGhpdHRpbmcgb3RoZXIgZWxlbWVudCBmaWd1cmUsIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICByZXR1cm4gaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICApXG4gICAgICAgID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1swXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRzQXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIGluY2x1ZGVCb3VuZFRleHRFbGVtZW50OiBib29sZWFuID0gZmFsc2UsXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnRcbiAgICAgID8gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpXG4gICAgICA6IHRoaXMuc2NlbmVcbiAgICAgICAgICAuZ2V0RWxlbWVudHMoKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlbWVudCkgPT4gIShpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQuY29udGFpbmVySWQpLFxuICAgICAgICAgICk7XG5cbiAgICByZXR1cm4gZ2V0RWxlbWVudHNBdFBvc2l0aW9uKGVsZW1lbnRzLCAoZWxlbWVudCkgPT5cbiAgICAgIGhpdFRlc3QoZWxlbWVudCwgdGhpcy5zdGF0ZSwgeCwgeSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUZXh0RWRpdGluZyA9ICh7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWSxcbiAgICBzaG91bGRCaW5kLFxuICAgIGluc2VydEF0UGFyZW50Q2VudGVyID0gdHJ1ZSxcbiAgfToge1xuICAgIC8qKiBYIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0IGF0ICovXG4gICAgc2NlbmVYOiBudW1iZXI7XG4gICAgLyoqIFkgcG9zaXRpb24gdG8gaW5zZXJ0IHRleHQgYXQgKi9cbiAgICBzY2VuZVk6IG51bWJlcjtcbiAgICBzaG91bGRCaW5kOiBib29sZWFuO1xuICAgIC8qKiB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gaW5zZXJ0IGF0IGVsZW1lbnQgY2VudGVyIGlmIGFwcGxpY2FibGUgKi9cbiAgICBpbnNlcnRBdFBhcmVudENlbnRlcj86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICBsZXQgcGFyZW50Q2VudGVyUG9zaXRpb24gPVxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiZcbiAgICAgIHRoaXMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICk7XG5cbiAgICBsZXQgZXhpc3RpbmdUZXh0RWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNvbnRhaW5lcjogRXhjYWxpZHJhd1RleHRDb250YWluZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgY29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleGlzdGluZ1RleHRFbGVtZW50ID1cbiAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPz8gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgLy8gYmluZCB0byBjb250YWluZXIgd2hlbiBzaG91bGRCaW5kIGlzIHRydWUgb3JcbiAgICAvLyBjbGlja2VkIG9uIGNlbnRlciBvZiBjb250YWluZXJcbiAgICBpZiAoXG4gICAgICAhY29udGFpbmVyICYmXG4gICAgICAhZXhpc3RpbmdUZXh0RWxlbWVudCAmJlxuICAgICAgKHNob3VsZEJpbmQgfHwgcGFyZW50Q2VudGVyUG9zaXRpb24pXG4gICAgKSB7XG4gICAgICBjb250YWluZXIgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKFxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKChlbGUpID0+ICFpc1RleHRFbGVtZW50KGVsZSkpLFxuICAgICAgICBzY2VuZVgsXG4gICAgICAgIHNjZW5lWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFleGlzdGluZ1RleHRFbGVtZW50ICYmIGNvbnRhaW5lcikge1xuICAgICAgY29uc3QgZm9udFN0cmluZyA9IHtcbiAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB9O1xuICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRBcHByb3hNaW5MaW5lV2lkdGgoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVyLmhlaWdodCwgbWluSGVpZ2h0KTtcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyLndpZHRoLCBtaW5XaWR0aCk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5ld0hlaWdodCwgd2lkdGg6IG5ld1dpZHRoIH0pO1xuICAgICAgc2NlbmVYID0gY29udGFpbmVyLnggKyBuZXdXaWR0aCAvIDI7XG4gICAgICBzY2VuZVkgPSBjb250YWluZXIueSArIG5ld0hlaWdodCAvIDI7XG4gICAgICBpZiAocGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgcGFyZW50Q2VudGVyUG9zaXRpb24gPSB0aGlzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgIHNjZW5lWSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBleGlzdGluZ1RleHRFbGVtZW50XG4gICAgICA/IGV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICAgIDogbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgICAgIHg6IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJYXG4gICAgICAgICAgICA6IHNjZW5lWCxcbiAgICAgICAgICB5OiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWVxuICAgICAgICAgICAgOiBzY2VuZVksXG4gICAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgICAgICB0ZXh0QWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFwiY2VudGVyXCJcbiAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBWRVJUSUNBTF9BTElHTi5NSURETEVcbiAgICAgICAgICAgIDogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgICAgICBjb250YWluZXJJZDogY29udGFpbmVyPy5pZCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZ3JvdXBJZHM6IGNvbnRhaW5lcj8uZ3JvdXBJZHMgPz8gW10sXG4gICAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmdFbGVtZW50OiBlbGVtZW50IH0pO1xuXG4gICAgaWYgKCFleGlzdGluZ1RleHRFbGVtZW50KSB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcblxuICAgICAgLy8gY2FzZTogY3JlYXRpbmcgbmV3IHRleHQgbm90IGNlbnRlcmVkIHRvIHBhcmVudCBlbGVtZW50IOKGkiBvZmZzZXQgWVxuICAgICAgLy8gc28gdGhhdCB0aGUgdGV4dCBpcyBjZW50ZXJlZCB0byBjdXJzb3IgcG9zaXRpb25cbiAgICAgIGlmICghcGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgeTogZWxlbWVudC55IC0gZWxlbWVudC5iYXNlbGluZSAvIDIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmhhbmRsZVRleHRXeXNpd3lnKGVsZW1lbnQsIHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50OiAhIWV4aXN0aW5nVGV4dEVsZW1lbnQsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNEb3VibGVDbGljayA9IChcbiAgICBldmVudDogUmVhY3QuTW91c2VFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIC8vIGNhc2U6IGRvdWJsZS1jbGlja2luZyB3aXRoIGFycm93L2xpbmUgdG9vbCBzZWxlY3RlZCB3b3VsZCBib3RoIGNyZWF0ZVxuICAgIC8vIHRleHQgYW5kIGVudGVyIG11bHRpRWxlbWVudCBtb2RlXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHdlIHNob3VsZCBvbmx5IGJlIGFibGUgdG8gZG91YmxlIGNsaWNrIHdoZW4gbW9kZSBpcyBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuXG4gICAgbGV0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIGV2ZW50LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHModGhpcy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9XG4gICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCB0aGlzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaGl0RWxlbWVudCEuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIXRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50KTtcbiAgICAgICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICAgICAgc2NlbmVYID0gc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgICAgIHNjZW5lWSA9IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICBzaG91bGRCaW5kOiBmYWxzZSxcbiAgICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50TGlua0F0UG9zaXRpb24gPSAoXG4gICAgc2NlbmVQb2ludGVyOiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIGhpdEVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4gICk6IEV4Y2FsaWRyYXdFbGVtZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgICAvLyBSZXZlcnNpbmcgc28gd2UgdHJhdmVyc2UgdGhlIGVsZW1lbnRzIGluIGRlY3JlYXNpbmcgb3JkZXJcbiAgICAvLyBvZiB6LWluZGV4XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgbGV0IGhpdEVsZW1lbnRJbmRleCA9IEluZmluaXR5O1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50LmlkKSB7XG4gICAgICAgIGhpdEVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZWxlbWVudC5saW5rICYmXG4gICAgICAgIGlzUG9pbnRIaXR0aW5nTGlua0ljb24oXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldLFxuICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSxcbiAgICAgICAgKSAmJlxuICAgICAgICBpbmRleCA8PSBoaXRFbGVtZW50SW5kZXhcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWRpcmVjdFRvTGluayA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBpc1RvdWNoU2NyZWVuOiBib29sZWFuLFxuICApID0+IHtcbiAgICBjb25zdCBkcmFnZ2VkRGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgdGhpcy5sYXN0UG9pbnRlckRvd24hLmNsaWVudFgsXG4gICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WSxcbiAgICAgIHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WCxcbiAgICAgIHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WSxcbiAgICApO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmhpdExpbmtFbGVtZW50IHx8XG4gICAgICAvLyBGb3IgdG91Y2ggc2NyZWVuIGFsbG93IGRyYWdnaW5nIHRocmVzaG9sZCBlbHNlIHN0cmljdCBjaGVja1xuICAgICAgKGlzVG91Y2hTY3JlZW4gJiYgZHJhZ2dlZERpc3RhbmNlID4gRFJBR0dJTkdfVEhSRVNIT0xEKSB8fFxuICAgICAgKCFpc1RvdWNoU2NyZWVuICYmIGRyYWdnZWREaXN0YW5jZSAhPT0gMClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgdGhpcy5sYXN0UG9pbnRlckRvd24hLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyRG93bkhpdHRpbmdMaW5rSWNvbiA9IGlzUG9pbnRIaXR0aW5nTGlua0ljb24oXG4gICAgICB0aGlzLmhpdExpbmtFbGVtZW50ISxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICBbbGFzdFBvaW50ZXJEb3duQ29vcmRzLngsIGxhc3RQb2ludGVyRG93bkNvb3Jkcy55XSxcbiAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCEsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgW2xhc3RQb2ludGVyVXBDb29yZHMueCwgbGFzdFBvaW50ZXJVcENvb3Jkcy55XSxcbiAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSxcbiAgICApO1xuICAgIGlmIChsYXN0UG9pbnRlckRvd25IaXR0aW5nTGlua0ljb24gJiYgbGFzdFBvaW50ZXJVcEhpdHRpbmdMaW5rSWNvbikge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5oaXRMaW5rRWxlbWVudC5saW5rO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICBsZXQgY3VzdG9tRXZlbnQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uTGlua09wZW4pIHtcbiAgICAgICAgICBjdXN0b21FdmVudCA9IHdyYXBFdmVudChFVkVOVC5FWENBTElEUkFXX0xJTkssIGV2ZW50Lm5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uTGlua09wZW4odGhpcy5oaXRMaW5rRWxlbWVudCwgY3VzdG9tRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VzdG9tRXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0xvY2FsTGluayh1cmwpID8gXCJfc2VsZlwiIDogXCJfYmxhbmtcIjtcbiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSB3aW5kb3cub3Blbih1bmRlZmluZWQsIHRhcmdldCk7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmdpdGh1Yi5pby9yZWwtbm9vcGVuZXIvXG4gICAgICAgICAgaWYgKG5ld1dpbmRvdykge1xuICAgICAgICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgICAgICAgICBuZXdXaW5kb3cubG9jYXRpb24gPSBub3JtYWxpemVMaW5rKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuICAgIGlmIChcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMiAmJlxuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyICYmXG4gICAgICBpbml0aWFsU2NhbGUgJiZcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlXG4gICAgKSB7XG4gICAgICBjb25zdCBjZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBjb25zdCBkZWx0YVggPSBjZW50ZXIueCAtIGdlc3R1cmUubGFzdENlbnRlci54O1xuICAgICAgY29uc3QgZGVsdGFZID0gY2VudGVyLnkgLSBnZXN0dXJlLmxhc3RDZW50ZXIueTtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGNlbnRlcjtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpKTtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID1cbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiICYmIHRoaXMuc3RhdGUucGVuTW9kZVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcblxuICAgICAgY29uc3QgbmV4dFpvb20gPSBzY2FsZUZhY3RvclxuICAgICAgICA/IGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIHNjYWxlRmFjdG9yKVxuICAgICAgICA6IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgem9vbVN0YXRlID0gZ2V0U3RhdGVGb3Jab29tKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZpZXdwb3J0WDogY2VudGVyLngsXG4gICAgICAgICAgICB2aWV3cG9ydFk6IGNlbnRlci55LFxuICAgICAgICAgICAgbmV4dFpvb20sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHpvb206IHpvb21TdGF0ZS56b29tLFxuICAgICAgICAgIHNjcm9sbFg6IHpvb21TdGF0ZS5zY3JvbGxYICsgZGVsdGFYIC8gbmV4dFpvb20sXG4gICAgICAgICAgc2Nyb2xsWTogem9vbVN0YXRlLnNjcm9sbFkgKyBkZWx0YVkgLyBuZXh0Wm9vbSxcbiAgICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID1cbiAgICAgICAgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UgPVxuICAgICAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9XG4gICAgICAgICAgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoXG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgeyB4OiBzY2VuZVBvaW50ZXJYLCB5OiBzY2VuZVBvaW50ZXJZIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nXG4gICAgKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZWRpdGluZ0xpbmVhckVsZW1lbnQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSkpIHtcbiAgICAgIC8vIEhvdmVyaW5nIHdpdGggYSBzZWxlY3RlZCB0b29sIG9yIGNyZWF0aW5nIG5ldyBsaW5lYXIgZWxlbWVudCB2aWEgY2xpY2tcbiAgICAgIC8vIGFuZCBwb2ludFxuICAgICAgY29uc3QgeyBkcmFnZ2luZ0VsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIFtzY2VuZVBvaW50ZXJdLFxuICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSB9ID0gbXVsdGlFbGVtZW50O1xuXG4gICAgICBjb25zdCB7IHBvaW50cywgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG5cbiAgICAgIGlmIChsYXN0UG9pbnQgPT09IGxhc3RDb21taXR0ZWRQb2ludCkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IHlldCBjcmVhdGVkIGEgdGVtcCBwb2ludCBhbmQgd2UncmUgYmV5b25kIGNvbW1pdC16b25lXG4gICAgICAgIC8vIHRocmVzaG9sZCwgYWRkIGEgcG9pbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXJYIC0gcngsXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gcnksXG4gICAgICAgICAgICBsYXN0UG9pbnRbMF0sXG4gICAgICAgICAgICBsYXN0UG9pbnRbMV0sXG4gICAgICAgICAgKSA+PSBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgICAgLy8gaW4gdGhpcyBicmFuY2gsIHdlJ3JlIGluc2lkZSB0aGUgY29tbWl0IHpvbmUsIGFuZCBubyB1bmNvbW1pdHRlZFxuICAgICAgICAgIC8vIHBvaW50IGV4aXN0cy4gVGh1cyBkbyBub3RoaW5nIChkb24ndCBhZGQvcmVtb3ZlIHBvaW50cykuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHBvaW50cy5sZW5ndGggPiAyICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogcG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNQYXRoQUxvb3AocG9pbnRzLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgbGFzdCB1bmNvbW1pdHRlZCBwb2ludFxuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZXNlbGVjdGVkQnV0dG9uID0gQm9vbGVhbihldmVudC5idXR0b25zKTtcbiAgICBpZiAoXG4gICAgICBoYXNEZXNlbGVjdGVkQnV0dG9uIHx8XG4gICAgICAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInRleHRcIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcImVyYXNlclwiKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihcbiAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgIGhpdEVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuaGl0TGlua0VsZW1lbnQuaWRdXG4gICAgKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgc2hvd0h5cGVybGlua1Rvb2x0aXAodGhpcy5oaXRMaW5rRWxlbWVudCwgdGhpcy5zdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGVIeXBlcmxpbmtUb29saXAoKTtcbiAgICAgIGlmIChcbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICBoaXRFbGVtZW50LmxpbmsgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0gJiZcbiAgICAgICAgIXRoaXMuY29udGV4dE1lbnVPcGVuICYmXG4gICAgICAgICF0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IFwiaW5mb1wiIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICBzZXRDdXJzb3IoXG4gICAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICAgaXNUZXh0RWxlbWVudChoaXRFbGVtZW50KSA/IENVUlNPUl9UWVBFLlRFWFQgOiBDVVJTT1JfVFlQRS5DUk9TU0hBSVIsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQgJiZcbiAgICAgICAgICBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50LCB0aGlzLnN0YXRlLCBbXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgICAgIF0pXG4gICAgICAgICkge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gaWYgdXNpbmcgY21kL2N0cmwsIHdlJ3JlIG5vdCBkcmFnZ2luZ1xuICAgICAgICAhZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGhpdEVsZW1lbnQgfHxcbiAgICAgICAgICB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUVyYXNlciA9IChcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICAgc2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnRJZHMgPSAoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pID0+IHtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWRzVG9VcGRhdGUucHVzaChlbGVtZW50LmlkKTtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgaWRzVG9VcGRhdGU6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnksXG4gICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICk7XG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgcG9pbnQgPSB7IC4uLnBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcyB9O1xuICAgIGxldCBzYW1wbGluZ0ludGVydmFsID0gMDtcbiAgICB3aGlsZSAoc2FtcGxpbmdJbnRlcnZhbCA8PSBkaXN0YW5jZSkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTtcbiAgICAgIHVwZGF0ZUVsZW1lbnRJZHMoaGl0RWxlbWVudHMpO1xuXG4gICAgICAvLyBFeGl0IHNpbmNlIHdlIHJlYWNoZWQgY3VycmVudCBwb2ludFxuICAgICAgaWYgKHNhbXBsaW5nSW50ZXJ2YWwgPT09IGRpc3RhbmNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgbmV4dCBwb2ludCBpbiB0aGUgbGluZSBhdCBhIGRpc3RhbmNlIG9mIHNhbXBsaW5nIGludGVydmFsXG4gICAgICBzYW1wbGluZ0ludGVydmFsID0gTWF0aC5taW4oc2FtcGxpbmdJbnRlcnZhbCArIHRocmVzaG9sZCwgZGlzdGFuY2UpO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZVJhdGlvID0gc2FtcGxpbmdJbnRlcnZhbCAvIGRpc3RhbmNlO1xuICAgICAgY29uc3QgbmV4dFggPVxuICAgICAgICAoMSAtIGRpc3RhbmNlUmF0aW8pICogcG9pbnQueCArIGRpc3RhbmNlUmF0aW8gKiBzY2VuZVBvaW50ZXIueDtcbiAgICAgIGNvbnN0IG5leHRZID1cbiAgICAgICAgKDEgLSBkaXN0YW5jZVJhdGlvKSAqIHBvaW50LnkgKyBkaXN0YW5jZVJhdGlvICogc2NlbmVQb2ludGVyLnk7XG4gICAgICBwb2ludC54ID0gbmV4dFg7XG4gICAgICBwb2ludC55ID0gbmV4dFk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkubWFwKChlbGUpID0+IHtcbiAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiYgaWRzVG9VcGRhdGUuaW5jbHVkZXMoZWxlLmNvbnRhaW5lcklkKVxuICAgICAgICAgID8gZWxlLmNvbnRhaW5lcklkXG4gICAgICAgICAgOiBlbGUuaWQ7XG4gICAgICBpZiAoaWRzVG9VcGRhdGUuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtpZF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHsgb3BhY2l0eTogMjAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHNjZW5lUG9pbnRlci54O1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gc2NlbmVQb2ludGVyLnk7XG4gIH07XG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuICAgIHRoaXMubWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KTtcblxuICAgIC8vZmlyZXMgb25seSBvbmNlLCBpZiBwZW4gaXMgZGV0ZWN0ZWQsIHBlbk1vZGUgaXMgZW5hYmxlZFxuICAgIC8vdGhlIHVzZXIgY2FuIGRpc2FibGUgdGhpcyBieSB0b2dnbGluZyB0aGUgcGVuTW9kZSBidXR0b25cbiAgICBpZiAoIXRoaXMuc3RhdGUucGVuRGV0ZWN0ZWQgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbk1vZGU6IHRydWUsXG4gICAgICAgICAgcGVuRGV0ZWN0ZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5kZXZpY2VUeXBlLmlzVG91Y2hTY3JlZW4gJiZcbiAgICAgIFtcInBlblwiLCBcInRvdWNoXCJdLmluY2x1ZGVzKGV2ZW50LnBvaW50ZXJUeXBlKVxuICAgICkge1xuICAgICAgdGhpcy5kZXZpY2VUeXBlID0gdXBkYXRlT2JqZWN0KHRoaXMuZGV2aWNlVHlwZSwgeyBpc1RvdWNoU2NyZWVuOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQb2ludGVyRG93biA9IGV2ZW50O1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG4gICAgaWYgKFxuICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgb24gcG9pbnRlciBkb3duIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd09uUG9pbnRlckRvd24gPVxuICAgICAgIXRoaXMuc3RhdGUucGVuTW9kZSB8fFxuICAgICAgZXZlbnQucG9pbnRlclR5cGUgIT09IFwidG91Y2hcIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIjtcblxuICAgIGlmICghYWxsb3dPblBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIlxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAvLyByZXNldCBpbWFnZSBwcmV2aWV3IG9uIHBvaW50ZXJkb3duXG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkNST1NTSEFJUik7XG5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsLFxuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgICAgbXV0YXRlRWxlbWVudCh0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICB0aGlzLmhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24oXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwiZXJhc2VyXCIpIHtcbiAgICAgIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID1cbiAgICAgIHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9XG4gICAgICB0aGlzLm9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGNvbnN0IG9uS2V5RG93biA9IHRoaXMub25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcbiAgICBjb25zdCBvbktleVVwID0gdGhpcy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlclVwID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLmxhc3RQb2ludGVyVXAgPSBldmVudDtcbiAgICBpZiAodGhpcy5kZXZpY2VUeXBlLmlzVG91Y2hTY3JlZW4pIHtcbiAgICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH0sXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICk7XG4gICAgICB0aGlzLmhpdExpbmtFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24oXG4gICAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgICAgaGl0RWxlbWVudCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLmhpdExpbmtFbGVtZW50LmlkXVxuICAgICkge1xuICAgICAgdGhpcy5yZWRpcmVjdFRvTGluayhldmVudCwgdGhpcy5kZXZpY2VUeXBlLmlzVG91Y2hTY3JlZW4pO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlUG9pbnRlcihldmVudCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgICAgICBpZiAoIWludmFsaWRhdGVDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBUT1VDSF9DVFhfTUVOVV9USU1FT1VUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldENvbnRleHRNZW51VGltZXIgPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlQ2xlYW51cEFmdGVyTWlzc2luZ1BvaW50ZXJVcChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGxhc3RQb2ludGVyVXAgIT09IG51bGwpIHtcbiAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHNvbWV0aW1lcyB3ZSBkb24ndCBnZXQgYSBwb2ludGVydXAgYWZ0ZXIgYSBwb2ludGVyZG93bixcbiAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29udGV4dHVhbCBtZW51IG9yIGFsZXJ0IGlzIHRyaWdnZXJlZC4gSW4gb3JkZXIgdG8gYXZvaWRcbiAgICAgIC8vIGJlaW5nIGluIGEgd2VpcmQgc3RhdGUsIHdlIGNsZWFuIHVwIG9uIHRoZSBuZXh0IHBvaW50ZXJkb3duXG4gICAgICBsYXN0UG9pbnRlclVwKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgcGFubmluZ1xuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwICYmXG4gICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLldIRUVMIHx8XG4gICAgICAgICAgKGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBpc0hvbGRpbmdTcGFjZSkgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZClcbiAgICAgICkgfHxcbiAgICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5cbiAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICBsZXQgeyBjbGllbnRYOiBsYXN0WCwgY2xpZW50WTogbGFzdFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgLypcbiAgICAgICAqIFByZXZlbnQgcGFzdGUgZXZlbnQgaWYgd2UgbW92ZSB3aGlsZSBtaWRkbGUgY2xpY2tpbmcgb24gTGludXguXG4gICAgICAgKiBTZWUgaXNzdWUgIzEzODMuXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgaXNMaW51eCAmJlxuICAgICAgICAhbmV4dFBhc3RlUHJldmVudGVkICYmXG4gICAgICAgIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSlcbiAgICAgICkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8qIFByZXZlbnQgdGhlIG5leHQgcGFzdGUgZXZlbnQgKi9cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlnaHQgY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVuYWJsZU5leHRQYXN0ZSA9ICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGRlbHRhWCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZGVsdGFZIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgICAobGFzdFBvaW50ZXJVcCA9ICgpID0+IHtcbiAgICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICAgICAgb25Qb2ludGVyTW92ZS5mbHVzaCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKFxuICAgICAgICBnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSxcbiAgICAgICksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKFxuICAgICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gZHVwbGljYXRlIGJlY2F1c2Ugd2UnbGwgYmUgdXBkYXRpbmcgdGhpcyBzdGF0ZVxuICAgICAgbGFzdENvb3JkczogeyAuLi5vcmlnaW4gfSxcbiAgICAgIG9yaWdpbmFsRWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkgYXMgUG9pbnRlckRvd25TdGF0ZVtcIm9yaWdpbmFsRWxlbWVudHNcIl0pLFxuICAgICAgcmVzaXplOiB7XG4gICAgICAgIGhhbmRsZVR5cGU6IGZhbHNlLFxuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIsXG4gICAgICAgIGNlbnRlcjogeyB4OiAobWF4WCArIG1pblgpIC8gMiwgeTogKG1heFkgKyBtaW5ZKSAvIDIgfSxcbiAgICAgIH0sXG4gICAgICBoaXQ6IHtcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgYWxsSGl0RWxlbWVudHM6IFtdLFxuICAgICAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czpcbiAgICAgICAgICB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICApLFxuICAgICAgICBoYXNIaXRFbGVtZW50SW5zaWRlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBkcmFnOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGJveFNlbGVjdGlvbjoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZWxlbWVudElkc1RvRXJhc2U6IHt9LFxuICAgIH07XG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgZHJhZ2dpbmcgYSBzY3JvbGxiYXJcbiAgcHJpdmF0ZSBoYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJFaXRoZXIgJiYgIXRoaXMuc3RhdGUubXVsdGlFbGVtZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gdHJ1ZTtcbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgICBpc0RyYWdnaW5nU2Nyb2xsQmFyID0gZmFsc2U7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICAgIG9uUG9pbnRlck1vdmUuZmx1c2goKTtcbiAgICB9KTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdGlvbklmTm90VXNpbmdTZWxlY3Rpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHBvaW50ZXIgZXZlbnQgaGFzIGJlZW4gY29tcGxldGVseSBoYW5kbGVkXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbk9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSA9XG4gICAgICAgICAgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nRWxlbWVudDogZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLmVsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9XG4gICAgICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKFxuICAgICAgICAgIGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldFJlc2l6ZU9mZnNldFhZKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiZcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLnBvaW50cy5sZW5ndGggPT09IDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIChhcHBTdGF0ZSkgPT4gdGhpcy5zZXRTdGF0ZShhcHBTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGl0RWxlbWVudCBtYXkgYWxyZWFkeSBiZSBzZXQgYWJvdmUsIHNvIGNoZWNrIGZpcnN0XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPz9cbiAgICAgICAgICB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKTtcblxuICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgIC8vIEVhcmx5IHJldHVybiBpZiBwb2ludGVyIGlzIGhpdHRpbmcgbGluayBpY29uXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNQb2ludEhpdHRpbmdMaW5rSWNvbihcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnldLFxuICAgICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUgPVxuICAgICAgICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgY29uc3Qgc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkID1cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIElmIHdlIGNsaWNrIG9uIHNvbWV0aGluZ1xuICAgICAgICB9IGVsc2UgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGhpdEVsZW1lbnQubGluayA/IFwiaW5mb1wiIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBpc0FTZWxlY3RlZEVsZW1lbnQoaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXTtcbiAgfVxuXG4gIHByaXZhdGUgaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoXG4gICAgcG9pbnQ6IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4sXG4gICAgc2VsZWN0ZWRFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IHBpeGVscyBvZmYgdGhlIHNoYXBlIGJvdW5kYXJ5IHdlIHN0aWxsIGNvbnNpZGVyIGEgaGl0XG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgcG9pbnQueCA+IHgxIC0gdGhyZXNob2xkICYmXG4gICAgICBwb2ludC54IDwgeDIgKyB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPiB5MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueSA8IHkyICsgdGhyZXNob2xkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVGV4dE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gaWYgd2UncmUgY3VycmVudGx5IHN0aWxsIGVkaXRpbmcgdGV4dCwgY2xpY2tpbmcgb3V0c2lkZVxuICAgIC8vIHNob3VsZCBvbmx5IGZpbmFsaXplIGl0LCBub3QgY3JlYXRlIGFub3RoZXIgKGlycmVzcGVjdGl2ZVxuICAgIC8vIG9mIHN0YXRlLmVsZW1lbnRMb2NrZWQpXG4gICAgaWYgKGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNjZW5lWCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLng7XG4gICAgbGV0IHNjZW5lWSA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSwge1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICBzY2VuZVggPSBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9XG4gICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWSxcbiAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXksXG4gICAgfSk7XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkgPT4ge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHJlc3N1cmVzID0gZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgICA/IGVsZW1lbnQucHJlc3N1cmVzXG4gICAgICA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBwb2ludHM6IFtbMCwgMF1dLFxuICAgICAgcHJlc3N1cmVzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICB0aGlzLnNjZW5lLFxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIGVsZW1lbnQsXG4gICAgXSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUVsZW1lbnQgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gIH06IHtcbiAgICBzY2VuZVg6IG51bWJlcjtcbiAgICBzY2VuZVk6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHNjZW5lWCwgc2NlbmVZLCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdJbWFnZUVsZW1lbnQoe1xuICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIC8vIGZpbmFsaXplIGlmIGNvbXBsZXRpbmcgYSBsb29wXG4gICAgICBpZiAoXG4gICAgICAgIG11bHRpRWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICBpc1BhdGhBTG9vcChtdWx0aUVsZW1lbnQucG9pbnRzLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB4OiByeCwgeTogcnksIGxhc3RDb21taXR0ZWRQb2ludCB9ID0gbXVsdGlFbGVtZW50O1xuXG4gICAgICAvLyBjbGlja2luZyBpbnNpZGUgY29tbWl0IHpvbmUg4oaSIGZpbmFsaXplIGFycm93XG4gICAgICBpZiAoXG4gICAgICAgIG11bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoID4gMSAmJlxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQgJiZcbiAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHJ5LFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFswXSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMV0sXG4gICAgICAgICkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICBbbXVsdGlFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIGNsaWNraW5nIG91dHNpZGUgY29tbWl0IHpvbmUg4oaSIHVwZGF0ZSByZWZlcmVuY2UgZm9yIGxhc3QgY29tbWl0dGVkXG4gICAgICAvLyBwb2ludFxuICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICB9KTtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcblxuICAgICAgLyogSWYgYXJyb3cgaXMgcHJlLWFycm93aGVhZHMsIGl0IHdpbGwgaGF2ZSB1bmRlZmluZWQgZm9yIGJvdGggc3RhcnQgYW5kIGVuZCBhcnJvd2hlYWRzLlxuICAgICAgSWYgc28sIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3Igc3RhcnQgYW5kIFwiYXJyb3dcIiBmb3IgZW5kLiBJZiB0aGUgbGluZWFyIGl0ZW0gaXMgbm90XG4gICAgICBhbiBhcnJvdywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBib3RoLiBPdGhlcndpc2UsIHdlIHdhbnQgaXQgdG8gdXNlIHRoZVxuICAgICAgdmFsdWVzIGZyb20gYXBwU3RhdGUuICovXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBbc3RhcnRBcnJvd2hlYWQsIGVuZEFycm93aGVhZF0gPVxuICAgICAgICBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiXG4gICAgICAgICAgPyBbY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRdXG4gICAgICAgICAgOiBbbnVsbCwgbnVsbF07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHg6IGdyaWRYLFxuICAgICAgICB5OiBncmlkWSxcbiAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBbLi4uZWxlbWVudC5wb2ludHMsIFswLCAwXV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICApO1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBQcmV2ZW50cyBmb2N1cyBmcm9tIGVzY2FwaW5nIGV4Y2FsaWRyYXcgdGFiXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuQUxUICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuXG4gICAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcmFzZXIoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUsIHBvaW50ZXJDb29yZHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG5cbiAgICAgIC8vIGZvciBhcnJvd3MvbGluZXMsIGRvbid0IHN0YXJ0IGRyYWdnaW5nIHVudGlsIGEgZ2l2ZW4gdGhyZXNob2xkXG4gICAgICAvLyB0byBlbnN1cmUgd2UgZG9uJ3QgY3JlYXRlIGEgMi1wb2ludCBhcnJvdyBieSBtaXN0YWtlIHdoZW5cbiAgICAgIC8vIHVzZXIgY2xpY2tzIG1vdXNlIGluIGEgd2F5IHRoYXQgaXQgbW92ZXMgYSB0aW55IGJpdCAodGh1c1xuICAgICAgLy8gdHJpZ2dlcmluZyBwb2ludGVybW92ZSlcbiAgICAgIGlmIChcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJsaW5lXCIpXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApIDwgRFJBR0dJTkdfVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZykge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBwb2ludHNTY2VuZUNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGlkRHJhZykge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNIaXRBU2VsZWN0ZWRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMuc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+IHRoaXMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICAoaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSAmJlxuICAgICAgICAvLyB0aGlzIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgd2hlbiBjbGlja2luZyBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGxpbmUncyBib3VuZGluZyBib3hcbiAgICAgICAgKCF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFldmVudC5zaGlmdEtleSkgJiZcbiAgICAgICAgLy8gYm94LXNlbGVjdGluZyB3aXRob3V0IHNoaWZ0IHdoZW4gZWRpdGluZyBsaW5lLCBub3QgY2xpY2tpbmcgb24gYSBsaW5lXG4gICAgICAgICghdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmVsZW1lbnRJZCAhPT1cbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ/LmlkIHx8XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSlcbiAgICAgICkge1xuICAgICAgICAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCAmJiAhcG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsKSB7XG4gICAgICAgICAgY29uc3QgW2RyYWdYLCBkcmFnWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbXG4gICAgICAgICAgICBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54KSxcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBXZSBvbmx5IGRyYWcgaW4gb25lIGRpcmVjdGlvbiBpZiBzaGlmdCBpcyBwcmVzc2VkXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgICAgICAgZHJhZ1NlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdYLFxuICAgICAgICAgICAgZHJhZ1ksXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgICAgLy8gV2UgZHVwbGljYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlmIGFsdCBpcyBwcmVzc2VkIG9uIHBvaW50ZXIgbW92ZVxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcblxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9BcHBlbmQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHM6IEFycmF5PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+ID1cbiAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgdGhpcy5zdGF0ZSwgdHJ1ZSkubWFwKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dEVsZW1lbnRzLFxuICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLFxuICAgICAgICAgICAgICBvbGRJZFRvRHVwbGljYXRlZElkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dFNjZW5lRWxlbWVudHMsXG4gICAgICAgICAgICAgIGVsZW1lbnRzVG9BcHBlbmQsXG4gICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQsXG4gICAgICAgICAgICAgIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byByZWFkIHRoaXMuc3RhdGUgd2l0aGluIGVhY2ggbW92ZSBldmVudCxcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCByZWFkIGEgc3RhbGUgb25lIVxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzLmxlbmd0aCA+IDAgJiYgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBvaW50ID1cbiAgICAgICAgICBsYXN0UG9pbnQgJiYgbGFzdFBvaW50WzBdID09PSBkeCAmJiBsYXN0UG9pbnRbMV0gPT09IGR5O1xuXG4gICAgICAgIGlmICghZGlzY2FyZFBvaW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgICAgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBkeSxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHsgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2R4LCBkeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoXG4gICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBbcG9pbnRlckNvb3Jkc10sXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXJ0Qm91bmRFbGVtZW50LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFldmVudC5zaGlmdEtleSAmJlxuICAgICAgICAgIC8vIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgKHdpdGhvdXQgc2hpZnQpXG4gICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICAgICBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIHRoaXMuc3RhdGUpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYm94LXNlbGVjdCBsaW5lIGVkaXRvciBwb2ludHNcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZUJveFNlbGVjdGlvbihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHJlZ3VsYXIgYm94LXNlbGVjdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uID0gZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24oXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKChtYXAsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgIH0sIHt9IGFzIGFueSksXG4gICAgICAgICAgICAgICAgICAuLi4ocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzaW5nIGN0cmwvY21kLCBzZWxlY3QgdGhlIGhpdEVsZW1lbnQgb25seSBpZiB3ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQuaWRdOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDpcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb25bMF0ubGlua1xuICAgICAgICAgICAgICAgICAgICA/IFwiaW5mb1wiXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChjaGlsZEV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGlzUmVzaXppbmcsXG4gICAgICAgIGlzUm90YXRpbmcsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2UsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogbnVsbCxcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIC8vIHRleHQgZWxlbWVudHMgYXJlIHJlc2V0IG9uIGZpbmFsaXplLCBhbmQgcmVzZXR0aW5nIG9uIHBvaW50ZXJ1cFxuICAgICAgICAvLyBtYXkgY2F1c2UgaXNzdWVzIHdpdGggZG91YmxlIHRhcHNcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6XG4gICAgICAgICAgbXVsdGlFbGVtZW50IHx8IGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICAgICAgICAgID8gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudFxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoY2hpbGRFdmVudC5jbGllbnRYLCBjaGlsZEV2ZW50LmNsaWVudFksIFwidXBcIik7XG5cbiAgICAgIC8vIEhhbmRsZSBlbmQgb2YgZHJhZ2dpbmcgYSBwb2ludCBvZiBhIGxpbmVhciBlbGVtZW50LCBtaWdodCBjbG9zZSBhIGxvb3BcbiAgICAgIC8vIGFuZCBzZXRzIGJpbmRpbmcgZWxlbWVudFxuICAgICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAgIChwb2ludGVyRG93blN0YXRlLmhpdD8uZWxlbWVudD8uaWQgIT09XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCB8fFxuICAgICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKFxuICAgICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlLmZsdXNoKCk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5QT0lOVEVSX01PVkUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9VUCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZRE9XTixcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24hLFxuICAgICAgKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5LRVlVUCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwISxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQ/LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBsZXQgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgLy8gQWxsb3dzIGRvdHMgdG8gYXZvaWQgYmVpbmcgZmxhZ2dlZCBhcyBpbmZpbml0ZWx5IHNtYWxsXG4gICAgICAgIGlmIChkeCA9PT0gcG9pbnRzWzBdWzBdICYmIGR5ID09PSBwb2ludHNbMF1bMV0pIHtcbiAgICAgICAgICBkeSArPSAwLjAwMDE7XG4gICAgICAgICAgZHggKz0gMC4wMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgY2hpbGRFdmVudC5wcmVzc3VyZV07XG5cbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICBwcmVzc3VyZXMsXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBbZHgsIGR5XSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IGRyYWdnaW5nRWxlbWVudDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgICAgeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICAgIHRoaXMuc2NlbmVcbiAgICAgICAgICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbC5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50IS5wb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCAmJlxuICAgICAgICAgICFtdWx0aUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgICAuLi5kcmFnZ2luZ0VsZW1lbnQucG9pbnRzLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50LngsXG4gICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50LnksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbXVsdGlFbGVtZW50OiBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudDogdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICAgICAgICBpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10sIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsIH0pO1xuICAgICAgICAgIGlmICghZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCAmJlxuICAgICAgICBpc0ludmlzaWJseVNtYWxsRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVtb3ZlIGludmlzaWJsZSBlbGVtZW50IHdoaWNoIHdhcyBhZGRlZCBpbiBvblBvaW50ZXJEb3duXG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuc2xpY2UoMCwgLTEpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoZHJhZ2dpbmdFbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQgJiYgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQocmVzaXppbmdFbGVtZW50KSkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbC5pZCAhPT0gcmVzaXppbmdFbGVtZW50LmlkKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29kZSBiZWxvdyBoYW5kbGVzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnQocykgd2VyZW4ndFxuICAgICAgLy8gZHJhZyBvciBhZGRlZCB0byBzZWxlY3Rpb24gb24gcG9pbnRlciBkb3duIHBoYXNlLlxuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgY29uc3QgZHJhZ2dlZERpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WCxcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WSxcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLmNsaWVudFgsXG4gICAgICAgICAgdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRZLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkcmFnZ2VkRGlzdGFuY2UgPT09IDApIHtcbiAgICAgICAgICBjb25zdCBzY2VuZVBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WCxcbiAgICAgICAgICAgICAgY2xpZW50WTogdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRZLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgICAgICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaGl0RWxlbWVudHMuZm9yRWFjaChcbiAgICAgICAgICAgIChoaXRFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtoaXRFbGVtZW50LmlkXSA9IHRydWUpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcmFzZUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uICYmXG4gICAgICAgIC8vIGlmIHdlJ3JlIGVkaXRpbmcgYSBsaW5lLCBwb2ludGVydXAgc2hvdWxkbid0IHN3aXRjaCBzZWxlY3Rpb24gaWZcbiAgICAgICAgLy8gYm94IHNlbGVjdGVkXG4gICAgICAgICghdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZClcbiAgICAgICkge1xuICAgICAgICAvLyB3aGVuIGluc2lkZSBsaW5lIGVkaXRvciwgc2hpZnQgc2VsZWN0cyBwb2ludHMgaW5zdGVhZFxuICAgICAgICBpZiAoY2hpbGRFdmVudC5zaGlmdEtleSAmJiAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXSkge1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRWaWFHcm91cCh0aGlzLnN0YXRlLCBoaXRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVuc2VsZWN0IGFsbCBncm91cHMgaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdyb3Vwc1xuICAgICAgICAgICAgICAvLyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgY29uc3QgaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzID0gaGl0RWxlbWVudC5ncm91cElkc1xuICAgICAgICAgICAgICAgIC5mbGF0TWFwKChncm91cElkKSA9PlxuICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHNJbkdyb3VwKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgZ3JvdXBJZCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+ICh7IFtlbGVtZW50LmlkXTogZmFsc2UgfSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocHJldklkLCBhY2MpID0+ICh7IC4uLnByZXZJZCwgLi4uYWNjIH0pLCB7fSk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3ByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmhpdEVsZW1lbnQuZ3JvdXBJZHNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZ0lkKSA9PiAoeyBbZ0lkXTogZmFsc2UgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGFjYykgPT4gKHsgLi4ucHJldiwgLi4uYWNjIH0pLCB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgLi4uaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50IS5pZF06IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChfcHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbaGl0RWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAuLi5zZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaGl0RWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICF0aGlzLnN0YXRlLmlzUmVzaXppbmcgJiZcbiAgICAgICAgKChoaXRFbGVtZW50ICYmXG4gICAgICAgICAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICAgICAgaGl0RWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgICghaGl0RWxlbWVudCAmJlxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIERlc2VsZWN0IHNlbGVjdGVkIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIgJiYgZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgfHxcbiAgICAgICAgaXNTb21lRWxlbWVudFNlbGVjdGVkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgfHwgaXNSZXNpemluZyB8fCBpc1JvdGF0aW5nKSB7XG4gICAgICAgIChpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpXG4gICAgICAgICAgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICAgOiB1bmJpbmRMaW5lYXJFbGVtZW50cykoXG4gICAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnRMb2NrZWQgJiYgZWxlbWVudFR5cGUgIT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVyYXNlRWxlbWVudHMgPSAocG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLm1hcCgoZWxlKSA9PiB7XG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuaWRdKSB7XG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHsgaXNEZWxldGVkOiB0cnVlIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiZcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZSwgeyBpc0RlbGV0ZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgfTtcblxuICBwcml2YXRlIGluaXRpYWxpemVJbWFnZSA9IGFzeW5jICh7XG4gICAgaW1hZ2VGaWxlLFxuICAgIGltYWdlRWxlbWVudDogX2ltYWdlRWxlbWVudCxcbiAgICBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ID0gZmFsc2UsXG4gIH06IHtcbiAgICBpbWFnZUZpbGU6IEZpbGU7XG4gICAgaW1hZ2VFbGVtZW50OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50O1xuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXc/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgLy8gYXQgdGhpcyBwb2ludCB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGltYWdlIGZpbGUsIGJ1dCB3ZSBkbyB0aGlzIGNoZWNrXG4gICAgLy8gdG8gc2F0aXNmeSBUUyBkb3duIHRoZSBsaW5lXG4gICAgaWYgKCFpc1N1cHBvcnRlZEltYWdlRmlsZShpbWFnZUZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgICB9XG4gICAgY29uc3QgbWltZVR5cGUgPSBpbWFnZUZpbGUudHlwZTtcblxuICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgXCJ3YWl0XCIpO1xuXG4gICAgaWYgKG1pbWVUeXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1hZ2VGaWxlID0gU1ZHU3RyaW5nVG9GaWxlKFxuICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVNWRyhhd2FpdCBpbWFnZUZpbGUudGV4dCgpKSxcbiAgICAgICAgICBpbWFnZUZpbGUubmFtZSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuc3ZnSW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2VuZXJhdGUgaW1hZ2UgaWQgKGJ5IGRlZmF1bHQgdGhlIGZpbGUgZGlnZXN0KSBiZWZvcmUgYW55XG4gICAgLy8gcmVzaXppbmcvY29tcHJlc3Npb24gdGFrZXMgcGxhY2UgdG8ga2VlcCBpdCBtb3JlIHBvcnRhYmxlXG4gICAgY29uc3QgZmlsZUlkID0gYXdhaXQgKCh0aGlzLnByb3BzLmdlbmVyYXRlSWRGb3JGaWxlPy4oXG4gICAgICBpbWFnZUZpbGUsXG4gICAgKSBhcyBQcm9taXNlPEZpbGVJZD4pIHx8IGdlbmVyYXRlSWRGcm9tRmlsZShpbWFnZUZpbGUpKTtcblxuICAgIGlmICghZmlsZUlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQ291bGRuJ3QgZ2VuZXJhdGUgZmlsZSBpZCBvciB0aGUgc3VwcGxpZWQgYGdlbmVyYXRlSWRGb3JGaWxlYCBkaWRuJ3QgcmVzb2x2ZSB0byBvbmUuXCIsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdGaWxlRGF0YSA9IHRoaXMuZmlsZXNbZmlsZUlkXTtcbiAgICBpZiAoIWV4aXN0aW5nRmlsZURhdGE/LmRhdGFVUkwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGltYWdlRmlsZSA9IGF3YWl0IHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgICAgICBtYXhXaWR0aE9ySGVpZ2h0OiBERUZBVUxUX01BWF9JTUFHRV9XSURUSF9PUl9IRUlHSFQsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgdHJ5aW5nIHRvIHJlc2luZyBpbWFnZSBmaWxlIG9uIGluc2VydGlvblwiLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZUZpbGUuc2l6ZSA+IE1BWF9BTExPV0VEX0ZJTEVfQllURVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIHQoXCJlcnJvcnMuZmlsZVRvb0JpZ1wiLCB7XG4gICAgICAgICAgICBtYXhTaXplOiBgJHtNYXRoLnRydW5jKE1BWF9BTExPV0VEX0ZJTEVfQllURVMgLyAxMDI0IC8gMTAyNCl9TUJgLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICBjb25zdCBkYXRhVVJMID0gdGhpcy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMO1xuICAgICAgLy8gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgdW5uZWNlc3NhcmlseSByZXNpemUgdGhlIG9yaWdpbmFsXG4gICAgICAvLyBmdWxsLXNpemUgZmlsZSBmb3IgY3Vyc29yIHByZXZpZXdcbiAgICAgIC8vIChpdCdzIG11Y2ggZmFzdGVyIHRvIGNvbnZlcnQgdGhlIHJlc2l6ZWQgZGF0YVVSTCB0byBGaWxlKVxuICAgICAgY29uc3QgcmVzaXplZEZpbGUgPSBkYXRhVVJMICYmIGRhdGFVUkxUb0ZpbGUoZGF0YVVSTCk7XG5cbiAgICAgIHRoaXMuc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yKHJlc2l6ZWRGaWxlIHx8IGltYWdlRmlsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVVSTCA9XG4gICAgICB0aGlzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkwgfHwgKGF3YWl0IGdldERhdGFVUkwoaW1hZ2VGaWxlKSk7XG5cbiAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBtdXRhdGVFbGVtZW50KFxuICAgICAgX2ltYWdlRWxlbWVudCxcbiAgICAgIHtcbiAgICAgICAgZmlsZUlkLFxuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICkgYXMgTm9uRGVsZXRlZDxJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPE5vbkRlbGV0ZWQ8SW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50Pj4oXG4gICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5maWxlcyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsZXMsXG4gICAgICAgICAgICBbZmlsZUlkXToge1xuICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICAgICAgZGF0YVVSTCxcbiAgICAgICAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjYWNoZWRJbWFnZURhdGEgPSB0aGlzLmltYWdlQ2FjaGUuZ2V0KGZpbGVJZCk7XG4gICAgICAgICAgaWYgKCFjYWNoZWRJbWFnZURhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUltYWdlQ2FjaGUoW2ltYWdlRWxlbWVudF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FjaGVkSW1hZ2VEYXRhPy5pbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IGNhY2hlZEltYWdlRGF0YS5pbWFnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50Py5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudD8uaWQgIT09IGltYWdlRWxlbWVudC5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKCFzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgaW1hZ2UgaW50byBlbGVtZW50cyBhcnJheSBhbmQgcmVyZW5kZXJzXG4gICAqL1xuICBwcml2YXRlIGluc2VydEltYWdlRWxlbWVudCA9IGFzeW5jIChcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gICAgaW1hZ2VGaWxlOiBGaWxlLFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXc/OiBib29sZWFuLFxuICApID0+IHtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgaW1hZ2VFbGVtZW50LFxuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUltYWdlKHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICBpc0RlbGV0ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yID0gYXN5bmMgKGltYWdlRmlsZTogRmlsZSkgPT4ge1xuICAgIC8vIG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gMTI4IHB4XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSA5NjtcblxuICAgIGNvbnN0IGltYWdlUHJldmlldyA9IGF3YWl0IHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IGN1cnNvckltYWdlU2l6ZVB4LFxuICAgIH0pO1xuXG4gICAgbGV0IHByZXZpZXdEYXRhVVJMID0gYXdhaXQgZ2V0RGF0YVVSTChpbWFnZVByZXZpZXcpO1xuXG4gICAgLy8gU1ZHIGNhbm5vdCBiZSByZXNpemVkIHZpYSBgcmVzaXplSW1hZ2VGaWxlYCBzbyB3ZSByZXNpemUgYnkgcmVuZGVyaW5nIHRvXG4gICAgLy8gYSBzbWFsbCBjYW52YXNcbiAgICBpZiAoaW1hZ2VGaWxlLnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG5cbiAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICBsZXQgd2lkdGggPSBoZWlnaHQgKiAoaW1nLndpZHRoIC8gaW1nLmhlaWdodCk7XG5cbiAgICAgIGlmICh3aWR0aCA+IGN1cnNvckltYWdlU2l6ZVB4KSB7XG4gICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgIGhlaWdodCA9IHdpZHRoICogKGltZy5oZWlnaHQgLyBpbWcud2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuXG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICBwcmV2aWV3RGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpIGFzIERhdGFVUkw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCkge1xuICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSA0IDQsIGF1dG9gKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvbkltYWdlQWN0aW9uID0gYXN5bmMgKFxuICAgIHsgaW5zZXJ0T25DYW52YXNEaXJlY3RseSB9ID0geyBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5OiBmYWxzZSB9LFxuICApID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50WCA9IHRoaXMuc3RhdGUud2lkdGggLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgICAgY29uc3QgY2xpZW50WSA9IHRoaXMuc3RhdGUuaGVpZ2h0IC8gMiArIHRoaXMuc3RhdGUub2Zmc2V0VG9wO1xuXG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgeyBjbGllbnRYLCBjbGllbnRZIH0sXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpbWFnZUZpbGUgPSBhd2FpdCBmaWxlT3Blbih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkltYWdlXCIsXG4gICAgICAgIGV4dGVuc2lvbnM6IFtcImpwZ1wiLCBcInBuZ1wiLCBcInN2Z1wiLCBcImdpZlwiXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgc2NlbmVZOiB5LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpbnNlcnRPbkNhbnZhc0RpcmVjdGx5KSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgaW1hZ2VGaWxlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogaW1hZ2VFbGVtZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoXG4gICAgICAgICAgICAgIGltYWdlRWxlbWVudCxcbiAgICAgICAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICAgICAgICAvKiBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ICovIHRydWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zID0gKFxuICAgIGltYWdlRWxlbWVudDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgICBmb3JjZU5hdHVyYWxTaXplID0gZmFsc2UsXG4gICkgPT4ge1xuICAgIGNvbnN0IGltYWdlID1cbiAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50KSAmJlxuICAgICAgdGhpcy5pbWFnZUNhY2hlLmdldChpbWFnZUVsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG5cbiAgICBpZiAoIWltYWdlIHx8IGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUgJiZcbiAgICAgICAgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyU2l6ZSA9IDEwMCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBpbWFnZUVsZW1lbnQueCAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgeTogaW1hZ2VFbGVtZW50LnkgLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclNpemUsXG4gICAgICAgICAgaGVpZ2h0OiBwbGFjZWhvbGRlclNpemUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZm9yY2VOYXR1cmFsU2l6ZSB8fFxuICAgICAgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAgIC8vIGludGVudGlvbiB3YXMgdG8gY2xpY2sgaW5zdGVhZCBvZiBkcmFnLCBhbmQgdXNlIHRoZSBpbWFnZSdzXG4gICAgICAvLyBpbnRyaW5zaWMgc2l6ZVxuICAgICAgKGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSAmJlxuICAgICAgICBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlKVxuICAgICkge1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5zdGF0ZS5oZWlnaHQgLSAxMjAsIDE2MCk7XG4gICAgICAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICAgIG1pbkhlaWdodCxcbiAgICAgICAgTWF0aC5mbG9vcih0aGlzLnN0YXRlLmhlaWdodCAqIDAuNSkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihpbWFnZS5uYXR1cmFsSGVpZ2h0LCBtYXhIZWlnaHQpO1xuICAgICAgY29uc3Qgd2lkdGggPSBoZWlnaHQgKiAoaW1hZ2UubmF0dXJhbFdpZHRoIC8gaW1hZ2UubmF0dXJhbEhlaWdodCk7XG5cbiAgICAgIC8vIGFkZCBjdXJyZW50IGltYWdlRWxlbWVudCB3aWR0aC9oZWlnaHQgdG8gYWNjb3VudCBmb3IgcHJldmlvdXMgY2VudGVyaW5nXG4gICAgICAvLyBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2VcbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG5cbiAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiB1cGRhdGVzIGltYWdlIGNhY2hlLCByZWZyZXNoaW5nIHVwZGF0ZWQgZWxlbWVudHMgYW5kL29yIHNldHRpbmcgc3RhdHVzXG4gICAgICB0byBlcnJvciBmb3IgaW1hZ2VzIHRoYXQgZmFpbCBkdXJpbmcgPGltZz4gZWxlbWVudCBjcmVhdGlvbiAqL1xuICBwcml2YXRlIHVwZGF0ZUltYWdlQ2FjaGUgPSBhc3luYyAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdLFxuICAgIGZpbGVzID0gdGhpcy5maWxlcyxcbiAgKSA9PiB7XG4gICAgY29uc3QgeyB1cGRhdGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9ID0gYXdhaXQgX3VwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgZmlsZUlkczogZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgICBmaWxlcyxcbiAgICB9KTtcbiAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUgfHwgZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgICAgZXJyb3JlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdXBkYXRlZEZpbGVzLCBlcnJvcmVkRmlsZXMgfTtcbiAgfTtcblxuICAvKiogYWRkcyBuZXcgaW1hZ2VzIHRvIGltYWdlQ2FjaGUgYW5kIHJlLXJlbmRlcnMgaWYgbmVlZGVkICovXG4gIHByaXZhdGUgYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlID0gYXN5bmMgKFxuICAgIGltYWdlRWxlbWVudHM6IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdID0gZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICksXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzID0gdGhpcy5maWxlcyxcbiAgKSA9PiB7XG4gICAgY29uc3QgdW5jYWNoZWRJbWFnZUVsZW1lbnRzID0gaW1hZ2VFbGVtZW50cy5maWx0ZXIoXG4gICAgICAoZWxlbWVudCkgPT4gIWVsZW1lbnQuaXNEZWxldGVkICYmICF0aGlzLmltYWdlQ2FjaGUuaGFzKGVsZW1lbnQuZmlsZUlkKSxcbiAgICApO1xuXG4gICAgaWYgKHVuY2FjaGVkSW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgdXBkYXRlZEZpbGVzIH0gPSBhd2FpdCB0aGlzLnVwZGF0ZUltYWdlQ2FjaGUoXG4gICAgICAgIHVuY2FjaGVkSW1hZ2VFbGVtZW50cyxcbiAgICAgICAgZmlsZXMsXG4gICAgICApO1xuICAgICAgaWYgKHVwZGF0ZWRGaWxlcy5zaXplKSB7XG4gICAgICAgIHRoaXMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIGdlbmVyYWxseSB5b3Ugc2hvdWxkIHVzZSBgYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKClgIGRpcmVjdGx5IGlmIHlvdSBuZWVkXG4gICAqICB0byByZW5kZXIgbmV3IGltYWdlcy4gVGhpcyBpcyBqdXN0IGEgZmFpbHNhZmUgICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbWFnZVJlZnJlc2ggPSB0aHJvdHRsZSgoKSA9PiB7XG4gICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgfSwgSU1BR0VfUkVOREVSX1RJTUVPVVQpO1xuXG4gIHByaXZhdGUgdXBkYXRlQmluZGluZ0VuYWJsZWRPblBvaW50ZXJNb3ZlID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICBjb25zdCBzaG91bGRFbmFibGVCaW5kaW5nID0gc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudChldmVudCk7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCAhPT0gc2hvdWxkRW5hYmxlQmluZGluZykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzQmluZGluZ0VuYWJsZWQ6IHNob3VsZEVuYWJsZUJpbmRpbmcgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yID0gKHBvaW50ZXJDb29yZHM6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9KTogdm9pZCA9PiB7XG4gICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICB0aGlzLnNjZW5lLFxuICAgICk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczpcbiAgICAgICAgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsID8gW2hvdmVyZWRCaW5kYWJsZUVsZW1lbnRdIDogW10sXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyA9IChcbiAgICBsaW5lYXJFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICAvKiogc2NlbmUgY29vcmRzICovXG4gICAgcG9pbnRlckNvb3Jkczoge1xuICAgICAgeDogbnVtYmVyO1xuICAgICAgeTogbnVtYmVyO1xuICAgIH1bXSxcbiAgICAvLyBEdXJpbmcgbGluZSBjcmVhdGlvbiB0aGUgc3RhcnQgYmluZGluZyBoYXNuJ3QgYmVlbiB3cml0dGVuIHlldFxuICAgIC8vIGludG8gYGxpbmVhckVsZW1lbnRgXG4gICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50PzogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCB8IG51bGwsXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmICghcG9pbnRlckNvb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IHBvaW50ZXJDb29yZHMucmVkdWNlKFxuICAgICAgKGFjYzogTm9uRGVsZXRlZDxFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50PltdLCBjb29yZHMpID0+IHtcbiAgICAgICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgICAgICBjb29yZHMsXG4gICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICAgICFpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQoXG4gICAgICAgICAgICBsaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCxcbiAgICAgICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQsXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2MucHVzaChob3ZlcmVkQmluZGFibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3MgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gZ2V0RWxpZ2libGVFbGVtZW50c0ZvckJpbmRpbmcoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdGlvbihoaXRFbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAvLyBDb250aW51ZSBlZGl0aW5nIHRoZSBzYW1lIGdyb3VwIGlmIHRoZSB1c2VyIHNlbGVjdGVkIGEgZGlmZmVyZW50XG4gICAgICAvLyBlbGVtZW50IGZyb20gaXRcbiAgICAgIGVkaXRpbmdHcm91cElkOlxuICAgICAgICBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgJiZcbiAgICAgICAgaGl0RWxlbWVudCAhPSBudWxsICYmXG4gICAgICAgIGlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkKVxuICAgICAgICAgID8gcHJldlN0YXRlLmVkaXRpbmdHcm91cElkXG4gICAgICAgICAgOiBudWxsLFxuICAgIH0pKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1JlZiA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XG4gICAgLy8gY2FudmFzIGlzIG51bGwgd2hlbiB1bm1vdW50aW5nXG4gICAgaWYgKGNhbnZhcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgICB0aGlzLnJjID0gcm91Z2guY2FudmFzKHRoaXMuY2FudmFzKTtcblxuICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgdGhpcy5oYW5kbGVXaGVlbCwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgdGhpcy5vblRhcFN0YXJ0KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9FTkQsIHRoaXMub25UYXBFbmQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUFwcE9uRHJvcCA9IGFzeW5jIChldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzLml0ZW0oMCk7XG5cbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBzY2VuZSBmcm9tIHRoZSBpbWFnZSBpZiBpdCdzIGVtYmVkZGVkXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIGlmIChmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnBuZyB8fCBmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgb24gb2xkZXIgcmVsZWFzZXMuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtc1swXTtcbiAgICAgICAgICAgICAgICAoZmlsZSBhcyBhbnkpLmhhbmRsZSA9IGF3YWl0IChcbiAgICAgICAgICAgICAgICAgIGl0ZW0gYXMgYW55XG4gICAgICAgICAgICAgICAgKS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2VuZSA9IGF3YWl0IGxvYWRGcm9tQmxvYihcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgICAgICAuLi5zY2VuZSxcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAuLi4oc2NlbmUuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJFbmNvZGluZ0Vycm9yXCIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gc2NlbmUgaXMgZW1iZWRkZWQgb3Igd2UgZmFpbCBmb3Igd2hhdGV2ZXIgcmVhc29uLCBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgY29uc3QgeyB4OiBzY2VuZVgsIHk6IHNjZW5lWSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gdGhpcy5jcmVhdGVJbWFnZUVsZW1lbnQoeyBzY2VuZVgsIHNjZW5lWSB9KTtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBmaWxlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsaWJyYXJ5U2hhcGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliKTtcbiAgICBpZiAobGlicmFyeVNoYXBlcyAhPT0gXCJcIikge1xuICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgIGVsZW1lbnRzOiBKU09OLnBhcnNlKGxpYnJhcnlTaGFwZXMpLFxuICAgICAgICBwb3NpdGlvbjogZXZlbnQsXG4gICAgICAgIGZpbGVzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMuaXRlbSgwKTtcbiAgICBpZiAoXG4gICAgICBmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIgfHxcbiAgICAgIGZpbGU/Lm5hbWU/LmVuZHNXaXRoKFwiLmV4Y2FsaWRyYXdsaWJcIilcbiAgICApIHtcbiAgICAgIHRoaXMubGlicmFyeVxuICAgICAgICAuaW1wb3J0TGlicmFyeShmaWxlKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gQ2xvc2UgYW5kIHRoZW4gb3BlbiB0byBnZXQgdGhlIGxpYnJhcmllcyB1cGRhdGVkXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IGZhbHNlIH0pO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiB0cnVlIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PlxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSksXG4gICAgICAgICk7XG4gICAgICAvLyBkZWZhdWx0OiBhc3N1bWUgYW4gRXhjYWxpZHJhdyBmaWxlIHJlZ2FyZGxlc3Mgb2YgZXh0ZW5zaW9uL01pbWVUeXBlXG4gICAgfSBlbHNlIGlmIChmaWxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgICAgaWYgKG5hdGl2ZUZpbGVTeXN0ZW1TdXBwb3J0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgb25seSB3b3JrIGFzIG9mIENocm9tZSA4NixcbiAgICAgICAgICAvLyBidXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIG9uIG9sZGVyIHJlbGVhc2VzLlxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgKGZpbGUgYXMgYW55KS5oYW5kbGUgPSBhd2FpdCAoaXRlbSBhcyBhbnkpLmdldEFzRmlsZVN5c3RlbUhhbmRsZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSk7XG4gICAgfVxuICB9O1xuXG4gIGxvYWRGaWxlVG9DYW52YXMgPSAoZmlsZTogQmxvYikgPT4ge1xuICAgIGxvYWRGcm9tQmxvYihmaWxlLCB0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKVxuICAgICAgLnRoZW4oKHNjZW5lKSA9PiB7XG4gICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgLi4uc2NlbmUsXG4gICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgIC4uLihzY2VuZS5hcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXBsYWNlRmlsZXM6IHRydWUsXG4gICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0NvbnRleHRNZW51ID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKFxuICAgICAgKGV2ZW50Lm5hdGl2ZUV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIgfHxcbiAgICAgICAgKGV2ZW50Lm5hdGl2ZUV2ZW50LnBvaW50ZXJUeXBlID09PSBcInBlblwiICYmXG4gICAgICAgICAgLy8gYWx3YXlzIGFsbG93IGlmIHVzZXIgdXNlcyBhIHBlbiBzZWNvbmRhcnkgYnV0dG9uXG4gICAgICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5TRUNPTkRBUlkpKSAmJlxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIlxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7IHByZWZlclNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnQgPyBcImVsZW1lbnRcIiA6IFwiY2FudmFzXCI7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCE7XG4gICAgY29uc3QgeyB0b3A6IG9mZnNldFRvcCwgbGVmdDogb2Zmc2V0TGVmdCB9ID1cbiAgICAgIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSB9LCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudSh7IHRvcCwgbGVmdCB9LCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSxcbiAgICAgICAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaW1hZ2UgPVxuICAgICAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgJiZcbiAgICAgICAgdGhpcy5pbWFnZUNhY2hlLmdldChkcmFnZ2luZ0VsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9XG4gICAgICAgIGltYWdlICYmICEoaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgID8gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHRcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgIGRyYWdOZXdFbGVtZW50KFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksXG4gICAgICAgIGdyaWRYLFxuICAgICAgICBncmlkWSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgZ3JpZFgpLFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LCBncmlkWSksXG4gICAgICAgIGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICAgICA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KVxuICAgICAgICAgIDogc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLFxuICAgICAgICBhc3BlY3RSYXRpbyxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChbZHJhZ2dpbmdFbGVtZW50XSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVIYW5kbGVSZXNpemUgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsXG4gICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzSW1hZ2VFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICAgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudClcbiAgICAgICAgICA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICByZXNpemVYLFxuICAgICAgICByZXNpemVZLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKiBAcHJpdmF0ZSB1c2UgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSAqL1xuICBwcml2YXRlIF9vcGVuQ29udGV4dE1lbnUgPSAoXG4gICAge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICB9OiB7XG4gICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICB0b3A6IG51bWJlcjtcbiAgICB9LFxuICAgIHR5cGU6IFwiY2FudmFzXCIgfCBcImVsZW1lbnRcIixcbiAgKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSB0cnVlO1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5QmVBbGxvd1VuYmluZGluZyA9IGFjdGlvblVuYmluZFRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5QmVBbGxvd0JpbmRpbmcgPSBhY3Rpb25CaW5kVGV4dC5jb250ZXh0SXRlbVByZWRpY2F0ZShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBDb250ZXh0TWVudU9wdGlvbltdID0gW107XG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNQbmcpO1xuICAgIH1cblxuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNTdmcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgY29uc3Qgdmlld01vZGVPcHRpb25zID0gW1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgIGFjdGlvblRvZ2dsZVN0YXRzLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IHZpZXdNb2RlT3B0aW9ucyxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VUeXBlLmlzTW9iaWxlICYmXG4gICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgICAgICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJlxuICAgICAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGFjdGlvbkNvcHlBc1BuZyxcbiAgICAgICAgICAgIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiZcbiAgICAgICAgICAgICAgZWxlbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBhY3Rpb25Db3B5QXNTdmcsXG4gICAgICAgICAgICAoKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25TZWxlY3RBbGwsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCAuLi5vcHRpb25zXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VUeXBlLmlzTW9iaWxlICYmIGFjdGlvbkN1dCxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksXG4gICAgICAgICAgICB0aGlzLmRldmljZVR5cGUuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZS5pc01vYmlsZSAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uQ29weVN0eWxlcyxcbiAgICAgICAgICAgIGFjdGlvblBhc3RlU3R5bGVzLFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgbWF5YmVHcm91cEFjdGlvbiAmJiBhY3Rpb25Hcm91cCxcbiAgICAgICAgICAgIG1heUJlQWxsb3dVbmJpbmRpbmcgJiYgYWN0aW9uVW5iaW5kVGV4dCxcbiAgICAgICAgICAgIG1heUJlQWxsb3dCaW5kaW5nICYmIGFjdGlvbkJpbmRUZXh0LFxuICAgICAgICAgICAgbWF5YmVVbmdyb3VwQWN0aW9uICYmIGFjdGlvblVuZ3JvdXAsXG4gICAgICAgICAgICAobWF5YmVHcm91cEFjdGlvbiB8fCBtYXliZVVuZ3JvdXBBY3Rpb24pICYmIHNlcGFyYXRvcixcbiAgICAgICAgICAgIGFjdGlvbkFkZFRvTGlicmFyeSxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIGFjdGlvblNlbmRCYWNrd2FyZCxcbiAgICAgICAgICAgIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgICAgICAgICAgIGFjdGlvblNlbmRUb0JhY2ssXG4gICAgICAgICAgICBhY3Rpb25CcmluZ1RvRnJvbnQsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBtYXliZUZsaXBIb3Jpem9udGFsICYmIGFjdGlvbkZsaXBIb3Jpem9udGFsLFxuICAgICAgICAgICAgbWF5YmVGbGlwVmVydGljYWwgJiYgYWN0aW9uRmxpcFZlcnRpY2FsLFxuICAgICAgICAgICAgKG1heWJlRmxpcEhvcml6b250YWwgfHwgbWF5YmVGbGlwVmVydGljYWwpICYmIHNlcGFyYXRvcixcbiAgICAgICAgICAgIGFjdGlvbkxpbmsuY29udGV4dEl0ZW1QcmVkaWNhdGUoZWxlbWVudHMsIHRoaXMuc3RhdGUpICYmIGFjdGlvbkxpbmssXG4gICAgICAgICAgICBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlV2hlZWwgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZIH0gPSBldmVudDtcbiAgICBjb25zdCB7IHNlbGVjdGVkRWxlbWVudElkcywgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgLy8gbm90ZSB0aGF0IGV2ZW50LmN0cmxLZXkgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBwaW5jaCB6b29taW5nXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkge1xuICAgICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbihkZWx0YVkpO1xuICAgICAgY29uc3QgTUFYX1NURVAgPSAxMDtcbiAgICAgIGxldCBkZWx0YSA9IE1hdGguYWJzKGRlbHRhWSk7XG4gICAgICBpZiAoZGVsdGEgPiBNQVhfU1RFUCkge1xuICAgICAgICBkZWx0YSA9IE1BWF9TVEVQO1xuICAgICAgfVxuICAgICAgZGVsdGEgKj0gc2lnbjtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdab29tID0gdGhpcy5zdGF0ZS56b29tLnZhbHVlIC0gZGVsdGEgLyAxMDA7XG4gICAgICAvLyBpbmNyZWFzZSB6b29tIHN0ZXBzIHRoZSBtb3JlIHpvb21lZC1pbiB3ZSBhcmUgKGFwcGxpZXMgdG8gPjEwMCUgb25seSlcbiAgICAgIG5ld1pvb20gKz0gTWF0aC5sb2cxMChNYXRoLm1heCgxLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpKSAqIC1zaWduO1xuICAgICAgLy8gcm91bmQgdG8gbmVhcmVzdCBzdGVwXG4gICAgICBuZXdab29tID0gTWF0aC5yb3VuZChuZXdab29tICogWk9PTV9TVEVQICogMTAwKSAvIChaT09NX1NURVAgKiAxMDApO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgLi4uZ2V0U3RhdGVGb3Jab29tKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZpZXdwb3J0WDogY3Vyc29yWCxcbiAgICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICAgIG5leHRab29tOiBnZXROb3JtYWxpemVkWm9vbShuZXdab29tKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczpcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgPyBzZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgICAgICAgIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYIH0pID0+ICh7XG4gICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFkgfSkgPT4gKHtcbiAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgfSkpO1xuICB9KTtcblxuICBwcml2YXRlIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICAgc2NhbGU6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKFxuICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCkpLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdChcbiAgICAgICAgeCAtIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICB5IC0gZWxlbWVudENlbnRlclksXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPVxuICAgICAgICBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHsgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCwgc2NlbmVZOiBlbGVtZW50Q2VudGVyWSB9LFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB2aWV3cG9ydFgsIHZpZXdwb3J0WSwgZWxlbWVudENlbnRlclgsIGVsZW1lbnRDZW50ZXJZIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUG9pbnRlciA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYnV0dG9uOiBcInVwXCIgfCBcImRvd25cIikgPT4ge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBpZiAoIXRoaXMudW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVET01SZWN0ID0gKGNiPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0LFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgd2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJlxuICAgICAgICBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiZcbiAgICAgICAgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiZcbiAgICAgICAgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3AsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0Q2FudmFzT2Zmc2V0cygpOiBQaWNrPEFwcFN0YXRlLCBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCI+IHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPVxuICAgICAgbGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuY29kZSA9PT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkgfHxcbiAgICAgIGRlZmF1bHRMYW5nO1xuICAgIGF3YWl0IHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcbiAgICB0aGlzLnNldEFwcFN0YXRlKHt9KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBoOiB7XG4gICAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICAgIHN0YXRlOiBBcHBTdGF0ZTtcbiAgICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgICAgIGFwcDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+O1xuICAgICAgaGlzdG9yeTogSGlzdG9yeTtcbiAgICB9O1xuICB9XG59XG5cbmlmIChcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbikge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8ICh7fSBhcyBXaW5kb3dbXCJoXCJdKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICAgIH0sXG4gICAgICBzZXQoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
|
|
1617
1617
|
|
|
1618
1618
|
/***/ }),
|
|
1619
1619
|
|
|
@@ -2383,7 +2383,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2383
2383
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2384
2384
|
|
|
2385
2385
|
"use strict";
|
|
2386
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n\r\n\r\n\r\n\r\n\r\nconst redrawTextBoundingBox = (element, container, appState) => {\r\n const maxWidth = container\r\n ? container.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2\r\n : undefined;\r\n let text = element.text;\r\n if (container) {\r\n text = wrapText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), container.width);\r\n }\r\n const metrics = measureText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), maxWidth);\r\n let coordY = element.y;\r\n // Resize container and vertically center align the text\r\n if (container) {\r\n let nextHeight = container.height;\r\n if (element.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\r\n coordY = container.y + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else if (element.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\r\n coordY =\r\n container.y + container.height - metrics.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else {\r\n coordY = container.y + container.height / 2 - metrics.height / 2;\r\n if (metrics.height > container.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n nextHeight = metrics.height + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\r\n }\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n width: metrics.width,\r\n height: metrics.height,\r\n baseline: metrics.baseline,\r\n y: coordY,\r\n text,\r\n });\r\n};\r\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\r\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\r\n oldElements.forEach((element) => {\r\n var _a;\r\n const newElementId = oldIdToDuplicatedId.get(element.id);\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\r\n if (newTextElementId) {\r\n const newContainer = sceneElementMap.get(newElementId);\r\n if (newContainer) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\r\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.concat({\r\n type: \"text\",\r\n id: newTextElementId,\r\n }),\r\n });\r\n }\r\n const newTextElement = sceneElementMap.get(newTextElementId);\r\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\r\n containerId: newContainer ? newElementId : null,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n};\r\nconst handleBindTextResize = (element, transformHandleType) => {\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element).getElement(boundTextElementId);\r\n if (textElement && textElement.text) {\r\n if (!element) {\r\n return;\r\n }\r\n let text = textElement.text;\r\n let nextHeight = textElement.height;\r\n let containerHeight = element.height;\r\n let nextBaseLine = textElement.baseline;\r\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\r\n if (text) {\r\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n }\r\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n nextHeight = dimensions.height;\r\n nextBaseLine = dimensions.baseline;\r\n }\r\n // increase height in case text element height exceeds\r\n if (nextHeight > element.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n containerHeight = nextHeight + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const diff = containerHeight - element.height;\r\n // fix the y coord when resizing from ne/nw/n\r\n const updatedY = transformHandleType === \"ne\" ||\r\n transformHandleType === \"nw\" ||\r\n transformHandleType === \"n\"\r\n ? element.y - diff\r\n : element.y;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n height: containerHeight,\r\n y: updatedY,\r\n });\r\n }\r\n let updatedY;\r\n if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\r\n updatedY = element.y + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\r\n updatedY = element.y + element.height - nextHeight - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else {\r\n updatedY = element.y + element.height / 2 - nextHeight / 2;\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\r\n text,\r\n // preserve padding and set width correctly\r\n width: element.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2,\r\n height: nextHeight,\r\n x: element.x + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING,\r\n y: updatedY,\r\n baseline: nextBaseLine,\r\n });\r\n }\r\n }\r\n};\r\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\r\nconst measureText = (text, font, maxWidth) => {\r\n text = text\r\n .split(\"\\n\")\r\n // replace empty lines with single space because leading/trailing empty\r\n // lines would be stripped from computation\r\n .map((x) => x || \" \")\r\n .join(\"\\n\");\r\n const container = document.createElement(\"div\");\r\n container.style.position = \"absolute\";\r\n container.style.whiteSpace = \"pre\";\r\n container.style.font = font;\r\n container.style.minHeight = \"1em\";\r\n if (maxWidth) {\r\n const lineHeight = getApproxLineHeight(font);\r\n container.style.width = `${String(maxWidth)}px`;\r\n container.style.maxWidth = `${String(maxWidth)}px`;\r\n container.style.overflow = \"hidden\";\r\n container.style.wordBreak = \"break-word\";\r\n container.style.lineHeight = `${String(lineHeight)}px`;\r\n container.style.whiteSpace = \"pre-wrap\";\r\n }\r\n document.body.appendChild(container);\r\n container.innerText = text;\r\n const span = document.createElement(\"span\");\r\n span.style.display = \"inline-block\";\r\n span.style.overflow = \"hidden\";\r\n span.style.width = \"1px\";\r\n span.style.height = \"1px\";\r\n container.appendChild(span);\r\n // Baseline is important for positioning text on canvas\r\n const baseline = span.offsetTop + span.offsetHeight;\r\n const width = container.offsetWidth;\r\n const height = container.offsetHeight;\r\n document.body.removeChild(container);\r\n return { width, height, baseline };\r\n};\r\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\r\nconst cacheApproxLineHeight = {};\r\nconst getApproxLineHeight = (font) => {\r\n if (cacheApproxLineHeight[font]) {\r\n return cacheApproxLineHeight[font];\r\n }\r\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\r\n return cacheApproxLineHeight[font];\r\n};\r\nlet canvas;\r\nconst getTextWidth = (text, font) => {\r\n if (!canvas) {\r\n canvas = document.createElement(\"canvas\");\r\n }\r\n const canvas2dContext = canvas.getContext(\"2d\");\r\n canvas2dContext.font = font;\r\n const metrics = canvas2dContext.measureText(text);\r\n // since in test env the canvas measureText algo\r\n // doesn't measure text and instead just returns number of\r\n // characters hence we assume that each letteris 10px\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\r\n return metrics.width * 10;\r\n }\r\n return metrics.width;\r\n};\r\nconst wrapText = (text, font, containerWidth) => {\r\n const maxWidth = containerWidth - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const lines = [];\r\n const originalLines = text.split(\"\\n\");\r\n const spaceWidth = getTextWidth(\" \", font);\r\n originalLines.forEach((originalLine) => {\r\n const words = originalLine.split(\" \");\r\n // This means its newline so push it\r\n if (words.length === 1 && words[0] === \"\") {\r\n lines.push(words[0]);\r\n }\r\n else {\r\n let currentLine = \"\";\r\n let currentLineWidthTillNow = 0;\r\n let index = 0;\r\n while (index < words.length) {\r\n const currentWordWidth = getTextWidth(words[index], font);\r\n // Start breaking longer words exceeding max width\r\n if (currentWordWidth >= maxWidth) {\r\n // push current line since the current word exceeds the max width\r\n // so will be appended in next line\r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n while (words[index].length > 0) {\r\n const currentChar = words[index][0];\r\n const width = charWidth.calculate(currentChar, font);\r\n currentLineWidthTillNow += width;\r\n words[index] = words[index].slice(1);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n currentLine = currentChar;\r\n currentLineWidthTillNow = width;\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n else {\r\n currentLine += currentChar;\r\n }\r\n }\r\n // push current line if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n else {\r\n // space needs to be appended before next word\r\n // as currentLine contains chars which couldn't be appended\r\n // to previous line\r\n currentLine += \" \";\r\n currentLineWidthTillNow += spaceWidth;\r\n }\r\n index++;\r\n }\r\n else {\r\n // Start appending words in a line till max width reached\r\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\r\n const word = words[index];\r\n currentLineWidthTillNow = getTextWidth(currentLine + word, font);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLineWidthTillNow = 0;\r\n currentLine = \"\";\r\n break;\r\n }\r\n index++;\r\n currentLine += `${word} `;\r\n // Push the word if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine.slice(0, -1));\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n break;\r\n }\r\n }\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n }\r\n if (currentLine) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n }\r\n }\r\n });\r\n return lines.join(\"\\n\");\r\n};\r\nconst charWidth = (() => {\r\n const cachedCharWidth = {};\r\n const calculate = (char, font) => {\r\n const ascii = char.charCodeAt(0);\r\n if (!cachedCharWidth[font]) {\r\n cachedCharWidth[font] = [];\r\n }\r\n if (!cachedCharWidth[font][ascii]) {\r\n const width = getTextWidth(char, font);\r\n cachedCharWidth[font][ascii] = width;\r\n }\r\n return cachedCharWidth[font][ascii];\r\n };\r\n const getCache = (font) => {\r\n return cachedCharWidth[font];\r\n };\r\n return {\r\n calculate,\r\n getCache,\r\n };\r\n})();\r\nconst getApproxMinLineWidth = (font) => {\r\n const maxCharWidth = getMaxCharWidth(font);\r\n if (maxCharWidth === 0) {\r\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\r\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\r\n }\r\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n};\r\nconst getApproxMinLineHeight = (font) => {\r\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n};\r\nconst getMinCharWidth = (font) => {\r\n const cache = charWidth.getCache(font);\r\n if (!cache) {\r\n return 0;\r\n }\r\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\r\n return Math.min(...cacheWithOutEmpty);\r\n};\r\nconst getMaxCharWidth = (font) => {\r\n const cache = charWidth.getCache(font);\r\n if (!cache) {\r\n return 0;\r\n }\r\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\r\n return Math.max(...cacheWithOutEmpty);\r\n};\r\nconst getApproxCharsToFitInWidth = (font, width) => {\r\n // Generally lower case is used so converting to lower case\r\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\r\n const batchLength = 6;\r\n let index = 0;\r\n let widthTillNow = 0;\r\n let str = \"\";\r\n while (widthTillNow <= width) {\r\n const batch = dummyText.substr(index, index + batchLength);\r\n str += batch;\r\n widthTillNow += getTextWidth(str, font);\r\n if (index === dummyText.length - 1) {\r\n index = 0;\r\n }\r\n index = index + batchLength;\r\n }\r\n while (widthTillNow > width) {\r\n str = str.substr(0, str.length - 1);\r\n widthTillNow = getTextWidth(str, font);\r\n }\r\n return str.length;\r\n};\r\nconst getBoundTextElementId = (container) => {\r\n var _a, _b, _c;\r\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\r\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\r\n null\r\n : null;\r\n};\r\nconst getBoundTextElement = (element) => {\r\n var _a;\r\n if (!element) {\r\n return null;\r\n }\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\r\n }\r\n return null;\r\n};\r\nconst getContainerElement = (element) => {\r\n var _a;\r\n if (!element) {\r\n return null;\r\n }\r\n if (element.containerId) {\r\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\r\n }\r\n return null;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVLLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsT0FFUSxFQUNSLEVBQUU7O0lBQ0YsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7UUFDdkIsT0FBTyxvRUFBYyxDQUFDLE9BQU8sQ0FBQywwQ0FBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFJLElBQUksQ0FBQztLQUN6RTtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gIEZvbnRTdHJpbmcsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBCT1VORF9URVhUX1BBRERJTkcsIFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlIH0gZnJvbSBcIi4vdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgY29uc3QgbWF4V2lkdGggPSBjb250YWluZXJcbiAgICA/IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICA6IHVuZGVmaW5lZDtcbiAgbGV0IHRleHQgPSBlbGVtZW50LnRleHQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIGVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICAgIGNvbnRhaW5lci53aWR0aCxcbiAgICApO1xuICB9XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICBlbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICBnZXRGb250U3RyaW5nKGVsZW1lbnQpLFxuICAgIG1heFdpZHRoLFxuICApO1xuXG4gIGxldCBjb29yZFkgPSBlbGVtZW50Lnk7XG4gIC8vIFJlc2l6ZSBjb250YWluZXIgYW5kIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBsZXQgbmV4dEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG5cbiAgICBpZiAoZWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgQk9VTkRfVEVYVF9QQURESU5HO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICAgIGNvb3JkWSA9XG4gICAgICAgIGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gbWV0cmljcy5oZWlnaHQgLyAyO1xuICAgICAgaWYgKG1ldHJpY3MuaGVpZ2h0ID4gY29udGFpbmVyLmhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIpIHtcbiAgICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0ICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBuZXh0SGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICB9XG5cbiAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICB5OiBjb29yZFksXG4gICAgdGV4dCxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiA9IChcbiAgc2NlbmVFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZElkVG9EdXBsaWNhdGVkSWQ6IE1hcDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdPixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzY2VuZUVsZW1lbnRNYXAgPSBhcnJheVRvTWFwKHNjZW5lRWxlbWVudHMpIGFzIE1hcDxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50XG4gID47XG4gIG9sZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmlkKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGJvdW5kVGV4dEVsZW1lbnRJZCk7XG4gICAgICBpZiAobmV3VGV4dEVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld0VsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdDb250YWluZXIpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld0NvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogZWxlbWVudC5ib3VuZEVsZW1lbnRzPy5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUZXh0RWxlbWVudCA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KG5ld1RleHRFbGVtZW50KSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBuZXdDb250YWluZXIgPyBuZXdFbGVtZW50SWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUsXG4pID0+IHtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgY29uc3QgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBpZiAodGV4dEVsZW1lbnQgJiYgdGV4dEVsZW1lbnQudGV4dCkge1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICAgIGxldCBuZXh0SGVpZ2h0ID0gdGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IGNvbnRhaW5lckhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IG5leHRCYXNlTGluZSA9IHRleHRFbGVtZW50LmJhc2VsaW5lO1xuICAgICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gbWVhc3VyZVRleHQoXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICApO1xuICAgICAgICBuZXh0SGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICAgIG5leHRCYXNlTGluZSA9IGRpbWVuc2lvbnMuYmFzZWxpbmU7XG4gICAgICB9XG4gICAgICAvLyBpbmNyZWFzZSBoZWlnaHQgaW4gY2FzZSB0ZXh0IGVsZW1lbnQgaGVpZ2h0IGV4Y2VlZHNcbiAgICAgIGlmIChuZXh0SGVpZ2h0ID4gZWxlbWVudC5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyKSB7XG4gICAgICAgIGNvbnRhaW5lckhlaWdodCA9IG5leHRIZWlnaHQgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICBjb25zdCBkaWZmID0gY29udGFpbmVySGVpZ2h0IC0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIC8vIGZpeCB0aGUgeSBjb29yZCB3aGVuIHJlc2l6aW5nIGZyb20gbmUvbncvblxuICAgICAgICBjb25zdCB1cGRhdGVkWSA9XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuZVwiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuXCJcbiAgICAgICAgICAgID8gZWxlbWVudC55IC0gZGlmZlxuICAgICAgICAgICAgOiBlbGVtZW50Lnk7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0LFxuICAgICAgICAgIHk6IHVwZGF0ZWRZLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRZO1xuICAgICAgaWYgKHRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLlRPUCkge1xuICAgICAgICB1cGRhdGVkWSA9IGVsZW1lbnQueSArIEJPVU5EX1RFWFRfUEFERElORztcbiAgICAgIH0gZWxzZSBpZiAodGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgIHVwZGF0ZWRZID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQgLSBuZXh0SGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlZFkgPSBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCAvIDIgLSBuZXh0SGVpZ2h0IC8gMjtcbiAgICAgIH1cblxuICAgICAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwge1xuICAgICAgICB0ZXh0LFxuICAgICAgICAvLyBwcmVzZXJ2ZSBwYWRkaW5nIGFuZCBzZXQgd2lkdGggY29ycmVjdGx5XG4gICAgICAgIHdpZHRoOiBlbGVtZW50LndpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMixcbiAgICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgICAgICB4OiBlbGVtZW50LnggKyBCT1VORF9URVhUX1BBRERJTkcsXG4gICAgICAgIHk6IHVwZGF0ZWRZLFxuICAgICAgICBiYXNlbGluZTogbmV4dEJhc2VMaW5lLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBtYXhXaWR0aD86IG51bWJlciB8IG51bGwsXG4pID0+IHtcbiAgdGV4dCA9IHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAvLyByZXBsYWNlIGVtcHR5IGxpbmVzIHdpdGggc2luZ2xlIHNwYWNlIGJlY2F1c2UgbGVhZGluZy90cmFpbGluZyBlbXB0eVxuICAgIC8vIGxpbmVzIHdvdWxkIGJlIHN0cmlwcGVkIGZyb20gY29tcHV0YXRpb25cbiAgICAubWFwKCh4KSA9PiB4IHx8IFwiIFwiKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgY29udGFpbmVyLnN0eWxlLmZvbnQgPSBmb250O1xuICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gXCIxZW1cIjtcbiAgaWYgKG1heFdpZHRoKSB7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IGdldEFwcHJveExpbmVIZWlnaHQoZm9udCk7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7U3RyaW5nKG1heFdpZHRoKX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gYCR7U3RyaW5nKG1heFdpZHRoKX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb250YWluZXIuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLmxpbmVIZWlnaHQgPSBgJHtTdHJpbmcobGluZUhlaWdodCl9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICB9XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgY29udGFpbmVyLmlubmVyVGV4dCA9IHRleHQ7XG5cbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICBzcGFuLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgc3Bhbi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG4gIHNwYW4uc3R5bGUuaGVpZ2h0ID0gXCIxcHhcIjtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNwYW4pO1xuICAvLyBCYXNlbGluZSBpcyBpbXBvcnRhbnQgZm9yIHBvc2l0aW9uaW5nIHRleHQgb24gY2FudmFzXG4gIGNvbnN0IGJhc2VsaW5lID0gc3Bhbi5vZmZzZXRUb3AgKyBzcGFuLm9mZnNldEhlaWdodDtcbiAgY29uc3Qgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG5cbiAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLm9mZnNldEhlaWdodDtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuXG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH07XG59O1xuXG5jb25zdCBEVU1NWV9URVhUID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIi50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuY29uc3QgY2FjaGVBcHByb3hMaW5lSGVpZ2h0OiB7IFtrZXk6IEZvbnRTdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TGluZUhlaWdodCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGlmIChjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF0pIHtcbiAgICByZXR1cm4gY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdO1xuICB9XG4gIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XSA9IG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQsIGZvbnQsIG51bGwpLmhlaWdodDtcbiAgcmV0dXJuIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XTtcbn07XG5cbmxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkO1xuY29uc3QgZ2V0VGV4dFdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcblxuICBjb25zdCBtZXRyaWNzID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpO1xuICAvLyBzaW5jZSBpbiB0ZXN0IGVudiB0aGUgY2FudmFzIG1lYXN1cmVUZXh0IGFsZ29cbiAgLy8gZG9lc24ndCBtZWFzdXJlIHRleHQgYW5kIGluc3RlYWQganVzdCByZXR1cm5zIG51bWJlciBvZlxuICAvLyBjaGFyYWN0ZXJzIGhlbmNlIHdlIGFzc3VtZSB0aGF0IGVhY2ggbGV0dGVyaXMgMTBweFxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICByZXR1cm4gbWV0cmljcy53aWR0aCAqIDEwO1xuICB9XG5cbiAgcmV0dXJuIG1ldHJpY3Mud2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udDogRm9udFN0cmluZyxcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBtYXhXaWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBjb25zdCBsaW5lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjb25zdCBvcmlnaW5hbExpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgc3BhY2VXaWR0aCA9IGdldFRleHRXaWR0aChcIiBcIiwgZm9udCk7XG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3Qgd29yZHMgPSBvcmlnaW5hbExpbmUuc3BsaXQoXCIgXCIpO1xuICAgIC8vIFRoaXMgbWVhbnMgaXRzIG5ld2xpbmUgc28gcHVzaCBpdFxuICAgIGlmICh3b3Jkcy5sZW5ndGggPT09IDEgJiYgd29yZHNbMF0gPT09IFwiXCIpIHtcbiAgICAgIGxpbmVzLnB1c2god29yZHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgbGV0IGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50V29yZFdpZHRoID0gZ2V0VGV4dFdpZHRoKHdvcmRzW2luZGV4XSwgZm9udCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYnJlYWtpbmcgbG9uZ2VyIHdvcmRzIGV4Y2VlZGluZyBtYXggd2lkdGhcbiAgICAgICAgaWYgKGN1cnJlbnRXb3JkV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBzaW5jZSB0aGUgY3VycmVudCB3b3JkIGV4Y2VlZHMgdGhlIG1heCB3aWR0aFxuICAgICAgICAgIC8vIHNvIHdpbGwgYmUgYXBwZW5kZWQgaW4gbmV4dCBsaW5lXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAod29yZHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gd29yZHNbaW5kZXhdWzBdO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHdpZHRoO1xuICAgICAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZHNbaW5kZXhdLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IHdpZHRoO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgICAvLyBhcyBjdXJyZW50TGluZSBjb250YWlucyBjaGFycyB3aGljaCBjb3VsZG4ndCBiZSBhcHBlbmRlZFxuICAgICAgICAgICAgLy8gdG8gcHJldmlvdXMgbGluZVxuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSBzcGFjZVdpZHRoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1tpbmRleF07XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldFRleHRXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAke3dvcmR9IGA7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHdvcmQgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUuc2xpY2UoMCwgLTEpKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudExpbmUpIHtcbiAgICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoYXJXaWR0aCA9ICgoKSA9PiB7XG4gIGNvbnN0IGNhY2hlZENoYXJXaWR0aDogeyBba2V5OiBGb250U3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0ge307XG5cbiAgY29uc3QgY2FsY3VsYXRlID0gKGNoYXI6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIGNvbnN0IGFzY2lpID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdKSB7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aChjaGFyLCBmb250KTtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0gPSB3aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXTtcbiAgfTtcblxuICBjb25zdCBnZXRDYWNoZSA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGUsXG4gICAgZ2V0Q2FjaGUsXG4gIH07XG59KSgpO1xuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1heENoYXJXaWR0aCA9IGdldE1heENoYXJXaWR0aChmb250KTtcbiAgaWYgKG1heENoYXJXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBtZWFzdXJlVGV4dChEVU1NWV9URVhULnNwbGl0KFwiXCIpLmpvaW4oXCJcXG5cIiksIGZvbnQpLndpZHRoICtcbiAgICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICApO1xuICB9XG4gIHJldHVybiBtYXhDaGFyV2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIE1hdGgubWF4KC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0VGV4dFdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRUZXh0V2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8ubGVuZ3RoXG4gICAgPyBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZCB8fFxuICAgICAgICBudWxsXG4gICAgOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcikgfHwgbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRWxlbWVudCA9IChcbiAgZWxlbWVudDpcbiAgICB8IChFeGNhbGlkcmF3RWxlbWVudCAmIHsgY29udGFpbmVySWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gfCBudWxsIH0pXG4gICAgfCBudWxsLFxuKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChlbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgcmV0dXJuIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGVsZW1lbnQuY29udGFpbmVySWQpIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
2386
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n\r\n\r\n\r\n\r\n\r\nconst redrawTextBoundingBox = (element, container) => {\r\n const maxWidth = container\r\n ? container.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2\r\n : undefined;\r\n let text = element.text;\r\n if (container) {\r\n text = wrapText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), container.width);\r\n }\r\n const metrics = measureText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), maxWidth);\r\n let coordY = element.y;\r\n let coordX = element.x;\r\n // Resize container and vertically center align the text\r\n if (container) {\r\n let nextHeight = container.height;\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n if (element.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\r\n coordY = container.y + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else if (element.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\r\n coordY =\r\n container.y + container.height - metrics.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else {\r\n coordY = container.y + container.height / 2 - metrics.height / 2;\r\n if (metrics.height > container.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n nextHeight = metrics.height + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\r\n }\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n width: metrics.width,\r\n height: metrics.height,\r\n baseline: metrics.baseline,\r\n y: coordY,\r\n x: coordX,\r\n text,\r\n });\r\n};\r\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\r\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\r\n oldElements.forEach((element) => {\r\n var _a;\r\n const newElementId = oldIdToDuplicatedId.get(element.id);\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\r\n if (newTextElementId) {\r\n const newContainer = sceneElementMap.get(newElementId);\r\n if (newContainer) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\r\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.concat({\r\n type: \"text\",\r\n id: newTextElementId,\r\n }),\r\n });\r\n }\r\n const newTextElement = sceneElementMap.get(newTextElementId);\r\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\r\n containerId: newContainer ? newElementId : null,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n};\r\nconst handleBindTextResize = (element, transformHandleType) => {\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element).getElement(boundTextElementId);\r\n if (textElement && textElement.text) {\r\n if (!element) {\r\n return;\r\n }\r\n let text = textElement.text;\r\n let nextHeight = textElement.height;\r\n let containerHeight = element.height;\r\n let nextBaseLine = textElement.baseline;\r\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\r\n if (text) {\r\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n }\r\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n nextHeight = dimensions.height;\r\n nextBaseLine = dimensions.baseline;\r\n }\r\n // increase height in case text element height exceeds\r\n if (nextHeight > element.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n containerHeight = nextHeight + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const diff = containerHeight - element.height;\r\n // fix the y coord when resizing from ne/nw/n\r\n const updatedY = transformHandleType === \"ne\" ||\r\n transformHandleType === \"nw\" ||\r\n transformHandleType === \"n\"\r\n ? element.y - diff\r\n : element.y;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n height: containerHeight,\r\n y: updatedY,\r\n });\r\n }\r\n let updatedY;\r\n if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\r\n updatedY = element.y + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\r\n updatedY = element.y + element.height - nextHeight - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\r\n }\r\n else {\r\n updatedY = element.y + element.height / 2 - nextHeight / 2;\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\r\n text,\r\n // preserve padding and set width correctly\r\n width: element.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2,\r\n height: nextHeight,\r\n x: element.x + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING,\r\n y: updatedY,\r\n baseline: nextBaseLine,\r\n });\r\n }\r\n }\r\n};\r\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\r\nconst measureText = (text, font, maxWidth) => {\r\n text = text\r\n .split(\"\\n\")\r\n // replace empty lines with single space because leading/trailing empty\r\n // lines would be stripped from computation\r\n .map((x) => x || \" \")\r\n .join(\"\\n\");\r\n const container = document.createElement(\"div\");\r\n container.style.position = \"absolute\";\r\n container.style.whiteSpace = \"pre\";\r\n container.style.font = font;\r\n container.style.minHeight = \"1em\";\r\n if (maxWidth) {\r\n const lineHeight = getApproxLineHeight(font);\r\n container.style.width = `${String(maxWidth)}px`;\r\n container.style.maxWidth = `${String(maxWidth)}px`;\r\n container.style.overflow = \"hidden\";\r\n container.style.wordBreak = \"break-word\";\r\n container.style.lineHeight = `${String(lineHeight)}px`;\r\n container.style.whiteSpace = \"pre-wrap\";\r\n }\r\n document.body.appendChild(container);\r\n container.innerText = text;\r\n const span = document.createElement(\"span\");\r\n span.style.display = \"inline-block\";\r\n span.style.overflow = \"hidden\";\r\n span.style.width = \"1px\";\r\n span.style.height = \"1px\";\r\n container.appendChild(span);\r\n // Baseline is important for positioning text on canvas\r\n const baseline = span.offsetTop + span.offsetHeight;\r\n const width = container.offsetWidth;\r\n const height = container.offsetHeight;\r\n document.body.removeChild(container);\r\n return { width, height, baseline };\r\n};\r\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\r\nconst cacheApproxLineHeight = {};\r\nconst getApproxLineHeight = (font) => {\r\n if (cacheApproxLineHeight[font]) {\r\n return cacheApproxLineHeight[font];\r\n }\r\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\r\n return cacheApproxLineHeight[font];\r\n};\r\nlet canvas;\r\nconst getTextWidth = (text, font) => {\r\n if (!canvas) {\r\n canvas = document.createElement(\"canvas\");\r\n }\r\n const canvas2dContext = canvas.getContext(\"2d\");\r\n canvas2dContext.font = font;\r\n const metrics = canvas2dContext.measureText(text);\r\n // since in test env the canvas measureText algo\r\n // doesn't measure text and instead just returns number of\r\n // characters hence we assume that each letteris 10px\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\r\n return metrics.width * 10;\r\n }\r\n return metrics.width;\r\n};\r\nconst wrapText = (text, font, containerWidth) => {\r\n const maxWidth = containerWidth - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const lines = [];\r\n const originalLines = text.split(\"\\n\");\r\n const spaceWidth = getTextWidth(\" \", font);\r\n originalLines.forEach((originalLine) => {\r\n const words = originalLine.split(\" \");\r\n // This means its newline so push it\r\n if (words.length === 1 && words[0] === \"\") {\r\n lines.push(words[0]);\r\n }\r\n else {\r\n let currentLine = \"\";\r\n let currentLineWidthTillNow = 0;\r\n let index = 0;\r\n while (index < words.length) {\r\n const currentWordWidth = getTextWidth(words[index], font);\r\n // Start breaking longer words exceeding max width\r\n if (currentWordWidth >= maxWidth) {\r\n // push current line since the current word exceeds the max width\r\n // so will be appended in next line\r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n while (words[index].length > 0) {\r\n const currentChar = words[index][0];\r\n const width = charWidth.calculate(currentChar, font);\r\n currentLineWidthTillNow += width;\r\n words[index] = words[index].slice(1);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n currentLine = currentChar;\r\n currentLineWidthTillNow = width;\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n else {\r\n currentLine += currentChar;\r\n }\r\n }\r\n // push current line if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n else {\r\n // space needs to be appended before next word\r\n // as currentLine contains chars which couldn't be appended\r\n // to previous line\r\n currentLine += \" \";\r\n currentLineWidthTillNow += spaceWidth;\r\n }\r\n index++;\r\n }\r\n else {\r\n // Start appending words in a line till max width reached\r\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\r\n const word = words[index];\r\n currentLineWidthTillNow = getTextWidth(currentLine + word, font);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLineWidthTillNow = 0;\r\n currentLine = \"\";\r\n break;\r\n }\r\n index++;\r\n currentLine += `${word} `;\r\n // Push the word if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine.slice(0, -1));\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n break;\r\n }\r\n }\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n }\r\n if (currentLine) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n }\r\n }\r\n });\r\n return lines.join(\"\\n\");\r\n};\r\nconst charWidth = (() => {\r\n const cachedCharWidth = {};\r\n const calculate = (char, font) => {\r\n const ascii = char.charCodeAt(0);\r\n if (!cachedCharWidth[font]) {\r\n cachedCharWidth[font] = [];\r\n }\r\n if (!cachedCharWidth[font][ascii]) {\r\n const width = getTextWidth(char, font);\r\n cachedCharWidth[font][ascii] = width;\r\n }\r\n return cachedCharWidth[font][ascii];\r\n };\r\n const getCache = (font) => {\r\n return cachedCharWidth[font];\r\n };\r\n return {\r\n calculate,\r\n getCache,\r\n };\r\n})();\r\nconst getApproxMinLineWidth = (font) => {\r\n const maxCharWidth = getMaxCharWidth(font);\r\n if (maxCharWidth === 0) {\r\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\r\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\r\n }\r\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n};\r\nconst getApproxMinLineHeight = (font) => {\r\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n};\r\nconst getMinCharWidth = (font) => {\r\n const cache = charWidth.getCache(font);\r\n if (!cache) {\r\n return 0;\r\n }\r\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\r\n return Math.min(...cacheWithOutEmpty);\r\n};\r\nconst getMaxCharWidth = (font) => {\r\n const cache = charWidth.getCache(font);\r\n if (!cache) {\r\n return 0;\r\n }\r\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\r\n return Math.max(...cacheWithOutEmpty);\r\n};\r\nconst getApproxCharsToFitInWidth = (font, width) => {\r\n // Generally lower case is used so converting to lower case\r\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\r\n const batchLength = 6;\r\n let index = 0;\r\n let widthTillNow = 0;\r\n let str = \"\";\r\n while (widthTillNow <= width) {\r\n const batch = dummyText.substr(index, index + batchLength);\r\n str += batch;\r\n widthTillNow += getTextWidth(str, font);\r\n if (index === dummyText.length - 1) {\r\n index = 0;\r\n }\r\n index = index + batchLength;\r\n }\r\n while (widthTillNow > width) {\r\n str = str.substr(0, str.length - 1);\r\n widthTillNow = getTextWidth(str, font);\r\n }\r\n return str.length;\r\n};\r\nconst getBoundTextElementId = (container) => {\r\n var _a, _b, _c;\r\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\r\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\r\n null\r\n : null;\r\n};\r\nconst getBoundTextElement = (element) => {\r\n var _a;\r\n if (!element) {\r\n return null;\r\n }\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\r\n }\r\n return null;\r\n};\r\nconst getContainerElement = (element) => {\r\n var _a;\r\n if (!element) {\r\n return null;\r\n }\r\n if (element.containerId) {\r\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\r\n }\r\n return null;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFPLENBQ0wsQ0FBQyxtRUFBYyxDQUFDLE9BQU8sQ0FBQywwQ0FBRSxVQUFVLENBQ2xDLGtCQUFrQixDQUNvQixLQUFJLElBQUksQ0FDakQsQ0FBQztLQUNIO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFSyxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLE9BRVEsRUFDUixFQUFFOztJQUNGLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDWixPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO1FBQ3ZCLE9BQU8sb0VBQWMsQ0FBQyxPQUFPLENBQUMsMENBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSSxJQUFJLENBQUM7S0FDekU7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRFbGVtZW50LnRzPzQyZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgYXJyYXlUb01hcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyXG4gICAgPyBjb250YWluZXIud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgOiB1bmRlZmluZWQ7XG4gIGxldCB0ZXh0ID0gZWxlbWVudC50ZXh0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICBlbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICBjb250YWluZXIud2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgZWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICBtYXhXaWR0aCxcbiAgKTtcbiAgbGV0IGNvb3JkWSA9IGVsZW1lbnQueTtcbiAgbGV0IGNvb3JkWCA9IGVsZW1lbnQueDtcbiAgLy8gUmVzaXplIGNvbnRhaW5lciBhbmQgdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGxldCBuZXh0SGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodDtcbiAgICBjb29yZFggPSBjb250YWluZXIueCArIEJPVU5EX1RFWFRfUEFERElORztcbiAgICBpZiAoZWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgQk9VTkRfVEVYVF9QQURESU5HO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICAgIGNvb3JkWSA9XG4gICAgICAgIGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gbWV0cmljcy5oZWlnaHQgLyAyO1xuICAgICAgaWYgKG1ldHJpY3MuaGVpZ2h0ID4gY29udGFpbmVyLmhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIpIHtcbiAgICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0ICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBuZXh0SGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICB9XG4gIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgIGhlaWdodDogbWV0cmljcy5oZWlnaHQsXG4gICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUsXG4gICAgeTogY29vcmRZLFxuICAgIHg6IGNvb3JkWCxcbiAgICB0ZXh0LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uID0gKFxuICBzY2VuZUVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkSWRUb0R1cGxpY2F0ZWRJZDogTWFwPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjZW5lRWxlbWVudE1hcCA9IGFycmF5VG9NYXAoc2NlbmVFbGVtZW50cykgYXMgTWFwPFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sXG4gICAgRXhjYWxpZHJhd0VsZW1lbnRcbiAgPjtcbiAgb2xkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpIGFzIHN0cmluZztcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCBuZXdUZXh0RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIGlmIChuZXdUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld0NvbnRhaW5lcikge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3Q29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudHM/LmNvbmNhdCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICBpZDogbmV3VGV4dEVsZW1lbnRJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50ID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld1RleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQobmV3VGV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdUZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgY29udGFpbmVySWQ6IG5ld0NvbnRhaW5lciA/IG5ld0VsZW1lbnRJZCA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICBjb25zdCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5nZXRFbGVtZW50KFxuICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGlmICh0ZXh0RWxlbWVudCAmJiB0ZXh0RWxlbWVudC50ZXh0KSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuICAgICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICBsZXQgbmV4dEJhc2VMaW5lID0gdGV4dEVsZW1lbnQuYmFzZWxpbmU7XG4gICAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJuXCIgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJzXCIpIHtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICAgIGVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBtZWFzdXJlVGV4dChcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgIGVsZW1lbnQud2lkdGgsXG4gICAgICAgICk7XG4gICAgICAgIG5leHRIZWlnaHQgPSBkaW1lbnNpb25zLmhlaWdodDtcbiAgICAgICAgbmV4dEJhc2VMaW5lID0gZGltZW5zaW9ucy5iYXNlbGluZTtcbiAgICAgIH1cbiAgICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgICAgaWYgKG5leHRIZWlnaHQgPiBlbGVtZW50LmhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIpIHtcbiAgICAgICAgY29udGFpbmVySGVpZ2h0ID0gbmV4dEhlaWdodCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBjb250YWluZXJIZWlnaHQgLSBlbGVtZW50LmhlaWdodDtcbiAgICAgICAgLy8gZml4IHRoZSB5IGNvb3JkIHdoZW4gcmVzaXppbmcgZnJvbSBuZS9udy9uXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5cIlxuICAgICAgICAgICAgPyBlbGVtZW50LnkgLSBkaWZmXG4gICAgICAgICAgICA6IGVsZW1lbnQueTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgdXBkYXRlZFk7XG4gICAgICBpZiAodGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uVE9QKSB7XG4gICAgICAgIHVwZGF0ZWRZID0gZWxlbWVudC55ICsgQk9VTkRfVEVYVF9QQURESU5HO1xuICAgICAgfSBlbHNlIGlmICh0ZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICAgICAgdXBkYXRlZFkgPSBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCAtIG5leHRIZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVkWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMiAtIG5leHRIZWlnaHQgLyAyO1xuICAgICAgfVxuXG4gICAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICAgIHRleHQsXG4gICAgICAgIC8vIHByZXNlcnZlIHBhZGRpbmcgYW5kIHNldCB3aWR0aCBjb3JyZWN0bHlcbiAgICAgICAgd2lkdGg6IGVsZW1lbnQud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyLFxuICAgICAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgICAgIHg6IGVsZW1lbnQueCArIEJPVU5EX1RFWFRfUEFERElORyxcbiAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICAgIGJhc2VsaW5lOiBuZXh0QmFzZUxpbmUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmFzc2F0b3IvY2FudmFzLXRleHQtZWRpdG9yL2Jsb2IvbWFzdGVyL2xpYi9Gb250TWV0cmljcy5qc1xuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIG1heFdpZHRoPzogbnVtYmVyIHwgbnVsbCxcbikgPT4ge1xuICB0ZXh0ID0gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC8vIHJlcGxhY2UgZW1wdHkgbGluZXMgd2l0aCBzaW5nbGUgc3BhY2UgYmVjYXVzZSBsZWFkaW5nL3RyYWlsaW5nIGVtcHR5XG4gICAgLy8gbGluZXMgd291bGQgYmUgc3RyaXBwZWQgZnJvbSBjb21wdXRhdGlvblxuICAgIC5tYXAoKHgpID0+IHggfHwgXCIgXCIpXG4gICAgLmpvaW4oXCJcXG5cIik7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuICBpZiAobWF4V2lkdGgpIHtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChmb250KTtcbiAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHtTdHJpbmcobWF4V2lkdGgpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUubWF4V2lkdGggPSBgJHtTdHJpbmcobWF4V2lkdGgpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS53b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgICBjb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IGAke1N0cmluZyhsaW5lSGVpZ2h0KX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICBjb250YWluZXIuaW5uZXJUZXh0ID0gdGV4dDtcblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gIHNwYW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICBzcGFuLnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIC8vIEJhc2VsaW5lIGlzIGltcG9ydGFudCBmb3IgcG9zaXRpb25pbmcgdGV4dCBvbiBjYW52YXNcbiAgY29uc3QgYmFzZWxpbmUgPSBzcGFuLm9mZnNldFRvcCArIHNwYW4ub2Zmc2V0SGVpZ2h0O1xuICBjb25zdCB3aWR0aCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aDtcblxuICBjb25zdCBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7XG5cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUgfTtcbn07XG5cbmNvbnN0IERVTU1ZX1RFWFQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OVwiLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG5jb25zdCBjYWNoZUFwcHJveExpbmVIZWlnaHQ6IHsgW2tleTogRm9udFN0cmluZ106IG51bWJlciB9ID0ge307XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hMaW5lSGVpZ2h0ID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XSkge1xuICAgIHJldHVybiBjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF07XG4gIH1cbiAgY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdID0gbWVhc3VyZVRleHQoRFVNTVlfVEVYVCwgZm9udCwgbnVsbCkuaGVpZ2h0O1xuICByZXR1cm4gY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdO1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5jb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgfVxuICBjb25zdCBjYW52YXMyZENvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcbiAgY2FudmFzMmRDb250ZXh0LmZvbnQgPSBmb250O1xuXG4gIGNvbnN0IG1ldHJpY3MgPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCk7XG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiBtZXRyaWNzLndpZHRoICogMTA7XG4gIH1cblxuICByZXR1cm4gbWV0cmljcy53aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCB3cmFwVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyV2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuXG4gIGNvbnN0IGxpbmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbnN0IG9yaWdpbmFsTGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBzcGFjZVdpZHRoID0gZ2V0VGV4dFdpZHRoKFwiIFwiLCBmb250KTtcbiAgb3JpZ2luYWxMaW5lcy5mb3JFYWNoKChvcmlnaW5hbExpbmUpID0+IHtcbiAgICBjb25zdCB3b3JkcyA9IG9yaWdpbmFsTGluZS5zcGxpdChcIiBcIik7XG4gICAgLy8gVGhpcyBtZWFucyBpdHMgbmV3bGluZSBzbyBwdXNoIGl0XG4gICAgaWYgKHdvcmRzLmxlbmd0aCA9PT0gMSAmJiB3b3Jkc1swXSA9PT0gXCJcIikge1xuICAgICAgbGluZXMucHVzaCh3b3Jkc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXb3JkV2lkdGggPSBnZXRUZXh0V2lkdGgod29yZHNbaW5kZXhdLCBmb250KTtcblxuICAgICAgICAvLyBTdGFydCBicmVha2luZyBsb25nZXIgd29yZHMgZXhjZWVkaW5nIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudFdvcmRXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIHNpbmNlIHRoZSBjdXJyZW50IHdvcmQgZXhjZWVkcyB0aGUgbWF4IHdpZHRoXG4gICAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcbiAgICAgICAgICBpZiAoY3VycmVudExpbmUpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENoYXIgPSB3b3Jkc1tpbmRleF1bMF07XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJXaWR0aC5jYWxjdWxhdGUoY3VycmVudENoYXIsIGZvbnQpO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gd2lkdGg7XG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudENoYXI7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gd2lkdGg7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSArPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNwYWNlIG5lZWRzIHRvIGJlIGFwcGVuZGVkIGJlZm9yZSBuZXh0IHdvcmRcbiAgICAgICAgICAgIC8vIGFzIGN1cnJlbnRMaW5lIGNvbnRhaW5zIGNoYXJzIHdoaWNoIGNvdWxkbid0IGJlIGFwcGVuZGVkXG4gICAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lXG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHNwYWNlV2lkdGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgICB3aGlsZSAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPCBtYXhXaWR0aCAmJiBpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0VGV4dFdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gYCR7d29yZH0gYDtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgd29yZCBpZiBhcHBlbmRpbmcgc3BhY2UgZXhjZWVkcyBtYXggd2lkdGhcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS5zbGljZSgwLCAtMSkpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50TGluZSkge1xuICAgICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hhcldpZHRoID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGVkQ2hhcldpZHRoOiB7IFtrZXk6IEZvbnRTdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB7fTtcblxuICBjb25zdCBjYWxjdWxhdGUgPSAoY2hhcjogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXNjaWkgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF0pIHtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKGNoYXIsIGZvbnQpO1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSA9IHdpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldO1xuICB9O1xuXG4gIGNvbnN0IGdldENhY2hlID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGNhbGN1bGF0ZSxcbiAgICBnZXRDYWNoZSxcbiAgfTtcbn0pKCk7XG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZVdpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgbWF4Q2hhcldpZHRoID0gZ2V0TWF4Q2hhcldpZHRoKGZvbnQpO1xuICBpZiAobWF4Q2hhcldpZHRoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQuc3BsaXQoXCJcIikuam9pbihcIlxcblwiKSwgZm9udCkud2lkdGggK1xuICAgICAgQk9VTkRfVEVYVF9QQURESU5HICogMlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1heENoYXJXaWR0aCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIHJldHVybiBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRUZXh0V2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldFRleHRXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYgeyBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGwgfSlcbiAgICB8IG51bGwsXG4pID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5jb250YWluZXJJZCkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
2387
2387
|
|
|
2388
2388
|
/***/ }),
|
|
2389
2389
|
|
|
@@ -2933,7 +2933,7 @@ module.exports = JSON.parse('{"white":"#ffffff","black":"#000000","gray":["#f8f9
|
|
|
2933
2933
|
/***/ ((module) => {
|
|
2934
2934
|
|
|
2935
2935
|
"use strict";
|
|
2936
|
-
module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","arrowhead_triangle":"Triangle","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"Background","exportEmbedScene":"Embed scene","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasColors":"Used on canvas","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Sharing","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library…","libraries":"Browse libraries","loadingScene":"Loading scene…","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","showStroke":"Show stroke color picker","showBackground":"Show background color picker","toggleTheme":"Toggle theme","personalLib":"Personal Library","excalidrawLib":"Excalidraw Library","decreaseFontSize":"Decrease font size","increaseFontSize":"Increase font size","unbindText":"Unbind text","link":{"edit":"Edit link","create":"Create link","label":"Link"}},"buttons":{"clearReset":"Reset the canvas","exportJSON":"Export to file","exportImage":"Save as image","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save (to active file)","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","roomDialog":"Sharing","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode","cancel":"Cancel","clear":"Clear","remove":"Remove","publishLibrary":"Publish","submit":"Submit","confirm":"Confirm"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn\'t create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn\'t create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn\'t load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn\'t copy to clipboard. Try using Chrome browser.","decryptFailed":"Couldn\'t decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can\'t read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorLoadingLibrary":"There was an error loading the third party library.","errorAddingToLibrary":"Couldn\'t add item to the library","errorRemovingFromLibrary":"Couldn\'t remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"This image does not seem to contain any scene data. Have you enabled scene embedding during export?","cannotRestoreFromImage":"Scene couldn\'t be restored from this image file","invalidSceneUrl":"Couldn\'t import scene from the supplied URL. It\'s either malformed, or doesn\'t contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?","removeItemsFromsLibrary":"Delete {{count}} item(s) from library?","invalidEncryptionKey":"Encryption key must be of 22 characters. Live collaboration is disabled."},"errors":{"unsupportedFileType":"Unsupported file type.","imageInsertError":"Couldn\'t insert image. Try again later...","fileTooBig":"File is too big. Maximum allowed size is {{maxSize}}.","svgImageInsertError":"Couldn\'t insert SVG image. The SVG markup looks invalid.","invalidSVGString":"Invalid SVG.","cannotResolveCollabServer":"Couldn\'t connect to the collab server. Please reload the page and try again."},"toolBar":{"selection":"Selection","image":"Insert image","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing","penMode":"Prevent pinch-zoom and accept freedraw input only from pen","link":"Add/ Update link for a selected shape","eraser":"Eraser"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"canvasPanning":"To move canvas, hold mouse wheel or spacebar while dragging","linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you\'re finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","text_selected":"Double-click or press ENTER to edit text","text_editing":"Press Escape or CtrlOrCmd+ENTER to finish editing","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","resizeImage":"You can resize freely by holding SHIFT,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point(s),\\nCtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to edit (hold SHIFT to select multiple),\\nor hold Alt and click to add new points","placeImage":"Click to place the image, or click and drag to set its size manually","publishLibrary":"Publish your own library","bindTextToElement":"Press enter to add text","deepBoxSelect":"Hold CtrlOrCmd to deep select, and to prevent dragging","eraserRevert":"Hold Alt to revert the elements marked for deletion"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn\'t work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don\'t worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you\'ll be able to continue working with the scene, locally. Note that this won\'t affect other people, and they\'ll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"exportDialog":{"disk_title":"Save to disk","disk_details":"Export the scene data to a file from which you can import later.","disk_button":"Save to file","link_title":"Shareable link","link_details":"Export as a read-only link.","link_button":"Export to Link","excalidrawplus_description":"Save the scene to your Excalidraw+ workspace.","excalidrawplus_button":"Export","excalidrawplus_exportError":"Couldn\'t export to Excalidraw+ at this moment..."},"helpDialog":{"blog":"Read our blog","click":"click","deepSelect":"Deep select","deepBoxSelect":"Deep select within box, and prevent dragging","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","doubleClick":"double-click","drag":"drag","editor":"Editor","editSelectedShape":"Edit selected shape (text/arrow/line)","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","tools":"Tools","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text editor)","textNewLine":"Add new line (text editor)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection"},"clearCanvasDialog":{"title":"Clear canvas"},"publishDialog":{"title":"Publish library","itemName":"Item name","authorName":"Author name","githubUsername":"GitHub username","twitterUsername":"Twitter username","libraryName":"Library name","libraryDesc":"Library description","website":"Website","placeholder":{"authorName":"Your name or username","libraryName":"Name of your library","libraryDesc":"Description of your library to help people understand its usage","githubHandle":"GitHub handle (optional), so you can edit the library once submitted for review","twitterHandle":"Twitter username (optional), so we know who to credit when promoting over Twitter","website":"Link to your personal website or elsewhere (optional)"},"errors":{"required":"Required","website":"Enter a valid URL"},"noteDescription":{"pre":"Submit your library to be included in the ","link":"public library repository","post":"for other people to use in their drawings."},"noteGuidelines":{"pre":"The library needs to be manually approved first. Please read the ","link":"guidelines","post":" before submitting. You will need a GitHub account to communicate and make changes if requested, but it is not strictly required."},"noteLicense":{"pre":"By submitting, you agree the library will be published under the ","link":"MIT License, ","post":"which in short means anyone can use them without restrictions."},"noteItems":"Each library item must have its own name so it\'s filterable. The following library items will be included:","atleastOneLibItem":"Please select at least one library item to get started"},"publishSuccessDialog":{"title":"Library submitted","content":"Thank you {{authorName}}. Your library has been submitted for review. You can track the status","link":"here"},"confirmDialog":{"resetLibrary":"Reset library","removeItemsFromLib":"Remove selected items from library"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw\'s servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"addedToLibrary":"Added to library","copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"},"colors":{"495057":"Gray 7","ffffff":"White","f8f9fa":"Gray 0","f1f3f5":"Gray 1","fff5f5":"Red 0","fff0f6":"Pink 0","f8f0fc":"Grape 0","f3f0ff":"Violet 0","edf2ff":"Indigo 0","e7f5ff":"Blue 0","e3fafc":"Cyan 0","e6fcf5":"Teal 0","ebfbee":"Green 0","f4fce3":"Lime 0","fff9db":"Yellow 0","fff4e6":"Orange 0","transparent":"Transparent","ced4da":"Gray 4","868e96":"Gray 6","fa5252":"Red 6","e64980":"Pink 6","be4bdb":"Grape 6","7950f2":"Violet 6","4c6ef5":"Indigo 6","228be6":"Blue 6","15aabf":"Cyan 6","12b886":"Teal 6","40c057":"Green 6","82c91e":"Lime 6","fab005":"Yellow 6","fd7e14":"Orange 6","000000":"Black","343a40":"Gray 8","c92a2a":"Red 9","a61e4d":"Pink 9","862e9c":"Grape 9","5f3dc4":"Violet 9","364fc7":"Indigo 9","1864ab":"Blue 9","0b7285":"Cyan 9","087f5b":"Teal 9","2b8a3e":"Green 9","5c940d":"Lime 9","e67700":"Yellow 9","d9480f":"Orange 9"}}');
|
|
2936
|
+
module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","arrowhead_triangle":"Triangle","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"Background","exportEmbedScene":"Embed scene","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasColors":"Used on canvas","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Sharing","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library…","libraries":"Browse libraries","loadingScene":"Loading scene…","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","showStroke":"Show stroke color picker","showBackground":"Show background color picker","toggleTheme":"Toggle theme","personalLib":"Personal Library","excalidrawLib":"Excalidraw Library","decreaseFontSize":"Decrease font size","increaseFontSize":"Increase font size","unbindText":"Unbind text","bindText":"Bind text to the container","link":{"edit":"Edit link","create":"Create link","label":"Link"}},"buttons":{"clearReset":"Reset the canvas","exportJSON":"Export to file","exportImage":"Save as image","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save (to active file)","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","roomDialog":"Sharing","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode","cancel":"Cancel","clear":"Clear","remove":"Remove","publishLibrary":"Publish","submit":"Submit","confirm":"Confirm"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn\'t create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn\'t create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn\'t load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn\'t copy to clipboard. Try using Chrome browser.","decryptFailed":"Couldn\'t decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can\'t read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorLoadingLibrary":"There was an error loading the third party library.","errorAddingToLibrary":"Couldn\'t add item to the library","errorRemovingFromLibrary":"Couldn\'t remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"This image does not seem to contain any scene data. Have you enabled scene embedding during export?","cannotRestoreFromImage":"Scene couldn\'t be restored from this image file","invalidSceneUrl":"Couldn\'t import scene from the supplied URL. It\'s either malformed, or doesn\'t contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?","removeItemsFromsLibrary":"Delete {{count}} item(s) from library?","invalidEncryptionKey":"Encryption key must be of 22 characters. Live collaboration is disabled."},"errors":{"unsupportedFileType":"Unsupported file type.","imageInsertError":"Couldn\'t insert image. Try again later...","fileTooBig":"File is too big. Maximum allowed size is {{maxSize}}.","svgImageInsertError":"Couldn\'t insert SVG image. The SVG markup looks invalid.","invalidSVGString":"Invalid SVG.","cannotResolveCollabServer":"Couldn\'t connect to the collab server. Please reload the page and try again."},"toolBar":{"selection":"Selection","image":"Insert image","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing","penMode":"Prevent pinch-zoom and accept freedraw input only from pen","link":"Add/ Update link for a selected shape","eraser":"Eraser"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"canvasPanning":"To move canvas, hold mouse wheel or spacebar while dragging","linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you\'re finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","text_selected":"Double-click or press ENTER to edit text","text_editing":"Press Escape or CtrlOrCmd+ENTER to finish editing","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","resizeImage":"You can resize freely by holding SHIFT,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point(s),\\nCtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to edit (hold SHIFT to select multiple),\\nor hold Alt and click to add new points","placeImage":"Click to place the image, or click and drag to set its size manually","publishLibrary":"Publish your own library","bindTextToElement":"Press enter to add text","deepBoxSelect":"Hold CtrlOrCmd to deep select, and to prevent dragging","eraserRevert":"Hold Alt to revert the elements marked for deletion"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn\'t work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don\'t worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you\'ll be able to continue working with the scene, locally. Note that this won\'t affect other people, and they\'ll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"exportDialog":{"disk_title":"Save to disk","disk_details":"Export the scene data to a file from which you can import later.","disk_button":"Save to file","link_title":"Shareable link","link_details":"Export as a read-only link.","link_button":"Export to Link","excalidrawplus_description":"Save the scene to your Excalidraw+ workspace.","excalidrawplus_button":"Export","excalidrawplus_exportError":"Couldn\'t export to Excalidraw+ at this moment..."},"helpDialog":{"blog":"Read our blog","click":"click","deepSelect":"Deep select","deepBoxSelect":"Deep select within box, and prevent dragging","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","doubleClick":"double-click","drag":"drag","editor":"Editor","editSelectedShape":"Edit selected shape (text/arrow/line)","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","tools":"Tools","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text editor)","textNewLine":"Add new line (text editor)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection"},"clearCanvasDialog":{"title":"Clear canvas"},"publishDialog":{"title":"Publish library","itemName":"Item name","authorName":"Author name","githubUsername":"GitHub username","twitterUsername":"Twitter username","libraryName":"Library name","libraryDesc":"Library description","website":"Website","placeholder":{"authorName":"Your name or username","libraryName":"Name of your library","libraryDesc":"Description of your library to help people understand its usage","githubHandle":"GitHub handle (optional), so you can edit the library once submitted for review","twitterHandle":"Twitter username (optional), so we know who to credit when promoting over Twitter","website":"Link to your personal website or elsewhere (optional)"},"errors":{"required":"Required","website":"Enter a valid URL"},"noteDescription":{"pre":"Submit your library to be included in the ","link":"public library repository","post":"for other people to use in their drawings."},"noteGuidelines":{"pre":"The library needs to be manually approved first. Please read the ","link":"guidelines","post":" before submitting. You will need a GitHub account to communicate and make changes if requested, but it is not strictly required."},"noteLicense":{"pre":"By submitting, you agree the library will be published under the ","link":"MIT License, ","post":"which in short means anyone can use them without restrictions."},"noteItems":"Each library item must have its own name so it\'s filterable. The following library items will be included:","atleastOneLibItem":"Please select at least one library item to get started"},"publishSuccessDialog":{"title":"Library submitted","content":"Thank you {{authorName}}. Your library has been submitted for review. You can track the status","link":"here"},"confirmDialog":{"resetLibrary":"Reset library","removeItemsFromLib":"Remove selected items from library"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw\'s servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"addedToLibrary":"Added to library","copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"},"colors":{"495057":"Gray 7","ffffff":"White","f8f9fa":"Gray 0","f1f3f5":"Gray 1","fff5f5":"Red 0","fff0f6":"Pink 0","f8f0fc":"Grape 0","f3f0ff":"Violet 0","edf2ff":"Indigo 0","e7f5ff":"Blue 0","e3fafc":"Cyan 0","e6fcf5":"Teal 0","ebfbee":"Green 0","f4fce3":"Lime 0","fff9db":"Yellow 0","fff4e6":"Orange 0","transparent":"Transparent","ced4da":"Gray 4","868e96":"Gray 6","fa5252":"Red 6","e64980":"Pink 6","be4bdb":"Grape 6","7950f2":"Violet 6","4c6ef5":"Indigo 6","228be6":"Blue 6","15aabf":"Cyan 6","12b886":"Teal 6","40c057":"Green 6","82c91e":"Lime 6","fab005":"Yellow 6","fd7e14":"Orange 6","000000":"Black","343a40":"Gray 8","c92a2a":"Red 9","a61e4d":"Pink 9","862e9c":"Grape 9","5f3dc4":"Violet 9","364fc7":"Indigo 9","1864ab":"Blue 9","0b7285":"Cyan 9","087f5b":"Teal 9","2b8a3e":"Green 9","5c940d":"Lime 9","e67700":"Yellow 9","d9480f":"Orange 9"}}');
|
|
2937
2937
|
|
|
2938
2938
|
/***/ }),
|
|
2939
2939
|
|
|
@@ -2955,7 +2955,7 @@ module.exports = JSON.parse('{"ar-SA":94,"bg-BG":61,"bn-BD":0,"ca-ES":99,"cs-CZ"
|
|
|
2955
2955
|
/***/ ((module) => {
|
|
2956
2956
|
|
|
2957
2957
|
"use strict";
|
|
2958
|
-
module.exports = JSON.parse('{"name":"@dwelle/excalidraw","version":"0.3.
|
|
2958
|
+
module.exports = JSON.parse('{"name":"@dwelle/excalidraw","version":"0.3.54","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","license":"MIT","keywords":[],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.17.0","@babel/plugin-transform-arrow-functions":"7.16.7","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.8","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.7","@babel/preset-react":"7.16.7","@babel/preset-typescript":"7.16.7","autoprefixer":"10.4.2","babel-loader":"8.2.3","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"6.7.1","mini-css-extract-plugin":"2.4.6","postcss-loader":"6.2.1","sass-loader":"12.4.0","terser-webpack-plugin":"5.3.1","ts-loader":"9.2.8","typescript":"4.5.4","webpack":"5.65.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.2","webpack-dev-server":"4.7.4","webpack-merge":"5.8.0"},"repository":"https://github.com/dwelle/excalidraw","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"rm -rf dist && cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack","start":"webpack serve --config webpack.dev-server.config.js","install:deps":"yarn install --frozen-lockfile && yarn --cwd ../../../","build:example":"EXAMPLE=true webpack --config webpack.dev-server.config.js"},"dependencies":{"dotenv":"10.0.0"}}');
|
|
2959
2959
|
|
|
2960
2960
|
/***/ })
|
|
2961
2961
|
|