@excalidraw/excalidraw 0.14.1-cf38c0f → 0.14.1-e41ea95

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.
@@ -2283,7 +2283,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2283
2283
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2284
2284
 
2285
2285
  "use strict";
2286
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-cf38c0f\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-cf38c0f\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsdzVCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksdzVCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2286
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-e41ea95\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-e41ea95\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsdzVCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksdzVCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2287
2287
 
2288
2288
  /***/ }),
2289
2289
 
@@ -3449,7 +3449,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3449
3449
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3450
3450
 
3451
3451
  "use strict";
3452
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\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 */ \"../../element/index.ts\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n let text = textElement.text;\n if (container) {\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n let coordY = textElement.y;\n let coordX = textElement.x;\n // Resize container and vertically center align the text\n if (container) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n const containerDims = getContainerDims(container);\n let nextHeight = containerDims.height;\n const boundTextElementPadding = getBoundTextElementOffset(textElement);\n if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n coordY = container.y + boundTextElementPadding;\n }\n else if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n metrics.height -\n boundTextElementPadding;\n }\n else {\n coordY = container.y + containerDims.height / 2 - metrics.height / 2;\n if (metrics.height > (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container)) {\n nextHeight = metrics.height + boundTextElementPadding * 2;\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\n }\n }\n if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n coordX = container.x + boundTextElementPadding;\n }\n else if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n coordX =\n container.x +\n containerDims.width -\n metrics.width -\n boundTextElementPadding;\n }\n else {\n coordX = container.x + containerDims.width / 2 - metrics.width / 2;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.updateOriginalContainerCache)(container.id, nextHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n }\n else {\n const centerX = textElement.x + textElement.width / 2;\n const centerY = textElement.y + textElement.height / 2;\n const diffWidth = metrics.width - textElement.width;\n const diffHeight = metrics.height - textElement.height;\n coordY = centerY - (textElement.height + diffHeight) / 2;\n coordX = centerX - (textElement.width + diffWidth) / 2;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n y: coordY,\n x: coordX,\n text,\n });\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (newContainer.boundElements || []).concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n const maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n nextBaseLine = dimensions.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = nextHeight + getBoundTextElementOffset(textElement) * 2;\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n updateBoundTextPosition(container, textElement);\n }\n }\n};\nconst updateBoundTextPosition = (container, boundTextElement) => {\n const containerDims = getContainerDims(container);\n const boundTextElementPadding = getBoundTextElementOffset(boundTextElement);\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = container.y + boundTextElementPadding;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y =\n container.y +\n containerDims.height -\n boundTextElement.height -\n boundTextElementPadding;\n }\n else {\n y = container.y + containerDims.height / 2 - boundTextElement.height / 2;\n }\n const x = boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT\n ? container.x + boundTextElementPadding\n : boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT\n ? container.x +\n containerDims.width -\n boundTextElement.width -\n boundTextElementPadding\n : container.x + containerDims.width / 2 - boundTextElement.width / 2;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(boundTextElement, { x, y });\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, maxWidth) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n const textWidth = getTextWidth(text, font);\n if (maxWidth) {\n const lineHeight = getApproxLineHeight(font);\n container.style.width = `${String(Math.min(textWidth, maxWidth) + 1)}px`;\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.lineHeight = `${String(lineHeight)}px`;\n container.style.whiteSpace = \"pre-wrap\";\n }\n document.body.appendChild(container);\n container.innerText = text;\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n // Baseline is important for positioning text on canvas\n const baseline = span.offsetTop + span.offsetHeight;\n // Since span adds 1px extra width to the container\n let width = container.offsetWidth;\n if (maxWidth && textWidth > maxWidth) {\n width = width - 1;\n }\n const height = container.offsetHeight;\n document.body.removeChild(container);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return { width, height, baseline, container };\n }\n return { width, height, baseline };\n};\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight = {};\nconst getApproxLineHeight = (font) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\n return cacheApproxLineHeight[font];\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const metrics = canvas2dContext.measureText(text);\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return metrics.width * 10;\n }\n return metrics.width;\n};\nconst getTextWidth = (text, font) => {\n const lines = text.split(\"\\n\");\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst wrapText = (text, font, maxWidth) => {\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n originalLines.forEach((originalLine) => {\n const words = originalLine.split(\" \");\n // This means its newline so push it\n if (words.length === 1 && words[0] === \"\") {\n lines.push(words[0]);\n }\n else {\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // Start breaking longer words exceeding max width\n if (currentWordWidth >= maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n while (words[index].length > 0) {\n const currentChar = words[index][0];\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(1);\n if (currentLineWidthTillNow >= maxWidth) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLineWidthTillNow = 0;\n currentLine = \"\";\n break;\n }\n index++;\n currentLine += `${word} `;\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n const word = currentLine.slice(0, -1);\n push(word);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n break;\n }\n }\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n }\n if (currentLine) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n }\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst getApproxMinLineWidth = (font) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getApproxMinLineHeight = (font) => {\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\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) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n const boundTextElement = getBoundTextElement(element);\n if (boundTextElement) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_8__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_9__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst isValidTextContainer = (element) => {\n return (element.type === \"rectangle\" ||\n element.type === \"ellipse\" ||\n element.type === \"diamond\" ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isImageElement)(element) ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QkFDRCxDQUFDO2FBQ0YsQ0FBQyxFQUNGO1lBQ0EsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixNQUFNO1NBQ1A7YUFBTSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDL0MsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU8sb0VBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN4RSxDQUFDLENBQUM7QUFFSyxNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBMEIsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sQ0FDTCxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFDNUIsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUMxQiwyREFBYyxDQUFDLE9BQU8sQ0FBQztRQUN2QiwyREFBYyxDQUFDLE9BQU8sQ0FBQyxDQUN4QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HLCBURVhUX0FMSUdOLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgZ2V0TWF4Q29udGFpbmVySGVpZ2h0LCBnZXRNYXhDb250YWluZXJXaWR0aCB9IGZyb20gXCIuL25ld0VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNJbWFnZUVsZW1lbnQsXG4gIGlzQXJyb3dFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWRyYXdUZXh0Qm91bmRpbmdCb3ggPSAoXG4gIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGxldCBtYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgbGV0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQodGV4dCwgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksIG1heFdpZHRoKTtcbiAgbGV0IGNvb3JkWSA9IHRleHRFbGVtZW50Lnk7XG4gIGxldCBjb29yZFggPSB0ZXh0RWxlbWVudC54O1xuICAvLyBSZXNpemUgY29udGFpbmVyIGFuZCB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgICAgbGV0IG5leHRIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nID0gZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCh0ZXh0RWxlbWVudCk7XG4gICAgICBpZiAodGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uVE9QKSB7XG4gICAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2UgaWYgKHRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgICAgICBjb29yZFkgPVxuICAgICAgICAgIGNvbnRhaW5lci55ICtcbiAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCAtXG4gICAgICAgICAgbWV0cmljcy5oZWlnaHQgLVxuICAgICAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBjb250YWluZXJEaW1zLmhlaWdodCAvIDIgLSBtZXRyaWNzLmhlaWdodCAvIDI7XG4gICAgICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpKSB7XG4gICAgICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgICAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgbmV4dEhlaWdodCAvIDIgLSBtZXRyaWNzLmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0ZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uTEVGVCkge1xuICAgICAgICBjb29yZFggPSBjb250YWluZXIueCArIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICAgICAgfSBlbHNlIGlmICh0ZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFQpIHtcbiAgICAgICAgY29vcmRYID1cbiAgICAgICAgICBjb250YWluZXIueCArXG4gICAgICAgICAgY29udGFpbmVyRGltcy53aWR0aCAtXG4gICAgICAgICAgbWV0cmljcy53aWR0aCAtXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb29yZFggPSBjb250YWluZXIueCArIGNvbnRhaW5lckRpbXMud2lkdGggLyAyIC0gbWV0cmljcy53aWR0aCAvIDI7XG4gICAgICB9XG4gICAgICB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCwgbmV4dEhlaWdodCk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5leHRIZWlnaHQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNlbnRlclggPSB0ZXh0RWxlbWVudC54ICsgdGV4dEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgY29uc3QgY2VudGVyWSA9IHRleHRFbGVtZW50LnkgKyB0ZXh0RWxlbWVudC5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgZGlmZldpZHRoID0gbWV0cmljcy53aWR0aCAtIHRleHRFbGVtZW50LndpZHRoO1xuICAgICAgY29uc3QgZGlmZkhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0IC0gdGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgY29vcmRZID0gY2VudGVyWSAtICh0ZXh0RWxlbWVudC5oZWlnaHQgKyBkaWZmSGVpZ2h0KSAvIDI7XG4gICAgICBjb29yZFggPSBjZW50ZXJYIC0gKHRleHRFbGVtZW50LndpZHRoICsgZGlmZldpZHRoKSAvIDI7XG4gICAgfVxuICB9XG4gIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICB3aWR0aDogbWV0cmljcy53aWR0aCxcbiAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBtZXRyaWNzLmJhc2VsaW5lLFxuICAgIHk6IGNvb3JkWSxcbiAgICB4OiBjb29yZFgsXG4gICAgdGV4dCxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiA9IChcbiAgc2NlbmVFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZElkVG9EdXBsaWNhdGVkSWQ6IE1hcDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdPixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzY2VuZUVsZW1lbnRNYXAgPSBhcnJheVRvTWFwKHNjZW5lRWxlbWVudHMpIGFzIE1hcDxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50XG4gID47XG4gIG9sZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmlkKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGJvdW5kVGV4dEVsZW1lbnRJZCk7XG4gICAgICBpZiAobmV3VGV4dEVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld0VsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdDb250YWluZXIpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld0NvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKG5ld0NvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IFtdKS5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUZXh0RWxlbWVudCA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KG5ld1RleHRFbGVtZW50KSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBuZXdDb250YWluZXIgPyBuZXdFbGVtZW50SWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCk7XG4gIGxldCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgYm91bmRUZXh0RWxlbWVudElkLFxuICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgbGV0IG5leHRXaWR0aCA9IHRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgbmV4dEJhc2VMaW5lID0gdGV4dEVsZW1lbnQuYmFzZWxpbmU7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG1lYXN1cmVUZXh0KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgbWF4V2lkdGgsXG4gICAgICApO1xuICAgICAgbmV4dEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0O1xuICAgICAgbmV4dFdpZHRoID0gZGltZW5zaW9ucy53aWR0aDtcbiAgICAgIG5leHRCYXNlTGluZSA9IGRpbWVuc2lvbnMuYmFzZWxpbmU7XG4gICAgfVxuICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBuZXh0SGVpZ2h0ICsgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCh0ZXh0RWxlbWVudCkgKiAyO1xuICAgICAgY29uc3QgZGlmZiA9IGNvbnRhaW5lckhlaWdodCAtIGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgLy8gZml4IHRoZSB5IGNvb3JkIHdoZW4gcmVzaXppbmcgZnJvbSBuZS9udy9uXG4gICAgICBjb25zdCB1cGRhdGVkWSA9XG4gICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5cIilcbiAgICAgICAgICA/IGNvbnRhaW5lci55IC0gZGlmZlxuICAgICAgICAgIDogY29udGFpbmVyLnk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICB0ZXh0LFxuICAgICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcblxuICAgICAgYmFzZWxpbmU6IG5leHRCYXNlTGluZSxcbiAgICB9KTtcbiAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIHVwZGF0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgdXBkYXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgPSBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBsZXQgeTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uVE9QKSB7XG4gICAgeSA9IGNvbnRhaW5lci55ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID1cbiAgICAgIGNvbnRhaW5lci55ICtcbiAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC1cbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICB9IGVsc2Uge1xuICAgIHkgPSBjb250YWluZXIueSArIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgfVxuICBjb25zdCB4ID1cbiAgICBib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUXG4gICAgICA/IGNvbnRhaW5lci54ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmdcbiAgICAgIDogYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFRcbiAgICAgID8gY29udGFpbmVyLnggK1xuICAgICAgICBjb250YWluZXJEaW1zLndpZHRoIC1cbiAgICAgICAgYm91bmRUZXh0RWxlbWVudC53aWR0aCAtXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nXG4gICAgICA6IGNvbnRhaW5lci54ICsgY29udGFpbmVyRGltcy53aWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMjtcblxuICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQsIHsgeCwgeSB9KTtcbn07XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBtYXhXaWR0aD86IG51bWJlciB8IG51bGwsXG4pID0+IHtcbiAgdGV4dCA9IHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAvLyByZXBsYWNlIGVtcHR5IGxpbmVzIHdpdGggc2luZ2xlIHNwYWNlIGJlY2F1c2UgbGVhZGluZy90cmFpbGluZyBlbXB0eVxuICAgIC8vIGxpbmVzIHdvdWxkIGJlIHN0cmlwcGVkIGZyb20gY29tcHV0YXRpb25cbiAgICAubWFwKCh4KSA9PiB4IHx8IFwiIFwiKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgY29udGFpbmVyLnN0eWxlLmZvbnQgPSBmb250O1xuICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gXCIxZW1cIjtcbiAgY29uc3QgdGV4dFdpZHRoID0gZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpO1xuXG4gIGlmIChtYXhXaWR0aCkge1xuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke1N0cmluZyhNYXRoLm1pbih0ZXh0V2lkdGgsIG1heFdpZHRoKSArIDEpfXB4YDtcblxuICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gYCR7U3RyaW5nKGxpbmVIZWlnaHQpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgfVxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5pbm5lclRleHQgPSB0ZXh0O1xuXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgc3Bhbi5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIHNwYW4uc3R5bGUud2lkdGggPSBcIjFweFwiO1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcbiAgLy8gQmFzZWxpbmUgaXMgaW1wb3J0YW50IGZvciBwb3NpdGlvbmluZyB0ZXh0IG9uIGNhbnZhc1xuICBjb25zdCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIC8vIFNpbmNlIHNwYW4gYWRkcyAxcHggZXh0cmEgd2lkdGggdG8gdGhlIGNvbnRhaW5lclxuICBsZXQgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gIGlmIChtYXhXaWR0aCAmJiB0ZXh0V2lkdGggPiBtYXhXaWR0aCkge1xuICAgIHdpZHRoID0gd2lkdGggLSAxO1xuICB9XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUsIGNvbnRhaW5lciB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH07XG59O1xuXG5jb25zdCBEVU1NWV9URVhUID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIi50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuY29uc3QgY2FjaGVBcHByb3hMaW5lSGVpZ2h0OiB7IFtrZXk6IEZvbnRTdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TGluZUhlaWdodCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGlmIChjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF0pIHtcbiAgICByZXR1cm4gY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdO1xuICB9XG4gIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XSA9IG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQsIGZvbnQsIG51bGwpLmhlaWdodDtcbiAgcmV0dXJuIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XTtcbn07XG5cbmxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkO1xuY29uc3QgZ2V0TGluZVdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcblxuICBjb25zdCBtZXRyaWNzID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpO1xuICAvLyBzaW5jZSBpbiB0ZXN0IGVudiB0aGUgY2FudmFzIG1lYXN1cmVUZXh0IGFsZ29cbiAgLy8gZG9lc24ndCBtZWFzdXJlIHRleHQgYW5kIGluc3RlYWQganVzdCByZXR1cm5zIG51bWJlciBvZlxuICAvLyBjaGFyYWN0ZXJzIGhlbmNlIHdlIGFzc3VtZSB0aGF0IGVhY2ggbGV0dGVyaXMgMTBweFxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICByZXR1cm4gbWV0cmljcy53aWR0aCAqIDEwO1xuICB9XG5cbiAgcmV0dXJuIG1ldHJpY3Mud2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dFdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcbmV4cG9ydCBjb25zdCB3cmFwVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcsIG1heFdpZHRoOiBudW1iZXIpID0+IHtcbiAgY29uc3QgbGluZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgY29uc3Qgb3JpZ2luYWxMaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSBnZXRMaW5lV2lkdGgoXCIgXCIsIGZvbnQpO1xuXG4gIGNvbnN0IHB1c2ggPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc3RyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChzdHIpO1xuICAgIH1cbiAgfTtcbiAgb3JpZ2luYWxMaW5lcy5mb3JFYWNoKChvcmlnaW5hbExpbmUpID0+IHtcbiAgICBjb25zdCB3b3JkcyA9IG9yaWdpbmFsTGluZS5zcGxpdChcIiBcIik7XG4gICAgLy8gVGhpcyBtZWFucyBpdHMgbmV3bGluZSBzbyBwdXNoIGl0XG4gICAgaWYgKHdvcmRzLmxlbmd0aCA9PT0gMSAmJiB3b3Jkc1swXSA9PT0gXCJcIikge1xuICAgICAgbGluZXMucHVzaCh3b3Jkc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXb3JkV2lkdGggPSBnZXRMaW5lV2lkdGgod29yZHNbaW5kZXhdLCBmb250KTtcblxuICAgICAgICAvLyBTdGFydCBicmVha2luZyBsb25nZXIgd29yZHMgZXhjZWVkaW5nIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudFdvcmRXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIHNpbmNlIHRoZSBjdXJyZW50IHdvcmQgZXhjZWVkcyB0aGUgbWF4IHdpZHRoXG4gICAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcbiAgICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENoYXIgPSB3b3Jkc1tpbmRleF1bMF07XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJXaWR0aC5jYWxjdWxhdGUoY3VycmVudENoYXIsIGZvbnQpO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gd2lkdGg7XG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudENoYXI7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gd2lkdGg7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSArPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNwYWNlIG5lZWRzIHRvIGJlIGFwcGVuZGVkIGJlZm9yZSBuZXh0IHdvcmRcbiAgICAgICAgICAgIC8vIGFzIGN1cnJlbnRMaW5lIGNvbnRhaW5zIGNoYXJzIHdoaWNoIGNvdWxkbid0IGJlIGFwcGVuZGVkXG4gICAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lXG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHNwYWNlV2lkdGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgICB3aGlsZSAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPCBtYXhXaWR0aCAmJiBpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0TGluZVdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gYCR7d29yZH0gYDtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgd29yZCBpZiBhcHBlbmRpbmcgc3BhY2UgZXhjZWVkcyBtYXggd2lkdGhcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgcHVzaCh3b3JkKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudExpbmUpIHtcbiAgICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoYXJXaWR0aCA9ICgoKSA9PiB7XG4gIGNvbnN0IGNhY2hlZENoYXJXaWR0aDogeyBba2V5OiBGb250U3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0ge307XG5cbiAgY29uc3QgY2FsY3VsYXRlID0gKGNoYXI6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIGNvbnN0IGFzY2lpID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdKSB7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGdldExpbmVXaWR0aChjaGFyLCBmb250KTtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0gPSB3aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXTtcbiAgfTtcblxuICBjb25zdCBnZXRDYWNoZSA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGUsXG4gICAgZ2V0Q2FjaGUsXG4gIH07XG59KSgpO1xuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1heENoYXJXaWR0aCA9IGdldE1heENoYXJXaWR0aChmb250KTtcblxuICBpZiAobWF4Q2hhcldpZHRoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQuc3BsaXQoXCJcIikuam9pbihcIlxcblwiKSwgZm9udCkud2lkdGggK1xuICAgICAgQk9VTkRfVEVYVF9QQURESU5HICogMlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1heENoYXJXaWR0aCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIHJldHVybiBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYge1xuICAgICAgICBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGw7XG4gICAgICB9KVxuICAgIHwgbnVsbCxcbikgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmNvbnRhaW5lcklkKSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckRpbXMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgTUlOX1dJRFRIID0gMzAwO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KGVsZW1lbnQud2lkdGgsIE1JTl9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoOiBlbGVtZW50LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ2VudGVyID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNvbnRhaW5lci54ICsgY29udGFpbmVyLndpZHRoIC8gMixcbiAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGNvbnRhaW5lcik7XG4gIGlmIChwb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IG1pZFBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyLnBvaW50c1tpbmRleF0sXG4gICAgKTtcbiAgICByZXR1cm4geyB4OiBtaWRQb2ludFswXSwgeTogbWlkUG9pbnRbMV0gfTtcbiAgfVxuICBjb25zdCBpbmRleCA9IGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMiAtIDE7XG4gIGxldCBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhcbiAgICBjb250YWluZXIsXG4gICAgYXBwU3RhdGUsXG4gIClbaW5kZXhdO1xuICBpZiAoIW1pZFNlZ21lbnRNaWRwb2ludCkge1xuICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdLFxuICAgICAgaW5kZXggKyAxLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgeDogbWlkU2VnbWVudE1pZHBvaW50WzBdLCB5OiBtaWRTZWdtZW50TWlkcG9pbnRbMV0gfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWxlbWVudEFuZ2xlID0gKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8IGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gdGV4dEVsZW1lbnQuYW5nbGU7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5hbmdsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0ID0gKFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogODtcbiAgfVxuICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFsbG93VmVydGljYWxBbGlnbiA9IChcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGhhc0JvdW5kQ29udGFpbmVyID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIGlmIChoYXNCb3VuZENvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbiA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lciB8IG51bGwgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSwgZmFsc2UpXG4gICAgICA/IHNlbGVjdGVkRWxlbWVudHNbMF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBsZXQgaGl0RWxlbWVudCA9IG51bGw7XG4gIC8vIFdlIG5lZWQgdG8gdG8gaGl0IHRlc3RpbmcgZnJvbSBmcm9udCAoZW5kIG9mIHRoZSBhcnJheSkgdG8gYmFjayAoYmVnaW5uaW5nIG9mIHRoZSBhcnJheSlcbiAgZm9yIChsZXQgaW5kZXggPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KSB7XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XS5pc0RlbGV0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnRzW2luZGV4XSk7XG4gICAgaWYgKFxuICAgICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudHNbaW5kZXhdKSAmJlxuICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudHNbaW5kZXhdLCBhcHBTdGF0ZSwgW1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHgxIDwgeCAmJiB4IDwgeDIgJiYgeTEgPCB5ICYmIHkgPCB5Mikge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihoaXRFbGVtZW50LCBmYWxzZSkgPyBoaXRFbGVtZW50IDogbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGV4dENvbnRhaW5lciA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnQudHlwZSA9PT0gXCJyZWN0YW5nbGVcIiB8fFxuICAgIGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIgfHxcbiAgICBlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiIHx8XG4gICAgaXNJbWFnZUVsZW1lbnQoZWxlbWVudCkgfHxcbiAgICBpc0Fycm93RWxlbWVudChlbGVtZW50KVxuICApO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
3452
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\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 */ \"../../element/index.ts\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n let text = textElement.text;\n if (container) {\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n let coordY = textElement.y;\n let coordX = textElement.x;\n // Resize container and vertically center align the text\n if (container) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n const containerDims = getContainerDims(container);\n let nextHeight = containerDims.height;\n const boundTextElementPadding = getBoundTextElementOffset(textElement);\n if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n coordY = container.y + boundTextElementPadding;\n }\n else if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n metrics.height -\n boundTextElementPadding;\n }\n else {\n coordY = container.y + containerDims.height / 2 - metrics.height / 2;\n if (metrics.height > (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container)) {\n nextHeight = metrics.height + boundTextElementPadding * 2;\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\n }\n }\n if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n coordX = container.x + boundTextElementPadding;\n }\n else if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n coordX =\n container.x +\n containerDims.width -\n metrics.width -\n boundTextElementPadding;\n }\n else {\n coordX = container.x + containerDims.width / 2 - metrics.width / 2;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.updateOriginalContainerCache)(container.id, nextHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n }\n else {\n const centerX = textElement.x + textElement.width / 2;\n const centerY = textElement.y + textElement.height / 2;\n const diffWidth = metrics.width - textElement.width;\n const diffHeight = metrics.height - textElement.height;\n coordY = centerY - (textElement.height + diffHeight) / 2;\n coordX = centerX - (textElement.width + diffWidth) / 2;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n y: coordY,\n x: coordX,\n text,\n });\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (newContainer.boundElements || []).concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n const maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n nextBaseLine = dimensions.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = nextHeight + getBoundTextElementOffset(textElement) * 2;\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n updateBoundTextPosition(container, textElement);\n }\n }\n};\nconst updateBoundTextPosition = (container, boundTextElement) => {\n const containerDims = getContainerDims(container);\n const boundTextElementPadding = getBoundTextElementOffset(boundTextElement);\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = container.y + boundTextElementPadding;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y =\n container.y +\n containerDims.height -\n boundTextElement.height -\n boundTextElementPadding;\n }\n else {\n y = container.y + containerDims.height / 2 - boundTextElement.height / 2;\n }\n const x = boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT\n ? container.x + boundTextElementPadding\n : boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT\n ? container.x +\n containerDims.width -\n boundTextElement.width -\n boundTextElementPadding\n : container.x + containerDims.width / 2 - boundTextElement.width / 2;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(boundTextElement, { x, y });\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, maxWidth) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (maxWidth) {\n const lineHeight = getApproxLineHeight(font);\n // since we are adding a span of width 1px later\n container.style.maxWidth = `${maxWidth + 1}px`;\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.lineHeight = `${String(lineHeight)}px`;\n container.style.whiteSpace = \"pre-wrap\";\n }\n document.body.appendChild(container);\n container.innerText = text;\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n // Baseline is important for positioning text on canvas\n const baseline = span.offsetTop + span.offsetHeight;\n const width = container.offsetWidth;\n const height = container.offsetHeight;\n document.body.removeChild(container);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return { width, height, baseline, container };\n }\n return { width, height, baseline };\n};\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight = {};\nconst getApproxLineHeight = (font) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\n return cacheApproxLineHeight[font];\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const metrics = canvas2dContext.measureText(text);\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return metrics.width * 10;\n }\n // Since measureText behaves differently in different browsers\n // OS so considering a adjustment factor of 0.2\n const adjustmentFactor = 0.2;\n return metrics.width + adjustmentFactor;\n};\nconst getTextWidth = (text, font) => {\n const lines = text.split(\"\\n\");\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst wrapText = (text, font, maxWidth) => {\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n originalLines.forEach((originalLine) => {\n const words = originalLine.split(\" \");\n // This means its newline so push it\n if (words.length === 1 && words[0] === \"\") {\n lines.push(words[0]);\n return; // continue\n }\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // Start breaking longer words exceeding max width\n if (currentWordWidth >= maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLineWidthTillNow = 0;\n currentLine = \"\";\n break;\n }\n index++;\n currentLine += `${word} `;\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n const word = currentLine.slice(0, -1);\n push(word);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n break;\n }\n }\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n }\n if (currentLine) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst getApproxMinLineWidth = (font) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getApproxMinLineHeight = (font) => {\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\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) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n const boundTextElement = getBoundTextElement(element);\n if (boundTextElement) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_8__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_9__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst isValidTextContainer = (element) => {\n return (element.type === \"rectangle\" ||\n element.type === \"ellipse\" ||\n element.type === \"diamond\" ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isImageElement)(element) ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUU7WUFDL0MsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU8sb0VBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN4RSxDQUFDLENBQUM7QUFFSyxNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBMEIsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sQ0FDTCxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFDNUIsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUMxQiwyREFBYyxDQUFDLE9BQU8sQ0FBQztRQUN2QiwyREFBYyxDQUFDLE9BQU8sQ0FBQyxDQUN4QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HLCBURVhUX0FMSUdOLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgZ2V0TWF4Q29udGFpbmVySGVpZ2h0LCBnZXRNYXhDb250YWluZXJXaWR0aCB9IGZyb20gXCIuL25ld0VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNJbWFnZUVsZW1lbnQsXG4gIGlzQXJyb3dFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWRyYXdUZXh0Qm91bmRpbmdCb3ggPSAoXG4gIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGxldCBtYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgbGV0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQodGV4dCwgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksIG1heFdpZHRoKTtcbiAgbGV0IGNvb3JkWSA9IHRleHRFbGVtZW50Lnk7XG4gIGxldCBjb29yZFggPSB0ZXh0RWxlbWVudC54O1xuICAvLyBSZXNpemUgY29udGFpbmVyIGFuZCB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgICAgbGV0IG5leHRIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nID0gZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCh0ZXh0RWxlbWVudCk7XG4gICAgICBpZiAodGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uVE9QKSB7XG4gICAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2UgaWYgKHRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgICAgICBjb29yZFkgPVxuICAgICAgICAgIGNvbnRhaW5lci55ICtcbiAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCAtXG4gICAgICAgICAgbWV0cmljcy5oZWlnaHQgLVxuICAgICAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBjb250YWluZXJEaW1zLmhlaWdodCAvIDIgLSBtZXRyaWNzLmhlaWdodCAvIDI7XG4gICAgICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpKSB7XG4gICAgICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgICAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgbmV4dEhlaWdodCAvIDIgLSBtZXRyaWNzLmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0ZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uTEVGVCkge1xuICAgICAgICBjb29yZFggPSBjb250YWluZXIueCArIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICAgICAgfSBlbHNlIGlmICh0ZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFQpIHtcbiAgICAgICAgY29vcmRYID1cbiAgICAgICAgICBjb250YWluZXIueCArXG4gICAgICAgICAgY29udGFpbmVyRGltcy53aWR0aCAtXG4gICAgICAgICAgbWV0cmljcy53aWR0aCAtXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb29yZFggPSBjb250YWluZXIueCArIGNvbnRhaW5lckRpbXMud2lkdGggLyAyIC0gbWV0cmljcy53aWR0aCAvIDI7XG4gICAgICB9XG4gICAgICB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCwgbmV4dEhlaWdodCk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5leHRIZWlnaHQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNlbnRlclggPSB0ZXh0RWxlbWVudC54ICsgdGV4dEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgY29uc3QgY2VudGVyWSA9IHRleHRFbGVtZW50LnkgKyB0ZXh0RWxlbWVudC5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgZGlmZldpZHRoID0gbWV0cmljcy53aWR0aCAtIHRleHRFbGVtZW50LndpZHRoO1xuICAgICAgY29uc3QgZGlmZkhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0IC0gdGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgY29vcmRZID0gY2VudGVyWSAtICh0ZXh0RWxlbWVudC5oZWlnaHQgKyBkaWZmSGVpZ2h0KSAvIDI7XG4gICAgICBjb29yZFggPSBjZW50ZXJYIC0gKHRleHRFbGVtZW50LndpZHRoICsgZGlmZldpZHRoKSAvIDI7XG4gICAgfVxuICB9XG4gIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICB3aWR0aDogbWV0cmljcy53aWR0aCxcbiAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBtZXRyaWNzLmJhc2VsaW5lLFxuICAgIHk6IGNvb3JkWSxcbiAgICB4OiBjb29yZFgsXG4gICAgdGV4dCxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiA9IChcbiAgc2NlbmVFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZElkVG9EdXBsaWNhdGVkSWQ6IE1hcDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdPixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzY2VuZUVsZW1lbnRNYXAgPSBhcnJheVRvTWFwKHNjZW5lRWxlbWVudHMpIGFzIE1hcDxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50XG4gID47XG4gIG9sZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmlkKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGJvdW5kVGV4dEVsZW1lbnRJZCk7XG4gICAgICBpZiAobmV3VGV4dEVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld0VsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdDb250YWluZXIpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld0NvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKG5ld0NvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IFtdKS5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUZXh0RWxlbWVudCA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KG5ld1RleHRFbGVtZW50KSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBuZXdDb250YWluZXIgPyBuZXdFbGVtZW50SWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCk7XG4gIGxldCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgYm91bmRUZXh0RWxlbWVudElkLFxuICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgbGV0IG5leHRXaWR0aCA9IHRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgbmV4dEJhc2VMaW5lID0gdGV4dEVsZW1lbnQuYmFzZWxpbmU7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG1lYXN1cmVUZXh0KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgbWF4V2lkdGgsXG4gICAgICApO1xuICAgICAgbmV4dEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0O1xuICAgICAgbmV4dFdpZHRoID0gZGltZW5zaW9ucy53aWR0aDtcbiAgICAgIG5leHRCYXNlTGluZSA9IGRpbWVuc2lvbnMuYmFzZWxpbmU7XG4gICAgfVxuICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBuZXh0SGVpZ2h0ICsgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCh0ZXh0RWxlbWVudCkgKiAyO1xuICAgICAgY29uc3QgZGlmZiA9IGNvbnRhaW5lckhlaWdodCAtIGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgLy8gZml4IHRoZSB5IGNvb3JkIHdoZW4gcmVzaXppbmcgZnJvbSBuZS9udy9uXG4gICAgICBjb25zdCB1cGRhdGVkWSA9XG4gICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5cIilcbiAgICAgICAgICA/IGNvbnRhaW5lci55IC0gZGlmZlxuICAgICAgICAgIDogY29udGFpbmVyLnk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICB0ZXh0LFxuICAgICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcblxuICAgICAgYmFzZWxpbmU6IG5leHRCYXNlTGluZSxcbiAgICB9KTtcbiAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIHVwZGF0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgdXBkYXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgPSBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBsZXQgeTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uVE9QKSB7XG4gICAgeSA9IGNvbnRhaW5lci55ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID1cbiAgICAgIGNvbnRhaW5lci55ICtcbiAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC1cbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICB9IGVsc2Uge1xuICAgIHkgPSBjb250YWluZXIueSArIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgfVxuICBjb25zdCB4ID1cbiAgICBib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUXG4gICAgICA/IGNvbnRhaW5lci54ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmdcbiAgICAgIDogYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFRcbiAgICAgID8gY29udGFpbmVyLnggK1xuICAgICAgICBjb250YWluZXJEaW1zLndpZHRoIC1cbiAgICAgICAgYm91bmRUZXh0RWxlbWVudC53aWR0aCAtXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nXG4gICAgICA6IGNvbnRhaW5lci54ICsgY29udGFpbmVyRGltcy53aWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMjtcblxuICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQsIHsgeCwgeSB9KTtcbn07XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBtYXhXaWR0aD86IG51bWJlciB8IG51bGwsXG4pID0+IHtcbiAgdGV4dCA9IHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAvLyByZXBsYWNlIGVtcHR5IGxpbmVzIHdpdGggc2luZ2xlIHNwYWNlIGJlY2F1c2UgbGVhZGluZy90cmFpbGluZyBlbXB0eVxuICAgIC8vIGxpbmVzIHdvdWxkIGJlIHN0cmlwcGVkIGZyb20gY29tcHV0YXRpb25cbiAgICAubWFwKCh4KSA9PiB4IHx8IFwiIFwiKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgY29udGFpbmVyLnN0eWxlLmZvbnQgPSBmb250O1xuICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gXCIxZW1cIjtcblxuICBpZiAobWF4V2lkdGgpIHtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChmb250KTtcbiAgICAvLyBzaW5jZSB3ZSBhcmUgYWRkaW5nIGEgc3BhbiBvZiB3aWR0aCAxcHggbGF0ZXJcbiAgICBjb250YWluZXIuc3R5bGUubWF4V2lkdGggPSBgJHttYXhXaWR0aCArIDF9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gYCR7U3RyaW5nKGxpbmVIZWlnaHQpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgfVxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5pbm5lclRleHQgPSB0ZXh0O1xuXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgc3Bhbi5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIHNwYW4uc3R5bGUud2lkdGggPSBcIjFweFwiO1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcbiAgLy8gQmFzZWxpbmUgaXMgaW1wb3J0YW50IGZvciBwb3NpdGlvbmluZyB0ZXh0IG9uIGNhbnZhc1xuICBjb25zdCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIGNvbnN0IHdpZHRoID0gY29udGFpbmVyLm9mZnNldFdpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lLCBjb250YWluZXIgfTtcbiAgfVxuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBiYXNlbGluZSB9O1xufTtcblxuY29uc3QgRFVNTVlfVEVYVCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XCIudG9Mb2NhbGVVcHBlckNhc2UoKTtcbmNvbnN0IGNhY2hlQXBwcm94TGluZUhlaWdodDogeyBba2V5OiBGb250U3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveExpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdKSB7XG4gICAgcmV0dXJuIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XTtcbiAgfVxuICBjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF0gPSBtZWFzdXJlVGV4dChEVU1NWV9URVhULCBmb250LCBudWxsKS5oZWlnaHQ7XG4gIHJldHVybiBjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF07XG59O1xuXG5sZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZDtcbmNvbnN0IGdldExpbmVXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICB9XG4gIGNvbnN0IGNhbnZhczJkQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjYW52YXMyZENvbnRleHQuZm9udCA9IGZvbnQ7XG5cbiAgY29uc3QgbWV0cmljcyA9IGNhbnZhczJkQ29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgLy8gc2luY2UgaW4gdGVzdCBlbnYgdGhlIGNhbnZhcyBtZWFzdXJlVGV4dCBhbGdvXG4gIC8vIGRvZXNuJ3QgbWVhc3VyZSB0ZXh0IGFuZCBpbnN0ZWFkIGp1c3QgcmV0dXJucyBudW1iZXIgb2ZcbiAgLy8gY2hhcmFjdGVycyBoZW5jZSB3ZSBhc3N1bWUgdGhhdCBlYWNoIGxldHRlcmlzIDEwcHhcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIG1ldHJpY3Mud2lkdGggKiAxMDtcbiAgfVxuICAvLyBTaW5jZSBtZWFzdXJlVGV4dCBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGRpZmZlcmVudCBicm93c2Vyc1xuICAvLyBPUyBzbyBjb25zaWRlcmluZyBhIGFkanVzdG1lbnQgZmFjdG9yIG9mIDAuMlxuICBjb25zdCBhZGp1c3RtZW50RmFjdG9yID0gMC4yO1xuXG4gIHJldHVybiBtZXRyaWNzLndpZHRoICsgYWRqdXN0bWVudEZhY3Rvcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgbGV0IHdpZHRoID0gMDtcbiAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGdldExpbmVXaWR0aChsaW5lLCBmb250KSk7XG4gIH0pO1xuICByZXR1cm4gd2lkdGg7XG59O1xuZXhwb3J0IGNvbnN0IHdyYXBUZXh0ID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZywgbWF4V2lkdGg6IG51bWJlcikgPT4ge1xuICBjb25zdCBsaW5lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjb25zdCBvcmlnaW5hbExpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgc3BhY2VXaWR0aCA9IGdldExpbmVXaWR0aChcIiBcIiwgZm9udCk7XG5cbiAgY29uc3QgcHVzaCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgIGlmIChzdHIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgfVxuICB9O1xuICBvcmlnaW5hbExpbmVzLmZvckVhY2goKG9yaWdpbmFsTGluZSkgPT4ge1xuICAgIGNvbnN0IHdvcmRzID0gb3JpZ2luYWxMaW5lLnNwbGl0KFwiIFwiKTtcbiAgICAvLyBUaGlzIG1lYW5zIGl0cyBuZXdsaW5lIHNvIHB1c2ggaXRcbiAgICBpZiAod29yZHMubGVuZ3RoID09PSAxICYmIHdvcmRzWzBdID09PSBcIlwiKSB7XG4gICAgICBsaW5lcy5wdXNoKHdvcmRzWzBdKTtcbiAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRXb3JkV2lkdGggPSBnZXRMaW5lV2lkdGgod29yZHNbaW5kZXhdLCBmb250KTtcblxuICAgICAgLy8gU3RhcnQgYnJlYWtpbmcgbG9uZ2VyIHdvcmRzIGV4Y2VlZGluZyBtYXggd2lkdGhcbiAgICAgIGlmIChjdXJyZW50V29yZFdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIHNpbmNlIHRoZSBjdXJyZW50IHdvcmQgZXhjZWVkcyB0aGUgbWF4IHdpZHRoXG4gICAgICAgIC8vIHNvIHdpbGwgYmUgYXBwZW5kZWQgaW4gbmV4dCBsaW5lXG4gICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgd2hpbGUgKHdvcmRzW2luZGV4XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChcbiAgICAgICAgICAgIHdvcmRzW2luZGV4XS5jb2RlUG9pbnRBdCgwKSEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJXaWR0aC5jYWxjdWxhdGUoY3VycmVudENoYXIsIGZvbnQpO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHdpZHRoO1xuICAgICAgICAgIHdvcmRzW2luZGV4XSA9IHdvcmRzW2luZGV4XS5zbGljZShjdXJyZW50Q2hhci5sZW5ndGgpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gd2lkdGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBpZiBhcHBlbmRpbmcgc3BhY2UgZXhjZWVkcyBtYXggd2lkdGhcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc3BhY2UgbmVlZHMgdG8gYmUgYXBwZW5kZWQgYmVmb3JlIG5leHQgd29yZFxuICAgICAgICAgIC8vIGFzIGN1cnJlbnRMaW5lIGNvbnRhaW5zIGNoYXJzIHdoaWNoIGNvdWxkbid0IGJlIGFwcGVuZGVkXG4gICAgICAgICAgLy8gdG8gcHJldmlvdXMgbGluZVxuICAgICAgICAgIGN1cnJlbnRMaW5lICs9IFwiIFwiO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHNwYWNlV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgIHdoaWxlIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA8IG1heFdpZHRoICYmIGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgY3VycmVudExpbmUgKz0gYCR7d29yZH0gYDtcblxuICAgICAgICAgIC8vIFB1c2ggdGhlIHdvcmQgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIHB1c2god29yZCk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID09PSBtYXhXaWR0aCkge1xuICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMaW5lKSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoYXJXaWR0aCA9ICgoKSA9PiB7XG4gIGNvbnN0IGNhY2hlZENoYXJXaWR0aDogeyBba2V5OiBGb250U3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0ge307XG5cbiAgY29uc3QgY2FsY3VsYXRlID0gKGNoYXI6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIGNvbnN0IGFzY2lpID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdKSB7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGdldExpbmVXaWR0aChjaGFyLCBmb250KTtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0gPSB3aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXTtcbiAgfTtcblxuICBjb25zdCBnZXRDYWNoZSA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGUsXG4gICAgZ2V0Q2FjaGUsXG4gIH07XG59KSgpO1xuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1heENoYXJXaWR0aCA9IGdldE1heENoYXJXaWR0aChmb250KTtcblxuICBpZiAobWF4Q2hhcldpZHRoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQuc3BsaXQoXCJcIikuam9pbihcIlxcblwiKSwgZm9udCkud2lkdGggK1xuICAgICAgQk9VTkRfVEVYVF9QQURESU5HICogMlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1heENoYXJXaWR0aCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIHJldHVybiBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYge1xuICAgICAgICBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGw7XG4gICAgICB9KVxuICAgIHwgbnVsbCxcbikgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmNvbnRhaW5lcklkKSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckRpbXMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgTUlOX1dJRFRIID0gMzAwO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KGVsZW1lbnQud2lkdGgsIE1JTl9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoOiBlbGVtZW50LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ2VudGVyID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNvbnRhaW5lci54ICsgY29udGFpbmVyLndpZHRoIC8gMixcbiAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGNvbnRhaW5lcik7XG4gIGlmIChwb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IG1pZFBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyLnBvaW50c1tpbmRleF0sXG4gICAgKTtcbiAgICByZXR1cm4geyB4OiBtaWRQb2ludFswXSwgeTogbWlkUG9pbnRbMV0gfTtcbiAgfVxuICBjb25zdCBpbmRleCA9IGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMiAtIDE7XG4gIGxldCBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhcbiAgICBjb250YWluZXIsXG4gICAgYXBwU3RhdGUsXG4gIClbaW5kZXhdO1xuICBpZiAoIW1pZFNlZ21lbnRNaWRwb2ludCkge1xuICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdLFxuICAgICAgaW5kZXggKyAxLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgeDogbWlkU2VnbWVudE1pZHBvaW50WzBdLCB5OiBtaWRTZWdtZW50TWlkcG9pbnRbMV0gfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWxlbWVudEFuZ2xlID0gKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8IGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gdGV4dEVsZW1lbnQuYW5nbGU7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5hbmdsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0ID0gKFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogODtcbiAgfVxuICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFsbG93VmVydGljYWxBbGlnbiA9IChcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGhhc0JvdW5kQ29udGFpbmVyID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIGlmIChoYXNCb3VuZENvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbiA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lciB8IG51bGwgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSwgZmFsc2UpXG4gICAgICA/IHNlbGVjdGVkRWxlbWVudHNbMF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBsZXQgaGl0RWxlbWVudCA9IG51bGw7XG4gIC8vIFdlIG5lZWQgdG8gdG8gaGl0IHRlc3RpbmcgZnJvbSBmcm9udCAoZW5kIG9mIHRoZSBhcnJheSkgdG8gYmFjayAoYmVnaW5uaW5nIG9mIHRoZSBhcnJheSlcbiAgZm9yIChsZXQgaW5kZXggPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KSB7XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XS5pc0RlbGV0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnRzW2luZGV4XSk7XG4gICAgaWYgKFxuICAgICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudHNbaW5kZXhdKSAmJlxuICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudHNbaW5kZXhdLCBhcHBTdGF0ZSwgW1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHgxIDwgeCAmJiB4IDwgeDIgJiYgeTEgPCB5ICYmIHkgPCB5Mikge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihoaXRFbGVtZW50LCBmYWxzZSkgPyBoaXRFbGVtZW50IDogbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGV4dENvbnRhaW5lciA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnQudHlwZSA9PT0gXCJyZWN0YW5nbGVcIiB8fFxuICAgIGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIgfHxcbiAgICBlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiIHx8XG4gICAgaXNJbWFnZUVsZW1lbnQoZWxlbWVudCkgfHxcbiAgICBpc0Fycm93RWxlbWVudChlbGVtZW50KVxuICApO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
3453
3453
 
3454
3454
  /***/ }),
3455
3455
 
@@ -3460,7 +3460,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3460
3460
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3461
3461
 
3462
3462
  "use strict";
3463
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getOriginalContainerHeightFromCache\": () => (/* binding */ getOriginalContainerHeightFromCache),\n/* harmony export */ \"resetOriginalContainerCache\": () => (/* binding */ resetOriginalContainerCache),\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg),\n/* harmony export */ \"updateOriginalContainerCache\": () => (/* binding */ updateOriginalContainerCache)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\n const { zoom } = appState;\n const degree = (180 * angle) / Math.PI;\n let translateX = (width * (zoom.value - 1)) / 2;\n let translateY = (height * (zoom.value - 1)) / 2;\n if (width > maxWidth && zoom.value !== 1) {\n translateX = (maxWidth * (zoom.value - 1)) / 2;\n }\n if (height > maxHeight && zoom.value !== 1) {\n translateY = (maxHeight * (zoom.value - 1)) / 2;\n }\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\nconst originalContainerCache = {};\nconst updateOriginalContainerCache = (id, height) => {\n const data = originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\nconst resetOriginalContainerCache = (id) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\nconst getOriginalContainerHeightFromCache = (id) => {\n var _a, _b;\n return (_b = (_a = originalContainerCache[id]) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : null;\n};\nconst textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\n if (!editable.style.fontFamily || !editable.style.fontSize) {\n return false;\n }\n const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedTextElement.fontFamily }) !==\n currentFont) {\n return true;\n }\n if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n return true;\n }\n return false;\n };\n const updateWysiwygStyle = () => {\n var _a;\n const appState = app.state;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n if (!updatedTextElement) {\n return;\n }\n const { textAlign, verticalAlign } = updatedTextElement;\n const approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement));\n if (updatedTextElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedTextElement)) {\n let coordX = updatedTextElement.x;\n let coordY = updatedTextElement.y;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedTextElement);\n let maxWidth = updatedTextElement.width;\n let maxHeight = updatedTextElement.height;\n const width = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let textElementHeight = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.LinearElementEditor.getBoundTextElementPosition(container, updatedTextElement);\n coordX = boundTextCoords.x;\n coordY = boundTextCoords.y;\n }\n const propertiesUpdated = textPropertiesUpdated(updatedTextElement, editable);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerDims)(container);\n // using editor.style.height to get the accurate height of text editor\n const editorHeight = Number(editable.style.height.slice(0, -2));\n if (editorHeight > 0) {\n textElementHeight = editorHeight;\n }\n if (propertiesUpdated) {\n // update height of the editor after properties updated\n textElementHeight = updatedTextElement.height;\n }\n let originalContainerData;\n if (propertiesUpdated) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n else {\n originalContainerData = originalContainerCache[container.id];\n if (!originalContainerData) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n }\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container);\n maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && textElementHeight > maxHeight) {\n const diff = Math.min(textElementHeight - maxHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height + diff });\n return;\n }\n else if (\n // autoshrink container height until original container height\n // is reached when text is removed\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) &&\n containerDims.height > originalContainerData.height &&\n textElementHeight < maxHeight) {\n const diff = Math.min(maxHeight - textElementHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height - diff });\n }\n // Start pushing text upward until a diff of 30px (padding)\n // is reached\n else {\n // vertically center align the text\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.MIDDLE) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n coordY =\n container.y + containerDims.height / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n textElementHeight -\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementOffset)(updatedTextElement);\n }\n }\n }\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n const initialSelectionStart = editable.selectionStart;\n const initialSelectionEnd = editable.selectionEnd;\n const initialLength = editable.value.length;\n editable.value = updatedTextElement.originalText;\n // restore cursor position after value updated so it doesn't\n // go to the end of text when container auto expanded\n if (initialSelectionStart === initialSelectionEnd &&\n initialSelectionEnd !== initialLength) {\n // get diff between length and selection end and shift\n // the cursor by \"diff\" times to position correctly\n const diff = initialLength - initialSelectionEnd;\n editable.selectionStart = editable.value.length - diff;\n editable.selectionEnd = editable.value.length - diff;\n }\n const lines = updatedTextElement.originalText.split(\"\\n\");\n const lineHeight = updatedTextElement.containerId\n ? approxLineHeight\n : updatedTextElement.height / lines.length;\n if (!container) {\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n }\n // Make sure text editor height doesn't go beyond viewport\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\n Object.assign(editable.style, {\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement),\n // must be defined *after* font ¯\\_(ツ)_/¯\n lineHeight: `${lineHeight}px`,\n width: `${Math.min(width, maxWidth)}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(width, textElementHeight, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextElementAngle)(updatedTextElement), appState, maxWidth, editorMaxHeight),\n textAlign,\n verticalAlign,\n color: updatedTextElement.strokeColor,\n opacity: updatedTextElement.opacity / 100,\n filter: \"var(--theme-filter)\",\n maxHeight: `${editorMaxHeight}px`,\n });\n // For some reason updating font attribute doesn't set font family\n // hence updating font family explicitly for test environment\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedTextElement);\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedTextElement, { x: coordX, y: coordY });\n }\n };\n const editable = document.createElement(\"textarea\");\n editable.dir = \"auto\";\n editable.tabIndex = 0;\n editable.dataset.type = \"wysiwyg\";\n // prevent line wrapping on Safari\n editable.wrap = \"off\";\n editable.classList.add(\"excalidraw-wysiwyg\");\n let whiteSpace = \"pre\";\n let wordBreak = \"normal\";\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n whiteSpace = \"pre-wrap\";\n wordBreak = \"break-word\";\n }\n Object.assign(editable.style, {\n position: \"absolute\",\n display: \"inline-block\",\n minHeight: \"1em\",\n backfaceVisibility: \"hidden\",\n margin: 0,\n padding: 0,\n border: 0,\n outline: 0,\n resize: \"none\",\n background: \"transparent\",\n overflow: \"hidden\",\n // must be specified because in dark mode canvas creates a stacking context\n zIndex: \"var(--zIndex-wysiwyg)\",\n wordBreak,\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n whiteSpace,\n overflowWrap: \"break-word\",\n boxSizing: \"content-box\",\n });\n updateWysiwygStyle();\n if (onChange) {\n editable.onpaste = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const clipboardData = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event, true);\n if (!clipboardData.text) {\n return;\n }\n const data = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(clipboardData.text);\n if (!data) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)({\n fontSize: app.state.currentItemFontSize,\n fontFamily: app.state.currentItemFontFamily,\n });\n if (container) {\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(`${editable.value}${data}`, font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n }\n });\n editable.oninput = () => {\n var _a;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement);\n // using scrollHeight here since we need to calculate\n // number of lines so cannot use editable.style.height\n // as that gets updated below\n // Rounding here so that the lines calculated is more accurate in all browsers.\n // The scrollHeight and approxLineHeight differs in diff browsers\n // eg it gives 1.05 in firefox for handewritten small font due to which\n // height gets updated as lines > 1 and leads to jumping text for first line in bound container\n // hence rounding here to avoid that\n const lines = Math.round(editable.scrollHeight / (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)(font));\n // auto increase height only when lines > 1 so its\n // measured correctly and vertically aligns for\n // first line as well as setting height to \"auto\"\n // doubles the height as soon as user starts typing\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\n let height = \"auto\";\n editable.style.height = \"0px\";\n let heightSet = false;\n if (lines === 2) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container)).split(\"\\n\").length;\n // This is browser behaviour when setting height to \"auto\"\n // It sets the height needed for 2 lines even if actual\n // line count is 1 as mentioned above as well\n // hence reducing the height by half if actual line count is 1\n // so single line aligns vertically when deleting\n if (actualLineCount === 1) {\n height = `${editable.scrollHeight / 2}px`;\n editable.style.height = height;\n heightSet = true;\n }\n }\n if (!heightSet) {\n editable.style.height = `${editable.scrollHeight}px`;\n }\n }\n onChange((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value));\n };\n }\n editable.onkeydown = (event) => {\n if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn);\n updateWysiwygStyle();\n }\n else if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut);\n updateWysiwygStyle();\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\n event.preventDefault();\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\n event.preventDefault();\n if (event.isComposing || event.keyCode === 229) {\n return;\n }\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\n event.preventDefault();\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\n outdent();\n }\n else {\n indent();\n }\n // We must send an input event to resize the element\n editable.dispatchEvent(new Event(\"input\"));\n }\n };\n const TAB_SIZE = 4;\n const TAB = \" \".repeat(TAB_SIZE);\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n const indent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex);\n value = `${startValue}${TAB}${endValue}`;\n });\n editable.value = value;\n editable.selectionStart = selectionStart + TAB_SIZE;\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n };\n const outdent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n const removedTabs = [];\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const tabMatch = value\n .slice(startIndex, startIndex + TAB_SIZE)\n .match(RE_LEADING_TAB);\n if (tabMatch) {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex + tabMatch[0].length);\n // Delete a tab from the line\n value = `${startValue}${endValue}`;\n removedTabs.push(startIndex);\n }\n });\n editable.value = value;\n if (removedTabs.length) {\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\n }\n else {\n // If the cursor is before the first tab removed, ex:\n // Line| #1\n // Line #2\n // Lin|e #3\n // we should reset the selectionStart to his initial value.\n editable.selectionStart = selectionStart;\n }\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\n }\n };\n /**\n * @returns indices of start positions of selected lines, in reverse order\n */\n const getSelectedLinesStartIndices = () => {\n let { selectionStart, selectionEnd, value } = editable;\n // chars before selectionStart on the same line\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\n .length;\n // put caret at the start of the line\n selectionStart = selectionStart - startOffset;\n const selected = value.slice(selectionStart, selectionEnd);\n return selected\n .split(\"\\n\")\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\n ? // curr line index is prev line's start + prev line's length + \\n\n startIndices[idx - 1] + lines[idx - 1].length + 1\n : // first selected line\n selectionStart), [])\n .reverse();\n };\n const stopEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n // using a state variable instead of passing it to the handleSubmit callback\n // so that we don't need to create separate a callback for event handlers\n let submittedViaKeyboard = false;\n const handleSubmit = () => {\n var _a, _b;\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n // wysiwyg on update\n cleanup();\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\n if (!updateElement) {\n return;\n }\n let text = editable.value;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\n if (container) {\n text = updateElement.text;\n if (editable.value.trim()) {\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\n if (!boundTextElementId || boundTextElementId !== element.id) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: element.id,\n }),\n });\n }\n }\n else {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\n });\n }\n }\n onSubmit({\n text,\n viaKeyboard: submittedViaKeyboard,\n originalText: editable.value,\n });\n };\n const cleanup = () => {\n if (isDestroyed) {\n return;\n }\n isDestroyed = true;\n // remove events to ensure they don't late-fire\n editable.onblur = null;\n editable.oninput = null;\n editable.onkeydown = null;\n if (observer) {\n observer.disconnect();\n }\n window.removeEventListener(\"resize\", updateWysiwygStyle);\n window.removeEventListener(\"wheel\", stopEvent, true);\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n window.removeEventListener(\"blur\", handleSubmit);\n unbindUpdate();\n editable.remove();\n };\n const bindBlurEvent = (event) => {\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n // trigger the blur on ensuing pointerup.\n // Also to handle cases such as picking a color which would trigger a blur\n // in that same tick.\n const target = event === null || event === void 0 ? void 0 : event.target;\n const isTargetColorPicker = target instanceof HTMLInputElement &&\n target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\n setTimeout(() => {\n editable.onblur = handleSubmit;\n if (target && isTargetColorPicker) {\n target.onblur = () => {\n editable.focus();\n };\n }\n // case: clicking on the same property → no change → no update → no focus\n if (!isTargetColorPicker) {\n editable.focus();\n }\n });\n };\n // prevent blur when changing properties from the menu\n const onPointerDown = (event) => {\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\n event.target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\n if (((event.target instanceof HTMLElement ||\n event.target instanceof SVGElement) &&\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\n isTargetColorPicker) {\n editable.onblur = null;\n window.addEventListener(\"pointerup\", bindBlurEvent);\n // handle edge-case where pointerup doesn't fire e.g. due to user\n // alt-tabbing away\n window.addEventListener(\"blur\", handleSubmit);\n }\n };\n // handle updates of textElement properties of editing element\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\n var _a;\n updateWysiwygStyle();\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\n if (!isColorPickerActive) {\n editable.focus();\n }\n });\n // ---------------------------------------------------------------------------\n let isDestroyed = false;\n // select on init (focusing is done separately inside the bindBlurEvent()\n // because we need it to happen *after* the blur event from `pointerdown`)\n editable.select();\n bindBlurEvent();\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n // is preferred so we catch changes from host, where window may not resize.\n let observer = null;\n if (canvas && \"ResizeObserver\" in window) {\n observer = new window.ResizeObserver(() => {\n updateWysiwygStyle();\n });\n observer.observe(canvas);\n }\n else {\n window.addEventListener(\"resize\", updateWysiwygStyle);\n }\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"wheel\", stopEvent, {\n passive: false,\n capture: true,\n });\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUNmLGFBQWEsQ0FBQyxpQ0FBaUMsRUFDaEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRXeXNpd3lnLnRzeD84ZjRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPREVTLCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7XG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICBnZXRGb250U3RyaW5nLFxuICBnZXRGb250RmFtaWx5U3RyaW5nLFxuICBpc1Rlc3RFbnYsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHtcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEFwcHJveExpbmVIZWlnaHQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgZ2V0VGV4dEVsZW1lbnRBbmdsZSxcbiAgZ2V0VGV4dFdpZHRoLFxuICBub3JtYWxpemVUZXh0LFxuICB3cmFwVGV4dCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGFjdGlvbkRlY3JlYXNlRm9udFNpemUsXG4gIGFjdGlvbkluY3JlYXNlRm9udFNpemUsXG59IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcbmltcG9ydCB7IGFjdGlvblpvb21JbiwgYWN0aW9uWm9vbU91dCB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkNhbnZhc1wiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7IGdldE1heENvbnRhaW5lckhlaWdodCwgZ2V0TWF4Q29udGFpbmVyV2lkdGggfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgcGFyc2VDbGlwYm9hcmQgfSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgbWF4V2lkdGg6IG51bWJlcixcbiAgbWF4SGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgeyB6b29tIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGFuZ2xlKSAvIE1hdGguUEk7XG4gIGxldCB0cmFuc2xhdGVYID0gKHdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQgJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVkgPSAobWF4SGVpZ2h0ICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIHJldHVybiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb20udmFsdWV9KSByb3RhdGUoJHtkZWdyZWV9ZGVnKWA7XG59O1xuXG5jb25zdCBvcmlnaW5hbENvbnRhaW5lckNhY2hlOiB7XG4gIFtpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXV06XG4gICAgfCB7XG4gICAgICAgIGhlaWdodDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJoZWlnaHRcIl07XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG59ID0ge307XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbiAgaGVpZ2h0OiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBkYXRhID1cbiAgICBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSB8fCAob3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0gPSB7IGhlaWdodCB9KTtcbiAgZGF0YS5oZWlnaHQgPSBoZWlnaHQ7XG4gIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4pID0+IHtcbiAgaWYgKG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdKSB7XG4gICAgZGVsZXRlIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3JpZ2luYWxDb250YWluZXJIZWlnaHRGcm9tQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuKSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXT8uaGVpZ2h0ID8/IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFd5c2l3eWcgPSAoe1xuICBpZCxcbiAgb25DaGFuZ2UsXG4gIG9uU3VibWl0LFxuICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgZWxlbWVudCxcbiAgY2FudmFzLFxuICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICBhcHAsXG59OiB7XG4gIGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBhcHA6IEFwcDtcbn0pID0+IHtcbiAgY29uc3QgdGV4dFByb3BlcnRpZXNVcGRhdGVkID0gKFxuICAgIHVwZGF0ZWRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBpZiAoIWVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkgfHwgIWVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZFRleHRFbGVtZW50LmZvbnRGYW1pbHkgfSkgIT09XG4gICAgICBjdXJyZW50Rm9udFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChgJHt1cGRhdGVkVGV4dEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVXeXNpd3lnU3R5bGUgPSAoKSA9PiB7XG4gICAgY29uc3QgYXBwU3RhdGUgPSBhcHAuc3RhdGU7XG4gICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID1cbiAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50PEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4oaWQpO1xuICAgIGlmICghdXBkYXRlZFRleHRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSB1cGRhdGVkVGV4dEVsZW1lbnQ7XG5cbiAgICBjb25zdCBhcHByb3hMaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChcbiAgICAgIGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KSxcbiAgICApO1xuICAgIGlmICh1cGRhdGVkVGV4dEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQpKSB7XG4gICAgICBsZXQgY29vcmRYID0gdXBkYXRlZFRleHRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZFRleHRFbGVtZW50Lnk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG5cbiAgICAgIGxldCBtYXhIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICAvLyBTZXQgdG8gZWxlbWVudCBoZWlnaHQgYnkgZGVmYXVsdCBzaW5jZSB0aGF0J3NcbiAgICAgIC8vIHdoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdW5ib3VuZGVkIHRleHRcbiAgICAgIGxldCB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBpZiAoY29udGFpbmVyICYmIHVwZGF0ZWRUZXh0RWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dENvb3JkcyA9XG4gICAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29vcmRYID0gYm91bmRUZXh0Q29vcmRzLng7XG4gICAgICAgICAgY29vcmRZID0gYm91bmRUZXh0Q29vcmRzLnk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQoXG4gICAgICAgICAgdXBkYXRlZFRleHRFbGVtZW50LFxuICAgICAgICAgIGVkaXRhYmxlLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgICAgICAvLyB1c2luZyBlZGl0b3Iuc3R5bGUuaGVpZ2h0IHRvIGdldCB0aGUgYWNjdXJhdGUgaGVpZ2h0IG9mIHRleHQgZWRpdG9yXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcbiAgICAgICAgaWYgKGVkaXRvckhlaWdodCA+IDApIHtcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgYWZ0ZXIgcHJvcGVydGllcyB1cGRhdGVkXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9yaWdpbmFsQ29udGFpbmVyRGF0YTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXNVcGRhdGVkKSB7XG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJEYXRhID0gdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShcbiAgICAgICAgICAgIGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJEYXRhID0gb3JpZ2luYWxDb250YWluZXJDYWNoZVtjb250YWluZXIuaWRdO1xuICAgICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJEYXRhKSB7XG4gICAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKFxuICAgICAgICAgICAgICBjb250YWluZXIuaWQsXG4gICAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgICAgIG1heEhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuXG4gICAgICAgIC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG5cbiAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmIHRleHRFbGVtZW50SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgLSBtYXhIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXJEaW1zLmhlaWdodCArIGRpZmYgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIGF1dG9zaHJpbmsgY29udGFpbmVyIGhlaWdodCB1bnRpbCBvcmlnaW5hbCBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgICAgLy8gaXMgcmVhY2hlZCB3aGVuIHRleHQgaXMgcmVtb3ZlZFxuICAgICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckRhdGEuaGVpZ2h0ICYmXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgPCBtYXhIZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgbWF4SGVpZ2h0IC0gdGV4dEVsZW1lbnRIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXJEaW1zLmhlaWdodCAtIGRpZmYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgcHVzaGluZyB0ZXh0IHVwd2FyZCB1bnRpbCBhIGRpZmYgb2YgMzBweCAocGFkZGluZylcbiAgICAgICAgLy8gaXMgcmVhY2hlZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICAgICAgICAgIGlmICh2ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5NSURETEUpIHtcbiAgICAgICAgICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci55ICsgY29udGFpbmVyRGltcy5oZWlnaHQgLyAyIC0gdGV4dEVsZW1lbnRIZWlnaHQgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICBjb250YWluZXIueSArXG4gICAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgLVxuICAgICAgICAgICAgICBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uRW5kID0gZWRpdGFibGUuc2VsZWN0aW9uRW5kO1xuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dDtcblxuICAgICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdmFsdWUgdXBkYXRlZCBzbyBpdCBkb2Vzbid0XG4gICAgICAvLyBnbyB0byB0aGUgZW5kIG9mIHRleHQgd2hlbiBjb250YWluZXIgYXV0byBleHBhbmRlZFxuICAgICAgaWYgKFxuICAgICAgICBpbml0aWFsU2VsZWN0aW9uU3RhcnQgPT09IGluaXRpYWxTZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvbkVuZCAhPT0gaW5pdGlhbExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIC8vIGdldCBkaWZmIGJldHdlZW4gbGVuZ3RoIGFuZCBzZWxlY3Rpb24gZW5kIGFuZCBzaGlmdFxuICAgICAgICAvLyB0aGUgY3Vyc29yIGJ5IFwiZGlmZlwiIHRpbWVzIHRvIHBvc2l0aW9uIGNvcnJlY3RseVxuICAgICAgICBjb25zdCBkaWZmID0gaW5pdGlhbExlbmd0aCAtIGluaXRpYWxTZWxlY3Rpb25FbmQ7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICA/IGFwcHJveExpbmVIZWlnaHRcbiAgICAgICAgOiB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgbWF4V2lkdGggPSAoYXBwU3RhdGUud2lkdGggLSA4IC0gdmlld3BvcnRYKSAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBoZWlnaHQgZG9lc24ndCBnbyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9XG4gICAgICAgIChhcHBTdGF0ZS5oZWlnaHQgLSB2aWV3cG9ydFkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcblxuICAgICAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgICAgICBmb250OiBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIGZvbnQgwq9cXF8o44OEKV8vwq9cbiAgICAgICAgbGluZUhlaWdodDogYCR7bGluZUhlaWdodH1weGAsXG4gICAgICAgIHdpZHRoOiBgJHtNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpfXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHt0ZXh0RWxlbWVudEhlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQsXG4gICAgICAgICAgZ2V0VGV4dEVsZW1lbnRBbmdsZSh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgIGVkaXRvck1heEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZFRleHRFbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICBvcGFjaXR5OiB1cGRhdGVkVGV4dEVsZW1lbnQub3BhY2l0eSAvIDEwMCxcbiAgICAgICAgZmlsdGVyOiBcInZhcigtLXRoZW1lLWZpbHRlcilcIixcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtlZGl0b3JNYXhIZWlnaHR9cHhgLFxuICAgICAgfSk7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gdXBkYXRpbmcgZm9udCBhdHRyaWJ1dGUgZG9lc24ndCBzZXQgZm9udCBmYW1pbHlcbiAgICAgIC8vIGhlbmNlIHVwZGF0aW5nIGZvbnQgZmFtaWx5IGV4cGxpY2l0bHkgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseVN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQsIHsgeDogY29vcmRYLCB5OiBjb29yZFkgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBtaW5IZWlnaHQ6IFwiMWVtXCIsXG4gICAgYmFja2ZhY2VWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIHJlc2l6ZTogXCJub25lXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICAgIGJveFNpemluZzogXCJjb250ZW50LWJveFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25wYXN0ZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGF3YWl0IHBhcnNlQ2xpcGJvYXJkKGV2ZW50LCB0cnVlKTtcbiAgICAgIGlmICghY2xpcGJvYXJkRGF0YS50ZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVUZXh0KGNsaXBib2FyZERhdGEudGV4dCk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgICAgICBmb250U2l6ZTogYXBwLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IGFwcC5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBgJHtlZGl0YWJsZS52YWx1ZX0ke2RhdGF9YCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKHdyYXBwZWRUZXh0LCBmb250KTtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgaWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnN0IGZvbnQgPSBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICAvLyB1c2luZyBzY3JvbGxIZWlnaHQgaGVyZSBzaW5jZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzIHNvIGNhbm5vdCB1c2UgZWRpdGFibGUuc3R5bGUuaGVpZ2h0XG4gICAgICAvLyBhcyB0aGF0IGdldHMgdXBkYXRlZCBiZWxvd1xuICAgICAgLy8gUm91bmRpbmcgaGVyZSBzbyB0aGF0IHRoZSBsaW5lcyBjYWxjdWxhdGVkIGlzIG1vcmUgYWNjdXJhdGUgaW4gYWxsIGJyb3dzZXJzLlxuICAgICAgLy8gVGhlIHNjcm9sbEhlaWdodCBhbmQgYXBwcm94TGluZUhlaWdodCBkaWZmZXJzIGluIGRpZmYgYnJvd3NlcnNcbiAgICAgIC8vIGVnIGl0IGdpdmVzIDEuMDUgaW4gZmlyZWZveCBmb3IgaGFuZGV3cml0dGVuIHNtYWxsIGZvbnQgZHVlIHRvIHdoaWNoXG4gICAgICAvLyBoZWlnaHQgZ2V0cyB1cGRhdGVkIGFzIGxpbmVzID4gMSBhbmQgbGVhZHMgdG8ganVtcGluZyB0ZXh0IGZvciBmaXJzdCBsaW5lIGluIGJvdW5kIGNvbnRhaW5lclxuICAgICAgLy8gaGVuY2Ugcm91bmRpbmcgaGVyZSB0byBhdm9pZCB0aGF0XG4gICAgICBjb25zdCBsaW5lcyA9IE1hdGgucm91bmQoXG4gICAgICAgIGVkaXRhYmxlLnNjcm9sbEhlaWdodCAvIGdldEFwcHJveExpbmVIZWlnaHQoZm9udCksXG4gICAgICApO1xuICAgICAgLy8gYXV0byBpbmNyZWFzZSBoZWlnaHQgb25seSB3aGVuIGxpbmVzICA+IDEgc28gaXRzXG4gICAgICAvLyBtZWFzdXJlZCBjb3JyZWN0bHkgYW5kIHZlcnRpY2FsbHkgYWxpZ25zIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcbiAgICAgIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkgJiYgbGluZXMgPiAxKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSBcImF1dG9cIjtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjtcbiAgICAgICAgbGV0IGhlaWdodFNldCA9IGZhbHNlO1xuICAgICAgICBpZiAobGluZXMgPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGFjdHVhbExpbmVDb3VudCA9IHdyYXBUZXh0KFxuICAgICAgICAgICAgZWRpdGFibGUudmFsdWUsXG4gICAgICAgICAgICBmb250LFxuICAgICAgICAgICAgZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyISksXG4gICAgICAgICAgKS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG4gICAgICAgICAgLy8gVGhpcyBpcyBicm93c2VyIGJlaGF2aW91ciB3aGVuIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAgICAgLy8gSXQgc2V0cyB0aGUgaGVpZ2h0IG5lZWRlZCBmb3IgMiBsaW5lcyBldmVuIGlmIGFjdHVhbFxuICAgICAgICAgIC8vIGxpbmUgY291bnQgaXMgMSBhcyBtZW50aW9uZWQgYWJvdmUgYXMgd2VsbFxuICAgICAgICAgIC8vIGhlbmNlIHJlZHVjaW5nIHRoZSBoZWlnaHQgYnkgaGFsZiBpZiBhY3R1YWwgbGluZSBjb3VudCBpcyAxXG4gICAgICAgICAgLy8gc28gc2luZ2xlIGxpbmUgYWxpZ25zIHZlcnRpY2FsbHkgd2hlbiBkZWxldGluZ1xuICAgICAgICAgIGlmIChhY3R1YWxMaW5lQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodCAvIDJ9cHhgO1xuICAgICAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgaGVpZ2h0U2V0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoZWlnaHRTZXQpIHtcbiAgICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHR9cHhgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbkNoYW5nZShub3JtYWxpemVUZXh0KGVkaXRhYmxlLnZhbHVlKSk7XG4gICAgfTtcbiAgfVxuXG4gIGVkaXRhYmxlLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgYWN0aW9uWm9vbUluLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25ab29tSW4pO1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgYWN0aW9uWm9vbU91dC5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uWm9vbU91dCk7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkRlY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVjcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb25JbmNyZWFzZUZvbnRTaXplLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkluY3JlYXNlRm9udFNpemUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVTQ0FQRSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSICYmIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSBLRVlTLlRBQiB8fFxuICAgICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQgfHxcbiAgICAgICAgICBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSlcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUKSB7XG4gICAgICAgIG91dGRlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCgpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuICAgICAgZWRpdGFibGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFRBQl9TSVpFID0gNDtcbiAgY29uc3QgVEFCID0gXCIgXCIucmVwZWF0KFRBQl9TSVpFKTtcbiAgY29uc3QgUkVfTEVBRElOR19UQUIgPSBuZXcgUmVnRXhwKGBeIHsxLCR7VEFCX1NJWkV9fWApO1xuICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcblxuICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7VEFCfSR7ZW5kVmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuICAgIGNvbnN0IHJlbW92ZWRUYWJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGFiTWF0Y2ggPSB2YWx1ZVxuICAgICAgICAuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKVxuICAgICAgICAubWF0Y2goUkVfTEVBRElOR19UQUIpO1xuXG4gICAgICBpZiAodGFiTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXggKyB0YWJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG4gICAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke2VuZFZhbHVlfWA7XG4gICAgICAgIHJlbW92ZWRUYWJzLnB1c2goc3RhcnRJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLFxuICAgICAgICAgIHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGZpcnN0IHRhYiByZW1vdmVkLCBleDpcbiAgICAgICAgLy8gTGluZXwgIzFcbiAgICAgICAgLy8gICAgIExpbmUgIzJcbiAgICAgICAgLy8gTGlufGUgIzNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlc2V0IHRoZSBzZWxlY3Rpb25TdGFydCB0byBoaXMgaW5pdGlhbCB2YWx1ZS5cbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgIH1cbiAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KFxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgaW5kaWNlcyBvZiBzdGFydCBwb3NpdGlvbnMgb2Ygc2VsZWN0ZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGNvbnN0IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgdmFsdWUgfSA9IGVkaXRhYmxlO1xuXG4gICAgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvW15cXG5dKiQvKSFbMF1cbiAgICAgIC5sZW5ndGg7XG4gICAgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgLSBzdGFydE9mZnNldDtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHN0YXJ0SW5kaWNlcywgbGluZSwgaWR4LCBsaW5lcykgPT5cbiAgICAgICAgICBzdGFydEluZGljZXMuY29uY2F0KFxuICAgICAgICAgICAgaWR4XG4gICAgICAgICAgICAgID8gLy8gY3VyciBsaW5lIGluZGV4IGlzIHByZXYgbGluZSdzIHN0YXJ0ICsgcHJldiBsaW5lJ3MgbGVuZ3RoICsgXFxuXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRpY2VzW2lkeCAtIDFdICsgbGluZXNbaWR4IC0gMV0ubGVuZ3RoICsgMVxuICAgICAgICAgICAgICA6IC8vIGZpcnN0IHNlbGVjdGVkIGxpbmVcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICApLFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgIClcbiAgICAgIC5yZXZlcnNlKCk7XG4gIH07XG5cbiAgY29uc3Qgc3RvcEV2ZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgLy8gdXNpbmcgYSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdG8gdGhlIGhhbmRsZVN1Ym1pdCBjYWxsYmFja1xuICAvLyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGEgY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsZXJzXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgLy8gY2xlYW51cCBtdXN0IGJlIHJ1biBiZWZvcmUgb25TdWJtaXQgb3RoZXJ3aXNlIHdoZW4gYXBwIGJsdXJzIHRoZSB3eXNpd3lnXG4gICAgLy8gaXQnZCBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcCBvZiBibHVy4oaSb25TdWJtaXQgYWZ0ZXIgd2UgcmUtZm9jdXMgdGhlXG4gICAgLy8gd3lzaXd5ZyBvbiB1cGRhdGVcbiAgICBjbGVhbnVwKCk7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgZWxlbWVudC5pZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZUVsZW1lbnQpO1xuXG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGV4dCA9IHVwZGF0ZUVsZW1lbnQudGV4dDtcbiAgICAgIGlmIChlZGl0YWJsZS52YWx1ZS50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gICAgICAgIGlmICghYm91bmRUZXh0RWxlbWVudElkIHx8IGJvdW5kVGV4dEVsZW1lbnRJZCAhPT0gZWxlbWVudC5pZCkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PlxuICAgICAgICAgICAgICAhaXNUZXh0RWxlbWVudChcbiAgICAgICAgICAgICAgICBlbGUgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25TdWJtaXQoe1xuICAgICAgdGV4dCxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
3463
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getOriginalContainerHeightFromCache\": () => (/* binding */ getOriginalContainerHeightFromCache),\n/* harmony export */ \"resetOriginalContainerCache\": () => (/* binding */ resetOriginalContainerCache),\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg),\n/* harmony export */ \"updateOriginalContainerCache\": () => (/* binding */ updateOriginalContainerCache)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\n const { zoom } = appState;\n const degree = (180 * angle) / Math.PI;\n let translateX = (width * (zoom.value - 1)) / 2;\n let translateY = (height * (zoom.value - 1)) / 2;\n if (width > maxWidth && zoom.value !== 1) {\n translateX = (maxWidth * (zoom.value - 1)) / 2;\n }\n if (height > maxHeight && zoom.value !== 1) {\n translateY = (maxHeight * (zoom.value - 1)) / 2;\n }\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\nconst originalContainerCache = {};\nconst updateOriginalContainerCache = (id, height) => {\n const data = originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\nconst resetOriginalContainerCache = (id) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\nconst getOriginalContainerHeightFromCache = (id) => {\n var _a, _b;\n return (_b = (_a = originalContainerCache[id]) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : null;\n};\nconst textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\n if (!editable.style.fontFamily || !editable.style.fontSize) {\n return false;\n }\n const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedTextElement.fontFamily }) !==\n currentFont) {\n return true;\n }\n if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n return true;\n }\n return false;\n };\n const updateWysiwygStyle = () => {\n var _a;\n const appState = app.state;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n if (!updatedTextElement) {\n return;\n }\n const { textAlign, verticalAlign } = updatedTextElement;\n const approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement));\n if (updatedTextElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedTextElement)) {\n let coordX = updatedTextElement.x;\n let coordY = updatedTextElement.y;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedTextElement);\n let maxWidth = updatedTextElement.width;\n let maxHeight = updatedTextElement.height;\n const width = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let textElementHeight = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.LinearElementEditor.getBoundTextElementPosition(container, updatedTextElement);\n coordX = boundTextCoords.x;\n coordY = boundTextCoords.y;\n }\n const propertiesUpdated = textPropertiesUpdated(updatedTextElement, editable);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerDims)(container);\n // using editor.style.height to get the accurate height of text editor\n const editorHeight = Number(editable.style.height.slice(0, -2));\n if (editorHeight > 0) {\n textElementHeight = editorHeight;\n }\n if (propertiesUpdated) {\n // update height of the editor after properties updated\n textElementHeight = updatedTextElement.height;\n }\n let originalContainerData;\n if (propertiesUpdated) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n else {\n originalContainerData = originalContainerCache[container.id];\n if (!originalContainerData) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n }\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container);\n maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && textElementHeight > maxHeight) {\n const diff = Math.min(textElementHeight - maxHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height + diff });\n return;\n }\n else if (\n // autoshrink container height until original container height\n // is reached when text is removed\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) &&\n containerDims.height > originalContainerData.height &&\n textElementHeight < maxHeight) {\n const diff = Math.min(maxHeight - textElementHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height - diff });\n }\n // Start pushing text upward until a diff of 30px (padding)\n // is reached\n else {\n // vertically center align the text\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.MIDDLE) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n coordY =\n container.y + containerDims.height / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n textElementHeight -\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementOffset)(updatedTextElement);\n }\n }\n }\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n const initialSelectionStart = editable.selectionStart;\n const initialSelectionEnd = editable.selectionEnd;\n const initialLength = editable.value.length;\n editable.value = updatedTextElement.originalText;\n // restore cursor position after value updated so it doesn't\n // go to the end of text when container auto expanded\n if (initialSelectionStart === initialSelectionEnd &&\n initialSelectionEnd !== initialLength) {\n // get diff between length and selection end and shift\n // the cursor by \"diff\" times to position correctly\n const diff = initialLength - initialSelectionEnd;\n editable.selectionStart = editable.value.length - diff;\n editable.selectionEnd = editable.value.length - diff;\n }\n const lines = updatedTextElement.originalText.split(\"\\n\");\n const lineHeight = updatedTextElement.containerId\n ? approxLineHeight\n : updatedTextElement.height / lines.length;\n if (!container) {\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n }\n // Make sure text editor height doesn't go beyond viewport\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\n Object.assign(editable.style, {\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement),\n // must be defined *after* font ¯\\_(ツ)_/¯\n lineHeight: `${lineHeight}px`,\n width: `${Math.min(width, maxWidth)}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(width, textElementHeight, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextElementAngle)(updatedTextElement), appState, maxWidth, editorMaxHeight),\n textAlign,\n verticalAlign,\n color: updatedTextElement.strokeColor,\n opacity: updatedTextElement.opacity / 100,\n filter: \"var(--theme-filter)\",\n maxHeight: `${editorMaxHeight}px`,\n });\n // For some reason updating font attribute doesn't set font family\n // hence updating font family explicitly for test environment\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedTextElement);\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedTextElement, { x: coordX, y: coordY });\n }\n };\n const editable = document.createElement(\"textarea\");\n editable.dir = \"auto\";\n editable.tabIndex = 0;\n editable.dataset.type = \"wysiwyg\";\n // prevent line wrapping on Safari\n editable.wrap = \"off\";\n editable.classList.add(\"excalidraw-wysiwyg\");\n let whiteSpace = \"pre\";\n let wordBreak = \"normal\";\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n whiteSpace = \"pre-wrap\";\n wordBreak = \"break-word\";\n }\n Object.assign(editable.style, {\n position: \"absolute\",\n display: \"inline-block\",\n minHeight: \"1em\",\n backfaceVisibility: \"hidden\",\n margin: 0,\n padding: 0,\n border: 0,\n outline: 0,\n resize: \"none\",\n background: \"transparent\",\n overflow: \"hidden\",\n // must be specified because in dark mode canvas creates a stacking context\n zIndex: \"var(--zIndex-wysiwyg)\",\n wordBreak,\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n whiteSpace,\n overflowWrap: \"break-word\",\n boxSizing: \"content-box\",\n });\n updateWysiwygStyle();\n if (onChange) {\n editable.onpaste = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const clipboardData = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event, true);\n if (!clipboardData.text) {\n return;\n }\n const data = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(clipboardData.text);\n if (!data) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)({\n fontSize: app.state.currentItemFontSize,\n fontFamily: app.state.currentItemFontFamily,\n });\n if (container) {\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(`${editable.value}${data}`, font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n }\n });\n editable.oninput = () => {\n var _a;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement);\n // using scrollHeight here since we need to calculate\n // number of lines so cannot use editable.style.height\n // as that gets updated below\n // Rounding here so that the lines calculated is more accurate in all browsers.\n // The scrollHeight and approxLineHeight differs in diff browsers\n // eg it gives 1.05 in firefox for handewritten small font due to which\n // height gets updated as lines > 1 and leads to jumping text for first line in bound container\n // hence rounding here to avoid that\n const lines = Math.round(editable.scrollHeight / (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)(font));\n // auto increase height only when lines > 1 so its\n // measured correctly and vertically aligns for\n // first line as well as setting height to \"auto\"\n // doubles the height as soon as user starts typing\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n let height = \"auto\";\n editable.style.height = \"0px\";\n let heightSet = false;\n if (lines === 2) {\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container)).split(\"\\n\").length;\n // This is browser behaviour when setting height to \"auto\"\n // It sets the height needed for 2 lines even if actual\n // line count is 1 as mentioned above as well\n // hence reducing the height by half if actual line count is 1\n // so single line aligns vertically when deleting\n if (actualLineCount === 1) {\n height = `${editable.scrollHeight / 2}px`;\n editable.style.height = height;\n heightSet = true;\n }\n }\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value), font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n if (!heightSet) {\n editable.style.height = `${editable.scrollHeight}px`;\n }\n }\n onChange((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value));\n };\n }\n editable.onkeydown = (event) => {\n if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn);\n updateWysiwygStyle();\n }\n else if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut);\n updateWysiwygStyle();\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\n event.preventDefault();\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\n event.preventDefault();\n if (event.isComposing || event.keyCode === 229) {\n return;\n }\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\n event.preventDefault();\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\n outdent();\n }\n else {\n indent();\n }\n // We must send an input event to resize the element\n editable.dispatchEvent(new Event(\"input\"));\n }\n };\n const TAB_SIZE = 4;\n const TAB = \" \".repeat(TAB_SIZE);\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n const indent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex);\n value = `${startValue}${TAB}${endValue}`;\n });\n editable.value = value;\n editable.selectionStart = selectionStart + TAB_SIZE;\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n };\n const outdent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n const removedTabs = [];\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const tabMatch = value\n .slice(startIndex, startIndex + TAB_SIZE)\n .match(RE_LEADING_TAB);\n if (tabMatch) {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex + tabMatch[0].length);\n // Delete a tab from the line\n value = `${startValue}${endValue}`;\n removedTabs.push(startIndex);\n }\n });\n editable.value = value;\n if (removedTabs.length) {\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\n }\n else {\n // If the cursor is before the first tab removed, ex:\n // Line| #1\n // Line #2\n // Lin|e #3\n // we should reset the selectionStart to his initial value.\n editable.selectionStart = selectionStart;\n }\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\n }\n };\n /**\n * @returns indices of start positions of selected lines, in reverse order\n */\n const getSelectedLinesStartIndices = () => {\n let { selectionStart, selectionEnd, value } = editable;\n // chars before selectionStart on the same line\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\n .length;\n // put caret at the start of the line\n selectionStart = selectionStart - startOffset;\n const selected = value.slice(selectionStart, selectionEnd);\n return selected\n .split(\"\\n\")\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\n ? // curr line index is prev line's start + prev line's length + \\n\n startIndices[idx - 1] + lines[idx - 1].length + 1\n : // first selected line\n selectionStart), [])\n .reverse();\n };\n const stopEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n // using a state variable instead of passing it to the handleSubmit callback\n // so that we don't need to create separate a callback for event handlers\n let submittedViaKeyboard = false;\n const handleSubmit = () => {\n var _a, _b;\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n // wysiwyg on update\n cleanup();\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\n if (!updateElement) {\n return;\n }\n let text = editable.value;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\n if (container) {\n text = updateElement.text;\n if (editable.value.trim()) {\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\n if (!boundTextElementId || boundTextElementId !== element.id) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: element.id,\n }),\n });\n }\n }\n else {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\n });\n }\n }\n onSubmit({\n text,\n viaKeyboard: submittedViaKeyboard,\n originalText: editable.value,\n });\n };\n const cleanup = () => {\n if (isDestroyed) {\n return;\n }\n isDestroyed = true;\n // remove events to ensure they don't late-fire\n editable.onblur = null;\n editable.oninput = null;\n editable.onkeydown = null;\n if (observer) {\n observer.disconnect();\n }\n window.removeEventListener(\"resize\", updateWysiwygStyle);\n window.removeEventListener(\"wheel\", stopEvent, true);\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n window.removeEventListener(\"blur\", handleSubmit);\n unbindUpdate();\n editable.remove();\n };\n const bindBlurEvent = (event) => {\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n // trigger the blur on ensuing pointerup.\n // Also to handle cases such as picking a color which would trigger a blur\n // in that same tick.\n const target = event === null || event === void 0 ? void 0 : event.target;\n const isTargetColorPicker = target instanceof HTMLInputElement &&\n target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\n setTimeout(() => {\n editable.onblur = handleSubmit;\n if (target && isTargetColorPicker) {\n target.onblur = () => {\n editable.focus();\n };\n }\n // case: clicking on the same property → no change → no update → no focus\n if (!isTargetColorPicker) {\n editable.focus();\n }\n });\n };\n // prevent blur when changing properties from the menu\n const onPointerDown = (event) => {\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\n event.target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\n if (((event.target instanceof HTMLElement ||\n event.target instanceof SVGElement) &&\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\n isTargetColorPicker) {\n editable.onblur = null;\n window.addEventListener(\"pointerup\", bindBlurEvent);\n // handle edge-case where pointerup doesn't fire e.g. due to user\n // alt-tabbing away\n window.addEventListener(\"blur\", handleSubmit);\n }\n };\n // handle updates of textElement properties of editing element\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\n var _a;\n updateWysiwygStyle();\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\n if (!isColorPickerActive) {\n editable.focus();\n }\n });\n // ---------------------------------------------------------------------------\n let isDestroyed = false;\n // select on init (focusing is done separately inside the bindBlurEvent()\n // because we need it to happen *after* the blur event from `pointerdown`)\n editable.select();\n bindBlurEvent();\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n // is preferred so we catch changes from host, where window may not resize.\n let observer = null;\n if (canvas && \"ResizeObserver\" in window) {\n observer = new window.ResizeObserver(() => {\n updateWysiwygStyle();\n });\n observer.observe(canvas);\n }\n else {\n window.addEventListener(\"resize\", updateWysiwygStyle);\n }\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"wheel\", stopEvent, {\n passive: false,\n capture: true,\n });\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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U0FBTTtRQUNMLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUN2RDtJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7UUFDMUMsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQztJQUNILG1CQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUNmLGFBQWEsQ0FBQyxpQ0FBaUMsRUFDaEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRXeXNpd3lnLnRzeD84ZjRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPREVTLCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7XG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICBnZXRGb250U3RyaW5nLFxuICBnZXRGb250RmFtaWx5U3RyaW5nLFxuICBpc1Rlc3RFbnYsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHtcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEFwcHJveExpbmVIZWlnaHQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgZ2V0VGV4dEVsZW1lbnRBbmdsZSxcbiAgZ2V0VGV4dFdpZHRoLFxuICBub3JtYWxpemVUZXh0LFxuICB3cmFwVGV4dCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGFjdGlvbkRlY3JlYXNlRm9udFNpemUsXG4gIGFjdGlvbkluY3JlYXNlRm9udFNpemUsXG59IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcbmltcG9ydCB7IGFjdGlvblpvb21JbiwgYWN0aW9uWm9vbU91dCB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkNhbnZhc1wiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7IGdldE1heENvbnRhaW5lckhlaWdodCwgZ2V0TWF4Q29udGFpbmVyV2lkdGggfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgcGFyc2VDbGlwYm9hcmQgfSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgbWF4V2lkdGg6IG51bWJlcixcbiAgbWF4SGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgeyB6b29tIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGFuZ2xlKSAvIE1hdGguUEk7XG4gIGxldCB0cmFuc2xhdGVYID0gKHdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQgJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVkgPSAobWF4SGVpZ2h0ICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIHJldHVybiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb20udmFsdWV9KSByb3RhdGUoJHtkZWdyZWV9ZGVnKWA7XG59O1xuXG5jb25zdCBvcmlnaW5hbENvbnRhaW5lckNhY2hlOiB7XG4gIFtpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXV06XG4gICAgfCB7XG4gICAgICAgIGhlaWdodDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJoZWlnaHRcIl07XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG59ID0ge307XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbiAgaGVpZ2h0OiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBkYXRhID1cbiAgICBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSB8fCAob3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0gPSB7IGhlaWdodCB9KTtcbiAgZGF0YS5oZWlnaHQgPSBoZWlnaHQ7XG4gIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4pID0+IHtcbiAgaWYgKG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdKSB7XG4gICAgZGVsZXRlIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3JpZ2luYWxDb250YWluZXJIZWlnaHRGcm9tQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuKSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXT8uaGVpZ2h0ID8/IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFd5c2l3eWcgPSAoe1xuICBpZCxcbiAgb25DaGFuZ2UsXG4gIG9uU3VibWl0LFxuICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgZWxlbWVudCxcbiAgY2FudmFzLFxuICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICBhcHAsXG59OiB7XG4gIGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBhcHA6IEFwcDtcbn0pID0+IHtcbiAgY29uc3QgdGV4dFByb3BlcnRpZXNVcGRhdGVkID0gKFxuICAgIHVwZGF0ZWRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBpZiAoIWVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkgfHwgIWVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZFRleHRFbGVtZW50LmZvbnRGYW1pbHkgfSkgIT09XG4gICAgICBjdXJyZW50Rm9udFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChgJHt1cGRhdGVkVGV4dEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVXeXNpd3lnU3R5bGUgPSAoKSA9PiB7XG4gICAgY29uc3QgYXBwU3RhdGUgPSBhcHAuc3RhdGU7XG4gICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID1cbiAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50PEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4oaWQpO1xuXG4gICAgaWYgKCF1cGRhdGVkVGV4dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0QWxpZ24sIHZlcnRpY2FsQWxpZ24gfSA9IHVwZGF0ZWRUZXh0RWxlbWVudDtcbiAgICBjb25zdCBhcHByb3hMaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChcbiAgICAgIGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KSxcbiAgICApO1xuICAgIGlmICh1cGRhdGVkVGV4dEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQpKSB7XG4gICAgICBsZXQgY29vcmRYID0gdXBkYXRlZFRleHRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZFRleHRFbGVtZW50Lnk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG5cbiAgICAgIGxldCBtYXhIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICAvLyBTZXQgdG8gZWxlbWVudCBoZWlnaHQgYnkgZGVmYXVsdCBzaW5jZSB0aGF0J3NcbiAgICAgIC8vIHdoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdW5ib3VuZGVkIHRleHRcbiAgICAgIGxldCB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID1cbiAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb29yZFggPSBib3VuZFRleHRDb29yZHMueDtcbiAgICAgICAgICBjb29yZFkgPSBib3VuZFRleHRDb29yZHMueTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQsXG4gICAgICAgICAgZWRpdGFibGUsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICAgIC8vIHVzaW5nIGVkaXRvci5zdHlsZS5oZWlnaHQgdG8gZ2V0IHRoZSBhY2N1cmF0ZSBoZWlnaHQgb2YgdGV4dCBlZGl0b3JcbiAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0ID0gZWRpdG9ySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luYWxDb250YWluZXJEYXRhO1xuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKFxuICAgICAgICAgICAgY29udGFpbmVyLmlkLFxuICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2NvbnRhaW5lci5pZF07XG4gICAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckRhdGEpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVyRGF0YSA9IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoXG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICAgICAgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gYXV0b2dyb3cgY29udGFpbmVyIGhlaWdodCBpZiB0ZXh0IGV4Y2VlZHNcbiAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmIHRleHRFbGVtZW50SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgLSBtYXhIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXJEaW1zLmhlaWdodCArIGRpZmYgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIGF1dG9zaHJpbmsgY29udGFpbmVyIGhlaWdodCB1bnRpbCBvcmlnaW5hbCBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgICAgLy8gaXMgcmVhY2hlZCB3aGVuIHRleHQgaXMgcmVtb3ZlZFxuICAgICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckRhdGEuaGVpZ2h0ICYmXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgPCBtYXhIZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgbWF4SGVpZ2h0IC0gdGV4dEVsZW1lbnRIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXJEaW1zLmhlaWdodCAtIGRpZmYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgcHVzaGluZyB0ZXh0IHVwd2FyZCB1bnRpbCBhIGRpZmYgb2YgMzBweCAocGFkZGluZylcbiAgICAgICAgLy8gaXMgcmVhY2hlZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICAgICAgICAgIGlmICh2ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5NSURETEUpIHtcbiAgICAgICAgICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci55ICsgY29udGFpbmVyRGltcy5oZWlnaHQgLyAyIC0gdGV4dEVsZW1lbnRIZWlnaHQgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICBjb250YWluZXIueSArXG4gICAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgLVxuICAgICAgICAgICAgICBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uRW5kID0gZWRpdGFibGUuc2VsZWN0aW9uRW5kO1xuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dDtcblxuICAgICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdmFsdWUgdXBkYXRlZCBzbyBpdCBkb2Vzbid0XG4gICAgICAvLyBnbyB0byB0aGUgZW5kIG9mIHRleHQgd2hlbiBjb250YWluZXIgYXV0byBleHBhbmRlZFxuICAgICAgaWYgKFxuICAgICAgICBpbml0aWFsU2VsZWN0aW9uU3RhcnQgPT09IGluaXRpYWxTZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvbkVuZCAhPT0gaW5pdGlhbExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIC8vIGdldCBkaWZmIGJldHdlZW4gbGVuZ3RoIGFuZCBzZWxlY3Rpb24gZW5kIGFuZCBzaGlmdFxuICAgICAgICAvLyB0aGUgY3Vyc29yIGJ5IFwiZGlmZlwiIHRpbWVzIHRvIHBvc2l0aW9uIGNvcnJlY3RseVxuICAgICAgICBjb25zdCBkaWZmID0gaW5pdGlhbExlbmd0aCAtIGluaXRpYWxTZWxlY3Rpb25FbmQ7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICA/IGFwcHJveExpbmVIZWlnaHRcbiAgICAgICAgOiB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgbWF4V2lkdGggPSAoYXBwU3RhdGUud2lkdGggLSA4IC0gdmlld3BvcnRYKSAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBoZWlnaHQgZG9lc24ndCBnbyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9XG4gICAgICAgIChhcHBTdGF0ZS5oZWlnaHQgLSB2aWV3cG9ydFkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7TWF0aC5taW4od2lkdGgsIG1heFdpZHRoKX1weGAsXG4gICAgICAgIGhlaWdodDogYCR7dGV4dEVsZW1lbnRIZWlnaHR9cHhgLFxuICAgICAgICBsZWZ0OiBgJHt2aWV3cG9ydFh9cHhgLFxuICAgICAgICB0b3A6IGAke3ZpZXdwb3J0WX1weGAsXG4gICAgICAgIHRyYW5zZm9ybTogZ2V0VHJhbnNmb3JtKFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0LFxuICAgICAgICAgIGdldFRleHRFbGVtZW50QW5nbGUodXBkYXRlZFRleHRFbGVtZW50KSxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgICBlZGl0b3JNYXhIZWlnaHQsXG4gICAgICAgICksXG4gICAgICAgIHRleHRBbGlnbixcbiAgICAgICAgdmVydGljYWxBbGlnbixcbiAgICAgICAgY29sb3I6IHVwZGF0ZWRUZXh0RWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgb3BhY2l0eTogdXBkYXRlZFRleHRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YCxcbiAgICAgIH0pO1xuICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHVwZGF0aW5nIGZvbnQgYXR0cmlidXRlIGRvZXNuJ3Qgc2V0IGZvbnQgZmFtaWx5XG4gICAgICAvLyBoZW5jZSB1cGRhdGluZyBmb250IGZhbWlseSBleHBsaWNpdGx5IGZvciB0ZXN0IGVudmlyb25tZW50XG4gICAgICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIG11dGF0ZUVsZW1lbnQodXBkYXRlZFRleHRFbGVtZW50LCB7IHg6IGNvb3JkWCwgeTogY29vcmRZIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBlZGl0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblxuICBlZGl0YWJsZS5kaXIgPSBcImF1dG9cIjtcbiAgZWRpdGFibGUudGFiSW5kZXggPSAwO1xuICBlZGl0YWJsZS5kYXRhc2V0LnR5cGUgPSBcInd5c2l3eWdcIjtcbiAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIG9uIFNhZmFyaVxuICBlZGl0YWJsZS53cmFwID0gXCJvZmZcIjtcbiAgZWRpdGFibGUuY2xhc3NMaXN0LmFkZChcImV4Y2FsaWRyYXctd3lzaXd5Z1wiKTtcblxuICBsZXQgd2hpdGVTcGFjZSA9IFwicHJlXCI7XG4gIGxldCB3b3JkQnJlYWsgPSBcIm5vcm1hbFwiO1xuXG4gIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICB3aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICAgIHdvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICB9XG4gIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgbWluSGVpZ2h0OiBcIjFlbVwiLFxuICAgIGJhY2tmYWNlVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBib3JkZXI6IDAsXG4gICAgb3V0bGluZTogMCxcbiAgICByZXNpemU6IFwibm9uZVwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAvLyBtdXN0IGJlIHNwZWNpZmllZCBiZWNhdXNlIGluIGRhcmsgbW9kZSBjYW52YXMgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHRcbiAgICB6SW5kZXg6IFwidmFyKC0tekluZGV4LXd5c2l3eWcpXCIsXG4gICAgd29yZEJyZWFrLFxuICAgIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyAoYHdoaXRlc3BhY2U6IG5vd3JhcGAgZG9lc24ndCB3b3JrIG9uIEZGKVxuICAgIHdoaXRlU3BhY2UsXG4gICAgb3ZlcmZsb3dXcmFwOiBcImJyZWFrLXdvcmRcIixcbiAgICBib3hTaXppbmc6IFwiY29udGVudC1ib3hcIixcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9ucGFzdGUgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBhd2FpdCBwYXJzZUNsaXBib2FyZChldmVudCwgdHJ1ZSk7XG4gICAgICBpZiAoIWNsaXBib2FyZERhdGEudGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gbm9ybWFsaXplVGV4dChjbGlwYm9hcmREYXRhLnRleHQpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGZvbnQgPSBnZXRGb250U3RyaW5nKHtcbiAgICAgICAgZm9udFNpemU6IGFwcC5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBhcHAuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRUZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgYCR7ZWRpdGFibGUudmFsdWV9JHtkYXRhfWAsXG4gICAgICAgICAgZm9udCxcbiAgICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aCh3cmFwcGVkVGV4dCwgZm9udCk7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGlkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgICBjb25zdCBmb250ID0gZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgLy8gdXNpbmcgc2Nyb2xsSGVpZ2h0IGhlcmUgc2luY2Ugd2UgbmVlZCB0byBjYWxjdWxhdGVcbiAgICAgIC8vIG51bWJlciBvZiBsaW5lcyBzbyBjYW5ub3QgdXNlIGVkaXRhYmxlLnN0eWxlLmhlaWdodFxuICAgICAgLy8gYXMgdGhhdCBnZXRzIHVwZGF0ZWQgYmVsb3dcbiAgICAgIC8vIFJvdW5kaW5nIGhlcmUgc28gdGhhdCB0aGUgbGluZXMgY2FsY3VsYXRlZCBpcyBtb3JlIGFjY3VyYXRlIGluIGFsbCBicm93c2Vycy5cbiAgICAgIC8vIFRoZSBzY3JvbGxIZWlnaHQgYW5kIGFwcHJveExpbmVIZWlnaHQgZGlmZmVycyBpbiBkaWZmIGJyb3dzZXJzXG4gICAgICAvLyBlZyBpdCBnaXZlcyAxLjA1IGluIGZpcmVmb3ggZm9yIGhhbmRld3JpdHRlbiBzbWFsbCBmb250IGR1ZSB0byB3aGljaFxuICAgICAgLy8gaGVpZ2h0IGdldHMgdXBkYXRlZCBhcyBsaW5lcyA+IDEgYW5kIGxlYWRzIHRvIGp1bXBpbmcgdGV4dCBmb3IgZmlyc3QgbGluZSBpbiBib3VuZCBjb250YWluZXJcbiAgICAgIC8vIGhlbmNlIHJvdW5kaW5nIGhlcmUgdG8gYXZvaWQgdGhhdFxuICAgICAgY29uc3QgbGluZXMgPSBNYXRoLnJvdW5kKFxuICAgICAgICBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpLFxuICAgICAgKTtcbiAgICAgIC8vIGF1dG8gaW5jcmVhc2UgaGVpZ2h0IG9ubHkgd2hlbiBsaW5lcyAgPiAxIHNvIGl0c1xuICAgICAgLy8gbWVhc3VyZWQgY29ycmVjdGx5IGFuZCB2ZXJ0aWNhbGx5IGFsaWducyBmb3JcbiAgICAgIC8vIGZpcnN0IGxpbmUgYXMgd2VsbCBhcyBzZXR0aW5nIGhlaWdodCB0byBcImF1dG9cIlxuICAgICAgLy8gZG91YmxlcyB0aGUgaGVpZ2h0IGFzIHNvb24gYXMgdXNlciBzdGFydHMgdHlwaW5nXG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpICYmIGxpbmVzID4gMSkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgIGxldCBoZWlnaHQgPSBcImF1dG9cIjtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjtcbiAgICAgICAgbGV0IGhlaWdodFNldCA9IGZhbHNlO1xuICAgICAgICBpZiAobGluZXMgPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBhY3R1YWxMaW5lQ291bnQgPSB3cmFwVGV4dChcbiAgICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgICAgZm9udCxcbiAgICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciEpLFxuICAgICAgICAgICkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuICAgICAgICAgIC8vIFRoaXMgaXMgYnJvd3NlciBiZWhhdmlvdXIgd2hlbiBzZXR0aW5nIGhlaWdodCB0byBcImF1dG9cIlxuICAgICAgICAgIC8vIEl0IHNldHMgdGhlIGhlaWdodCBuZWVkZWQgZm9yIDIgbGluZXMgZXZlbiBpZiBhY3R1YWxcbiAgICAgICAgICAvLyBsaW5lIGNvdW50IGlzIDEgYXMgbWVudGlvbmVkIGFib3ZlIGFzIHdlbGxcbiAgICAgICAgICAvLyBoZW5jZSByZWR1Y2luZyB0aGUgaGVpZ2h0IGJ5IGhhbGYgaWYgYWN0dWFsIGxpbmUgY291bnQgaXMgMVxuICAgICAgICAgIC8vIHNvIHNpbmdsZSBsaW5lIGFsaWducyB2ZXJ0aWNhbGx5IHdoZW4gZGVsZXRpbmdcbiAgICAgICAgICBpZiAoYWN0dWFsTGluZUNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyAyfXB4YDtcbiAgICAgICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIGhlaWdodFNldCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyYXBwZWRUZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgbm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSksXG4gICAgICAgICAgZm9udCxcbiAgICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIhKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgod3JhcHBlZFRleHQsIGZvbnQpO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcblxuICAgICAgICBpZiAoIWhlaWdodFNldCkge1xuICAgICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodH1weGA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tSW4ua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblpvb21Jbik7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tT3V0LmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25ab29tT3V0KTtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuVEFCIHx8XG4gICAgICAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fFxuICAgICAgICAgIGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfUklHSFQpKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQpIHtcbiAgICAgICAgb3V0ZGVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXZSBtdXN0IHNlbmQgYW4gaW5wdXQgZXZlbnQgdG8gcmVzaXplIHRoZSBlbGVtZW50XG4gICAgICBlZGl0YWJsZS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgVEFCX1NJWkUgPSA0O1xuICBjb25zdCBUQUIgPSBcIiBcIi5yZXBlYXQoVEFCX1NJWkUpO1xuICBjb25zdCBSRV9MRUFESU5HX1RBQiA9IG5ldyBSZWdFeHAoYF4gezEsJHtUQUJfU0laRX19YCk7XG4gIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXgpO1xuXG4gICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtUQUJ9JHtlbmRWYWx1ZX1gO1xuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgKyBUQUJfU0laRTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQgKyBUQUJfU0laRSAqIGxpbmVzU3RhcnRJbmRpY2VzLmxlbmd0aDtcbiAgfTtcblxuICBjb25zdCBvdXRkZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgY29uc3QgcmVtb3ZlZFRhYnM6IG51bWJlcltdID0gW107XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0YWJNYXRjaCA9IHZhbHVlXG4gICAgICAgIC5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgVEFCX1NJWkUpXG4gICAgICAgIC5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gRGVsZXRlIGEgdGFiIGZyb20gdGhlIGxpbmVcbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAocmVtb3ZlZFRhYnMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSkge1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0IC0gVEFCX1NJWkUsXG4gICAgICAgICAgcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gTWF0aC5tYXgoXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBzZWxlY3Rpb25FbmQgLSBUQUJfU0laRSAqIHJlbW92ZWRUYWJzLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbmRpY2VzIG9mIHN0YXJ0IHBvc2l0aW9ucyBvZiBzZWxlY3RlZCBsaW5lcywgaW4gcmV2ZXJzZSBvcmRlclxuICAgKi9cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9ICgpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kLCB2YWx1ZSB9ID0gZWRpdGFibGU7XG5cbiAgICAvLyBjaGFycyBiZWZvcmUgc2VsZWN0aW9uU3RhcnQgb24gdGhlIHNhbWUgbGluZVxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pIVswXVxuICAgICAgLmxlbmd0aDtcbiAgICAvLyBwdXQgY2FyZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB2YWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSA9PlxuICAgICAgICAgIHN0YXJ0SW5kaWNlcy5jb25jYXQoXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICAgICAgPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgICAgICAgICAgICBzdGFydEluZGljZXNbaWR4IC0gMV0gKyBsaW5lc1tpZHggLSAxXS5sZW5ndGggKyAxXG4gICAgICAgICAgICAgIDogLy8gZmlyc3Qgc2VsZWN0ZWQgbGluZVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICksXG4gICAgICAgIFtdIGFzIG51bWJlcltdLFxuICAgICAgKVxuICAgICAgLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfTtcblxuICAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcbiAgbGV0IHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gZmFsc2U7XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICBlbGVtZW50LmlkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuICAgICAgaWYgKGVkaXRhYmxlLnZhbHVlLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+XG4gICAgICAgICAgICAgICFpc1RleHRFbGVtZW50KFxuICAgICAgICAgICAgICAgIGVsZSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0LFxuICAgICAgdmlhS2V5Ym9hcmQ6IHN1Ym1pdHRlZFZpYUtleWJvYXJkLFxuICAgICAgb3JpZ2luYWxUZXh0OiBlZGl0YWJsZS52YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcbiAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9ua2V5ZG93biA9IG51bGw7XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB0cnVlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuXG4gICAgdW5iaW5kVXBkYXRlKCk7XG5cbiAgICBlZGl0YWJsZS5yZW1vdmUoKTtcbiAgfTtcblxuICBjb25zdCBiaW5kQmx1ckV2ZW50ID0gKGV2ZW50PzogTW91c2VFdmVudCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIC8vIERlZmVycmVkIHNvIHRoYXQgdGhlIHBvaW50ZXJkb3duIHRoYXQgaW5pdGlhdGVzIHRoZSB3eXNpd3lnIGRvZXNuJ3RcbiAgICAvLyB0cmlnZ2VyIHRoZSBibHVyIG9uIGVuc3VpbmcgcG9pbnRlcnVwLlxuICAgIC8vIEFsc28gdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMgcGlja2luZyBhIGNvbG9yIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBibHVyXG4gICAgLy8gaW4gdGhhdCBzYW1lIHRpY2suXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcblxuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBoYW5kbGVTdWJtaXQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgdGFyZ2V0Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuICAgICAgaWYgKCFpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gcHJldmVudCBibHVyIHdoZW4gY2hhbmdpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBtZW51XG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICBpZiAoXG4gICAgICAoKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpICYmXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KGAuJHtDTEFTU0VTLlNIQVBFX0FDVElPTlNfTUVOVX1gKSAmJlxuICAgICAgICAhaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkgfHxcbiAgICAgIGlzVGFyZ2V0Q29sb3JQaWNrZXJcbiAgICApIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAgIC8vIGhhbmRsZSBlZGdlLWNhc2Ugd2hlcmUgcG9pbnRlcnVwIGRvZXNuJ3QgZmlyZSBlLmcuIGR1ZSB0byB1c2VyXG4gICAgICAvLyBhbHQtdGFiYmluZyBhd2F5XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaGFuZGxlIHVwZGF0ZXMgb2YgdGV4dEVsZW1lbnQgcHJvcGVydGllcyBvZiBlZGl0aW5nIGVsZW1lbnRcbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkhLmFkZENhbGxiYWNrKCgpID0+IHtcbiAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICBjb25zdCBpc0NvbG9yUGlja2VyQWN0aXZlID0gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KFxuICAgICAgXCIuY29sb3ItcGlja2VyLWlucHV0XCIsXG4gICAgKTtcbiAgICBpZiAoIWlzQ29sb3JQaWNrZXJBY3RpdmUpIHtcbiAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsZXQgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG4gIGVkaXRhYmxlLnNlbGVjdCgpO1xuICBiaW5kQmx1ckV2ZW50KCk7XG5cbiAgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuICBsZXQgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChjYW52YXMgJiYgXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdykge1xuICAgIG9ic2VydmVyID0gbmV3IHdpbmRvdy5SZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNhbnZhcyk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB7XG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgfSk7XG4gIGV4Y2FsaWRyYXdDb250YWluZXJcbiAgICA/LnF1ZXJ5U2VsZWN0b3IoXCIuZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIpIVxuICAgIC5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
3464
3464
 
3465
3465
  /***/ }),
3466
3466
 
@@ -3680,7 +3680,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3680
3680
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3681
3681
 
3682
3682
  "use strict";
3683
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.1-cf38c0f\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
3683
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.1-e41ea95\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
3684
3684
 
3685
3685
  /***/ }),
3686
3686
 
@@ -3801,7 +3801,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3801
3801
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3802
3802
 
3803
3803
  "use strict";
3804
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.1-cf38c0f\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
3804
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.1-e41ea95\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
3805
3805
 
3806
3806
  /***/ }),
3807
3807
 
@@ -3889,7 +3889,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3889
3889
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3890
3890
 
3891
3891
  "use strict";
3892
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"composeEventHandlers\": () => (/* binding */ composeEventHandlers),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getReactChildren\": () => (/* binding */ getReactChildren),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isShallowEqual\": () => (/* binding */ isShallowEqual),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./appState */ \"../../appState.ts\");\n\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveTool: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveTool\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_5__.isHandToolActive)(appState)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.GRAB;\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_5__.isEraserActive)(appState)) {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-cf38c0f\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-cf38c0f\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n/**\n * Partitions React children into named components and the rest of children.\n *\n * Returns known children as a dictionary of react children keyed by their\n * displayName, and the rest children as an array.\n *\n * NOTE all named react components are included in the dictionary, irrespective\n * of the supplied type parameter. This means you may be throwing away\n * children that you aren't expecting, but should nonetheless be rendered.\n * To guard against this (provided you care about the rest children at all),\n * supply a second parameter with an object with keys of the expected children.\n */\nconst getReactChildren = (children, expectedComponents) => {\n const restChildren = [];\n const knownChildren = react__WEBPACK_IMPORTED_MODULE_4___default().Children.toArray(children).reduce((acc, child) => {\n if (react__WEBPACK_IMPORTED_MODULE_4___default().isValidElement(child) &&\n (!expectedComponents ||\n child.type.displayName in expectedComponents)) {\n // @ts-ignore\n acc[child.type.displayName] = child;\n }\n else {\n restChildren.push(child);\n }\n return acc;\n }, {});\n return [knownChildren, restChildren];\n};\nconst isShallowEqual = (objA, objB) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objA);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every((key) => objA[key] === objB[key]);\n};\n// taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n if (!checkForDefaultPrevented ||\n !event.defaultPrevented) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsR0FBRyxFQUFFLEVBQ3hDLEVBQUU7SUFDRixPQUFPLFNBQVMsV0FBVyxDQUFDLEtBQVE7UUFDbEMsb0JBQW9CLGFBQXBCLG9CQUFvQix1QkFBcEIsb0JBQW9CLENBQUcsS0FBSyxDQUFDLENBQUM7UUFFOUIsSUFDRSxDQUFDLHdCQUF3QjtZQUN6QixDQUFFLEtBQTBCLENBQUMsZ0JBQWdCLEVBQzdDO1lBQ0EsT0FBTyxlQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUcsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/NzYzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcblxuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7XG4gIENVUlNPUl9UWVBFLFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIEVWRU5ULFxuICBGT05UX0ZBTUlMWSxcbiAgaXNEYXJ3aW4sXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbCwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IFNIQVBFUyB9IGZyb20gXCIuL3NoYXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgaXNFcmFzZXJBY3RpdmUsIGlzSGFuZFRvb2xBY3RpdmUgfSBmcm9tIFwiLi9hcHBTdGF0ZVwiO1xuXG5sZXQgbW9ja0RhdGVUaW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IHNldERhdGVUaW1lRm9yVGVzdHMgPSAoZGF0ZVRpbWU6IHN0cmluZykgPT4ge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9ICgpID0+IHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtocn0ke21pbn1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSAoc3RyOiBzdHJpbmcpID0+XG4gIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblxuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpcyBIVE1MRWxlbWVudCA9PlxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG5cbmV4cG9ydCBjb25zdCBpc0lucHV0TGlrZSA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MU2VsZWN0RWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudDtcblxuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gKHtcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgZm9yIChjb25zdCBbZm9udEZhbWlseVN0cmluZywgaWRdIG9mIE9iamVjdC5lbnRyaWVzKEZPTlRfRkFNSUxZKSkge1xuICAgIGlmIChpZCA9PT0gZm9udEZhbWlseSkge1xuICAgICAgcmV0dXJuIGAke2ZvbnRGYW1pbHlTdHJpbmd9LCAke1dJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVH1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcblxuLyoqIHJldHVybnMgZm9udFNpemUrZm9udEZhbWlseSBzdHJpbmcgZm9yIGFzc2lnbm1lbnQgdG8gRE9NIGVsZW1lbnRzICovXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9ICh7XG4gIGZvbnRTaXplLFxuICBmb250RmFtaWx5LFxufToge1xuICBmb250U2l6ZTogbnVtYmVyO1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseSB9KX1gIGFzIEZvbnRTdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2UgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICB0aW1lb3V0OiBudW1iZXIsXG4pID0+IHtcbiAgbGV0IGhhbmRsZSA9IDA7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyB0aHJvdHRsZSBjYWxsYmFjayB0byBleGVjdXRlIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuZXhwb3J0IGNvbnN0IHRocm90dGxlUkFGID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgb3B0cz86IHsgdHJhaWxpbmc/OiBib29sZWFuIH0sXG4pID0+IHtcbiAgbGV0IHRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzVHJhaWxpbmc6IFQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSAoYXJnczogVCkgPT4ge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBpZiAobGFzdEFyZ3NUcmFpbGluZykge1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmc7XG4gICAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBpZiAodGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGdW5jKGxhc3RBcmdzKTtcbiAgICB9IGVsc2UgaWYgKG9wdHM/LnRyYWlsaW5nKSB7XG4gICAgICBsYXN0QXJnc1RyYWlsaW5nID0gYXJncztcbiAgICB9XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5leHBvcnQgY29uc3QgY2h1bmsgPSA8VCBleHRlbmRzIGFueT4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIHNpemU6IG51bWJlcixcbik6IFRbXVtdID0+IHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHJlc0luZGV4ID0gMDtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkoTWF0aC5jZWlsKGFycmF5Lmxlbmd0aCAvIHNpemUpKTtcbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlID0gKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNlbGVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2UgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IE1hdGguYWJzKHggLSB5KTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjdGl2ZVRvb2wgPSAoXG4gIGFwcFN0YXRlOiBQaWNrPEFwcFN0YXRlLCBcImFjdGl2ZVRvb2xcIj4sXG4gIGRhdGE6IChcbiAgICB8IHsgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIHwgXCJoYW5kXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2w6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoaXNIYW5kVG9vbEFjdGl2ZShhcHBTdGF0ZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuR1JBQjtcbiAgfSBlbHNlIGlmIChpc0VyYXNlckFjdGl2ZShhcHBTdGF0ZSkpIHtcbiAgICBzZXRFcmFzZXJDdXJzb3IoY2FudmFzLCBhcHBTdGF0ZS50aGVtZSk7XG4gICAgLy8gZG8gbm90aGluZyBpZiBpbWFnZSB0b29sIGlzIHNlbGVjdGVkIHdoaWNoIHN1Z2dlc3RzIHRoZXJlJ3NcbiAgICAvLyBhIGltYWdlLXByZXZpZXcgc2V0IGFzIHRoZSBjdXJzb3JcbiAgICAvLyBJZ25vcmUgY3VzdG9tIHR5cGUgYXMgd2VsbCBhbmQgbGV0IGhvc3QgZGVjaWRlXG4gIH0gZWxzZSBpZiAoIVtcImltYWdlXCIsIFwiY3VzdG9tXCJdLmluY2x1ZGVzKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcblxuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZXhpdEZ1bGxTY3JlZW4gPSAoKSA9PiBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSAoc2hvcnRjdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXRcbiAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpXG4gICAgLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIilcbiAgICAucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKTtcbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0XG4gICAgICAucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2dpLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2dpLCBcIkN0cmxcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzID0gKFxuICB7IGNsaWVudFgsIGNsaWVudFkgfTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpIC8gem9vbS52YWx1ZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgLyB6b29tLnZhbHVlIC0gc2Nyb2xsWTtcblxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gKFxuICB7IHNjZW5lWCwgc2NlbmVZIH06IHsgc2NlbmVYOiBudW1iZXI7IHNjZW5lWTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYKSAqIHpvb20udmFsdWUgKyBvZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkpICogem9vbS52YWx1ZSArIG9mZnNldFRvcDtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbENTU1ZhcmlhYmxlID0gKG5hbWU6IHN0cmluZykgPT5cbiAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xuXG5jb25zdCBSU19MVFJfQ0hBUlMgPVxuICBcIkEtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJCOFxcdTAzMDAtXFx1MDU5MFxcdTA4MDAtXFx1MUZGRlwiICtcbiAgXCJcXHUyQzAwLVxcdUZCMUNcXHVGREZFLVxcdUZFNkZcXHVGRUZELVxcdUZGRkZcIjtcbmNvbnN0IFJTX1JUTF9DSEFSUyA9IFwiXFx1MDU5MS1cXHUwN0ZGXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXCI7XG5jb25zdCBSRV9SVExfQ0hFQ0sgPSBuZXcgUmVnRXhwKGBeW14ke1JTX0xUUl9DSEFSU31dKlske1JTX1JUTF9DSEFSU31dYCk7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGZpcnN0IGRpcmVjdGlvbmFsIGNoYXJhY3RlciBpcyBSVEwuIE1lYW5pbmcgd2hldGhlciBpdCBzdGFydHNcbiAqICB3aXRoIFJUTCBjaGFyYWN0ZXJzLCBvciBpbmRldGVybWluYXRlIChudW1iZXJzIGV0Yy4pIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnlcbiAqICBSVEwuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzE3MjIjZGlzY3Vzc2lvbl9yNDM2MzQwMTcxXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JUTCA9ICh0ZXh0OiBzdHJpbmcpID0+IFJFX1JUTF9DSEVDSy50ZXN0KHRleHQpO1xuXG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gKFxuICB4eVR1cGxlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuZXhwb3J0IGNvbnN0IG11dGVGU0Fib3J0RXJyb3IgPSAoZXJyb3I/OiBFcnJvcikgPT4ge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gMCxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSA8VD4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIGNiOiAoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IHJlYWRvbmx5IFRbXSkgPT4gYm9vbGVhbixcbiAgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5sZW5ndGggLSAxLFxuKSA9PiB7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIChcbiAgICBpc1JHQlRyYW5zcGFyZW50IHx8XG4gICAgaXNSUkdHQkJUcmFuc3BhcmVudCB8fFxuICAgIGNvbG9yID09PSBjb2xvcnMuZWxlbWVudEJhY2tncm91bmRbMF1cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlc29sdmFibGVQcm9taXNlPFQ+ID0gUHJvbWlzZTxUPiAmIHtcbiAgcmVzb2x2ZTogW1RdIGV4dGVuZHMgW3VuZGVmaW5lZF0gPyAodmFsdWU/OiBUKSA9PiB2b2lkIDogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuZXhwb3J0IGNvbnN0IHJlc29sdmFibGVQcm9taXNlID0gPFQ+KCkgPT4ge1xuICBsZXQgcmVzb2x2ZSE6IGFueTtcbiAgbGV0IHJlamVjdCE6IGFueTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgKHByb21pc2UgYXMgYW55KS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgKHByb21pc2UgYXMgYW55KS5yZWplY3QgPSByZWplY3Q7XG4gIHJldHVybiBwcm9taXNlIGFzIFJlc29sdmFibGVQcm9taXNlPFQ+O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlcyA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+XG4gICgoZXZlbnQpID0+IHtcbiAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhmdW5jIGFzIFRGdW5jdGlvbiwgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb247XG5cbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZCA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+IHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUY8UGFyYW1ldGVyczxURnVuY3Rpb24+PigoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb24pO1xufTtcblxuLy9odHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTQ2MjM4Mi84NDE4XG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IChudW06IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzaSA9IFtcbiAgICB7IHZhbHVlOiAxLCBzeW1ib2w6IFwiYlwiIH0sXG4gICAgeyB2YWx1ZTogMWUzLCBzeW1ib2w6IFwia1wiIH0sXG4gICAgeyB2YWx1ZTogMWU2LCBzeW1ib2w6IFwiTVwiIH0sXG4gICAgeyB2YWx1ZTogMWU5LCBzeW1ib2w6IFwiR1wiIH0sXG4gIF07XG4gIGNvbnN0IHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgbGV0IGluZGV4O1xuICBmb3IgKGluZGV4ID0gc2kubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgaWYgKG51bSA+PSBzaVtpbmRleF0udmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgIChudW0gLyBzaVtpbmRleF0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaW5kZXhdLnN5bWJvbFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZlcnNpb24gPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MTWV0YUVsZW1lbnQ+KCdtZXRhW25hbWU9XCJ2ZXJzaW9uXCJdJyk/LmNvbnRlbnQgfHxcbiAgICBERUZBVUxUX1ZFUlNJT05cbiAgKTtcbn07XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Vtb2ppID0gKCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBpZiAoIWN0eCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjtcbiAgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cbiAgY3R4LmZpbGxUZXh0KFwi8J+YgFwiLCAwLCAwKTtcbiAgcmV0dXJuIGN0eC5nZXRJbWFnZURhdGEob2Zmc2V0LCBvZmZzZXQsIDEsIDEpLmRhdGFbMF0gIT09IDA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuKTogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgb3ZlcmZsb3dZIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgIGNvbnN0IGhhc1Njcm9sbGFibGVDb250ZW50ID0gcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgJiZcbiAgICAgIChvdmVyZmxvd1kgPT09IFwiYXV0b1wiIHx8XG4gICAgICAgIG92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwib3ZlcmxheVwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vIE5PVEU6IG1vZGVybiBicm93c2VycyBubyBsb25nZXIgYWxsb3cgc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGhlcmVcbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ5dGVzVG9IZXhTdHJpbmcgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgLm1hcCgoYnl0ZSkgPT4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKVxuICAgIC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVwZGF0ZWRUaW1lc3RhbXAgPSAoKSA9PiAoaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKSk7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYGlkYCBhdHRyaWJ1dGUsXG4gKiBvciBhcnJheSBvZiBpZHMgKHN0cmluZ3MpLCBpbnRvIGEgTWFwLCBrZXlkIGJ5IGBpZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZz4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4pID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBNYXA8c3RyaW5nLCBUPiwgZWxlbWVudCkgPT4ge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Rlc3RFbnYgPSAoKSA9PlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uTk9ERV9FTlYgPT09IFwidGVzdFwiO1xuXG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IHdyYXBFdmVudCA9IDxUIGV4dGVuZHMgRXZlbnQ+KG5hbWU6IEVWRU5ULCBuYXRpdmVFdmVudDogVCkgPT4ge1xuICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgIH0sXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlT2JqZWN0ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqOiBULFxuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+LFxuKTogVCA9PiB7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgIGNvbnN0IHZhbHVlID0gKHVwZGF0ZXMgYXMgYW55KVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9iaiBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmosXG4gICAgLi4udXBkYXRlcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWw6IGFueSkgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8ICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc1Byb21pc2VMaWtlID0gKFxuICB2YWx1ZTogYW55LFxuKTogdmFsdWUgaXMgUHJvbWlzZTxSZXNvbHV0aW9uVHlwZTx0eXBlb2YgdmFsdWU+PiA9PiB7XG4gIHJldHVybiAoXG4gICAgISF2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgXCJjYXRjaFwiIGluIHZhbHVlICYmXG4gICAgXCJmaW5hbGx5XCIgaW4gdmFsdWVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICBcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiLFxuICApO1xuXG4gIHJldHVybiBmb2N1c2FibGVFbGVtZW50c1xuICAgID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnRhYkluZGV4ID4gLTEgJiYgIShlbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmRpc2FibGVkLFxuICAgICAgKVxuICAgIDogW107XG59O1xuXG4vKipcbiAqIFBhcnRpdGlvbnMgUmVhY3QgY2hpbGRyZW4gaW50byBuYW1lZCBjb21wb25lbnRzIGFuZCB0aGUgcmVzdCBvZiBjaGlsZHJlbi5cbiAqXG4gKiBSZXR1cm5zIGtub3duIGNoaWxkcmVuIGFzIGEgZGljdGlvbmFyeSBvZiByZWFjdCBjaGlsZHJlbiBrZXllZCBieSB0aGVpclxuICogZGlzcGxheU5hbWUsIGFuZCB0aGUgcmVzdCBjaGlsZHJlbiBhcyBhbiBhcnJheS5cbiAqXG4gKiBOT1RFIGFsbCBuYW1lZCByZWFjdCBjb21wb25lbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgZGljdGlvbmFyeSwgaXJyZXNwZWN0aXZlXG4gKiBvZiB0aGUgc3VwcGxpZWQgdHlwZSBwYXJhbWV0ZXIuIFRoaXMgbWVhbnMgeW91IG1heSBiZSB0aHJvd2luZyBhd2F5XG4gKiBjaGlsZHJlbiB0aGF0IHlvdSBhcmVuJ3QgZXhwZWN0aW5nLCBidXQgc2hvdWxkIG5vbmV0aGVsZXNzIGJlIHJlbmRlcmVkLlxuICogVG8gZ3VhcmQgYWdhaW5zdCB0aGlzIChwcm92aWRlZCB5b3UgY2FyZSBhYm91dCB0aGUgcmVzdCBjaGlsZHJlbiBhdCBhbGwpLFxuICogc3VwcGx5IGEgc2Vjb25kIHBhcmFtZXRlciB3aXRoIGFuIG9iamVjdCB3aXRoIGtleXMgb2YgdGhlIGV4cGVjdGVkIGNoaWxkcmVuLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UmVhY3RDaGlsZHJlbiA9IDxcbiAgS25vd25DaGlsZHJlbiBleHRlbmRzIHtcbiAgICBbayBpbiBzdHJpbmddPzogUmVhY3QuUmVhY3ROb2RlO1xuICB9LFxuPihcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSxcbiAgZXhwZWN0ZWRDb21wb25lbnRzPzogUmVjb3JkPGtleW9mIEtub3duQ2hpbGRyZW4sIGFueT4sXG4pID0+IHtcbiAgY29uc3QgcmVzdENoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVbXSA9IFtdO1xuXG4gIGNvbnN0IGtub3duQ2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKS5yZWR1Y2UoXG4gICAgKGFjYywgY2hpbGQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmXG4gICAgICAgICghZXhwZWN0ZWRDb21wb25lbnRzIHx8XG4gICAgICAgICAgKChjaGlsZC50eXBlIGFzIGFueSkuZGlzcGxheU5hbWUgYXMgc3RyaW5nKSBpbiBleHBlY3RlZENvbXBvbmVudHMpXG4gICAgICApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhY2NbY2hpbGQudHlwZS5kaXNwbGF5TmFtZV0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3RDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBQYXJ0aWFsPEtub3duQ2hpbGRyZW4+LFxuICApO1xuXG4gIHJldHVybiBba25vd25DaGlsZHJlbiwgcmVzdENoaWxkcmVuXSBhcyBjb25zdDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1NoYWxsb3dFcXVhbCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iakE6IFQsXG4gIG9iakI6IFQsXG4pID0+IHtcbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhS2V5cy5ldmVyeSgoa2V5KSA9PiBvYmpBW2tleV0gPT09IG9iakJba2V5XSk7XG59O1xuXG4vLyB0YWtlbiBmcm9tIFJhZGl4IFVJXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmFkaXgtdWkvcHJpbWl0aXZlcy9ibG9iL21haW4vcGFja2FnZXMvY29yZS9wcmltaXRpdmUvc3JjL3ByaW1pdGl2ZS50c3hcbmV4cG9ydCBjb25zdCBjb21wb3NlRXZlbnRIYW5kbGVycyA9IDxFPihcbiAgb3JpZ2luYWxFdmVudEhhbmRsZXI/OiAoZXZlbnQ6IEUpID0+IHZvaWQsXG4gIG91ckV2ZW50SGFuZGxlcj86IChldmVudDogRSkgPT4gdm9pZCxcbiAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlIH0gPSB7fSxcbikgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQ6IEUpIHtcbiAgICBvcmlnaW5hbEV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcblxuICAgIGlmIChcbiAgICAgICFjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgfHxcbiAgICAgICEoZXZlbnQgYXMgdW5rbm93biBhcyBFdmVudCkuZGVmYXVsdFByZXZlbnRlZFxuICAgICkge1xuICAgICAgcmV0dXJuIG91ckV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../utils.ts\n");
3892
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"composeEventHandlers\": () => (/* binding */ composeEventHandlers),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getReactChildren\": () => (/* binding */ getReactChildren),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isShallowEqual\": () => (/* binding */ isShallowEqual),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./appState */ \"../../appState.ts\");\n\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveTool: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveTool\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_5__.isHandToolActive)(appState)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.GRAB;\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_5__.isEraserActive)(appState)) {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-e41ea95\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.1-e41ea95\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n/**\n * Partitions React children into named components and the rest of children.\n *\n * Returns known children as a dictionary of react children keyed by their\n * displayName, and the rest children as an array.\n *\n * NOTE all named react components are included in the dictionary, irrespective\n * of the supplied type parameter. This means you may be throwing away\n * children that you aren't expecting, but should nonetheless be rendered.\n * To guard against this (provided you care about the rest children at all),\n * supply a second parameter with an object with keys of the expected children.\n */\nconst getReactChildren = (children, expectedComponents) => {\n const restChildren = [];\n const knownChildren = react__WEBPACK_IMPORTED_MODULE_4___default().Children.toArray(children).reduce((acc, child) => {\n if (react__WEBPACK_IMPORTED_MODULE_4___default().isValidElement(child) &&\n (!expectedComponents ||\n child.type.displayName in expectedComponents)) {\n // @ts-ignore\n acc[child.type.displayName] = child;\n }\n else {\n restChildren.push(child);\n }\n return acc;\n }, {});\n return [knownChildren, restChildren];\n};\nconst isShallowEqual = (objA, objB) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objA);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every((key) => objA[key] === objB[key]);\n};\n// taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n if (!checkForDefaultPrevented ||\n !event.defaultPrevented) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdXRpbHMudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTRCO0FBRUU7QUFVVDtBQUcrQjtBQUUxQjtBQUNvQztBQUU5RCxJQUFJLFlBQVksR0FBa0IsSUFBSSxDQUFDO0FBRWhDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDdEQsWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUMxQixDQUFDLENBQUM7QUFFSyxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7SUFDOUIsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxZQUFZLENBQUM7S0FDckI7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXBELE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQzlDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0QyxNQUFNLFVBQVUsR0FBRyxDQUN4QixNQUFvQyxFQUNiLEVBQUUsQ0FDekIsTUFBTSxZQUFZLFdBQVcsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVsRSxNQUFNLFdBQVcsR0FBRyxDQUN6QixNQUFvQyxFQU1uQixFQUFFLENBQ25CLENBQUMsTUFBTSxZQUFZLFdBQVcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7SUFDcEUsTUFBTSxZQUFZLGFBQWEsSUFBSSxxQkFBcUI7SUFDeEQsTUFBTSxZQUFZLGdCQUFnQjtJQUNsQyxNQUFNLFlBQVksbUJBQW1CO0lBQ3JDLE1BQU0sWUFBWSxpQkFBaUIsQ0FBQztBQUUvQixNQUFNLGlCQUFpQixHQUFHLENBQy9CLE1BQW9DLEVBS25CLEVBQUUsQ0FDbkIsQ0FBQyxNQUFNLFlBQVksV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztJQUNwRSxNQUFNLFlBQVksYUFBYSxJQUFJLHFCQUFxQjtJQUN4RCxNQUFNLFlBQVksbUJBQW1CO0lBQ3JDLENBQUMsTUFBTSxZQUFZLGdCQUFnQjtRQUNqQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztBQUVuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsRUFDbEMsVUFBVSxHQUdYLEVBQUUsRUFBRTtJQUNILEtBQUssTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsbURBQVcsQ0FBQyxFQUFFO1FBQ2hFLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUNyQixPQUFPLEdBQUcsZ0JBQWdCLEtBQUssbUVBQTJCLEVBQUUsQ0FBQztTQUM5RDtLQUNGO0lBQ0QsT0FBTyxtRUFBMkIsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFRix3RUFBd0U7QUFDakUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxFQUM1QixRQUFRLEVBQ1IsVUFBVSxHQUlYLEVBQUUsRUFBRTtJQUNILE9BQU8sR0FBRyxRQUFRLE1BQU0sbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFnQixDQUFDO0FBQzlFLENBQUMsQ0FBQztBQUVLLE1BQU0sUUFBUSxHQUFHLENBQ3RCLEVBQXdCLEVBQ3hCLE9BQWUsRUFDZixFQUFFO0lBQ0YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxRQUFRLEdBQWEsSUFBSSxDQUFDO0lBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFPLEVBQUUsRUFBRTtRQUN6QixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQixNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNoQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNkLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBQztJQUNGLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2YsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JCLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7U0FDbEI7SUFDSCxDQUFDLENBQUM7SUFDRixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUNoQixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUM7SUFDRixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLHdEQUF3RDtBQUNqRCxNQUFNLFdBQVcsR0FBRyxDQUN6QixFQUF3QixFQUN4QixJQUE2QixFQUM3QixFQUFFO0lBQ0YsSUFBSSxPQUFPLEdBQWtCLElBQUksQ0FBQztJQUNsQyxJQUFJLFFBQVEsR0FBYSxJQUFJLENBQUM7SUFDOUIsSUFBSSxnQkFBZ0IsR0FBYSxJQUFJLENBQUM7SUFFdEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFPLEVBQUUsRUFBRTtRQUMvQixPQUFPLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUMxQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDWixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDNUIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFPLEVBQUUsRUFBRTtRQUN6QixJQUFJLEtBQStCLEVBQUUsRUFHcEM7UUFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUNwQixZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEI7YUFBTSxJQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLEVBQUU7WUFDekIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDZixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtRQUNELElBQUksUUFBUSxFQUFFO1lBQ1osRUFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDcEM7SUFDSCxDQUFDLENBQUM7SUFDRixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUNoQixRQUFRLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUNwQixvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixvREFBb0Q7QUFDN0MsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsS0FBbUIsRUFDbkIsSUFBWSxFQUNMLEVBQUU7SUFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQzdCLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDM0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztLQUMxRDtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVLLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUU7SUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLElBQUksU0FBUyxFQUFFO1FBQ2IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzQjtBQUNILENBQUMsQ0FBQztBQUVLLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtJQUNsQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsSUFBSSxTQUFTLEVBQUU7UUFDYixTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7S0FDN0I7QUFDSCxDQUFDLENBQUM7QUFFSyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRTNELE1BQU0sZ0JBQWdCLEdBQUcsQ0FDOUIsUUFBc0MsRUFDdEMsSUFHbUQsRUFDM0IsRUFBRTtJQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzFCLHVDQUNLLFFBQVEsQ0FBQyxVQUFVLEtBQ3RCLElBQUksRUFBRSxRQUFRLEVBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQzNCO0tBQ0g7SUFFRCx1Q0FDSyxRQUFRLENBQUMsVUFBVSxLQUN0QixjQUFjLEVBQ1osSUFBSSxDQUFDLDBCQUEwQixLQUFLLFNBQVM7WUFDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYztZQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUNyQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixVQUFVLEVBQUUsSUFBSSxJQUNoQjtBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBZ0MsRUFBRSxFQUFFO0lBQzlELElBQUksTUFBTSxFQUFFO1FBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0tBQzFCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFnQyxFQUFFLE1BQWMsRUFBRSxFQUFFO0lBQzVFLElBQUksTUFBTSxFQUFFO1FBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0tBQzlCO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsSUFBSSxpQkFBc0IsQ0FBQztBQUMzQixJQUFJLGNBQXNCLENBQUM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsQ0FDN0IsTUFBZ0MsRUFDaEMsS0FBd0IsRUFDeEIsRUFBRTtJQUNGLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBRTdCLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtRQUN0QixNQUFNLFdBQVcsR0FBRyxLQUFLLEtBQUssa0RBQVUsQ0FBQztRQUN6QyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELGlCQUFpQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDO1FBQzdDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDcEQsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFDM0IsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDNUIsQ0FBQyxFQUNELENBQUMsRUFDRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FDWixDQUFDO1FBQ0YsT0FBTyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLDZDQUFRLENBQUMsQ0FBQyxDQUFDLDZDQUFRLENBQUM7UUFDdEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLDZDQUFRLENBQUMsQ0FBQyxDQUFDLDZDQUFRLENBQUM7UUFDeEQsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pCLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsc0RBQWMsQ0FBWSxDQUFDO0lBQzFFLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO1FBQzNELFVBQVUsRUFBRSxDQUFDO0tBQ2Q7SUFFRCxTQUFTLENBQ1AsTUFBTSxFQUNOLE9BQU8sY0FBYyxLQUFLLGlCQUFpQixHQUFHLENBQUMsSUFDN0MsaUJBQWlCLEdBQUcsQ0FDdEIsUUFBUSxDQUNULENBQUM7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLE1BQWdDLEVBQ2hDLFFBQWtCLEVBQ2xCLEVBQUU7SUFDRixJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ1gsT0FBTztLQUNSO0lBQ0QsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7UUFDNUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3JCO1NBQU0sSUFBSSwyREFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyx3REFBZ0IsQ0FBQztLQUN4QztTQUFNLElBQUkseURBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNuQyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4Qyw4REFBOEQ7UUFDOUQsb0NBQW9DO1FBQ3BDLGlEQUFpRDtLQUNsRDtTQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNsRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyw2REFBcUIsQ0FBQztLQUM3QztBQUNILENBQUMsQ0FBQztBQUVLLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxXQUMvQixzQkFBUSxDQUFDLGlCQUFpQiwwQ0FBRSxRQUFRLE1BQUssTUFBTSxJQUFDO0FBRTNDLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRSxDQUNsQyxRQUFRLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFFeEMsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBRXZELE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBZ0IsRUFBVSxFQUFFO0lBQ3pELFFBQVEsR0FBRyxRQUFRO1NBQ2hCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDO1NBQzlCLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxJQUFJLGdEQUFRLEVBQUU7UUFDWixPQUFPLFFBQVE7YUFDWixPQUFPLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDO2FBQ2pDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUssTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQXdDLEVBQzFELEVBQ0UsSUFBSSxFQUNKLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sR0FPUixFQUNELEVBQUU7SUFDRixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUN4RCxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUV2RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVLLE1BQU0sMkJBQTJCLEdBQUcsQ0FDekMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFzQyxFQUN0RCxFQUNFLElBQUksRUFDSixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxPQUFPLEdBT1IsRUFDRCxFQUFFO0lBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7SUFDdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7SUFDdEQsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFSyxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDbkQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztBQUUzRSxNQUFNLFlBQVksR0FDaEIseUVBQXlFO0lBQ3pFLHlDQUF5QyxDQUFDO0FBQzVDLE1BQU0sWUFBWSxHQUFHLHlDQUF5QyxDQUFDO0FBQy9ELE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sWUFBWSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDekU7Ozs7O0dBS0c7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUV4RCxNQUFNLFlBQVksR0FBRyxDQUMxQixPQUFrQyxFQUNSLEVBQUU7SUFDNUIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDdkIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixnRUFBZ0U7QUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQ2hELElBQUksTUFBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUU7UUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixPQUFPO0tBQ1I7SUFDRCxNQUFNLEtBQUssQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVLLE1BQU0sU0FBUyxHQUFHLENBQ3ZCLEtBQW1CLEVBQ25CLEVBQStELEVBQy9ELFlBQW9CLENBQUMsRUFDckIsRUFBRTtJQUNGLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtRQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7S0FDdEM7SUFDRCxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxLQUFLLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUMxQixPQUFPLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDN0IsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBbUIsRUFDbkIsRUFBK0QsRUFDL0QsWUFBb0IsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3BDLEVBQUU7SUFDRixJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7UUFDakIsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0tBQ3RDO0lBQ0QsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEtBQUssR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDbkIsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUM3QyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztJQUMxRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUM5RSxPQUFPLENBQ0wsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtRQUNuQixLQUFLLEtBQUssb0VBQTJCLENBQ3RDLENBQUM7QUFDSixDQUFDLENBQUM7QUFNSyxNQUFNLGlCQUFpQixHQUFHLEdBQU0sRUFBRTtJQUN2QyxJQUFJLE9BQWEsQ0FBQztJQUNsQixJQUFJLE1BQVksQ0FBQztJQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNoRCxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ25CLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDRixPQUFlLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNsQyxPQUFlLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqQyxPQUFPLE9BQStCLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSSxNQUFNLGtCQUFrQixHQUFHLENBR2hDLElBQXVFLEVBQ3ZFLEVBQUUsQ0FDRixDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDVCxrRUFBdUIsQ0FBQyxJQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBYyxDQUFDO0FBRWxCOzs7R0FHRztBQUNJLE1BQU0sMkJBQTJCLEdBQUcsQ0FHekMsSUFBdUUsRUFDdkUsRUFBRTtJQUNGLGFBQWE7SUFDYixPQUFPLFdBQVcsQ0FBd0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ25ELGtFQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQWMsQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGLDBDQUEwQztBQUNuQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBRSxNQUFjLEVBQVUsRUFBRTtJQUNoRSxNQUFNLEVBQUUsR0FBRztRQUNULEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO0tBQzVCLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRywwQkFBMEIsQ0FBQztJQUN0QyxJQUFJLEtBQUssQ0FBQztJQUNWLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDOUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNO1NBQ1A7S0FDRjtJQUNELE9BQU8sQ0FDTCxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FDN0UsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTs7SUFDN0IsT0FBTyxDQUNMLGVBQVEsQ0FBQyxhQUFhLENBQWtCLHNCQUFzQixDQUFDLDBDQUFFLE9BQU87UUFDeEUsdURBQWUsQ0FDaEIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLDJGQUEyRjtBQUNwRixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDaEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLEdBQUcsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLCtEQUErRDtJQUMvRCw4QkFBOEI7SUFDOUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlELENBQUMsQ0FBQztBQUVLLE1BQU0sNkJBQTZCLEdBQUcsQ0FDM0MsT0FBb0IsRUFDSSxFQUFFO0lBQzFCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDbkMsT0FBTyxNQUFNLEVBQUU7UUFDYixJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzVCLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBQ0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN2RSxJQUNFLG9CQUFvQjtZQUNwQixDQUFDLFNBQVMsS0FBSyxNQUFNO2dCQUNuQixTQUFTLEtBQUssUUFBUTtnQkFDdEIsU0FBUyxLQUFLLFNBQVMsQ0FBQyxFQUMxQjtZQUNBLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztLQUMvQjtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVLLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUF5QixFQUFFLEVBQUU7SUFDOUQsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUNuQyxPQUFPLE1BQU0sRUFBRTtRQUNiLElBQUksTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUN4QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO1NBQ1I7UUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztLQUMvQjtBQUNILENBQUMsQ0FBQztBQUVLLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBd0IsRUFBRSxFQUFFO0lBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN2QixzRUFBc0U7SUFDdEUsS0FBSyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUNwRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3JCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUssTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBRXhFOzs7R0FHRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQ3hCLEtBQW1CLEVBQ25CLEVBQUU7SUFDRixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFtQixFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ25ELEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVLLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRSxXQUM1QixjQUFPLE9BQU8sS0FBSyxXQUFXLElBQUkseTVCQUFXLDBDQUFFLFFBQVEsTUFBSyxNQUFNLElBQUM7QUFFOUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLFdBQzVCLGNBQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSx5NUJBQVcsMENBQUUsUUFBUSxNQUFLLFlBQVksSUFBQztBQUVwRSxNQUFNLFNBQVMsR0FBRyxDQUFrQixJQUFXLEVBQUUsV0FBYyxFQUFFLEVBQUU7SUFDeEUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7UUFDM0IsTUFBTSxFQUFFO1lBQ04sV0FBVztTQUNaO1FBQ0QsVUFBVSxFQUFFLElBQUk7S0FDakIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUssTUFBTSxZQUFZLEdBQUcsQ0FDMUIsR0FBTSxFQUNOLE9BQW1CLEVBQ2hCLEVBQUU7SUFDTCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUU7UUFDekIsTUFBTSxLQUFLLEdBQUksT0FBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO1lBQ2hDLElBQ0csR0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUs7Z0JBQzNCLGdFQUFnRTtnQkFDaEUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxFQUM3QztnQkFDQSxTQUFTO2FBQ1Y7WUFDRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO0tBQ0Y7SUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ2QsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVELHVDQUNLLEdBQUcsR0FDSCxPQUFPLEVBQ1Y7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVEsRUFBRSxFQUFFO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLENBQUMsQ0FBQztBQUVLLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtJQUMzQixJQUFJO1FBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0tBQ3REO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLFFBQVEsQ0FBQztLQUNqQjtBQUNILENBQUMsQ0FBQztBQUVLLE1BQU0sYUFBYSxHQUFHLENBQzNCLEtBQVUsRUFDc0MsRUFBRTtJQUNsRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUs7UUFDUCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLE1BQU0sSUFBSSxLQUFLO1FBQ2YsT0FBTyxJQUFJLEtBQUs7UUFDaEIsU0FBUyxJQUFJLEtBQUssQ0FDbkIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxTQUE2QixFQUFFLEVBQUU7SUFDdEUsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZ0JBQWdCLENBQ25ELG9FQUFvRSxDQUNyRSxDQUFDO0lBRUYsT0FBTyxpQkFBaUI7UUFDdEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQ2xDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDVixPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUUsT0FBNEIsQ0FBQyxRQUFRLENBQ25FO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ0ksTUFBTSxnQkFBZ0IsR0FBRyxDQUs5QixRQUF5QixFQUN6QixrQkFBcUQsRUFDckQsRUFBRTtJQUNGLE1BQU0sWUFBWSxHQUFzQixFQUFFLENBQUM7SUFFM0MsTUFBTSxhQUFhLEdBQUcsNkRBQXNCLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUMzRCxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNiLElBQ0UsMkRBQW9CLENBQUMsS0FBSyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxrQkFBa0I7Z0JBQ2hCLEtBQUssQ0FBQyxJQUFZLENBQUMsV0FBc0IsSUFBSSxrQkFBa0IsQ0FBQyxFQUNwRTtZQUNBLGFBQWE7WUFDYixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDckM7YUFBTTtZQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFDRCxFQUE0QixDQUM3QixDQUFDO0lBRUYsT0FBTyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQVUsQ0FBQztBQUNoRCxDQUFDLENBQUM7QUFFSyxNQUFNLGNBQWMsR0FBRyxDQUM1QixJQUFPLEVBQ1AsSUFBTyxFQUNQLEVBQUU7SUFDRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQztBQUVGLHNCQUFzQjtBQUN0Qiw2RkFBNkY7QUFDdEYsTUFBTSxvQkFBb0IsR0FBRyxDQUNsQyxvQkFBeUMsRUFDekMsZUFBb0MsRUFDcEMsRUFBRSx3QkFBd0IsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQ3hDLEVBQUU7SUFDRixPQUFPLFNBQVMsV0FBVyxDQUFDLEtBQVE7UUFDbEMsb0JBQW9CLGFBQXBCLG9CQUFvQix1QkFBcEIsb0JBQW9CLENBQUcsS0FBSyxDQUFDLENBQUM7UUFFOUIsSUFDRSxDQUFDLHdCQUF3QjtZQUN6QixDQUFFLEtBQTBCLENBQUMsZ0JBQWdCLEVBQzdDO1lBQ0EsT0FBTyxlQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUcsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/NzYzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcblxuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7XG4gIENVUlNPUl9UWVBFLFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIEVWRU5ULFxuICBGT05UX0ZBTUlMWSxcbiAgaXNEYXJ3aW4sXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbCwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IFNIQVBFUyB9IGZyb20gXCIuL3NoYXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgaXNFcmFzZXJBY3RpdmUsIGlzSGFuZFRvb2xBY3RpdmUgfSBmcm9tIFwiLi9hcHBTdGF0ZVwiO1xuXG5sZXQgbW9ja0RhdGVUaW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IHNldERhdGVUaW1lRm9yVGVzdHMgPSAoZGF0ZVRpbWU6IHN0cmluZykgPT4ge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9ICgpID0+IHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtocn0ke21pbn1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSAoc3RyOiBzdHJpbmcpID0+XG4gIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblxuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpcyBIVE1MRWxlbWVudCA9PlxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG5cbmV4cG9ydCBjb25zdCBpc0lucHV0TGlrZSA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MU2VsZWN0RWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudDtcblxuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gKHtcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgZm9yIChjb25zdCBbZm9udEZhbWlseVN0cmluZywgaWRdIG9mIE9iamVjdC5lbnRyaWVzKEZPTlRfRkFNSUxZKSkge1xuICAgIGlmIChpZCA9PT0gZm9udEZhbWlseSkge1xuICAgICAgcmV0dXJuIGAke2ZvbnRGYW1pbHlTdHJpbmd9LCAke1dJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVH1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcblxuLyoqIHJldHVybnMgZm9udFNpemUrZm9udEZhbWlseSBzdHJpbmcgZm9yIGFzc2lnbm1lbnQgdG8gRE9NIGVsZW1lbnRzICovXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9ICh7XG4gIGZvbnRTaXplLFxuICBmb250RmFtaWx5LFxufToge1xuICBmb250U2l6ZTogbnVtYmVyO1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseSB9KX1gIGFzIEZvbnRTdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2UgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICB0aW1lb3V0OiBudW1iZXIsXG4pID0+IHtcbiAgbGV0IGhhbmRsZSA9IDA7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyB0aHJvdHRsZSBjYWxsYmFjayB0byBleGVjdXRlIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuZXhwb3J0IGNvbnN0IHRocm90dGxlUkFGID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgb3B0cz86IHsgdHJhaWxpbmc/OiBib29sZWFuIH0sXG4pID0+IHtcbiAgbGV0IHRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzVHJhaWxpbmc6IFQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSAoYXJnczogVCkgPT4ge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBpZiAobGFzdEFyZ3NUcmFpbGluZykge1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmc7XG4gICAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBpZiAodGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGdW5jKGxhc3RBcmdzKTtcbiAgICB9IGVsc2UgaWYgKG9wdHM/LnRyYWlsaW5nKSB7XG4gICAgICBsYXN0QXJnc1RyYWlsaW5nID0gYXJncztcbiAgICB9XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5leHBvcnQgY29uc3QgY2h1bmsgPSA8VCBleHRlbmRzIGFueT4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIHNpemU6IG51bWJlcixcbik6IFRbXVtdID0+IHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHJlc0luZGV4ID0gMDtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkoTWF0aC5jZWlsKGFycmF5Lmxlbmd0aCAvIHNpemUpKTtcbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlID0gKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNlbGVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2UgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IE1hdGguYWJzKHggLSB5KTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjdGl2ZVRvb2wgPSAoXG4gIGFwcFN0YXRlOiBQaWNrPEFwcFN0YXRlLCBcImFjdGl2ZVRvb2xcIj4sXG4gIGRhdGE6IChcbiAgICB8IHsgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIHwgXCJoYW5kXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2w6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoaXNIYW5kVG9vbEFjdGl2ZShhcHBTdGF0ZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuR1JBQjtcbiAgfSBlbHNlIGlmIChpc0VyYXNlckFjdGl2ZShhcHBTdGF0ZSkpIHtcbiAgICBzZXRFcmFzZXJDdXJzb3IoY2FudmFzLCBhcHBTdGF0ZS50aGVtZSk7XG4gICAgLy8gZG8gbm90aGluZyBpZiBpbWFnZSB0b29sIGlzIHNlbGVjdGVkIHdoaWNoIHN1Z2dlc3RzIHRoZXJlJ3NcbiAgICAvLyBhIGltYWdlLXByZXZpZXcgc2V0IGFzIHRoZSBjdXJzb3JcbiAgICAvLyBJZ25vcmUgY3VzdG9tIHR5cGUgYXMgd2VsbCBhbmQgbGV0IGhvc3QgZGVjaWRlXG4gIH0gZWxzZSBpZiAoIVtcImltYWdlXCIsIFwiY3VzdG9tXCJdLmluY2x1ZGVzKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcblxuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZXhpdEZ1bGxTY3JlZW4gPSAoKSA9PiBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSAoc2hvcnRjdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXRcbiAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpXG4gICAgLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIilcbiAgICAucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKTtcbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0XG4gICAgICAucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2dpLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2dpLCBcIkN0cmxcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzID0gKFxuICB7IGNsaWVudFgsIGNsaWVudFkgfTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpIC8gem9vbS52YWx1ZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgLyB6b29tLnZhbHVlIC0gc2Nyb2xsWTtcblxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gKFxuICB7IHNjZW5lWCwgc2NlbmVZIH06IHsgc2NlbmVYOiBudW1iZXI7IHNjZW5lWTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYKSAqIHpvb20udmFsdWUgKyBvZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkpICogem9vbS52YWx1ZSArIG9mZnNldFRvcDtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbENTU1ZhcmlhYmxlID0gKG5hbWU6IHN0cmluZykgPT5cbiAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xuXG5jb25zdCBSU19MVFJfQ0hBUlMgPVxuICBcIkEtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJCOFxcdTAzMDAtXFx1MDU5MFxcdTA4MDAtXFx1MUZGRlwiICtcbiAgXCJcXHUyQzAwLVxcdUZCMUNcXHVGREZFLVxcdUZFNkZcXHVGRUZELVxcdUZGRkZcIjtcbmNvbnN0IFJTX1JUTF9DSEFSUyA9IFwiXFx1MDU5MS1cXHUwN0ZGXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXCI7XG5jb25zdCBSRV9SVExfQ0hFQ0sgPSBuZXcgUmVnRXhwKGBeW14ke1JTX0xUUl9DSEFSU31dKlske1JTX1JUTF9DSEFSU31dYCk7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGZpcnN0IGRpcmVjdGlvbmFsIGNoYXJhY3RlciBpcyBSVEwuIE1lYW5pbmcgd2hldGhlciBpdCBzdGFydHNcbiAqICB3aXRoIFJUTCBjaGFyYWN0ZXJzLCBvciBpbmRldGVybWluYXRlIChudW1iZXJzIGV0Yy4pIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnlcbiAqICBSVEwuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzE3MjIjZGlzY3Vzc2lvbl9yNDM2MzQwMTcxXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JUTCA9ICh0ZXh0OiBzdHJpbmcpID0+IFJFX1JUTF9DSEVDSy50ZXN0KHRleHQpO1xuXG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gKFxuICB4eVR1cGxlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuZXhwb3J0IGNvbnN0IG11dGVGU0Fib3J0RXJyb3IgPSAoZXJyb3I/OiBFcnJvcikgPT4ge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gMCxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSA8VD4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIGNiOiAoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IHJlYWRvbmx5IFRbXSkgPT4gYm9vbGVhbixcbiAgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5sZW5ndGggLSAxLFxuKSA9PiB7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIChcbiAgICBpc1JHQlRyYW5zcGFyZW50IHx8XG4gICAgaXNSUkdHQkJUcmFuc3BhcmVudCB8fFxuICAgIGNvbG9yID09PSBjb2xvcnMuZWxlbWVudEJhY2tncm91bmRbMF1cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlc29sdmFibGVQcm9taXNlPFQ+ID0gUHJvbWlzZTxUPiAmIHtcbiAgcmVzb2x2ZTogW1RdIGV4dGVuZHMgW3VuZGVmaW5lZF0gPyAodmFsdWU/OiBUKSA9PiB2b2lkIDogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuZXhwb3J0IGNvbnN0IHJlc29sdmFibGVQcm9taXNlID0gPFQ+KCkgPT4ge1xuICBsZXQgcmVzb2x2ZSE6IGFueTtcbiAgbGV0IHJlamVjdCE6IGFueTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgKHByb21pc2UgYXMgYW55KS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgKHByb21pc2UgYXMgYW55KS5yZWplY3QgPSByZWplY3Q7XG4gIHJldHVybiBwcm9taXNlIGFzIFJlc29sdmFibGVQcm9taXNlPFQ+O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlcyA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+XG4gICgoZXZlbnQpID0+IHtcbiAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhmdW5jIGFzIFRGdW5jdGlvbiwgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb247XG5cbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZCA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+IHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUY8UGFyYW1ldGVyczxURnVuY3Rpb24+PigoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb24pO1xufTtcblxuLy9odHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTQ2MjM4Mi84NDE4XG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IChudW06IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzaSA9IFtcbiAgICB7IHZhbHVlOiAxLCBzeW1ib2w6IFwiYlwiIH0sXG4gICAgeyB2YWx1ZTogMWUzLCBzeW1ib2w6IFwia1wiIH0sXG4gICAgeyB2YWx1ZTogMWU2LCBzeW1ib2w6IFwiTVwiIH0sXG4gICAgeyB2YWx1ZTogMWU5LCBzeW1ib2w6IFwiR1wiIH0sXG4gIF07XG4gIGNvbnN0IHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgbGV0IGluZGV4O1xuICBmb3IgKGluZGV4ID0gc2kubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgaWYgKG51bSA+PSBzaVtpbmRleF0udmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgIChudW0gLyBzaVtpbmRleF0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaW5kZXhdLnN5bWJvbFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZlcnNpb24gPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MTWV0YUVsZW1lbnQ+KCdtZXRhW25hbWU9XCJ2ZXJzaW9uXCJdJyk/LmNvbnRlbnQgfHxcbiAgICBERUZBVUxUX1ZFUlNJT05cbiAgKTtcbn07XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Vtb2ppID0gKCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBpZiAoIWN0eCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjtcbiAgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cbiAgY3R4LmZpbGxUZXh0KFwi8J+YgFwiLCAwLCAwKTtcbiAgcmV0dXJuIGN0eC5nZXRJbWFnZURhdGEob2Zmc2V0LCBvZmZzZXQsIDEsIDEpLmRhdGFbMF0gIT09IDA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuKTogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgb3ZlcmZsb3dZIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgIGNvbnN0IGhhc1Njcm9sbGFibGVDb250ZW50ID0gcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgJiZcbiAgICAgIChvdmVyZmxvd1kgPT09IFwiYXV0b1wiIHx8XG4gICAgICAgIG92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwib3ZlcmxheVwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vIE5PVEU6IG1vZGVybiBicm93c2VycyBubyBsb25nZXIgYWxsb3cgc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGhlcmVcbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ5dGVzVG9IZXhTdHJpbmcgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgLm1hcCgoYnl0ZSkgPT4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKVxuICAgIC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVwZGF0ZWRUaW1lc3RhbXAgPSAoKSA9PiAoaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKSk7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYGlkYCBhdHRyaWJ1dGUsXG4gKiBvciBhcnJheSBvZiBpZHMgKHN0cmluZ3MpLCBpbnRvIGEgTWFwLCBrZXlkIGJ5IGBpZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZz4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4pID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBNYXA8c3RyaW5nLCBUPiwgZWxlbWVudCkgPT4ge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Rlc3RFbnYgPSAoKSA9PlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uTk9ERV9FTlYgPT09IFwidGVzdFwiO1xuXG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IHdyYXBFdmVudCA9IDxUIGV4dGVuZHMgRXZlbnQ+KG5hbWU6IEVWRU5ULCBuYXRpdmVFdmVudDogVCkgPT4ge1xuICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgIH0sXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlT2JqZWN0ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqOiBULFxuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+LFxuKTogVCA9PiB7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgIGNvbnN0IHZhbHVlID0gKHVwZGF0ZXMgYXMgYW55KVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9iaiBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmosXG4gICAgLi4udXBkYXRlcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWw6IGFueSkgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8ICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc1Byb21pc2VMaWtlID0gKFxuICB2YWx1ZTogYW55LFxuKTogdmFsdWUgaXMgUHJvbWlzZTxSZXNvbHV0aW9uVHlwZTx0eXBlb2YgdmFsdWU+PiA9PiB7XG4gIHJldHVybiAoXG4gICAgISF2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgXCJjYXRjaFwiIGluIHZhbHVlICYmXG4gICAgXCJmaW5hbGx5XCIgaW4gdmFsdWVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICBcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiLFxuICApO1xuXG4gIHJldHVybiBmb2N1c2FibGVFbGVtZW50c1xuICAgID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnRhYkluZGV4ID4gLTEgJiYgIShlbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmRpc2FibGVkLFxuICAgICAgKVxuICAgIDogW107XG59O1xuXG4vKipcbiAqIFBhcnRpdGlvbnMgUmVhY3QgY2hpbGRyZW4gaW50byBuYW1lZCBjb21wb25lbnRzIGFuZCB0aGUgcmVzdCBvZiBjaGlsZHJlbi5cbiAqXG4gKiBSZXR1cm5zIGtub3duIGNoaWxkcmVuIGFzIGEgZGljdGlvbmFyeSBvZiByZWFjdCBjaGlsZHJlbiBrZXllZCBieSB0aGVpclxuICogZGlzcGxheU5hbWUsIGFuZCB0aGUgcmVzdCBjaGlsZHJlbiBhcyBhbiBhcnJheS5cbiAqXG4gKiBOT1RFIGFsbCBuYW1lZCByZWFjdCBjb21wb25lbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgZGljdGlvbmFyeSwgaXJyZXNwZWN0aXZlXG4gKiBvZiB0aGUgc3VwcGxpZWQgdHlwZSBwYXJhbWV0ZXIuIFRoaXMgbWVhbnMgeW91IG1heSBiZSB0aHJvd2luZyBhd2F5XG4gKiBjaGlsZHJlbiB0aGF0IHlvdSBhcmVuJ3QgZXhwZWN0aW5nLCBidXQgc2hvdWxkIG5vbmV0aGVsZXNzIGJlIHJlbmRlcmVkLlxuICogVG8gZ3VhcmQgYWdhaW5zdCB0aGlzIChwcm92aWRlZCB5b3UgY2FyZSBhYm91dCB0aGUgcmVzdCBjaGlsZHJlbiBhdCBhbGwpLFxuICogc3VwcGx5IGEgc2Vjb25kIHBhcmFtZXRlciB3aXRoIGFuIG9iamVjdCB3aXRoIGtleXMgb2YgdGhlIGV4cGVjdGVkIGNoaWxkcmVuLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UmVhY3RDaGlsZHJlbiA9IDxcbiAgS25vd25DaGlsZHJlbiBleHRlbmRzIHtcbiAgICBbayBpbiBzdHJpbmddPzogUmVhY3QuUmVhY3ROb2RlO1xuICB9LFxuPihcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSxcbiAgZXhwZWN0ZWRDb21wb25lbnRzPzogUmVjb3JkPGtleW9mIEtub3duQ2hpbGRyZW4sIGFueT4sXG4pID0+IHtcbiAgY29uc3QgcmVzdENoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVbXSA9IFtdO1xuXG4gIGNvbnN0IGtub3duQ2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKS5yZWR1Y2UoXG4gICAgKGFjYywgY2hpbGQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmXG4gICAgICAgICghZXhwZWN0ZWRDb21wb25lbnRzIHx8XG4gICAgICAgICAgKChjaGlsZC50eXBlIGFzIGFueSkuZGlzcGxheU5hbWUgYXMgc3RyaW5nKSBpbiBleHBlY3RlZENvbXBvbmVudHMpXG4gICAgICApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhY2NbY2hpbGQudHlwZS5kaXNwbGF5TmFtZV0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3RDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBQYXJ0aWFsPEtub3duQ2hpbGRyZW4+LFxuICApO1xuXG4gIHJldHVybiBba25vd25DaGlsZHJlbiwgcmVzdENoaWxkcmVuXSBhcyBjb25zdDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1NoYWxsb3dFcXVhbCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iakE6IFQsXG4gIG9iakI6IFQsXG4pID0+IHtcbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhS2V5cy5ldmVyeSgoa2V5KSA9PiBvYmpBW2tleV0gPT09IG9iakJba2V5XSk7XG59O1xuXG4vLyB0YWtlbiBmcm9tIFJhZGl4IFVJXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmFkaXgtdWkvcHJpbWl0aXZlcy9ibG9iL21haW4vcGFja2FnZXMvY29yZS9wcmltaXRpdmUvc3JjL3ByaW1pdGl2ZS50c3hcbmV4cG9ydCBjb25zdCBjb21wb3NlRXZlbnRIYW5kbGVycyA9IDxFPihcbiAgb3JpZ2luYWxFdmVudEhhbmRsZXI/OiAoZXZlbnQ6IEUpID0+IHZvaWQsXG4gIG91ckV2ZW50SGFuZGxlcj86IChldmVudDogRSkgPT4gdm9pZCxcbiAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlIH0gPSB7fSxcbikgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQ6IEUpIHtcbiAgICBvcmlnaW5hbEV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcblxuICAgIGlmIChcbiAgICAgICFjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgfHxcbiAgICAgICEoZXZlbnQgYXMgdW5rbm93biBhcyBFdmVudCkuZGVmYXVsdFByZXZlbnRlZFxuICAgICkge1xuICAgICAgcmV0dXJuIG91ckV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../utils.ts\n");
3893
3893
 
3894
3894
  /***/ }),
3895
3895