@zsviczian/excalidraw 0.10.0-fixjumpingtext-3 → 0.10.0-fixjumpingtext-4

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.
@@ -2550,7 +2550,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2550
2550
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2551
2551
 
2552
2552
  "use strict";
2553
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\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\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst normalizeText = (text) => {\r\n return (text\r\n // replace tabs with spaces so they render and measure correctly\r\n .replace(/\\t/g, \" \")\r\n // normalize newlines\r\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\r\n};\r\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\r\n const { zoom } = appState;\r\n const degree = (180 * angle) / Math.PI;\r\n let translateX = ((width) * (zoom.value - 1)) / 2;\r\n let translateY = ((height) * (zoom.value - 1)) / 2;\r\n if (width > maxWidth && zoom.value !== 1) {\r\n translateX = ((maxWidth) * (zoom.value - 1)) / 2;\r\n }\r\n if (height > maxHeight && zoom.value !== 1) {\r\n translateY = ((maxHeight) * (zoom.value - 1)) / 2;\r\n }\r\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\r\n};\r\nconst textWysiwyg = ({ id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\r\n const textPropertiesUpdated = (updatedElement, editable) => {\r\n const currentFont = editable.style.fontFamily.replaceAll('\"', \"\");\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedElement.fontFamily }) !==\r\n currentFont) {\r\n return true;\r\n }\r\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n let originalContainerHeight;\r\n let approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element));\r\n const updateWysiwygStyle = () => {\r\n var _a;\r\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\r\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\r\n let coordX = updatedElement.x;\r\n let coordY = updatedElement.y;\r\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedElement);\r\n let maxWidth = updatedElement.width;\r\n let maxHeight = updatedElement.height;\r\n let width = updatedElement.width;\r\n // Set to element height by default since thats\r\n // what is going to be used for unbounded text\r\n let height = updatedElement.height;\r\n if (container && updatedElement.containerId) {\r\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable);\r\n // using editor.style.height to get the accurate height of text editor\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editorHeight > 0) {\r\n height = editorHeight;\r\n }\r\n if (propertiesUpdated) {\r\n approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement));\r\n originalContainerHeight = container.height;\r\n // update height of the editor after properties updated\r\n height = updatedElement.height;\r\n }\r\n if (!originalContainerHeight) {\r\n originalContainerHeight = container.height;\r\n }\r\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n width = maxWidth;\r\n // The coordinates of text box set a distance of\r\n // 30px to preserve padding\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING;\r\n // autogrow container height if text exceeds\r\n if (height > maxHeight) {\r\n const diff = Math.min(height - maxHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height + diff });\r\n return;\r\n }\r\n else if (\r\n // autoshrink container height until original container height\r\n // is reached when text is removed\r\n container.height > originalContainerHeight &&\r\n height < maxHeight) {\r\n const diff = Math.min(maxHeight - height, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height - diff });\r\n }\r\n // Start pushing text upward until a diff of 30px (padding)\r\n // is reached\r\n else {\r\n // vertically center align the text\r\n coordY = container.y + container.height / 2 - height / 2;\r\n }\r\n }\r\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\r\n const { textAlign } = updatedElement;\r\n editable.value = updatedElement.originalText;\r\n const lines = updatedElement.originalText.split(\"\\n\");\r\n const lineHeight = updatedElement.containerId\r\n ? approxLineHeight\r\n : updatedElement.height / lines.length;\r\n if (!container) {\r\n maxWidth =\r\n (appState.offsetLeft + appState.width - viewportX) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\r\n }\r\n // Make sure text editor height doesn't go beyond viewport\r\n const editorMaxHeight = (appState.height -\r\n viewportY) /\r\n appState.zoom.value;\r\n const angle = container ? container.angle : updatedElement.angle;\r\n Object.assign(editable.style, {\r\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\r\n // must be defined *after* font ¯\\_(ツ)_/¯\r\n lineHeight: `${lineHeight}px`,\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${viewportX}px`,\r\n top: `${viewportY}px`,\r\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\r\n textAlign,\r\n color: updatedElement.strokeColor,\r\n opacity: updatedElement.opacity / 100,\r\n filter: \"var(--theme-filter)\",\r\n maxWidth: `${maxWidth}px`,\r\n maxHeight: `${editorMaxHeight}px`,\r\n });\r\n // For some reason updating font attribute doesn't set font family\r\n // hence updating font family explicitly for test environment\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\r\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedElement);\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedElement, { x: coordX, y: coordY });\r\n }\r\n };\r\n const editable = document.createElement(\"textarea\");\r\n editable.dir = \"auto\";\r\n editable.tabIndex = 0;\r\n editable.dataset.type = \"wysiwyg\";\r\n // prevent line wrapping on Safari\r\n editable.wrap = \"off\";\r\n editable.classList.add(\"excalidraw-wysiwyg\");\r\n let whiteSpace = \"pre\";\r\n let wordBreak = \"normal\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\r\n whiteSpace = \"pre-wrap\";\r\n wordBreak = \"break-word\";\r\n }\r\n Object.assign(editable.style, {\r\n position: \"absolute\",\r\n display: \"inline-block\",\r\n minHeight: \"1em\",\r\n backfaceVisibility: \"hidden\",\r\n margin: 0,\r\n padding: 0,\r\n border: 0,\r\n outline: 0,\r\n resize: \"none\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n // must be specified because in dark mode canvas creates a stacking context\r\n zIndex: \"var(--zIndex-wysiwyg)\",\r\n wordBreak,\r\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\r\n whiteSpace,\r\n overflowWrap: \"break-word\",\r\n });\r\n updateWysiwygStyle();\r\n if (onChange) {\r\n editable.oninput = () => {\r\n // using scrollHeight here since we need to calculate\r\n // number of lines so cannot use editable.style.height\r\n // as that gets updated below\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n // auto increase height only when lines > 1 so its\r\n // measured correctly and vertically alignes for\r\n // first line as well as setting height to \"auto\"\r\n // doubles the height as soon as user starts typing\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\r\n let height = \"auto\";\r\n if (lines === 2) {\r\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\r\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\"\\n\").length;\r\n // This is browser behaviour when setting height to \"auto\"\r\n // It sets the height needed for 2 lines even if actual\r\n // line count is 1 as mentioned above as well\r\n // hence reducing the height by half if actual line count is 1\r\n // so single line aligns vertically when deleting\r\n if (actualLineCount === 1) {\r\n height = `${editable.scrollHeight / 2}px`;\r\n }\r\n }\r\n editable.style.height = height;\r\n editable.style.height = `${editable.scrollHeight}px`;\r\n }\r\n onChange(normalizeText(editable.value));\r\n };\r\n }\r\n editable.onkeydown = (event) => {\r\n event.stopPropagation();\r\n if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\r\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\r\n }\r\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\r\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\r\n event.preventDefault();\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\r\n event.preventDefault();\r\n if (event.isComposing || event.keyCode === 229) {\r\n return;\r\n }\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\r\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\r\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\r\n event.preventDefault();\r\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\r\n outdent();\r\n }\r\n else {\r\n indent();\r\n }\r\n // We must send an input event to resize the element\r\n editable.dispatchEvent(new Event(\"input\"));\r\n }\r\n };\r\n const TAB_SIZE = 4;\r\n const TAB = \" \".repeat(TAB_SIZE);\r\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\r\n const indent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex);\r\n value = `${startValue}${TAB}${endValue}`;\r\n });\r\n editable.value = value;\r\n editable.selectionStart = selectionStart + TAB_SIZE;\r\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\r\n };\r\n const outdent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n const removedTabs = [];\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const tabMatch = value\r\n .slice(startIndex, startIndex + TAB_SIZE)\r\n .match(RE_LEADING_TAB);\r\n if (tabMatch) {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex + tabMatch[0].length);\r\n // Delete a tab from the line\r\n value = `${startValue}${endValue}`;\r\n removedTabs.push(startIndex);\r\n }\r\n });\r\n editable.value = value;\r\n if (removedTabs.length) {\r\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\r\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\r\n }\r\n else {\r\n // If the cursor is before the first tab removed, ex:\r\n // Line| #1\r\n // Line #2\r\n // Lin|e #3\r\n // we should reset the selectionStart to his initial value.\r\n editable.selectionStart = selectionStart;\r\n }\r\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\r\n }\r\n };\r\n /**\r\n * @returns indeces of start positions of selected lines, in reverse order\r\n */\r\n const getSelectedLinesStartIndices = () => {\r\n let { selectionStart, selectionEnd, value } = editable;\r\n // chars before selectionStart on the same line\r\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\r\n .length;\r\n // put caret at the start of the line\r\n selectionStart = selectionStart - startOffset;\r\n const selected = value.slice(selectionStart, selectionEnd);\r\n return selected\r\n .split(\"\\n\")\r\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\r\n ? // curr line index is prev line's start + prev line's length + \\n\r\n startIndices[idx - 1] + lines[idx - 1].length + 1\r\n : // first selected line\r\n selectionStart), [])\r\n .reverse();\r\n };\r\n const stopEvent = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n // using a state variable instead of passing it to the handleSubmit callback\r\n // so that we don't need to create separate a callback for event handlers\r\n let submittedViaKeyboard = false;\r\n const handleSubmit = () => {\r\n var _a, _b;\r\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\r\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\r\n // wysiwyg on update\r\n cleanup();\r\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\r\n if (!updateElement) {\r\n return;\r\n }\r\n let text = editable.value;\r\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\r\n if (container) {\r\n text = updateElement.text;\r\n if (editable.value) {\r\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\r\n if (!boundTextElementId || boundTextElementId !== element.id) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: element.id,\r\n }),\r\n });\r\n }\r\n }\r\n else {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\r\n });\r\n }\r\n }\r\n onSubmit({\r\n text,\r\n viaKeyboard: submittedViaKeyboard,\r\n originalText: editable.value,\r\n });\r\n };\r\n const cleanup = () => {\r\n if (isDestroyed) {\r\n return;\r\n }\r\n isDestroyed = true;\r\n // remove events to ensure they don't late-fire\r\n editable.onblur = null;\r\n editable.oninput = null;\r\n editable.onkeydown = null;\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n window.removeEventListener(\"resize\", updateWysiwygStyle);\r\n window.removeEventListener(\"wheel\", stopEvent, true);\r\n window.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n window.removeEventListener(\"blur\", handleSubmit);\r\n unbindUpdate();\r\n editable.remove();\r\n };\r\n const bindBlurEvent = (event) => {\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\r\n // trigger the blur on ensuing pointerup.\r\n // Also to handle cases such as picking a color which would trigger a blur\r\n // in that same tick.\r\n const target = event === null || event === void 0 ? void 0 : event.target;\r\n const isTargetColorPicker = target instanceof HTMLInputElement &&\r\n target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\r\n setTimeout(() => {\r\n editable.onblur = handleSubmit;\r\n if (target && isTargetColorPicker) {\r\n target.onblur = () => {\r\n editable.focus();\r\n };\r\n }\r\n // case: clicking on the same property → no change → no update → no focus\r\n if (!isTargetColorPicker) {\r\n editable.focus();\r\n }\r\n });\r\n };\r\n // prevent blur when changing properties from the menu\r\n const onPointerDown = (event) => {\r\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\r\n event.target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\r\n if (((event.target instanceof HTMLElement ||\r\n event.target instanceof SVGElement) &&\r\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\r\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\r\n isTargetColorPicker) {\r\n editable.onblur = null;\r\n window.addEventListener(\"pointerup\", bindBlurEvent);\r\n // handle edge-case where pointerup doesn't fire e.g. due to user\r\n // alt-tabbing away\r\n window.addEventListener(\"blur\", handleSubmit);\r\n }\r\n };\r\n // handle updates of textElement properties of editing element\r\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\r\n var _a;\r\n updateWysiwygStyle();\r\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\r\n if (!isColorPickerActive) {\r\n editable.focus();\r\n }\r\n });\r\n // ---------------------------------------------------------------------------\r\n let isDestroyed = false;\r\n // select on init (focusing is done separately inside the bindBlurEvent()\r\n // because we need it to happen *after* the blur event from `pointerdown`)\r\n editable.select();\r\n bindBlurEvent();\r\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\r\n // is preferred so we catch changes from host, where window may not resize.\r\n let observer = null;\r\n if (canvas && \"ResizeObserver\" in window) {\r\n observer = new window.ResizeObserver(() => {\r\n updateWysiwygStyle();\r\n });\r\n observer.observe(canvas);\r\n }\r\n else {\r\n window.addEventListener(\"resize\", updateWysiwygStyle);\r\n }\r\n window.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"wheel\", stopEvent, {\r\n passive: false,\r\n capture: true,\r\n });\r\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UUFBUSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dFd5c2l3eWcudHN4PzhmNGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHtcbiAgaXNXcml0YWJsZUVsZW1lbnQsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldEZvbnRGYW1pbHlTdHJpbmcsXG4gIGlzVGVzdEVudixcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBpc0JvdW5kVG9Db250YWluZXIsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBDTEFTU0VTLCBCT1VORF9URVhUX1BBRERJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0QXBwcm94TGluZUhlaWdodCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudElkLFxuICBnZXRDb250YWluZXJFbGVtZW50LFxuICB3cmFwVGV4dCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGFjdGlvbkRlY3JlYXNlRm9udFNpemUsXG4gIGFjdGlvbkluY3JlYXNlRm9udFNpemUsXG59IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5cbmNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdGV4dFxuICAgICAgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpXG4gICAgICAvLyBub3JtYWxpemUgbmV3bGluZXNcbiAgICAgIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKVxuICApO1xufTtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBtYXhXaWR0aDogbnVtYmVyLFxuICBtYXhIZWlnaHQ6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCB7IHpvb20gfSA9IGFwcFN0YXRlO1xuICBjb25zdCBkZWdyZWUgPSAoMTgwICogYW5nbGUpIC8gTWF0aC5QSTtcbiAgbGV0IHRyYW5zbGF0ZVggPSAoKHdpZHRoKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgbGV0IHRyYW5zbGF0ZVkgPSAoKGhlaWdodCkgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKChtYXhXaWR0aCkgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1heEhlaWdodCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWSA9ICgobWF4SGVpZ2h0KSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgfVxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gKHtcbiAgaWQsXG4gIGFwcFN0YXRlLFxuICBvbkNoYW5nZSxcbiAgb25TdWJtaXQsXG4gIGdldFZpZXdwb3J0Q29vcmRzLFxuICBlbGVtZW50LFxuICBjYW52YXMsXG4gIGV4Y2FsaWRyYXdDb250YWluZXIsXG4gIGFwcCxcbn06IHtcbiAgaWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl07XG4gIGFwcFN0YXRlOiBBcHBTdGF0ZTtcbiAgb25DaGFuZ2U/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdDogKGRhdGE6IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgdmlhS2V5Ym9hcmQ6IGJvb2xlYW47XG4gICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gIH0pID0+IHZvaWQ7XG4gIGdldFZpZXdwb3J0Q29vcmRzOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl07XG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGw7XG4gIGV4Y2FsaWRyYXdDb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgYXBwOiBBcHA7XG59KSA9PiB7XG4gIGNvbnN0IHRleHRQcm9wZXJ0aWVzVXBkYXRlZCA9IChcbiAgICB1cGRhdGVkRWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBjb25zdCBjdXJyZW50Rm9udCA9IGVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZUFsbCgnXCInLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZEVsZW1lbnQuZm9udEZhbWlseSB9KSAhPT1cbiAgICAgIGN1cnJlbnRGb250XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGAke3VwZGF0ZWRFbGVtZW50LmZvbnRTaXplfXB4YCAhPT0gZWRpdGFibGUuc3R5bGUuZm9udFNpemUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuICBsZXQgYXBwcm94TGluZUhlaWdodCA9IGdldEFwcHJveExpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhlbGVtZW50KSk7XG5cbiAgY29uc3QgdXBkYXRlV3lzaXd5Z1N0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG5cbiAgICAgIGxldCBtYXhIZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG4gICAgICBsZXQgd2lkdGggPSB1cGRhdGVkRWxlbWVudC53aWR0aDtcbiAgICAgIC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXRzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG4gICAgICBsZXQgaGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgaWYgKGNvbnRhaW5lciAmJiB1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkRWxlbWVudCxcbiAgICAgICAgICBlZGl0YWJsZSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBOdW1iZXIoZWRpdGFibGUuc3R5bGUuaGVpZ2h0LnNsaWNlKDAsIC0yKSk7XG4gICAgICAgIGlmIChlZGl0b3JIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgaGVpZ2h0ID0gZWRpdG9ySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKTtcblxuICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodDtcblxuICAgICAgICAgIC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcbiAgICAgICAgICBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckhlaWdodCkge1xuICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIG1heEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICB3aWR0aCA9IG1heFdpZHRoO1xuICAgICAgICAvLyBUaGUgY29vcmRpbmF0ZXMgb2YgdGV4dCBib3ggc2V0IGEgZGlzdGFuY2Ugb2ZcbiAgICAgICAgLy8gMzBweCB0byBwcmVzZXJ2ZSBwYWRkaW5nXG4gICAgICAgIGNvb3JkWCA9IGNvbnRhaW5lci54ICsgQk9VTkRfVEVYVF9QQURESU5HO1xuICAgICAgICAvLyBhdXRvZ3JvdyBjb250YWluZXIgaGVpZ2h0IGlmIHRleHQgZXhjZWVkc1xuICAgICAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKGhlaWdodCAtIG1heEhlaWdodCwgYXBwcm94TGluZUhlaWdodCk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0ICsgZGlmZiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gYXV0b3NocmluayBjb250YWluZXIgaGVpZ2h0IHVudGlsIG9yaWdpbmFsIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgICAgY29udGFpbmVyLmhlaWdodCA+IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ICYmXG4gICAgICAgICAgaGVpZ2h0IDwgbWF4SGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihtYXhIZWlnaHQgLSBoZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogY29udGFpbmVyLmhlaWdodCAtIGRpZmYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgcHVzaGluZyB0ZXh0IHVwd2FyZCB1bnRpbCBhIGRpZmYgb2YgMzBweCAocGFkZGluZylcbiAgICAgICAgLy8gaXMgcmVhY2hlZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICAgICAgICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3QgeyB0ZXh0QWxpZ24gfSA9IHVwZGF0ZWRFbGVtZW50O1xuICAgICAgZWRpdGFibGUudmFsdWUgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQ7XG4gICAgICBjb25zdCBsaW5lcyA9IHVwZGF0ZWRFbGVtZW50Lm9yaWdpbmFsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICA/IGFwcHJveExpbmVIZWlnaHRcbiAgICAgICAgOiB1cGRhdGVkRWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9XG4gICAgICAgICAgKGFwcFN0YXRlLm9mZnNldExlZnQgKyBhcHBTdGF0ZS53aWR0aCAtIHZpZXdwb3J0WCkgL1xuICAgICAgICAgICAgYXBwU3RhdGUuem9vbS52YWx1ZSAtXG4gICAgICAgICAgLy8gbWFyZ2luLXJpZ2h0IG9mIHBhcmVudCBpZiBhbnlcbiAgICAgICAgICBOdW1iZXIoXG4gICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgICAgICBleGNhbGlkcmF3Q29udGFpbmVyPy5wYXJlbnROb2RlIGFzIEVsZW1lbnQsXG4gICAgICAgICAgICApLm1hcmdpblJpZ2h0LnNsaWNlKDAsIC0yKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG4gICAgICBjb25zdCBlZGl0b3JNYXhIZWlnaHQgPVxuICAgICAgICAoYXBwU3RhdGUuaGVpZ2h0IC1cbiAgICAgICAgICB2aWV3cG9ydFkpIC9cbiAgICAgICAgYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGNvbnN0IGFuZ2xlID0gY29udGFpbmVyID8gY29udGFpbmVyLmFuZ2xlIDogdXBkYXRlZEVsZW1lbnQuYW5nbGU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGFuZ2xlLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgIGVkaXRvck1heEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YCxcbiAgICAgIH0pO1xuICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHVwZGF0aW5nIGZvbnQgYXR0cmlidXRlIGRvZXNuJ3Qgc2V0IGZvbnQgZmFtaWx5XG4gICAgICAvLyBoZW5jZSB1cGRhdGluZyBmb250IGZhbWlseSBleHBsaWNpdGx5IGZvciB0ZXN0IGVudmlyb25tZW50XG4gICAgICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlTdHJpbmcodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVkRWxlbWVudCwgeyB4OiBjb29yZFgsIHk6IGNvb3JkWSB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG5cbiAgZWRpdGFibGUuZGlyID0gXCJhdXRvXCI7XG4gIGVkaXRhYmxlLnRhYkluZGV4ID0gMDtcbiAgZWRpdGFibGUuZGF0YXNldC50eXBlID0gXCJ3eXNpd3lnXCI7XG4gIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyBvbiBTYWZhcmlcbiAgZWRpdGFibGUud3JhcCA9IFwib2ZmXCI7XG4gIGVkaXRhYmxlLmNsYXNzTGlzdC5hZGQoXCJleGNhbGlkcmF3LXd5c2l3eWdcIik7XG5cbiAgbGV0IHdoaXRlU3BhY2UgPSBcInByZVwiO1xuICBsZXQgd29yZEJyZWFrID0gXCJub3JtYWxcIjtcblxuICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgd2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgICB3b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgfVxuICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIG1pbkhlaWdodDogXCIxZW1cIixcbiAgICBiYWNrZmFjZVZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIG91dGxpbmU6IDAsXG4gICAgcmVzaXplOiBcIm5vbmVcIixcbiAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgLy8gbXVzdCBiZSBzcGVjaWZpZWQgYmVjYXVzZSBpbiBkYXJrIG1vZGUgY2FudmFzIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0XG4gICAgekluZGV4OiBcInZhcigtLXpJbmRleC13eXNpd3lnKVwiLFxuICAgIHdvcmRCcmVhayxcbiAgICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgKGB3aGl0ZXNwYWNlOiBub3dyYXBgIGRvZXNuJ3Qgd29yayBvbiBGRilcbiAgICB3aGl0ZVNwYWNlLFxuICAgIG92ZXJmbG93V3JhcDogXCJicmVhay13b3JkXCIsXG4gIH0pO1xuICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcblxuICBpZiAob25DaGFuZ2UpIHtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgLy8gdXNpbmcgc2Nyb2xsSGVpZ2h0IGhlcmUgc2luY2Ugd2UgbmVlZCB0byBjYWxjdWxhdGVcbiAgICAgIC8vIG51bWJlciBvZiBsaW5lcyBzbyBjYW5ub3QgdXNlIGVkaXRhYmxlLnN0eWxlLmhlaWdodFxuICAgICAgLy8gYXMgdGhhdCBnZXRzIHVwZGF0ZWQgYmVsb3dcbiAgICAgIGNvbnN0IGxpbmVzID0gZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gYXBwcm94TGluZUhlaWdodDtcbiAgICAgIC8vIGF1dG8gaW5jcmVhc2UgaGVpZ2h0IG9ubHkgd2hlbiBsaW5lcyAgPiAxIHNvIGl0c1xuICAgICAgLy8gbWVhc3VyZWQgY29ycmVjdGx5IGFuZCB2ZXJ0aWNhbGx5IGFsaWduZXMgZm9yXG4gICAgICAvLyBmaXJzdCBsaW5lIGFzIHdlbGwgYXMgc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgIC8vIGRvdWJsZXMgdGhlIGhlaWdodCBhcyBzb29uIGFzIHVzZXIgc3RhcnRzIHR5cGluZ1xuICAgICAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSAmJiBsaW5lcyA+IDEpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IFwiYXV0b1wiO1xuXG4gICAgICAgIGlmIChsaW5lcyA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgYWN0dWFsTGluZUNvdW50ID0gd3JhcFRleHQoXG4gICAgICAgICAgICBlZGl0YWJsZS52YWx1ZSxcbiAgICAgICAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICAgICAgICBjb250YWluZXIhLndpZHRoLFxuICAgICAgICAgICkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuXG4gICAgICAgICAgLy8gVGhpcyBpcyBicm93c2VyIGJlaGF2aW91ciB3aGVuIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAgICAgLy8gSXQgc2V0cyB0aGUgaGVpZ2h0IG5lZWRlZCBmb3IgMiBsaW5lcyBldmVuIGlmIGFjdHVhbFxuICAgICAgICAgIC8vIGxpbmUgY291bnQgaXMgMSBhcyBtZW50aW9uZWQgYWJvdmUgYXMgd2VsbFxuICAgICAgICAgIC8vIGhlbmNlIHJlZHVjaW5nIHRoZSBoZWlnaHQgYnkgaGFsZiBpZiBhY3R1YWwgbGluZSBjb3VudCBpcyAxXG4gICAgICAgICAgLy8gc28gc2luZ2xlIGxpbmUgYWxpZ25zIHZlcnRpY2FsbHkgd2hlbiBkZWxldGluZ1xuICAgICAgICAgIGlmIChhY3R1YWxMaW5lQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodCAvIDJ9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBvbkNoYW5nZShub3JtYWxpemVUZXh0KGVkaXRhYmxlLnZhbHVlKSk7XG4gICAgfTtcbiAgfVxuXG4gIGVkaXRhYmxlLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGFjdGlvbkRlY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVjcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb25JbmNyZWFzZUZvbnRTaXplLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkluY3JlYXNlRm9udFNpemUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVTQ0FQRSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSICYmIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSBLRVlTLlRBQiB8fFxuICAgICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQgfHxcbiAgICAgICAgICBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSlcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUKSB7XG4gICAgICAgIG91dGRlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCgpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuICAgICAgZWRpdGFibGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFRBQl9TSVpFID0gNDtcbiAgY29uc3QgVEFCID0gXCIgXCIucmVwZWF0KFRBQl9TSVpFKTtcbiAgY29uc3QgUkVfTEVBRElOR19UQUIgPSBuZXcgUmVnRXhwKGBeIHsxLCR7VEFCX1NJWkV9fWApO1xuICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcblxuICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7VEFCfSR7ZW5kVmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuICAgIGNvbnN0IHJlbW92ZWRUYWJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGFiTWF0Y2ggPSB2YWx1ZVxuICAgICAgICAuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKVxuICAgICAgICAubWF0Y2goUkVfTEVBRElOR19UQUIpO1xuXG4gICAgICBpZiAodGFiTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXggKyB0YWJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG4gICAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke2VuZFZhbHVlfWA7XG4gICAgICAgIHJlbW92ZWRUYWJzLnB1c2goc3RhcnRJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLFxuICAgICAgICAgIHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGZpcnN0IHRhYiByZW1vdmVkLCBleDpcbiAgICAgICAgLy8gTGluZXwgIzFcbiAgICAgICAgLy8gICAgIExpbmUgIzJcbiAgICAgICAgLy8gTGlufGUgIzNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlc2V0IHRoZSBzZWxlY3Rpb25TdGFydCB0byBoaXMgaW5pdGlhbCB2YWx1ZS5cbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgIH1cbiAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KFxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgaW5kZWNlcyBvZiBzdGFydCBwb3NpdGlvbnMgb2Ygc2VsZWN0ZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGNvbnN0IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgdmFsdWUgfSA9IGVkaXRhYmxlO1xuXG4gICAgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvW15cXG5dKiQvKSFbMF1cbiAgICAgIC5sZW5ndGg7XG4gICAgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgLSBzdGFydE9mZnNldDtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHN0YXJ0SW5kaWNlcywgbGluZSwgaWR4LCBsaW5lcykgPT5cbiAgICAgICAgICBzdGFydEluZGljZXMuY29uY2F0KFxuICAgICAgICAgICAgaWR4XG4gICAgICAgICAgICAgID8gLy8gY3VyciBsaW5lIGluZGV4IGlzIHByZXYgbGluZSdzIHN0YXJ0ICsgcHJldiBsaW5lJ3MgbGVuZ3RoICsgXFxuXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRpY2VzW2lkeCAtIDFdICsgbGluZXNbaWR4IC0gMV0ubGVuZ3RoICsgMVxuICAgICAgICAgICAgICA6IC8vIGZpcnN0IHNlbGVjdGVkIGxpbmVcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICApLFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgIClcbiAgICAgIC5yZXZlcnNlKCk7XG4gIH07XG5cbiAgY29uc3Qgc3RvcEV2ZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgLy8gdXNpbmcgYSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdG8gdGhlIGhhbmRsZVN1Ym1pdCBjYWxsYmFja1xuICAvLyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGEgY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsZXJzXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgLy8gY2xlYW51cCBtdXN0IGJlIHJ1biBiZWZvcmUgb25TdWJtaXQgb3RoZXJ3aXNlIHdoZW4gYXBwIGJsdXJzIHRoZSB3eXNpd3lnXG4gICAgLy8gaXQnZCBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcCBvZiBibHVy4oaSb25TdWJtaXQgYWZ0ZXIgd2UgcmUtZm9jdXMgdGhlXG4gICAgLy8gd3lzaXd5ZyBvbiB1cGRhdGVcbiAgICBjbGVhbnVwKCk7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgZWxlbWVudC5pZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZUVsZW1lbnQpO1xuXG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGV4dCA9IHVwZGF0ZUVsZW1lbnQudGV4dDtcbiAgICAgIGlmIChlZGl0YWJsZS52YWx1ZSkge1xuICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+XG4gICAgICAgICAgICAgICFpc1RleHRFbGVtZW50KFxuICAgICAgICAgICAgICAgIGVsZSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0LFxuICAgICAgdmlhS2V5Ym9hcmQ6IHN1Ym1pdHRlZFZpYUtleWJvYXJkLFxuICAgICAgb3JpZ2luYWxUZXh0OiBlZGl0YWJsZS52YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcbiAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9ua2V5ZG93biA9IG51bGw7XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB0cnVlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuXG4gICAgdW5iaW5kVXBkYXRlKCk7XG5cbiAgICBlZGl0YWJsZS5yZW1vdmUoKTtcbiAgfTtcblxuICBjb25zdCBiaW5kQmx1ckV2ZW50ID0gKGV2ZW50PzogTW91c2VFdmVudCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIC8vIERlZmVycmVkIHNvIHRoYXQgdGhlIHBvaW50ZXJkb3duIHRoYXQgaW5pdGlhdGVzIHRoZSB3eXNpd3lnIGRvZXNuJ3RcbiAgICAvLyB0cmlnZ2VyIHRoZSBibHVyIG9uIGVuc3VpbmcgcG9pbnRlcnVwLlxuICAgIC8vIEFsc28gdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMgcGlja2luZyBhIGNvbG9yIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBibHVyXG4gICAgLy8gaW4gdGhhdCBzYW1lIHRpY2suXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcblxuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBoYW5kbGVTdWJtaXQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgdGFyZ2V0Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuICAgICAgaWYgKCFpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gcHJldmVudCBibHVyIHdoZW4gY2hhbmdpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBtZW51XG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICBpZiAoXG4gICAgICAoKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpICYmXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KGAuJHtDTEFTU0VTLlNIQVBFX0FDVElPTlNfTUVOVX1gKSAmJlxuICAgICAgICAhaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkgfHxcbiAgICAgIGlzVGFyZ2V0Q29sb3JQaWNrZXJcbiAgICApIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAgIC8vIGhhbmRsZSBlZGdlLWNhc2Ugd2hlcmUgcG9pbnRlcnVwIGRvZXNuJ3QgZmlyZSBlLmcuIGR1ZSB0byB1c2VyXG4gICAgICAvLyBhbHQtdGFiYmluZyBhd2F5XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaGFuZGxlIHVwZGF0ZXMgb2YgdGV4dEVsZW1lbnQgcHJvcGVydGllcyBvZiBlZGl0aW5nIGVsZW1lbnRcbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkhLmFkZENhbGxiYWNrKCgpID0+IHtcbiAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICBjb25zdCBpc0NvbG9yUGlja2VyQWN0aXZlID0gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KFxuICAgICAgXCIuY29sb3ItcGlja2VyLWlucHV0XCIsXG4gICAgKTtcbiAgICBpZiAoIWlzQ29sb3JQaWNrZXJBY3RpdmUpIHtcbiAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsZXQgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG4gIGVkaXRhYmxlLnNlbGVjdCgpO1xuICBiaW5kQmx1ckV2ZW50KCk7XG5cbiAgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuICBsZXQgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChjYW52YXMgJiYgXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdykge1xuICAgIG9ic2VydmVyID0gbmV3IHdpbmRvdy5SZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNhbnZhcyk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB7XG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgfSk7XG4gIGV4Y2FsaWRyYXdDb250YWluZXJcbiAgICA/LnF1ZXJ5U2VsZWN0b3IoXCIuZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIpIVxuICAgIC5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
2553
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\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\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst normalizeText = (text) => {\r\n return (text\r\n // replace tabs with spaces so they render and measure correctly\r\n .replace(/\\t/g, \" \")\r\n // normalize newlines\r\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\r\n};\r\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\r\n const { zoom } = appState;\r\n const degree = (180 * angle) / Math.PI;\r\n let translateX = ((width) * (zoom.value - 1)) / 2;\r\n let translateY = ((height) * (zoom.value - 1)) / 2;\r\n if (width > maxWidth && zoom.value !== 1) {\r\n translateX = ((maxWidth) * (zoom.value - 1)) / 2;\r\n }\r\n if (height > maxHeight && zoom.value !== 1) {\r\n translateY = ((maxHeight) * (zoom.value - 1)) / 2;\r\n }\r\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\r\n};\r\nconst textWysiwyg = ({ id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\r\n const textPropertiesUpdated = (updatedElement, editable) => {\r\n const currentFont = editable.style.fontFamily.replaceAll('\"', \"\");\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedElement.fontFamily }) !==\r\n currentFont) {\r\n return true;\r\n }\r\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n let originalContainerHeight;\r\n let approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element));\r\n const updateWysiwygStyle = () => {\r\n var _a;\r\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\r\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\r\n let coordX = updatedElement.x;\r\n let coordY = updatedElement.y;\r\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedElement);\r\n let maxWidth = updatedElement.width;\r\n let maxHeight = updatedElement.height;\r\n let width = updatedElement.width;\r\n // Set to element height by default since thats\r\n // what is going to be used for unbounded text\r\n let height = updatedElement.height;\r\n if (container && updatedElement.containerId) {\r\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable);\r\n // using editor.style.height to get the accurate height of text editor\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editorHeight > 0) {\r\n height = editorHeight;\r\n }\r\n if (propertiesUpdated) {\r\n approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement));\r\n originalContainerHeight = container.height;\r\n // update height of the editor after properties updated\r\n height = updatedElement.height;\r\n }\r\n if (!originalContainerHeight) {\r\n originalContainerHeight = container.height;\r\n }\r\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n width = maxWidth;\r\n // The coordinates of text box set a distance of\r\n // 30px to preserve padding\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING;\r\n // autogrow container height if text exceeds\r\n if (height > maxHeight) {\r\n const diff = Math.min(height - maxHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height + diff });\r\n return;\r\n }\r\n else if (\r\n // autoshrink container height until original container height\r\n // is reached when text is removed\r\n container.height > originalContainerHeight &&\r\n height < maxHeight) {\r\n const diff = Math.min(maxHeight - height, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height - diff });\r\n }\r\n // Start pushing text upward until a diff of 30px (padding)\r\n // is reached\r\n else {\r\n // vertically center align the text\r\n coordY = container.y + container.height / 2 - height / 2;\r\n }\r\n }\r\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\r\n const { textAlign } = updatedElement;\r\n editable.value = updatedElement.originalText;\r\n const lines = updatedElement.originalText.split(\"\\n\");\r\n const lineHeight = updatedElement.containerId\r\n ? approxLineHeight\r\n : updatedElement.height / lines.length;\r\n if (!container) {\r\n maxWidth =\r\n (appState.width - 8 - viewportX) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\r\n }\r\n // Make sure text editor height doesn't go beyond viewport\r\n const editorMaxHeight = (appState.height -\r\n viewportY) /\r\n appState.zoom.value;\r\n const angle = container ? container.angle : updatedElement.angle;\r\n Object.assign(editable.style, {\r\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\r\n // must be defined *after* font ¯\\_(ツ)_/¯\r\n lineHeight: `${lineHeight}px`,\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${viewportX}px`,\r\n top: `${viewportY}px`,\r\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\r\n textAlign,\r\n color: updatedElement.strokeColor,\r\n opacity: updatedElement.opacity / 100,\r\n filter: \"var(--theme-filter)\",\r\n maxWidth: `${maxWidth}px`,\r\n maxHeight: `${editorMaxHeight}px`,\r\n });\r\n // For some reason updating font attribute doesn't set font family\r\n // hence updating font family explicitly for test environment\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\r\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedElement);\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedElement, { x: coordX, y: coordY });\r\n }\r\n };\r\n const editable = document.createElement(\"textarea\");\r\n editable.dir = \"auto\";\r\n editable.tabIndex = 0;\r\n editable.dataset.type = \"wysiwyg\";\r\n // prevent line wrapping on Safari\r\n editable.wrap = \"off\";\r\n editable.classList.add(\"excalidraw-wysiwyg\");\r\n let whiteSpace = \"pre\";\r\n let wordBreak = \"normal\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\r\n whiteSpace = \"pre-wrap\";\r\n wordBreak = \"break-word\";\r\n }\r\n Object.assign(editable.style, {\r\n position: \"absolute\",\r\n display: \"inline-block\",\r\n minHeight: \"1em\",\r\n backfaceVisibility: \"hidden\",\r\n margin: 0,\r\n padding: 0,\r\n border: 0,\r\n outline: 0,\r\n resize: \"none\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n // must be specified because in dark mode canvas creates a stacking context\r\n zIndex: \"var(--zIndex-wysiwyg)\",\r\n wordBreak,\r\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\r\n whiteSpace,\r\n overflowWrap: \"break-word\",\r\n });\r\n updateWysiwygStyle();\r\n if (onChange) {\r\n editable.oninput = () => {\r\n // using scrollHeight here since we need to calculate\r\n // number of lines so cannot use editable.style.height\r\n // as that gets updated below\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n // auto increase height only when lines > 1 so its\r\n // measured correctly and vertically alignes for\r\n // first line as well as setting height to \"auto\"\r\n // doubles the height as soon as user starts typing\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\r\n let height = \"auto\";\r\n if (lines === 2) {\r\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\r\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\"\\n\").length;\r\n // This is browser behaviour when setting height to \"auto\"\r\n // It sets the height needed for 2 lines even if actual\r\n // line count is 1 as mentioned above as well\r\n // hence reducing the height by half if actual line count is 1\r\n // so single line aligns vertically when deleting\r\n if (actualLineCount === 1) {\r\n height = `${editable.scrollHeight / 2}px`;\r\n }\r\n }\r\n editable.style.height = height;\r\n editable.style.height = `${editable.scrollHeight}px`;\r\n }\r\n onChange(normalizeText(editable.value));\r\n };\r\n }\r\n editable.onkeydown = (event) => {\r\n event.stopPropagation();\r\n if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\r\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\r\n }\r\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\r\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\r\n event.preventDefault();\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\r\n event.preventDefault();\r\n if (event.isComposing || event.keyCode === 229) {\r\n return;\r\n }\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\r\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\r\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\r\n event.preventDefault();\r\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\r\n outdent();\r\n }\r\n else {\r\n indent();\r\n }\r\n // We must send an input event to resize the element\r\n editable.dispatchEvent(new Event(\"input\"));\r\n }\r\n };\r\n const TAB_SIZE = 4;\r\n const TAB = \" \".repeat(TAB_SIZE);\r\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\r\n const indent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex);\r\n value = `${startValue}${TAB}${endValue}`;\r\n });\r\n editable.value = value;\r\n editable.selectionStart = selectionStart + TAB_SIZE;\r\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\r\n };\r\n const outdent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n const removedTabs = [];\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const tabMatch = value\r\n .slice(startIndex, startIndex + TAB_SIZE)\r\n .match(RE_LEADING_TAB);\r\n if (tabMatch) {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex + tabMatch[0].length);\r\n // Delete a tab from the line\r\n value = `${startValue}${endValue}`;\r\n removedTabs.push(startIndex);\r\n }\r\n });\r\n editable.value = value;\r\n if (removedTabs.length) {\r\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\r\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\r\n }\r\n else {\r\n // If the cursor is before the first tab removed, ex:\r\n // Line| #1\r\n // Line #2\r\n // Lin|e #3\r\n // we should reset the selectionStart to his initial value.\r\n editable.selectionStart = selectionStart;\r\n }\r\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\r\n }\r\n };\r\n /**\r\n * @returns indeces of start positions of selected lines, in reverse order\r\n */\r\n const getSelectedLinesStartIndices = () => {\r\n let { selectionStart, selectionEnd, value } = editable;\r\n // chars before selectionStart on the same line\r\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\r\n .length;\r\n // put caret at the start of the line\r\n selectionStart = selectionStart - startOffset;\r\n const selected = value.slice(selectionStart, selectionEnd);\r\n return selected\r\n .split(\"\\n\")\r\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\r\n ? // curr line index is prev line's start + prev line's length + \\n\r\n startIndices[idx - 1] + lines[idx - 1].length + 1\r\n : // first selected line\r\n selectionStart), [])\r\n .reverse();\r\n };\r\n const stopEvent = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n // using a state variable instead of passing it to the handleSubmit callback\r\n // so that we don't need to create separate a callback for event handlers\r\n let submittedViaKeyboard = false;\r\n const handleSubmit = () => {\r\n var _a, _b;\r\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\r\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\r\n // wysiwyg on update\r\n cleanup();\r\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\r\n if (!updateElement) {\r\n return;\r\n }\r\n let text = editable.value;\r\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\r\n if (container) {\r\n text = updateElement.text;\r\n if (editable.value) {\r\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\r\n if (!boundTextElementId || boundTextElementId !== element.id) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: element.id,\r\n }),\r\n });\r\n }\r\n }\r\n else {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\r\n });\r\n }\r\n }\r\n onSubmit({\r\n text,\r\n viaKeyboard: submittedViaKeyboard,\r\n originalText: editable.value,\r\n });\r\n };\r\n const cleanup = () => {\r\n if (isDestroyed) {\r\n return;\r\n }\r\n isDestroyed = true;\r\n // remove events to ensure they don't late-fire\r\n editable.onblur = null;\r\n editable.oninput = null;\r\n editable.onkeydown = null;\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n window.removeEventListener(\"resize\", updateWysiwygStyle);\r\n window.removeEventListener(\"wheel\", stopEvent, true);\r\n window.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n window.removeEventListener(\"blur\", handleSubmit);\r\n unbindUpdate();\r\n editable.remove();\r\n };\r\n const bindBlurEvent = (event) => {\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\r\n // trigger the blur on ensuing pointerup.\r\n // Also to handle cases such as picking a color which would trigger a blur\r\n // in that same tick.\r\n const target = event === null || event === void 0 ? void 0 : event.target;\r\n const isTargetColorPicker = target instanceof HTMLInputElement &&\r\n target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\r\n setTimeout(() => {\r\n editable.onblur = handleSubmit;\r\n if (target && isTargetColorPicker) {\r\n target.onblur = () => {\r\n editable.focus();\r\n };\r\n }\r\n // case: clicking on the same property → no change → no update → no focus\r\n if (!isTargetColorPicker) {\r\n editable.focus();\r\n }\r\n });\r\n };\r\n // prevent blur when changing properties from the menu\r\n const onPointerDown = (event) => {\r\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\r\n event.target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\r\n if (((event.target instanceof HTMLElement ||\r\n event.target instanceof SVGElement) &&\r\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\r\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\r\n isTargetColorPicker) {\r\n editable.onblur = null;\r\n window.addEventListener(\"pointerup\", bindBlurEvent);\r\n // handle edge-case where pointerup doesn't fire e.g. due to user\r\n // alt-tabbing away\r\n window.addEventListener(\"blur\", handleSubmit);\r\n }\r\n };\r\n // handle updates of textElement properties of editing element\r\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\r\n var _a;\r\n updateWysiwygStyle();\r\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\r\n if (!isColorPickerActive) {\r\n editable.focus();\r\n }\r\n });\r\n // ---------------------------------------------------------------------------\r\n let isDestroyed = false;\r\n // select on init (focusing is done separately inside the bindBlurEvent()\r\n // because we need it to happen *after* the blur event from `pointerdown`)\r\n editable.select();\r\n bindBlurEvent();\r\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\r\n // is preferred so we catch changes from host, where window may not resize.\r\n let observer = null;\r\n if (canvas && \"ResizeObserver\" in window) {\r\n observer = new window.ResizeObserver(() => {\r\n updateWysiwygStyle();\r\n });\r\n observer.observe(canvas);\r\n }\r\n else {\r\n window.addEventListener(\"resize\", updateWysiwygStyle);\r\n }\r\n window.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"wheel\", stopEvent, {\r\n passive: false,\r\n capture: true,\r\n });\r\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3g/OGY0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQge1xuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0Rm9udEZhbWlseVN0cmluZyxcbiAgaXNUZXN0RW52LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzQm91bmRUb0NvbnRhaW5lciwgaXNUZXh0RWxlbWVudCB9IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IENMQVNTRVMsIEJPVU5EX1RFWFRfUEFERElORyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hMaW5lSGVpZ2h0LFxuICBnZXRCb3VuZFRleHRFbGVtZW50SWQsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG4gIHdyYXBUZXh0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgYWN0aW9uRGVjcmVhc2VGb250U2l6ZSxcbiAgYWN0aW9uSW5jcmVhc2VGb250U2l6ZSxcbn0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uUHJvcGVydGllc1wiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0ZXh0XG4gICAgICAvLyByZXBsYWNlIHRhYnMgd2l0aCBzcGFjZXMgc28gdGhleSByZW5kZXIgYW5kIG1lYXN1cmUgY29ycmVjdGx5XG4gICAgICAucmVwbGFjZSgvXFx0L2csIFwiICAgICAgICBcIilcbiAgICAgIC8vIG5vcm1hbGl6ZSBuZXdsaW5lc1xuICAgICAgLnJlcGxhY2UoL1xccj9cXG58XFxyL2csIFwiXFxuXCIpXG4gICk7XG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIG1heFdpZHRoOiBudW1iZXIsXG4gIG1heEhlaWdodDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHsgem9vbSB9ID0gYXBwU3RhdGU7XG4gIGNvbnN0IGRlZ3JlZSA9ICgxODAgKiBhbmdsZSkgLyBNYXRoLlBJO1xuICBsZXQgdHJhbnNsYXRlWCA9ICgod2lkdGgpICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9ICgoaGVpZ2h0KSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgaWYgKHdpZHRoID4gbWF4V2lkdGggJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVggPSAoKG1heFdpZHRoKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgfVxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gKChtYXhIZWlnaHQpICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIHJldHVybiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb20udmFsdWV9KSByb3RhdGUoJHtkZWdyZWV9ZGVnKWA7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFd5c2l3eWcgPSAoe1xuICBpZCxcbiAgYXBwU3RhdGUsXG4gIG9uQ2hhbmdlLFxuICBvblN1Ym1pdCxcbiAgZ2V0Vmlld3BvcnRDb29yZHMsXG4gIGVsZW1lbnQsXG4gIGNhbnZhcyxcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcixcbiAgYXBwLFxufToge1xuICBpZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXTtcbiAgYXBwU3RhdGU6IEFwcFN0YXRlO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBhcHA6IEFwcDtcbn0pID0+IHtcbiAgY29uc3QgdGV4dFByb3BlcnRpZXNVcGRhdGVkID0gKFxuICAgIHVwZGF0ZWRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgZWRpdGFibGU6IEhUTUxUZXh0QXJlYUVsZW1lbnQsXG4gICkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlQWxsKCdcIicsIFwiXCIpO1xuICAgIGlmIChcbiAgICAgIGdldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5OiB1cGRhdGVkRWxlbWVudC5mb250RmFtaWx5IH0pICE9PVxuICAgICAgY3VycmVudEZvbnRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoYCR7dXBkYXRlZEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgbGV0IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0OiBudW1iZXI7XG4gIGxldCBhcHByb3hMaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChnZXRGb250U3RyaW5nKGVsZW1lbnQpKTtcblxuICBjb25zdCB1cGRhdGVXeXNpd3lnU3R5bGUgPSAoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKHVwZGF0ZWRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQodXBkYXRlZEVsZW1lbnQpKSB7XG4gICAgICBsZXQgY29vcmRYID0gdXBkYXRlZEVsZW1lbnQueDtcbiAgICAgIGxldCBjb29yZFkgPSB1cGRhdGVkRWxlbWVudC55O1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVkRWxlbWVudCk7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkRWxlbWVudC53aWR0aDtcblxuICAgICAgbGV0IG1heEhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgIGxldCB3aWR0aCA9IHVwZGF0ZWRFbGVtZW50LndpZHRoO1xuICAgICAgLy8gU2V0IHRvIGVsZW1lbnQgaGVpZ2h0IGJ5IGRlZmF1bHQgc2luY2UgdGhhdHNcbiAgICAgIC8vIHdoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdW5ib3VuZGVkIHRleHRcbiAgICAgIGxldCBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG4gICAgICBpZiAoY29udGFpbmVyICYmIHVwZGF0ZWRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXNVcGRhdGVkID0gdGV4dFByb3BlcnRpZXNVcGRhdGVkKFxuICAgICAgICAgIHVwZGF0ZWRFbGVtZW50LFxuICAgICAgICAgIGVkaXRhYmxlLFxuICAgICAgICApO1xuICAgICAgICAvLyB1c2luZyBlZGl0b3Iuc3R5bGUuaGVpZ2h0IHRvIGdldCB0aGUgYWNjdXJhdGUgaGVpZ2h0IG9mIHRleHQgZWRpdG9yXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcbiAgICAgICAgaWYgKGVkaXRvckhlaWdodCA+IDApIHtcbiAgICAgICAgICBoZWlnaHQgPSBlZGl0b3JIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnRpZXNVcGRhdGVkKSB7XG4gICAgICAgICAgYXBwcm94TGluZUhlaWdodCA9IGdldEFwcHJveExpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyh1cGRhdGVkRWxlbWVudCkpO1xuXG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0O1xuXG4gICAgICAgICAgLy8gdXBkYXRlIGhlaWdodCBvZiB0aGUgZWRpdG9yIGFmdGVyIHByb3BlcnRpZXMgdXBkYXRlZFxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9yaWdpbmFsQ29udGFpbmVySGVpZ2h0KSB7XG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIG1heFdpZHRoID0gY29udGFpbmVyLndpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgICAgICAgbWF4SGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIHdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIC8vIFRoZSBjb29yZGluYXRlcyBvZiB0ZXh0IGJveCBzZXQgYSBkaXN0YW5jZSBvZlxuICAgICAgICAvLyAzMHB4IHRvIHByZXNlcnZlIHBhZGRpbmdcbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkc7XG4gICAgICAgIC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG4gICAgICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oaGVpZ2h0IC0gbWF4SGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgKyBkaWZmIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAgIC8vIGlzIHJlYWNoZWQgd2hlbiB0ZXh0IGlzIHJlbW92ZWRcbiAgICAgICAgICBjb250YWluZXIuaGVpZ2h0ID4gb3JpZ2luYWxDb250YWluZXJIZWlnaHQgJiZcbiAgICAgICAgICBoZWlnaHQgPCBtYXhIZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKG1heEhlaWdodCAtIGhlaWdodCwgYXBwcm94TGluZUhlaWdodCk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFydCBwdXNoaW5nIHRleHQgdXB3YXJkIHVudGlsIGEgZGlmZiBvZiAzMHB4IChwYWRkaW5nKVxuICAgICAgICAvLyBpcyByZWFjaGVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gICAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBjb250YWluZXIuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFt2aWV3cG9ydFgsIHZpZXdwb3J0WV0gPSBnZXRWaWV3cG9ydENvb3Jkcyhjb29yZFgsIGNvb3JkWSk7XG4gICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gdXBkYXRlZEVsZW1lbnQ7XG4gICAgICBlZGl0YWJsZS52YWx1ZSA9IHVwZGF0ZWRFbGVtZW50Lm9yaWdpbmFsVGV4dDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmNvbnRhaW5lcklkXG4gICAgICAgID8gYXBwcm94TGluZUhlaWdodFxuICAgICAgICA6IHVwZGF0ZWRFbGVtZW50LmhlaWdodCAvIGxpbmVzLmxlbmd0aDtcbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIG1heFdpZHRoID1cbiAgICAgICAgICAoYXBwU3RhdGUud2lkdGggLSA4IC0gdmlld3BvcnRYKSAvXG4gICAgICAgICAgICBhcHBTdGF0ZS56b29tLnZhbHVlIC1cbiAgICAgICAgICAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICAgIE51bWJlcihcbiAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI/LnBhcmVudE5vZGUgYXMgRWxlbWVudCxcbiAgICAgICAgICAgICkubWFyZ2luUmlnaHQuc2xpY2UoMCwgLTIpLFxuICAgICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBoZWlnaHQgZG9lc24ndCBnbyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9XG4gICAgICAgIChhcHBTdGF0ZS5oZWlnaHQgLVxuICAgICAgICAgIHZpZXdwb3J0WSkgL1xuICAgICAgICBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgY29uc3QgYW5nbGUgPSBjb250YWluZXIgPyBjb250YWluZXIuYW5nbGUgOiB1cGRhdGVkRWxlbWVudC5hbmdsZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkRWxlbWVudCksXG4gICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIGZvbnQgwq9cXF8o44OEKV8vwq9cbiAgICAgICAgbGluZUhlaWdodDogYCR7bGluZUhlaWdodH1weGAsXG4gICAgICAgIHdpZHRoOiBgJHt3aWR0aH1weGAsXG4gICAgICAgIGhlaWdodDogYCR7aGVpZ2h0fXB4YCxcbiAgICAgICAgbGVmdDogYCR7dmlld3BvcnRYfXB4YCxcbiAgICAgICAgdG9wOiBgJHt2aWV3cG9ydFl9cHhgLFxuICAgICAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybShcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYW5nbGUsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkRWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgb3BhY2l0eTogdXBkYXRlZEVsZW1lbnQub3BhY2l0eSAvIDEwMCxcbiAgICAgICAgZmlsdGVyOiBcInZhcigtLXRoZW1lLWZpbHRlcilcIixcbiAgICAgICAgbWF4V2lkdGg6IGAke21heFdpZHRofXB4YCxcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtlZGl0b3JNYXhIZWlnaHR9cHhgLFxuICAgICAgfSk7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gdXBkYXRpbmcgZm9udCBhdHRyaWJ1dGUgZG9lc24ndCBzZXQgZm9udCBmYW1pbHlcbiAgICAgIC8vIGhlbmNlIHVwZGF0aW5nIGZvbnQgZmFtaWx5IGV4cGxpY2l0bHkgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseVN0cmluZyh1cGRhdGVkRWxlbWVudCk7XG4gICAgICB9XG4gICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZWRFbGVtZW50LCB7IHg6IGNvb3JkWCwgeTogY29vcmRZIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBlZGl0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblxuICBlZGl0YWJsZS5kaXIgPSBcImF1dG9cIjtcbiAgZWRpdGFibGUudGFiSW5kZXggPSAwO1xuICBlZGl0YWJsZS5kYXRhc2V0LnR5cGUgPSBcInd5c2l3eWdcIjtcbiAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIG9uIFNhZmFyaVxuICBlZGl0YWJsZS53cmFwID0gXCJvZmZcIjtcbiAgZWRpdGFibGUuY2xhc3NMaXN0LmFkZChcImV4Y2FsaWRyYXctd3lzaXd5Z1wiKTtcblxuICBsZXQgd2hpdGVTcGFjZSA9IFwicHJlXCI7XG4gIGxldCB3b3JkQnJlYWsgPSBcIm5vcm1hbFwiO1xuXG4gIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICB3aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICAgIHdvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICB9XG4gIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgbWluSGVpZ2h0OiBcIjFlbVwiLFxuICAgIGJhY2tmYWNlVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBib3JkZXI6IDAsXG4gICAgb3V0bGluZTogMCxcbiAgICByZXNpemU6IFwibm9uZVwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAvLyBtdXN0IGJlIHNwZWNpZmllZCBiZWNhdXNlIGluIGRhcmsgbW9kZSBjYW52YXMgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHRcbiAgICB6SW5kZXg6IFwidmFyKC0tekluZGV4LXd5c2l3eWcpXCIsXG4gICAgd29yZEJyZWFrLFxuICAgIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyAoYHdoaXRlc3BhY2U6IG5vd3JhcGAgZG9lc24ndCB3b3JrIG9uIEZGKVxuICAgIHdoaXRlU3BhY2UsXG4gICAgb3ZlcmZsb3dXcmFwOiBcImJyZWFrLXdvcmRcIixcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICAvLyB1c2luZyBzY3JvbGxIZWlnaHQgaGVyZSBzaW5jZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzIHNvIGNhbm5vdCB1c2UgZWRpdGFibGUuc3R5bGUuaGVpZ2h0XG4gICAgICAvLyBhcyB0aGF0IGdldHMgdXBkYXRlZCBiZWxvd1xuICAgICAgY29uc3QgbGluZXMgPSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBhcHByb3hMaW5lSGVpZ2h0O1xuICAgICAgLy8gYXV0byBpbmNyZWFzZSBoZWlnaHQgb25seSB3aGVuIGxpbmVzICA+IDEgc28gaXRzXG4gICAgICAvLyBtZWFzdXJlZCBjb3JyZWN0bHkgYW5kIHZlcnRpY2FsbHkgYWxpZ25lcyBmb3JcbiAgICAgIC8vIGZpcnN0IGxpbmUgYXMgd2VsbCBhcyBzZXR0aW5nIGhlaWdodCB0byBcImF1dG9cIlxuICAgICAgLy8gZG91YmxlcyB0aGUgaGVpZ2h0IGFzIHNvb24gYXMgdXNlciBzdGFydHMgdHlwaW5nXG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpICYmIGxpbmVzID4gMSkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gXCJhdXRvXCI7XG5cbiAgICAgICAgaWYgKGxpbmVzID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxMaW5lQ291bnQgPSB3cmFwVGV4dChcbiAgICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICAgICAgICAgIGNvbnRhaW5lciEud2lkdGgsXG4gICAgICAgICAgKS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG4gICAgICAgICAgaWYgKGFjdHVhbExpbmVDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gMn1weGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuVEFCIHx8XG4gICAgICAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fFxuICAgICAgICAgIGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfUklHSFQpKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQpIHtcbiAgICAgICAgb3V0ZGVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXZSBtdXN0IHNlbmQgYW4gaW5wdXQgZXZlbnQgdG8gcmVzaXplIHRoZSBlbGVtZW50XG4gICAgICBlZGl0YWJsZS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgVEFCX1NJWkUgPSA0O1xuICBjb25zdCBUQUIgPSBcIiBcIi5yZXBlYXQoVEFCX1NJWkUpO1xuICBjb25zdCBSRV9MRUFESU5HX1RBQiA9IG5ldyBSZWdFeHAoYF4gezEsJHtUQUJfU0laRX19YCk7XG4gIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXgpO1xuXG4gICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtUQUJ9JHtlbmRWYWx1ZX1gO1xuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgKyBUQUJfU0laRTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQgKyBUQUJfU0laRSAqIGxpbmVzU3RhcnRJbmRpY2VzLmxlbmd0aDtcbiAgfTtcblxuICBjb25zdCBvdXRkZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgY29uc3QgcmVtb3ZlZFRhYnM6IG51bWJlcltdID0gW107XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0YWJNYXRjaCA9IHZhbHVlXG4gICAgICAgIC5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgVEFCX1NJWkUpXG4gICAgICAgIC5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gRGVsZXRlIGEgdGFiIGZyb20gdGhlIGxpbmVcbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAocmVtb3ZlZFRhYnMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSkge1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0IC0gVEFCX1NJWkUsXG4gICAgICAgICAgcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gTWF0aC5tYXgoXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBzZWxlY3Rpb25FbmQgLSBUQUJfU0laRSAqIHJlbW92ZWRUYWJzLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbmRlY2VzIG9mIHN0YXJ0IHBvc2l0aW9ucyBvZiBzZWxlY3RlZCBsaW5lcywgaW4gcmV2ZXJzZSBvcmRlclxuICAgKi9cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9ICgpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kLCB2YWx1ZSB9ID0gZWRpdGFibGU7XG5cbiAgICAvLyBjaGFycyBiZWZvcmUgc2VsZWN0aW9uU3RhcnQgb24gdGhlIHNhbWUgbGluZVxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pIVswXVxuICAgICAgLmxlbmd0aDtcbiAgICAvLyBwdXQgY2FyZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB2YWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSA9PlxuICAgICAgICAgIHN0YXJ0SW5kaWNlcy5jb25jYXQoXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICAgICAgPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgICAgICAgICAgICBzdGFydEluZGljZXNbaWR4IC0gMV0gKyBsaW5lc1tpZHggLSAxXS5sZW5ndGggKyAxXG4gICAgICAgICAgICAgIDogLy8gZmlyc3Qgc2VsZWN0ZWQgbGluZVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICksXG4gICAgICAgIFtdIGFzIG51bWJlcltdLFxuICAgICAgKVxuICAgICAgLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfTtcblxuICAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcbiAgbGV0IHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gZmFsc2U7XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICBlbGVtZW50LmlkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuICAgICAgaWYgKGVkaXRhYmxlLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IFtdKS5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBjb250YWluZXIuYm91bmRFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgICAgICAgKGVsZSkgPT5cbiAgICAgICAgICAgICAgIWlzVGV4dEVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZWxlIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uU3VibWl0KHtcbiAgICAgIHRleHQsXG4gICAgICB2aWFLZXlib2FyZDogc3VibWl0dGVkVmlhS2V5Ym9hcmQsXG4gICAgICBvcmlnaW5hbFRleHQ6IGVkaXRhYmxlLnZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgZXZlbnRzIHRvIGVuc3VyZSB0aGV5IGRvbid0IGxhdGUtZmlyZVxuICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IG51bGw7XG4gICAgZWRpdGFibGUub25rZXlkb3duID0gbnVsbDtcblxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG5cbiAgICB1bmJpbmRVcGRhdGUoKTtcblxuICAgIGVkaXRhYmxlLnJlbW92ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGJpbmRCbHVyRXZlbnQgPSAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgLy8gRGVmZXJyZWQgc28gdGhhdCB0aGUgcG9pbnRlcmRvd24gdGhhdCBpbml0aWF0ZXMgdGhlIHd5c2l3eWcgZG9lc24ndFxuICAgIC8vIHRyaWdnZXIgdGhlIGJsdXIgb24gZW5zdWluZyBwb2ludGVydXAuXG4gICAgLy8gQWxzbyB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcyBwaWNraW5nIGEgY29sb3Igd2hpY2ggd291bGQgdHJpZ2dlciBhIGJsdXJcbiAgICAvLyBpbiB0aGF0IHNhbWUgdGljay5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudD8udGFyZ2V0O1xuXG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICB0YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KHRhcmdldCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IGhhbmRsZVN1Ym1pdDtcbiAgICAgIGlmICh0YXJnZXQgJiYgaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICB0YXJnZXQub25ibHVyID0gKCkgPT4ge1xuICAgICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBjYXNlOiBjbGlja2luZyBvbiB0aGUgc2FtZSBwcm9wZXJ0eSDihpIgbm8gY2hhbmdlIOKGkiBubyB1cGRhdGUg4oaSIG5vIGZvY3VzXG4gICAgICBpZiAoIWlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBwcmV2ZW50IGJsdXIgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1lbnVcbiAgY29uc3Qgb25Qb2ludGVyRG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIGlmIChcbiAgICAgICgoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgJiZcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke0NMQVNTRVMuU0hBUEVfQUNUSU9OU19NRU5VfWApICYmXG4gICAgICAgICFpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB8fFxuICAgICAgaXNUYXJnZXRDb2xvclBpY2tlclxuICAgICkge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgICAgLy8gaGFuZGxlIGVkZ2UtY2FzZSB3aGVyZSBwb2ludGVydXAgZG9lc24ndCBmaXJlIGUuZy4gZHVlIHRvIHVzZXJcbiAgICAgIC8vIGFsdC10YWJiaW5nIGF3YXlcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBoYW5kbGUgdXBkYXRlcyBvZiB0ZXh0RWxlbWVudCBwcm9wZXJ0aWVzIG9mIGVkaXRpbmcgZWxlbWVudFxuICBjb25zdCB1bmJpbmRVcGRhdGUgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuYWRkQ2FsbGJhY2soKCkgPT4ge1xuICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIGNvbnN0IGlzQ29sb3JQaWNrZXJBY3RpdmUgPSAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoXG4gICAgICBcIi5jb2xvci1waWNrZXItaW5wdXRcIixcbiAgICApO1xuICAgIGlmICghaXNDb2xvclBpY2tlckFjdGl2ZSkge1xuICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNlbGVjdCBvbiBpbml0IChmb2N1c2luZyBpcyBkb25lIHNlcGFyYXRlbHkgaW5zaWRlIHRoZSBiaW5kQmx1ckV2ZW50KClcbiAgLy8gYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGhhcHBlbiAqYWZ0ZXIqIHRoZSBibHVyIGV2ZW50IGZyb20gYHBvaW50ZXJkb3duYClcbiAgZWRpdGFibGUuc2VsZWN0KCk7XG4gIGJpbmRCbHVyRXZlbnQoKTtcblxuICAvLyByZXBvc2l0aW9uIHd5c2l3eWcgaW4gY2FzZSBvZiBjYW52YXMgaXMgcmVzaXplZC4gVXNpbmcgUmVzaXplT2JzZXJ2ZXJcbiAgLy8gaXMgcHJlZmVycmVkIHNvIHdlIGNhdGNoIGNoYW5nZXMgZnJvbSBob3N0LCB3aGVyZSB3aW5kb3cgbWF5IG5vdCByZXNpemUuXG4gIGxldCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgaWYgKGNhbnZhcyAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY2FudmFzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlOiB0cnVlLFxuICB9KTtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lclxuICAgID8ucXVlcnlTZWxlY3RvcihcIi5leGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIikhXG4gICAgLmFwcGVuZENoaWxkKGVkaXRhYmxlKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
2554
2554
 
2555
2555
  /***/ }),
2556
2556
 
@@ -3111,7 +3111,7 @@ module.exports = JSON.parse('{"ar-SA":88,"bg-BG":62,"bn-BD":0,"ca-ES":97,"cs-CZ"
3111
3111
  /***/ ((module) => {
3112
3112
 
3113
3113
  "use strict";
3114
- module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-fixjumpingtext-3","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.16.7","@babel/plugin-transform-arrow-functions":"7.16.7","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.8","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.7","@babel/preset-react":"7.16.7","@babel/preset-typescript":"7.16.7","autoprefixer":"10.4.2","babel-loader":"8.2.3","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"6.5.1","mini-css-extract-plugin":"2.4.6","postcss-loader":"6.2.1","sass-loader":"12.4.0","terser-webpack-plugin":"5.3.0","ts-loader":"9.2.6","typescript":"4.5.4","webpack":"5.65.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1","webpack-dev-server":"4.7.3","webpack-merge":"5.8.0"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack","start":"webpack serve --config webpack.dev-server.config.js "},"dependencies":{"dotenv":"10.0.0"}}');
3114
+ module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-fixjumpingtext-4","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.16.7","@babel/plugin-transform-arrow-functions":"7.16.7","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.8","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.7","@babel/preset-react":"7.16.7","@babel/preset-typescript":"7.16.7","autoprefixer":"10.4.2","babel-loader":"8.2.3","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"6.5.1","mini-css-extract-plugin":"2.4.6","postcss-loader":"6.2.1","sass-loader":"12.4.0","terser-webpack-plugin":"5.3.0","ts-loader":"9.2.6","typescript":"4.5.4","webpack":"5.65.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1","webpack-dev-server":"4.7.3","webpack-merge":"5.8.0"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack","start":"webpack serve --config webpack.dev-server.config.js "},"dependencies":{"dotenv":"10.0.0"}}');
3115
3115
 
3116
3116
  /***/ })
3117
3117