@zsviczian/excalidraw 0.10.0-obsidian-42 → 0.10.0-obsidian-43

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.
@@ -1917,7 +1917,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
1917
1917
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1918
1918
 
1919
1919
  "use strict";
1920
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"showFourthFont\\\": () => (/* binding */ showFourthFont),\\n/* harmony export */ \\\"useIsMobile\\\": () => (/* binding */ useIsMobile),\\n/* harmony export */ \\\"useExcalidrawContainer\\\": () => (/* binding */ useExcalidrawContainer),\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! nanoid */ \\\"../../../node_modules/nanoid/index.dev.js\\\");\\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \\\"../../actions/index.ts\\\");\\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \\\"../../actions/actionHistory.tsx\\\");\\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \\\"../../actions/manager.tsx\\\");\\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \\\"../../actions/register.ts\\\");\\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \\\"../../analytics.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \\\"../../clipboard.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \\\"../../data/index.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \\\"../../gesture.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \\\"../../history.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer */ \\\"../../renderer/index.ts\\\");\\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \\\"../../scene/index.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \\\"../../scene/zoom.ts\\\");\\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \\\"../../shapes.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \\\"../../components/ContextMenu.tsx\\\");\\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \\\"../../components/LayerUI.tsx\\\");\\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Stats */ \\\"../../components/Stats.tsx\\\");\\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Toast */ \\\"../../components/Toast.tsx\\\");\\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \\\"../../actions/actionToggleViewMode.tsx\\\");\\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../data/blob */ \\\"../../data/blob.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! lodash.throttle */ \\\"../../../node_modules/lodash.throttle/index.js\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_43__);\\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../data/filesystem */ \\\"../../data/filesystem.ts\\\");\\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_resizeElements__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../element/resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../element/Hyperlink */ \\\"../../element/Hyperlink.tsx\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nlet showFourthFont = false;\\r\\nconst IsMobileContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext(false);\\r\\nconst useIsMobile = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(IsMobileContext);\\r\\n};\\r\\nconst ExcalidrawContainerContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext({\\r\\n container: null,\\r\\n id: null\\r\\n});\\r\\nconst useExcalidrawContainer = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(ExcalidrawContainerContext);\\r\\n};\\r\\nlet didTapTwice = false;\\r\\nlet tappedTwiceTimer = 0;\\r\\nlet cursorX = 0;\\r\\nlet cursorY = 0;\\r\\nlet isHoldingSpace = false;\\r\\nlet isPanning = false;\\r\\nlet isDraggingScrollBar = false;\\r\\nlet currentScrollBars = {\\r\\n horizontal: null,\\r\\n vertical: null\\r\\n};\\r\\nlet touchTimeout = 0;\\r\\nlet invalidateContextMenu = false;\\r\\nlet lastPointerUp = null;\\r\\nconst gesture = {\\r\\n pointers: new Map(),\\r\\n lastCenter: null,\\r\\n initialDistance: null,\\r\\n initialScale: null\\r\\n};\\r\\nclass App extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {\\r\\n constructor(props) {\\r\\n var _a;\\r\\n var _this;\\r\\n super(props);\\r\\n _this = this;\\r\\n _initialiseProps.call(this);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\\r\\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name } = props;\\r\\n this.state = _objectSpread(_objectSpread(_objectSpread({}, defaultAppState), {}, {\\r\\n theme,\\r\\n isLoading: true\\r\\n }, this.getCanvasOffsets()), {}, {\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\\r\\n name,\\r\\n width: window.innerWidth,\\r\\n height: window.innerHeight,\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_50__.nanoid)();\\r\\n if (excalidrawRef) {\\r\\n const readyPromise = \\\"current\\\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\\r\\n const api = {\\r\\n ready: true,\\r\\n readyPromise,\\r\\n updateScene: this.updateScene,\\r\\n addFiles: this.addFiles,\\r\\n resetScene: this.resetScene,\\r\\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\\r\\n history: {\\r\\n clear: this.resetHistory\\r\\n },\\r\\n scrollToContent: this.scrollToContent,\\r\\n zoomToFit: this.zoomToFit,\\r\\n getSceneElements: this.getSceneElements,\\r\\n getAppState: function () {\\r\\n return _this.state;\\r\\n },\\r\\n getFiles: function () {\\r\\n return _this.files;\\r\\n },\\r\\n refresh: this.refresh,\\r\\n importLibrary: this.importLibraryFromUrl,\\r\\n setToastMessage: this.setToastMessage,\\r\\n updateContainerSize: this.updateContainerSize,\\r\\n id: this.id,\\r\\n setLocalFont: this.setLocalFont,\\r\\n selectElements: this.selectElements,\\r\\n sendBackward: this.sendBackward,\\r\\n bringForward: this.bringForward,\\r\\n sendToBack: this.sendToBack,\\r\\n bringToFront: this.bringToFront\\r\\n };\\r\\n if (typeof excalidrawRef === \\\"function\\\") {\\r\\n excalidrawRef(api);\\r\\n }\\r\\n else {\\r\\n excalidrawRef.current = api;\\r\\n }\\r\\n readyPromise.resolve(api);\\r\\n }\\r\\n this.excalidrawContainerValue = {\\r\\n container: this.excalidrawContainerRef.current,\\r\\n id: this.id\\r\\n };\\r\\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__[\\\"default\\\"]();\\r\\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__[\\\"default\\\"](this);\\r\\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__[\\\"default\\\"]();\\r\\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, function () {\\r\\n return _this.state;\\r\\n }, function () {\\r\\n return _this.scene.getElementsIncludingDeleted();\\r\\n }, this);\\r\\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\\r\\n }\\r\\n renderCanvas() {\\r\\n const canvasScale = window.devicePixelRatio;\\r\\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled } = this.state;\\r\\n const canvasWidth = canvasDOMWidth * canvasScale;\\r\\n const canvasHeight = canvasDOMHeight * canvasScale;\\r\\n if (viewModeEnabled) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight,\\r\\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n onDoubleClick: this.handleCanvasDoubleClick,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n render() {\\r\\n var _a, _b;\\r\\n var _this2 = this;\\r\\n const { zenModeEnabled, viewModeEnabled } = this.state;\\r\\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\\r\\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats } = this.props;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"div\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"])(\\\"excalidraw excalidraw-container\\\", {\\r\\n \\\"excalidraw--view-mode\\\": viewModeEnabled,\\r\\n \\\"excalidraw--mobile\\\": this.isMobile\\r\\n }),\\r\\n ref: this.excalidrawContainerRef,\\r\\n onDrop: this.handleAppOnDrop,\\r\\n tabIndex: 0,\\r\\n onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(ExcalidrawContainerContext.Provider, {\\r\\n value: this.excalidrawContainerValue,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsxs)(IsMobileContext.Provider, {\\r\\n value: this.isMobile,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__[\\\"default\\\"], {\\r\\n canvas: this.canvas,\\r\\n appState: this.state,\\r\\n files: this.files,\\r\\n setAppState: this.setAppState,\\r\\n actionManager: this.actionManager,\\r\\n elements: this.scene.getElements(),\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n onLockToggle: this.toggleLock,\\r\\n onPenModeToggle: this.togglePenMode,\\r\\n onInsertElements: function (elements) {\\r\\n return _this2.addElementsFromPasteOrLibrary({\\r\\n elements,\\r\\n position: \\\"center\\\",\\r\\n files: null\\r\\n });\\r\\n },\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n toggleZenMode: this.toggleZenMode,\\r\\n langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code,\\r\\n isCollaborating: this.props.isCollaborating,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderCustomFooter: renderFooter,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \\\"undefined\\\" && zenModeEnabled,\\r\\n showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \\\"undefined\\\" && this.props.UIOptions.canvasActions.theme,\\r\\n libraryReturnUrl: this.props.libraryReturnUrl,\\r\\n UIOptions: this.props.UIOptions,\\r\\n focusContainer: this.focusContainer,\\r\\n library: this.library,\\r\\n id: this.id,\\r\\n onImageAction: this.onImageAction\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-textEditorContainer\\\"\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-contextMenuContainer\\\"\\r\\n }), selectedElement.length === 1 && this.state.showHyperlinkPopup && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.Hyperlink, {\\r\\n element: selectedElement[0],\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n onLinkOpen: this.props.onLinkOpen\\r\\n }, selectedElement[0].id), this.state.showStats && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_38__.Stats, {\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n elements: this.scene.getElements(),\\r\\n onClose: this.toggleStats,\\r\\n renderCustomStats: renderCustomStats\\r\\n }), this.state.toastMessage !== null && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_39__.Toast, {\\r\\n message: this.state.toastMessage,\\r\\n clearToast: this.clearToast\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"main\\\", {\\r\\n children: this.renderCanvas()\\r\\n })]\\r\\n })\\r\\n })\\r\\n });\\r\\n }\\r\\n componentDidMount() {\\r\\n var _this3 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a, _b;\\r\\n _this3.unmounted = false;\\r\\n _this3.excalidrawContainerValue.container = _this3.excalidrawContainerRef.current;\\r\\n if (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n const setState = _this3.setState.bind(_this3);\\r\\n Object.defineProperties(window.h, {\\r\\n state: {\\r\\n configurable: true,\\r\\n get: function () {\\r\\n return _this3.state;\\r\\n }\\r\\n },\\r\\n setState: {\\r\\n configurable: true,\\r\\n value: function () {\\r\\n return _this3.setState(...arguments);\\r\\n }\\r\\n },\\r\\n app: {\\r\\n configurable: true,\\r\\n value: _this3\\r\\n },\\r\\n history: {\\r\\n configurable: true,\\r\\n value: _this3.history\\r\\n }\\r\\n });\\r\\n }\\r\\n _this3.scene.addCallback(_this3.onSceneUpdated);\\r\\n _this3.addEventListeners();\\r\\n if (_this3.excalidrawContainerRef.current) {\\r\\n _this3.focusContainer();\\r\\n }\\r\\n if (\\\"ResizeObserver\\\" in window && ((_a = _this3.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\\r\\n _this3.resizeObserver = new ResizeObserver(function () {\\r\\n // compute isMobile state\\r\\n // ---------------------------------------------------------------------\\r\\n const { width, height } = _this3.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this3.isMobile = width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE; // refresh offsets\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.updateDOMRect();\\r\\n });\\r\\n (_b = _this3.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n else if (window.matchMedia) {\\r\\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\\r\\n const handler = function () {\\r\\n return _this3.isMobile = mediaQuery.matches;\\r\\n };\\r\\n mediaQuery.addListener(handler);\\r\\n _this3.detachIsMobileMqHandler = function () {\\r\\n return mediaQuery.removeListener(handler);\\r\\n };\\r\\n }\\r\\n const searchParams = new URLSearchParams(window.location.search.slice(1));\\r\\n if (searchParams.has(\\\"web-share-target\\\")) {\\r\\n // Obtain a file that was shared via the Web Share Target API.\\r\\n _this3.restoreFileFromShare();\\r\\n }\\r\\n else {\\r\\n _this3.updateDOMRect(_this3.initializeScene);\\r\\n }\\r\\n })();\\r\\n }\\r\\n componentWillUnmount() {\\r\\n var _a;\\r\\n this.files = {};\\r\\n this.imageCache.clear();\\r\\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\\r\\n this.unmounted = true;\\r\\n this.removeEventListeners();\\r\\n this.scene.destroy();\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n }\\r\\n removeEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n (_d = this.detachIsMobileMqHandler) === null || _d === void 0 ? void 0 : _d.call(this);\\r\\n }\\r\\n addEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n this.removeEventListeners();\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n if (this.props.handleKeyboardGlobally) {\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, {\\r\\n passive: true\\r\\n });\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition); // rerender text elements on font load to fix #637 && #1553\\r\\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \\\"loadingdone\\\", this.onFontLoaded); // Safari-only desktop pinch zoom\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n if (this.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n if (this.props.detectScroll) {\\r\\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\\r\\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n }\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n }\\r\\n componentDidUpdate(prevProps, prevState) {\\r\\n var _a, _b, _c;\\r\\n var _this4 = this;\\r\\n // Hide hyperlink popup if shown when element type is not selection\\r\\n if (prevState.elementType === \\\"selection\\\" && this.state.elementType !== \\\"selection\\\" && this.state.showHyperlinkPopup) {\\r\\n this.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n if (prevProps.langCode !== this.props.langCode) {\\r\\n this.updateLanguage();\\r\\n }\\r\\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\\r\\n this.setState({\\r\\n viewModeEnabled: !!this.props.viewModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\\r\\n this.addEventListeners();\\r\\n this.deselectElements();\\r\\n }\\r\\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\\r\\n this.setState({\\r\\n zenModeEnabled: !!this.props.zenModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevProps.theme !== this.props.theme && this.props.theme) {\\r\\n this.setState({\\r\\n theme: this.props.theme\\r\\n });\\r\\n }\\r\\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\\r\\n this.setState({\\r\\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null\\r\\n });\\r\\n }\\r\\n if (this.props.name && prevProps.name !== this.props.name) {\\r\\n this.setState({\\r\\n name: this.props.name\\r\\n });\\r\\n }\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\\\"theme--dark\\\", this.state.theme === \\\"dark\\\");\\r\\n if (this.state.editingLinearElement && !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\\r\\n // defer so that the commitToHistory flag isn't reset via current update\\r\\n setTimeout(function () {\\r\\n _this4.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n const { multiElement } = prevState;\\r\\n if (prevState.elementType !== this.state.elementType && multiElement != null && (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\\r\\n }\\r\\n const cursorButton = {};\\r\\n const pointerViewportCoords = {};\\r\\n const remoteSelectedElementIds = {};\\r\\n const pointerUsernames = {};\\r\\n const pointerUserStates = {};\\r\\n this.state.collaborators.forEach(function (user, socketId) {\\r\\n if (user.selectedElementIds) {\\r\\n for (const id of Object.keys(user.selectedElementIds)) {\\r\\n if (!(id in remoteSelectedElementIds)) {\\r\\n remoteSelectedElementIds[id] = [];\\r\\n }\\r\\n remoteSelectedElementIds[id].push(socketId);\\r\\n }\\r\\n }\\r\\n if (!user.pointer) {\\r\\n return;\\r\\n }\\r\\n if (user.username) {\\r\\n pointerUsernames[socketId] = user.username;\\r\\n }\\r\\n if (user.userState) {\\r\\n pointerUserStates[socketId] = user.userState;\\r\\n }\\r\\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: user.pointer.x,\\r\\n sceneY: user.pointer.y\\r\\n }, _this4.state);\\r\\n cursorButton[socketId] = user.button;\\r\\n });\\r\\n const renderingElements = this.scene.getElements().filter(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(element)) {\\r\\n if ( // not placed on canvas yet (but in elements array)\\r\\n _this4.state.pendingImageElement && element.id === _this4.state.pendingImageElement.id) {\\r\\n return false;\\r\\n }\\r\\n } // don't render text element that's being currently edited (it's\\r\\n // rendered on remote only)\\r\\n return !_this4.state.editingElement || _this4.state.editingElement.type !== \\\"text\\\" || element.id !== _this4.state.editingElement.id;\\r\\n });\\r\\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_29__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\\r\\n scrollX: this.state.scrollX,\\r\\n scrollY: this.state.scrollY,\\r\\n viewBackgroundColor: this.state.viewBackgroundColor,\\r\\n zoom: this.state.zoom,\\r\\n remotePointerViewportCoords: pointerViewportCoords,\\r\\n remotePointerButton: cursorButton,\\r\\n remoteSelectedElementIds,\\r\\n remotePointerUsernames: pointerUsernames,\\r\\n remotePointerUserStates: pointerUserStates,\\r\\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\\r\\n theme: this.state.theme,\\r\\n imageCache: this.imageCache,\\r\\n isExporting: false,\\r\\n renderScrollbars: !this.isMobile\\r\\n });\\r\\n if (scrollBars) {\\r\\n currentScrollBars = scrollBars;\\r\\n }\\r\\n const scrolledOutside = // hide when editing text\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(this.state.editingElement) ? false : !atLeastOneVisibleElement && renderingElements.length > 0;\\r\\n if (this.state.scrolledOutside !== scrolledOutside) {\\r\\n this.setState({\\r\\n scrolledOutside\\r\\n });\\r\\n }\\r\\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\\r\\n this.scheduleImageRefresh(); // Do not notify consumers if we're still loading the scene. Among other\\r\\n // potential issues, this fixes a case where the tab isn't focused during\\r\\n // init, which would trigger onChange with empty elements, which would then\\r\\n // override whatever is in localStorage currently.\\r\\n if (!this.state.isLoading) {\\r\\n (_c = (_b = this.props).onChange) === null || _c === void 0 ? void 0 : _c.call(_b, this.scene.getElementsIncludingDeleted(), this.state, this.files);\\r\\n }\\r\\n }\\r\\n static resetTapTwice() {\\r\\n didTapTwice = false;\\r\\n }\\r\\n addTextFromPaste(text) {\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, this.state);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x,\\r\\n y,\\r\\n strokeColor: this.state.currentItemStrokeColor,\\r\\n backgroundColor: this.state.currentItemBackgroundColor,\\r\\n fillStyle: this.state.currentItemFillStyle,\\r\\n strokeWidth: this.state.currentItemStrokeWidth,\\r\\n strokeStyle: this.state.currentItemStrokeStyle,\\r\\n roughness: this.state.currentItemRoughness,\\r\\n opacity: this.state.currentItemOpacity,\\r\\n strokeSharpness: this.state.currentItemStrokeSharpness,\\r\\n text,\\r\\n rawText: text,\\r\\n fontSize: this.state.currentItemFontSize,\\r\\n fontFamily: this.state.currentItemFontFamily,\\r\\n textAlign: this.state.currentItemTextAlign,\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted(), element]);\\r\\n this.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n });\\r\\n this.history.resumeRecording();\\r\\n } // Collaboration\\r\\n selectShapeTool(elementType) {\\r\\n if (!isHoldingSpace) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, elementType);\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\\r\\n this.focusContainer();\\r\\n }\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(elementType)) {\\r\\n this.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n if (elementType === \\\"image\\\") {\\r\\n this.onImageAction();\\r\\n }\\r\\n if (elementType !== \\\"selection\\\") {\\r\\n this.setState({\\r\\n elementType,\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n else {\\r\\n this.setState({\\r\\n elementType\\r\\n });\\r\\n }\\r\\n }\\r\\n handleTextWysiwyg(element, _ref) {\\r\\n var _this5 = this;\\r\\n let { isExistingElement = false } = _ref;\\r\\n const updateElement = function (text, originalText, isDeleted, rawText, link) {\\r\\n _this5.scene.replaceAllElements([..._this5.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted,\\r\\n originalText,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText,\\r\\n link\\r\\n });\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n };\\r\\n if (isExistingElement && this.props.onBeforeTextEdit) {\\r\\n const text = this.props.onBeforeTextEdit(element);\\r\\n if (text) {\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted: false,\\r\\n originalText: text\\r\\n });\\r\\n return element;\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n }\\r\\n }\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\\r\\n id: element.id,\\r\\n canvas: this.canvas,\\r\\n getViewportCoords: function (x, y) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n }, _this5.state);\\r\\n return [viewportX - _this5.state.offsetLeft, viewportY - _this5.state.offsetTop];\\r\\n },\\r\\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (text) {\\r\\n updateElement(text, text, false);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\\r\\n }\\r\\n }),\\r\\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (_ref2) {\\r\\n let { text, viaKeyboard, originalText } = _ref2;\\r\\n const isDeleted = !text.trim();\\r\\n const rawText = originalText; //should this be originalText??\\r\\n let link = undefined;\\r\\n if (_this5.props.onBeforeTextSubmit) {\\r\\n const [updatedText, updatedOriginalText, l] = _this5.props.onBeforeTextSubmit(element, text, originalText, isDeleted);\\r\\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\\r\\n originalText = updatedOriginalText !== null && updatedOriginalText !== void 0 ? updatedOriginalText : originalText;\\r\\n link = l;\\r\\n }\\r\\n updateElement(text, originalText, isDeleted, rawText, link); // select the created text element only if submitting via keyboard\\r\\n // (when submitting via click it should act as signal to deselect)\\r\\n if (!isDeleted && viaKeyboard) {\\r\\n const elementIdToSelect = element.containerId ? element.containerId : element.id;\\r\\n _this5.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [elementIdToSelect]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isDeleted) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(_this5.scene.getElements(), [element]);\\r\\n }\\r\\n if (!isDeleted || isExistingElement) {\\r\\n _this5.history.resumeRecording();\\r\\n }\\r\\n _this5.setState({\\r\\n draggingElement: null,\\r\\n editingElement: null\\r\\n });\\r\\n if (_this5.state.elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this5.canvas, _this5.state.elementType);\\r\\n }\\r\\n _this5.focusContainer();\\r\\n }),\\r\\n element,\\r\\n excalidrawContainer: this.excalidrawContainerRef.current,\\r\\n app: this\\r\\n }); // deselect all other elements when inserting text\\r\\n this.deselectElements(); // do an initial update to re-initialize element position since we were\\r\\n // modifying element's x/y for sake of editor (case: syncing to remote)\\r\\n updateElement(element.text, element.originalText, false);\\r\\n }\\r\\n deselectElements() {\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n getTextElementAtPosition(x, y) {\\r\\n const element = this.getElementAtPosition(x, y, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\\r\\n return element;\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementAtPosition(x, y, opts) {\\r\\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement);\\r\\n if (allHitElements.length > 1) {\\r\\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\\r\\n for (let index = allHitElements.length - 1; index > -1; index--) {\\r\\n if (this.state.selectedElementIds[allHitElements[index].id]) {\\r\\n return allHitElements[index];\\r\\n }\\r\\n }\\r\\n }\\r\\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1]; // If we're hitting element with highest z-index only on its bounding box\\r\\n // while also hitting other element figure, the latter should be considered.\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y) ? allHitElements[allHitElements.length - 2] : elementWithHighestZIndex;\\r\\n }\\r\\n if (allHitElements.length === 1) {\\r\\n return allHitElements[0];\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementsAtPosition(x, y) {\\r\\n var _this6 = this;\\r\\n let includeBoundTextElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\r\\n const elements = includeBoundTextElement ? this.scene.getElements() : this.scene.getElements().filter(function (element) {\\r\\n return !((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && element.containerId);\\r\\n });\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(elements, function (element) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, _this6.state, x, y);\\r\\n });\\r\\n }\\r\\n maybeCleanupAfterMissingPointerUp(event) {\\r\\n if (lastPointerUp !== null) {\\r\\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\\r\\n // this can happen when a contextual menu or alert is triggered. In order to avoid\\r\\n // being in a weird state, we clean up on the next pointerdown\\r\\n lastPointerUp(event);\\r\\n }\\r\\n } // Returns whether the event is a panning\\r\\n updateGestureOnPointerDown(event) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n if (gesture.pointers.size === 2) {\\r\\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n gesture.initialScale = this.state.zoom.value;\\r\\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n }\\r\\n }\\r\\n initialPointerDownState(event) {\\r\\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return {\\r\\n origin,\\r\\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\\r\\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\\r\\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\\r\\n // we need to duplicate because we'll be updating this state\\r\\n lastCoords: _objectSpread({}, origin),\\r\\n originalElements: this.scene.getElements().reduce(function (acc, element) {\\r\\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\\r\\n return acc;\\r\\n }, new Map()),\\r\\n resize: {\\r\\n handleType: false,\\r\\n isResizing: false,\\r\\n offset: {\\r\\n x: 0,\\r\\n y: 0\\r\\n },\\r\\n arrowDirection: \\\"origin\\\",\\r\\n center: {\\r\\n x: (maxX + minX) / 2,\\r\\n y: (maxY + minY) / 2\\r\\n }\\r\\n },\\r\\n hit: {\\r\\n element: null,\\r\\n allHitElements: [],\\r\\n wasAddedToSelection: false,\\r\\n hasBeenDuplicated: false,\\r\\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\\r\\n hasHitElementInside: false\\r\\n },\\r\\n drag: {\\r\\n hasOccurred: false,\\r\\n offset: null\\r\\n },\\r\\n eventListeners: {\\r\\n onMove: null,\\r\\n onUp: null,\\r\\n onKeyUp: null,\\r\\n onKeyDown: null\\r\\n },\\r\\n boxSelection: {\\r\\n hasOccurred: false\\r\\n }\\r\\n };\\r\\n } // Returns whether the event is a dragging a scrollbar\\r\\n handleDraggingScrollBar(event, pointerDownState) {\\r\\n var _this7 = this;\\r\\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\\r\\n return false;\\r\\n }\\r\\n isDraggingScrollBar = true;\\r\\n pointerDownState.lastCoords.x = event.clientX;\\r\\n pointerDownState.lastCoords.y = event.clientY;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n _this7.handlePointerMoveOverScrollbars(event, pointerDownState);\\r\\n });\\r\\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isDraggingScrollBar = false;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this7.canvas, _this7.state.elementType);\\r\\n lastPointerUp = null;\\r\\n _this7.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this7.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n });\\r\\n lastPointerUp = onPointerUp;\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n return true;\\r\\n }\\r\\n isASelectedElement(hitElement) {\\r\\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\\r\\n }\\r\\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\\r\\n if (selectedElements.length < 2) {\\r\\n return false;\\r\\n } // How many pixels off the shape boundary we still consider a hit\\r\\n const threshold = 10 / this.state.zoom.value;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return point.x > x1 - threshold && point.x < x2 + threshold && point.y > y1 - threshold && point.y < y2 + threshold;\\r\\n }\\r\\n onKeyDownFromPointerDownHandler(pointerDownState) {\\r\\n var _this8 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (_this8.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this8.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onKeyUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this9 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // Prevents focus from escaping excalidraw tab\\r\\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\\r\\n if (_this9.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this9.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onPointerMoveFromPointerDownHandler(pointerDownState) {\\r\\n var _this10 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a, _b;\\r\\n // We need to initialize dragOffsetXY only after we've updated\\r\\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\\r\\n // event handler should hopefully ensure we're already working with\\r\\n // the updated state.\\r\\n if (pointerDownState.drag.offset === null) {\\r\\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state), pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n }\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n if (_this10.handlePointerMoveOverScrollbars(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this10.state);\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this10.state.gridSize); // for arrows/lines, don't start dragging until a given threshold\\r\\n // to ensure we don't create a 2-point arrow by mistake when\\r\\n // user clicks mouse in a way that it moves a tiny bit (thus\\r\\n // triggering pointermove)\\r\\n if (!pointerDownState.drag.hasOccurred && (_this10.state.elementType === \\\"arrow\\\" || _this10.state.elementType === \\\"line\\\")) {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n if (pointerDownState.resize.isResizing) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n if (_this10.maybeHandleResize(pointerDownState, event)) {\\r\\n return true;\\r\\n }\\r\\n }\\r\\n if (_this10.state.editingLinearElement) {\\r\\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(_this10.state, function (appState) {\\r\\n return _this10.setState(appState);\\r\\n }, pointerCoords.x, pointerCoords.y, function (element, pointsSceneCoords) {\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\\r\\n });\\r\\n if (didDrag) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this10.isASelectedElement(element);\\r\\n });\\r\\n if ((hasHitASelectedElement || pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) && ( // this allows for box-selecting points when clicking inside the\\r\\n // line's bounding box\\r\\n !_this10.state.editingLinearElement || !event.shiftKey) && ( // box-selecting without shift when editing line, not clicking on a line\\r\\n !_this10.state.editingLinearElement || ((_a = _this10.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !== ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) || pointerDownState.hit.hasHitElementInside)) {\\r\\n // Marking that click was used for dragging to check\\r\\n // if elements should be deselected on pointerup\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state); // prevent dragging even if we're no longer holding cmd/ctrl otherwise\\r\\n // it would have weird results (stuff jumping all over the screen)\\r\\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\\r\\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n const [dragDistanceX, dragDistanceY] = [Math.abs(pointerCoords.x - pointerDownState.origin.x), Math.abs(pointerCoords.y - pointerDownState.origin.y)]; // We only drag in one direction if shift is pressed\\r\\n const lockDirection = event.shiftKey;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, _this10.state);\\r\\n _this10.maybeSuggestBindingForAll(selectedElements); // We duplicate the selected element if alt is pressed on pointer move\\r\\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\\r\\n // Move the currently selected elements to the top of the z index stack, and\\r\\n // put the duplicates where the selected elements used to be.\\r\\n // (the origin point where the dragging started)\\r\\n pointerDownState.hit.hasBeenDuplicated = true;\\r\\n const nextElements = [];\\r\\n const elementsToAppend = [];\\r\\n const groupIdMap = new Map();\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const elements = _this10.scene.getElementsIncludingDeleted();\\r\\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this10.state, true).map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n for (const element of elements) {\\r\\n if (selectedElementIds.includes(element.id) || // case: the state.selectedElementIds might not have been\\r\\n // updated yet by the time this mousemove event is fired\\r\\n element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) && pointerDownState.hit.wasAddedToSelection) {\\r\\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this10.state.editingGroupId, groupIdMap, element);\\r\\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\\r\\n x: duplicatedElement.x + (originDragX - dragX),\\r\\n y: duplicatedElement.y + (originDragY - dragY)\\r\\n });\\r\\n nextElements.push(duplicatedElement);\\r\\n elementsToAppend.push(element);\\r\\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\\r\\n }\\r\\n else {\\r\\n nextElements.push(element);\\r\\n }\\r\\n }\\r\\n const nextSceneElements = [...nextElements, ...elementsToAppend];\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \\\"duplicatesServeAsOld\\\");\\r\\n _this10.scene.replaceAllElements(nextSceneElements);\\r\\n }\\r\\n return;\\r\\n }\\r\\n } // It is very important to read this.state within each move event,\\r\\n // otherwise we would read a stale one!\\r\\n const draggingElement = _this10.state.draggingElement;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"freedraw\\\") {\\r\\n const points = draggingElement.points;\\r\\n const dx = pointerCoords.x - draggingElement.x;\\r\\n const dy = pointerCoords.y - draggingElement.y;\\r\\n const pressures = draggingElement.simulatePressure ? draggingElement.pressures : [...draggingElement.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const points = draggingElement.points;\\r\\n let dx = gridX - draggingElement.x;\\r\\n let dy = gridY - draggingElement.y;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\\r\\n ({\\r\\n width: dx,\\r\\n height: dy\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(_this10.state.elementType, dx, dy));\\r\\n }\\r\\n if (points.length === 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]]\\r\\n });\\r\\n }\\r\\n else if (points.length > 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points.slice(0, -1), [dx, dy]]\\r\\n });\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n // When creating a linear element by dragging\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], _this10.state.startBoundElement);\\r\\n }\\r\\n }\\r\\n else {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n _this10.maybeDragNewGenericElement(pointerDownState, event);\\r\\n }\\r\\n if (_this10.state.elementType === \\\"selection\\\") {\\r\\n pointerDownState.boxSelection.hasOccurred = true;\\r\\n const elements = _this10.scene.getElements();\\r\\n if (!event.shiftKey && // allows for box-selecting points (without shift)\\r\\n !_this10.state.editingLinearElement && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, _this10.state)) {\\r\\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [pointerDownState.hit.element.id]: true\\r\\n }\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this10.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n } // box-select line editor points\\r\\n if (_this10.state.editingLinearElement) {\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handleBoxSelection(event, _this10.state, _this10.setState.bind(_this10)); // regular box-select\\r\\n }\\r\\n else {\\r\\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread(_objectSpread({}, prevState.selectedElementIds), elementsWithinSelection.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})), pointerDownState.hit.element ? {\\r\\n // if using ctrl/cmd, select the hitElement only if we\\r\\n // haven't box-selected anything else\\r\\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length\\r\\n } : null),\\r\\n showHyperlinkPopup: elementsWithinSelection.length === 1 && elementsWithinSelection[0].link ? \\\"info\\\" : false\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n } // Returns whether the pointer move happened over either scrollbar\\r\\n handlePointerMoveOverScrollbars(event, pointerDownState) {\\r\\n if (pointerDownState.scrollbars.isOverHorizontal) {\\r\\n const x = event.clientX;\\r\\n const dx = x - pointerDownState.lastCoords.x;\\r\\n this.setState({\\r\\n scrollX: this.state.scrollX - dx / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.x = x;\\r\\n return true;\\r\\n }\\r\\n if (pointerDownState.scrollbars.isOverVertical) {\\r\\n const y = event.clientY;\\r\\n const dy = y - pointerDownState.lastCoords.y;\\r\\n this.setState({\\r\\n scrollY: this.state.scrollY - dy / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.y = y;\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n }\\r\\n onPointerUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this11 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (childEvent) {\\r\\n var _a, _b;\\r\\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating } = _this11.state;\\r\\n _this11.setState({\\r\\n isResizing: false,\\r\\n isRotating: false,\\r\\n resizingElement: null,\\r\\n selectionElement: null,\\r\\n cursorButton: \\\"up\\\",\\r\\n // text elements are reset on finalize, and resetting on pointerup\\r\\n // may cause issues with double taps\\r\\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this11.state.editingElement) ? _this11.state.editingElement : null\\r\\n });\\r\\n _this11.savePointer(childEvent.clientX, childEvent.clientY, \\\"up\\\"); // Handle end of dragging a point of a linear element, might close a loop\\r\\n // and sets binding element\\r\\n if (_this11.state.editingLinearElement) {\\r\\n if (!pointerDownState.boxSelection.hasOccurred && (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !== _this11.state.editingLinearElement.elementId || !pointerDownState.hit.hasHitElementInside)) {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n else {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, _this11.state.editingLinearElement, _this11.state);\\r\\n if (editingLinearElement !== _this11.state.editingLinearElement) {\\r\\n _this11.setState({\\r\\n editingLinearElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n lastPointerUp = null;\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\\r\\n if (_this11.state.pendingImageElement) {\\r\\n _this11.setState({\\r\\n pendingImageElement: null\\r\\n });\\r\\n }\\r\\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \\\"freedraw\\\") {\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n const points = draggingElement.points;\\r\\n let dx = pointerCoords.x - draggingElement.x;\\r\\n let dy = pointerCoords.y - draggingElement.y; // Allows dots to avoid being flagged as infinitely small\\r\\n if (dx === points[0][0] && dy === points[0][1]) {\\r\\n dy += 0.0001;\\r\\n dx += 0.0001;\\r\\n }\\r\\n const pressures = draggingElement.simulatePressure ? [] : [...draggingElement.pressures, childEvent.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures,\\r\\n lastCommittedPoint: [dx, dy]\\r\\n });\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement)) {\\r\\n const imageElement = draggingElement;\\r\\n try {\\r\\n _this11.initializeImageDimensions(imageElement);\\r\\n _this11.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== imageElement.id;\\r\\n }));\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n if (draggingElement.points.length > 1) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n if (!pointerDownState.drag.hasOccurred && draggingElement && !multiElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...draggingElement.points, [pointerCoords.x - draggingElement.x, pointerCoords.y - draggingElement.y]]\\r\\n });\\r\\n _this11.setState({\\r\\n multiElement: draggingElement,\\r\\n editingElement: _this11.state.draggingElement\\r\\n });\\r\\n }\\r\\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, _this11.state, _this11.scene, pointerCoords);\\r\\n }\\r\\n _this11.setState({\\r\\n suggestedBindings: [],\\r\\n startBoundElement: null\\r\\n });\\r\\n if (!elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n elementType: \\\"selection\\\",\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" && draggingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\\r\\n // remove invisible element which was added in onPointerDown\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().slice(0, -1));\\r\\n _this11.setState({\\r\\n draggingElement: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (draggingElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\\r\\n }\\r\\n if (resizingElement) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== resizingElement.id;\\r\\n }));\\r\\n } // Code below handles selection when element(s) weren't\\r\\n // drag or added to selection on pointer down phase.\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n if (hitElement && !pointerDownState.drag.hasOccurred && !pointerDownState.hit.wasAddedToSelection && ( // if we're editing a line, pointerup shouldn't switch selection if\\r\\n // box selected\\r\\n !_this11.state.editingLinearElement || !pointerDownState.boxSelection.hasOccurred)) {\\r\\n // when inside line editor, shift selects points instead\\r\\n if (childEvent.shiftKey && !_this11.state.editingLinearElement) {\\r\\n if (_this11.state.selectedElementIds[hitElement.id]) {\\r\\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(_this11.state, hitElement)) {\\r\\n // We want to unselect all groups hitElement is part of\\r\\n // as well as all elements that are part of the groups\\r\\n // hitElement is part of\\r\\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds.flatMap(function (groupId) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(_this11.scene.getElements(), groupId);\\r\\n }).map(function (element) {\\r\\n return {\\r\\n [element.id]: false\\r\\n };\\r\\n }).reduce(function (prevId, acc) {\\r\\n return _objectSpread(_objectSpread({}, prevId), acc);\\r\\n }, {});\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedGroupIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), hitElement.groupIds.map(function (gId) {\\r\\n return {\\r\\n [gId]: false\\r\\n };\\r\\n }).reduce(function (prev, acc) {\\r\\n return _objectSpread(_objectSpread({}, prev), acc);\\r\\n }, {})),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups)\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n // remove element from selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: false\\r\\n })\\r\\n }), _this11.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n // add element to selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return _objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n }\\r\\n }), _this11.scene.getElements()));\\r\\n });\\r\\n }\\r\\n }\\r\\n if (!_this11.state.editingLinearElement && !pointerDownState.drag.hasOccurred && !_this11.state.isResizing && (hitElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, _this11.state, pointerDownState.origin.x, pointerDownState.origin.y) || !hitElement && pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements)) {\\r\\n // Deselect selected elements\\r\\n _this11.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\" && draggingElement) {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" || (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(_this11.scene.getElements(), _this11.state)) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\\r\\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this11.scene.getElements(), _this11.state));\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: [],\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n }\\r\\n maybeSuggestBindingForAll(selectedElements) {\\r\\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\\r\\n this.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n }\\r\\n clearSelection(hitElement) {\\r\\n this.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n // Continue editing the same group if the user selected a different\\r\\n // element from it\\r\\n editingGroupId: prevState.editingGroupId && hitElement != null && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId) ? prevState.editingGroupId : null\\r\\n };\\r\\n });\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: this.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\\r\\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(this.scene.getElementsIncludingDeleted().filter(function (element) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element);\\r\\n }), x, y);\\r\\n if (elementClickedInside) {\\r\\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\\r\\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\\r\\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\\r\\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\\r\\n if (isSnappedToCenter) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: elementCenterX,\\r\\n sceneY: elementCenterY\\r\\n }, appState);\\r\\n return {\\r\\n viewportX,\\r\\n viewportY,\\r\\n elementCenterX,\\r\\n elementCenterY\\r\\n };\\r\\n }\\r\\n }\\r\\n }\\r\\n getCanvasOffsets() {\\r\\n var _a;\\r\\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = this.excalidrawContainerRef.current;\\r\\n const { left, top } = excalidrawContainer.getBoundingClientRect();\\r\\n return {\\r\\n offsetLeft: left,\\r\\n offsetTop: top\\r\\n };\\r\\n }\\r\\n return {\\r\\n offsetLeft: 0,\\r\\n offsetTop: 0\\r\\n };\\r\\n }\\r\\n updateLanguage() {\\r\\n var _this12 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find(function (lang) {\\r\\n return lang.code === _this12.props.langCode;\\r\\n }) || _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\\r\\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\\r\\n _this12.setAppState({});\\r\\n })();\\r\\n }\\r\\n} // -----------------------------------------------------------------------------\\r\\n// TEST HOOKS\\r\\n// -----------------------------------------------------------------------------\\r\\nApp.defaultProps = {\\r\\n // needed for tests to pass since we directly render App in many tests\\r\\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS\\r\\n};\\r\\nvar _initialiseProps = function () {\\r\\n var _this13 = this;\\r\\n this.canvas = null;\\r\\n this.rc = null;\\r\\n this.unmounted = false;\\r\\n this.isMobile = false;\\r\\n this.excalidrawContainerRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createRef();\\r\\n this.files = {};\\r\\n this.imageCache = new Map();\\r\\n this.lastPointerDown = null;\\r\\n this.lastPointerUp = null;\\r\\n this.contextMenuOpen = false;\\r\\n this.focusContainer = function () {\\r\\n var _a;\\r\\n if (_this13.props.autoFocus) {\\r\\n (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\\r\\n }\\r\\n };\\r\\n this.getSceneElementsIncludingDeleted = function () {\\r\\n return _this13.scene.getElementsIncludingDeleted();\\r\\n };\\r\\n this.getSceneElements = function () {\\r\\n return _this13.scene.getElements();\\r\\n };\\r\\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (actionResult) {\\r\\n var _a, _b, _c, _d, _e, _f;\\r\\n // Since context menu closes when action triggered so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n if (_this13.unmounted || actionResult === false) {\\r\\n return;\\r\\n }\\r\\n let editingElement = null;\\r\\n if (actionResult.elements) {\\r\\n actionResult.elements.forEach(function (element) {\\r\\n var _a;\\r\\n if (((_a = _this13.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id && _this13.state.editingElement !== element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n editingElement = element;\\r\\n }\\r\\n });\\r\\n _this13.scene.replaceAllElements(actionResult.elements);\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n }\\r\\n if (actionResult.files) {\\r\\n _this13.files = actionResult.replaceFiles ? actionResult.files : _objectSpread(_objectSpread({}, _this13.files), actionResult.files);\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n if (actionResult.appState || editingElement) {\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\\r\\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\\r\\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\\r\\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_12__.THEME.LIGHT;\\r\\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : _this13.state.name;\\r\\n if (typeof _this13.props.viewModeEnabled !== \\\"undefined\\\") {\\r\\n viewModeEnabled = _this13.props.viewModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.zenModeEnabled !== \\\"undefined\\\") {\\r\\n zenModeEnabled = _this13.props.zenModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.gridModeEnabled !== \\\"undefined\\\") {\\r\\n gridSize = _this13.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\\r\\n }\\r\\n if (typeof _this13.props.theme !== \\\"undefined\\\") {\\r\\n theme = _this13.props.theme;\\r\\n }\\r\\n if (typeof _this13.props.name !== \\\"undefined\\\") {\\r\\n name = _this13.props.name;\\r\\n }\\r\\n _this13.setState(function (state) {\\r\\n var _a;\\r\\n // using Object.assign instead of spread to fool TS 4.2.2+ into\\r\\n // regarding the resulting type as not containing undefined\\r\\n // (which the following expression will never contain)\\r\\n return Object.assign(actionResult.appState || {}, {\\r\\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize,\\r\\n theme,\\r\\n name\\r\\n });\\r\\n }, function () {\\r\\n if (actionResult.syncHistory) {\\r\\n _this13.history.setCurrentState(_this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n }\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isHoldingSpace = false;\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n });\\r\\n this.onUnload = function () {\\r\\n _this13.onBlur();\\r\\n };\\r\\n this.disableEvent = function (event) {\\r\\n event.preventDefault();\\r\\n };\\r\\n this.onFontLoaded = function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.onSceneUpdated();\\r\\n };\\r\\n this.importLibraryFromUrl = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (url, token) {\\r\\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary)) {\\r\\n const hash = new URLSearchParams(window.location.hash.slice(1));\\r\\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `#${hash.toString()}`);\\r\\n }\\r\\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary)) {\\r\\n const query = new URLSearchParams(window.location.search);\\r\\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `?${query.toString()}`);\\r\\n }\\r\\n try {\\r\\n const request = yield fetch(decodeURIComponent(url));\\r\\n const blob = yield request.blob();\\r\\n const json = JSON.parse(yield blob.text());\\r\\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_14__.isValidLibrary)(json)) {\\r\\n throw new Error();\\r\\n }\\r\\n if (token === _this13.id || window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.confirmAddLibrary\\\", {\\r\\n numShapes: (json.libraryItems || json.library || []).length\\r\\n }))) {\\r\\n yield _this13.library.importLibrary(blob, \\\"published\\\"); // hack to rerender the library items after import\\r\\n if (_this13.state.isLibraryOpen) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n }\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.errorLoadingLibrary\\\"));\\r\\n console.error(error);\\r\\n }\\r\\n finally {\\r\\n _this13.focusContainer();\\r\\n }\\r\\n });\\r\\n return function (_x, _x2) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.resetHistory = function () {\\r\\n _this13.history.clear();\\r\\n };\\r\\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (opts) {\\r\\n _this13.scene.replaceAllElements([]);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), {}, {\\r\\n isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading,\\r\\n theme: _this13.state.theme\\r\\n });\\r\\n });\\r\\n _this13.resetHistory();\\r\\n });\\r\\n this.initializeScene = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n if (\\\"launchQueue\\\" in window && \\\"LaunchParams\\\" in window) {\\r\\n window.launchQueue.setConsumer(/*#__PURE__*/ function () {\\r\\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (launchParams) {\\r\\n if (!launchParams.files.length) {\\r\\n return;\\r\\n }\\r\\n const fileHandle = launchParams.files[0];\\r\\n const blob = yield fileHandle.getFile();\\r\\n blob.handle = fileHandle;\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(blob, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n });\\r\\n return function (_x3) {\\r\\n return _ref5.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n }\\r\\n if (!_this13.state.isLoading) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n }\\r\\n let initialData = null;\\r\\n try {\\r\\n initialData = (yield _this13.props.initialData) || null;\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\\r\\n _this13.libraryItemsFromStorage = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(initialData.libraryItems, \\\"unpublished\\\");\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n initialData = {\\r\\n appState: {\\r\\n errorMessage: error.message || \\\"Encountered an error during importing or restoring scene data\\\"\\r\\n }\\r\\n };\\r\\n }\\r\\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n elementType: scene.appState.elementType === \\\"image\\\" ? \\\"selection\\\" : scene.appState.elementType,\\r\\n isLoading: false\\r\\n });\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n width: _this13.state.width,\\r\\n height: _this13.state.height,\\r\\n offsetTop: _this13.state.offsetTop,\\r\\n offsetLeft: _this13.state.offsetLeft\\r\\n }), null));\\r\\n }\\r\\n _this13.resetHistory();\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n commitToHistory: true\\r\\n }));\\r\\n const libraryUrl = // current\\r\\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary) || // legacy, kept for compat reasons\\r\\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n if (libraryUrl) {\\r\\n yield _this13.importLibraryFromUrl(libraryUrl);\\r\\n }\\r\\n });\\r\\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n return (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n });\\r\\n _this13.setState({});\\r\\n });\\r\\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n const { offsetTop, offsetLeft } = _this13.getCanvasOffsets();\\r\\n _this13.setState(function (state) {\\r\\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\\r\\n return null;\\r\\n }\\r\\n return {\\r\\n offsetTop,\\r\\n offsetLeft\\r\\n };\\r\\n });\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\\r\\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.cutAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.copyAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.cutAll = function () {\\r\\n _this13.copyAll();\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected);\\r\\n };\\r\\n this.copyAll = function () {\\r\\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.copyToClipboard)(_this13.scene.getElements(), _this13.state, _this13.files);\\r\\n };\\r\\n this.onTapStart = function (event) {\\r\\n if (!didTapTwice) {\\r\\n didTapTwice = true;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\\r\\n return;\\r\\n } // insert text only if we tapped twice with a single finger\\r\\n // event.touches.length === 1 will also prevent inserting text when user's zooming\\r\\n if (didTapTwice && event.touches.length === 1) {\\r\\n const [touch] = event.touches; // @ts-ignore\\r\\n _this13.handleCanvasDoubleClick({\\r\\n clientX: touch.clientX,\\r\\n clientY: touch.clientY\\r\\n });\\r\\n didTapTwice = false;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n }\\r\\n event.preventDefault();\\r\\n if (event.touches.length === 2) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n };\\r\\n this.onTapEnd = function (event) {\\r\\n if (event.touches.length > 0) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n };\\r\\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(/*#__PURE__*/ function () {\\r\\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n // #686\\r\\n const target = document.activeElement;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);\\r\\n if (!isExcalidrawActive) {\\r\\n return;\\r\\n }\\r\\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\\r\\n if ( // if no ClipboardEvent supplied, assume we're pasting via contextMenu\\r\\n // thus these checks don't make sense\\r\\n event && (!(elementUnderCursor instanceof HTMLCanvasElement) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\\r\\n return;\\r\\n } // must be called in the same frame (thus before any awaits) as the paste\\r\\n // event else some browsers (FF...) will clear the clipboardData\\r\\n // (something something security)\\r\\n let file = (_b = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _b === void 0 ? void 0 : _b.files[0];\\r\\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\\r\\n if (!file && data.text) {\\r\\n const string = data.text.trim();\\r\\n if (string.startsWith(\\\"<svg\\\") && string.endsWith(\\\"</svg>\\\")) {\\r\\n // ignore SVG validation/normalization which will be done during image\\r\\n // initialization\\r\\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(string);\\r\\n }\\r\\n } // prefer spreadsheet data over image file (MS Office/Libre Office)\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file) && !data.spreadsheet) {\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (_this13.props.onPaste) {\\r\\n try {\\r\\n if ((yield _this13.props.onPaste(data, event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if (data.errorMessage) {\\r\\n _this13.setState({\\r\\n errorMessage: data.errorMessage\\r\\n });\\r\\n }\\r\\n else if (data.spreadsheet) {\\r\\n _this13.setState({\\r\\n pasteDialog: {\\r\\n data: data.spreadsheet,\\r\\n shown: true\\r\\n }\\r\\n });\\r\\n }\\r\\n else if (data.elements) {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: data.elements,\\r\\n files: data.files || null,\\r\\n position: \\\"cursor\\\"\\r\\n });\\r\\n }\\r\\n else if (data.text) {\\r\\n _this13.addTextFromPaste(data.text);\\r\\n }\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n event === null || event === void 0 ? void 0 : event.preventDefault();\\r\\n });\\r\\n return function (_x4) {\\r\\n return _ref6.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n this.addElementsFromPasteOrLibrary = function (opts) {\\r\\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\\r\\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\\r\\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\\r\\n const clientX = typeof opts.position === \\\"object\\\" ? opts.position.clientX : opts.position === \\\"cursor\\\" ? cursorX : _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = typeof opts.position === \\\"object\\\" ? opts.position.clientY : opts.position === \\\"cursor\\\" ? cursorY : _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const dx = x - elementsCenterX;\\r\\n const dy = y - elementsCenterY;\\r\\n const groupIdMap = new Map();\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, _this13.state.gridSize);\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const newElements = elements.map(function (element) {\\r\\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this13.state.editingGroupId, groupIdMap, element, {\\r\\n x: element.x + gridX - minX,\\r\\n y: element.y + gridY - minY\\r\\n });\\r\\n oldIdToDuplicatedId.set(element.id, newElement.id);\\r\\n return newElement;\\r\\n });\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\\r\\n const nextElements = [..._this13.scene.getElementsIncludingDeleted(), ...newElements];\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\\r\\n if (opts.files) {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), opts.files);\\r\\n }\\r\\n _this13.scene.replaceAllElements(nextElements);\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n isLibraryOpen: false,\\r\\n selectedElementIds: newElements.reduce(function (map, element) {\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(element)) {\\r\\n map[element.id] = true;\\r\\n }\\r\\n return map;\\r\\n }, {}),\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements()), function () {\\r\\n if (opts.files) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n });\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n };\\r\\n this.setAppState = function (obj) {\\r\\n _this13.setState(obj);\\r\\n };\\r\\n this.removePointer = function (event) {\\r\\n _this13.lastPointerUp = event; // remove touch handler for context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\" && touchTimeout) {\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n invalidateContextMenu = false;\\r\\n }\\r\\n gesture.pointers.delete(event.pointerId);\\r\\n };\\r\\n this.toggleLock = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n elementLocked: !prevState.elementLocked,\\r\\n elementType: prevState.elementLocked ? \\\"selection\\\" : prevState.elementType\\r\\n };\\r\\n });\\r\\n };\\r\\n this.togglePenMode = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: !prevState.penMode\\r\\n };\\r\\n });\\r\\n };\\r\\n this.toggleZenMode = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode);\\r\\n };\\r\\n this.toggleStats = function () {\\r\\n if (!_this13.state.showStats) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\\\"dialog\\\", \\\"stats\\\");\\r\\n }\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats);\\r\\n };\\r\\n this.scrollToContent = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n _this13.setState(_objectSpread({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], _this13.state, _this13.canvas)));\\r\\n };\\r\\n this.zoomToFit = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n let maxZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\\r\\n let margin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;\\r\\n if (!target) {\\r\\n target = _this13.scene.getElements();\\r\\n }\\r\\n if (target.length === 0) {\\r\\n maxZoom = 1;\\r\\n }\\r\\n _this13.setState((0,_actions__WEBPACK_IMPORTED_MODULE_5__.zoomToFitElements)(target, _this13.state, false, maxZoom, margin).appState);\\r\\n };\\r\\n this.updateContainerSize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (containers) {\\r\\n containers.forEach(function (el) {\\r\\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.rotate)(el.x + el.width, el.y + el.height, el.x + el.width / 2, el.y + el.height / 2, el.angle);\\r\\n (0,_element_resizeElements__WEBPACK_IMPORTED_MODULE_47__.resizeSingleElement)(el, true, el, \\\"se\\\", true, x, y);\\r\\n });\\r\\n });\\r\\n this.clearToast = function () {\\r\\n _this13.setState({\\r\\n toastMessage: null\\r\\n });\\r\\n };\\r\\n this.setToastMessage = function (toastMessage) {\\r\\n _this13.setState({\\r\\n toastMessage\\r\\n });\\r\\n };\\r\\n this.restoreFileFromShare = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n try {\\r\\n const webShareTargetCache = yield caches.open(\\\"web-share-target\\\");\\r\\n const file = yield webShareTargetCache.match(\\\"shared-file\\\");\\r\\n if (file) {\\r\\n const blob = yield file.blob();\\r\\n _this13.loadFileToCanvas(blob);\\r\\n yield webShareTargetCache.delete(\\\"shared-file\\\");\\r\\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (files) {\\r\\n const filesMap = files.reduce(function (acc, fileData) {\\r\\n acc.set(fileData.id, fileData);\\r\\n return acc;\\r\\n }, new Map());\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), Object.fromEntries(filesMap)); // bump versions for elements that reference added files so that\\r\\n // we/host apps can detect the change, and invalidate the image & shape\\r\\n // cache\\r\\n _this13.scene.getElements().forEach(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && filesMap.has(element.fileId)) {\\r\\n _this13.imageCache.delete(element.fileId);\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.bumpVersion)(element);\\r\\n }\\r\\n });\\r\\n _this13.scene.informMutation();\\r\\n _this13.addNewImagesToImageCache();\\r\\n });\\r\\n this.setLocalFont = function (showOnPanel) {\\r\\n showFourthFont = showOnPanel;\\r\\n };\\r\\n this.selectElements = function (elements) {\\r\\n _this13.updateScene({\\r\\n appState: _objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n editingGroupId: null,\\r\\n selectedElementIds: elements.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})\\r\\n }),\\r\\n commitToHistory: true\\r\\n });\\r\\n };\\r\\n this.bringToFront = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.bringForward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.sendToBack = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.sendBackward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (sceneData) {\\r\\n if (sceneData.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n if (sceneData.appState) {\\r\\n _this13.setState(sceneData.appState);\\r\\n }\\r\\n if (sceneData.elements) {\\r\\n _this13.scene.replaceAllElements(sceneData.elements);\\r\\n }\\r\\n if (sceneData.collaborators) {\\r\\n _this13.setState({\\r\\n collaborators: sceneData.collaborators\\r\\n });\\r\\n }\\r\\n if (sceneData.libraryItems) {\\r\\n _this13.library.saveLibrary((0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(sceneData.libraryItems, \\\"unpublished\\\"));\\r\\n }\\r\\n });\\r\\n this.onSceneUpdated = function () {\\r\\n _this13.setState({});\\r\\n };\\r\\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n cursorX = event.clientX;\\r\\n cursorY = event.clientY;\\r\\n });\\r\\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // normalize `event.key` when CapsLock is pressed #2372\\r\\n if (\\\"Proxy\\\" in window && (!event.shiftKey && /^[A-Z]$/.test(event.key) || event.shiftKey && /^[a-z]$/.test(event.key))) {\\r\\n event = new Proxy(event, {\\r\\n get(ev, prop) {\\r\\n const value = ev[prop];\\r\\n if (typeof value === \\\"function\\\") {\\r\\n // fix for Proxies hijacking `this`\\r\\n return value.bind(ev);\\r\\n }\\r\\n return prop === \\\"key\\\" ? // CapsLock inverts capitalization based on ShiftKey, so invert\\r\\n // it back\\r\\n event.shiftKey ? ev.key.toUpperCase() : ev.key.toLowerCase() : value;\\r\\n }\\r\\n });\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE || // case: using arrows to move between buttons\\r\\n (0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target)) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\\r\\n _this13.setState({\\r\\n showHelpDialog: true\\r\\n });\\r\\n }\\r\\n if (_this13.actionManager.handleKeyDown(event)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && _this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: false\\r\\n });\\r\\n }\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.ZERO) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: !_this13.state.isLibraryOpen\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const step = _this13.state.gridSize && (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT : _this13.state.gridSize) || (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state, true);\\r\\n let offsetX = 0;\\r\\n let offsetY = 0;\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\\r\\n offsetX = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\\r\\n offsetX = step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\\r\\n offsetY = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\\r\\n offsetY = step;\\r\\n }\\r\\n selectedElements.forEach(function (element) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n x: element.x + offsetX,\\r\\n y: element.y + offsetY\\r\\n });\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length === 1 && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n const selectedElement = selectedElements[0];\\r\\n _this13.startTextEditing({\\r\\n sceneX: selectedElement.x + selectedElement.width / 2,\\r\\n sceneY: selectedElement.y + selectedElement.height / 2,\\r\\n shouldBind: true\\r\\n });\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (!event.ctrlKey && !event.altKey && !event.metaKey && _this13.state.draggingElement === null) {\\r\\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\\r\\n if (shape) {\\r\\n _this13.selectShapeTool(shape);\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\\r\\n _this13.toggleLock();\\r\\n }\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\\r\\n isHoldingSpace = true;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n event.preventDefault();\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (_this13.state.elementType === \\\"selection\\\" && !selectedElements.length) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G && ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(_this13.state.elementType) || selectedElements.some(function (element) {\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type);\\r\\n }))) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"backgroundColorPicker\\\"\\r\\n });\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"strokeColorPicker\\\"\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"selection\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n isHoldingSpace = false;\\r\\n }\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this13.state) ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements) : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n gesture.initialScale = _this13.state.zoom.value;\\r\\n });\\r\\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // onGestureChange only has zoom factor but not the center.\\r\\n // If we're on iPad or iPhone, then we recognize multi-touch and will\\r\\n // zoom in at the right location on the touchMove handler already.\\r\\n // On Macbook, we don't have those events so will zoom in at the\\r\\n // current location instead.\\r\\n if (gesture.pointers.size === 2) {\\r\\n return;\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (initialScale) {\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale)\\r\\n }, state));\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n gesture.initialScale = null;\\r\\n });\\r\\n this.startTextEditing = function (_ref8) {\\r\\n var _a, _b;\\r\\n let { sceneX, sceneY, shouldBind, insertAtParentCenter = true } = _ref8;\\r\\n let parentCenterPosition = insertAtParentCenter && _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio); // bind to container when shouldBind is true or\\r\\n // clicked on center of container\\r\\n const container = shouldBind || parentCenterPosition ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(_this13.scene.getElements().filter(function (ele) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(ele);\\r\\n }), sceneX, sceneY) : null;\\r\\n let existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY); // consider bounded text element if container present\\r\\n if (container) {\\r\\n const boundTextElementId = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getBoundTextElementId)(container);\\r\\n if (boundTextElementId) {\\r\\n existingTextElement = _this13.scene.getElement(boundTextElementId);\\r\\n }\\r\\n }\\r\\n if (!existingTextElement && container) {\\r\\n const fontString = {\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily\\r\\n };\\r\\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const newHeight = Math.max(container.height, minHeight);\\r\\n const newWidth = Math.max(container.width, minWidth);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(container, {\\r\\n height: newHeight,\\r\\n width: newWidth\\r\\n });\\r\\n sceneX = container.x + newWidth / 2;\\r\\n sceneY = container.y + newHeight / 2;\\r\\n if (parentCenterPosition) {\\r\\n parentCenterPosition = _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n }\\r\\n }\\r\\n const element = existingTextElement ? existingTextElement : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x: parentCenterPosition ? parentCenterPosition.elementCenterX : sceneX,\\r\\n y: parentCenterPosition ? parentCenterPosition.elementCenterY : sceneY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n text: \\\"\\\",\\r\\n rawText: \\\"\\\",\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily,\\r\\n textAlign: parentCenterPosition ? \\\"center\\\" : _this13.state.currentItemTextAlign,\\r\\n verticalAlign: parentCenterPosition ? \\\"middle\\\" : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\\r\\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\\r\\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : []\\r\\n });\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n if (existingTextElement) {\\r\\n // if text element is no longer centered to a container, reset\\r\\n // verticalAlign to default because it's currently internal-only\\r\\n if (!parentCenterPosition || element.textAlign !== \\\"center\\\") {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]); // case: creating new text not centered to parent elemenent → offset Y\\r\\n // so that the text is centered to cursor position\\r\\n if (!parentCenterPosition) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n y: element.y - element.baseline / 2\\r\\n });\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n _this13.handleTextWysiwyg(element, {\\r\\n isExistingElement: !!existingTextElement\\r\\n });\\r\\n };\\r\\n this.handleCanvasDoubleClick = function (event) {\\r\\n // case: double-clicking with arrow/line tool selected would both create\\r\\n // text and enter multiElement mode\\r\\n if (_this13.state.multiElement) {\\r\\n return;\\r\\n } // we should only be able to double click when mode is selection\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(_this13.state);\\r\\n if (selectedGroupIds.length > 0) {\\r\\n const hitElement = _this13.getElementAtPosition(sceneX, sceneY);\\r\\n const selectedGroupId = hitElement && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, _this13.state.selectedGroupIds);\\r\\n if (selectedGroupId) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n editingGroupId: selectedGroupId,\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n },\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.viewModeEnabled) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n const selectedElement = selectedElements[0];\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(selectedElement);\\r\\n if (canBindText) {\\r\\n sceneX = selectedElement.x + selectedElement.width / 2;\\r\\n sceneY = selectedElement.y + selectedElement.height / 2;\\r\\n }\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n }\\r\\n };\\r\\n this.getElementLinkAtPosition = function (scenePointer, hitElement) {\\r\\n // Reversing so we traverse the elements in decreasing order\\r\\n // of z-index\\r\\n const elements = _this13.scene.getElements().slice().reverse();\\r\\n let hitElementIndex = Infinity;\\r\\n return elements.find(function (element, index) {\\r\\n if (hitElement && element.id === hitElement.id) {\\r\\n hitElementIndex = index;\\r\\n }\\r\\n return element.link && (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(element, _this13.state, [scenePointer.x, scenePointer.y]) && index <= hitElementIndex;\\r\\n });\\r\\n };\\r\\n this.redirectToLink = function (event) {\\r\\n var _a;\\r\\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerDown, _this13.state);\\r\\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerDownCoords.x, lastPointerDownCoords.y]);\\r\\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerUp, _this13.state);\\r\\n const LastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerUpCoords.x, lastPointerUpCoords.y]);\\r\\n if (lastPointerDownHittingLinkIcon && LastPointerUpHittingLinkIcon) {\\r\\n const url = (_a = _this13.hitLinkElement) === null || _a === void 0 ? void 0 : _a.link;\\r\\n if (url) {\\r\\n if (_this13.props.onLinkOpen) {\\r\\n _this13.props.onLinkOpen(url, event);\\r\\n }\\r\\n else {\\r\\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isLocalLink)(url) ? \\\"_self\\\" : \\\"_blank\\\";\\r\\n const newWindow = window.open(undefined, target); // https://mathiasbynens.github.io/rel-noopener/\\r\\n if (newWindow) {\\r\\n newWindow.opener = null;\\r\\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.normalizeLink)(url);\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n };\\r\\n this.attachLinkListener = function () {\\r\\n var _a;\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.addEventListener(\\\"click\\\", _this13.redirectToLink);\\r\\n };\\r\\n this.detachLinkListener = function () {\\r\\n var _a;\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(\\\"click\\\", _this13.redirectToLink);\\r\\n };\\r\\n this.handleCanvasPointerMove = function (event) {\\r\\n _this13.savePointer(event.clientX, event.clientY, _this13.state.cursorButton);\\r\\n if (gesture.pointers.has(event.pointerId)) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (gesture.pointers.size === 2 && gesture.lastCenter && initialScale && gesture.initialDistance) {\\r\\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n const deltaX = center.x - gesture.lastCenter.x;\\r\\n const deltaY = center.y - gesture.lastCenter.y;\\r\\n gesture.lastCenter = center;\\r\\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n const scaleFactor = _this13.state.elementType === \\\"freedraw\\\" && _this13.state.penMode ? 1 : distance / gesture.initialDistance;\\r\\n const nextZoom = scaleFactor ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor) : _this13.state.zoom.value;\\r\\n _this13.setState(function (state) {\\r\\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: center.x,\\r\\n viewportY: center.y,\\r\\n nextZoom\\r\\n }, state);\\r\\n return {\\r\\n zoom: zoomState.zoom,\\r\\n scrollX: zoomState.scrollX + deltaX / nextZoom,\\r\\n scrollY: zoomState.scrollY + deltaY / nextZoom,\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n }\\r\\n else {\\r\\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\\r\\n }\\r\\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\\r\\n return;\\r\\n }\\r\\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - _this13.state.offsetLeft, event.clientY - _this13.state.offsetTop);\\r\\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\\r\\n if (!_this13.state.draggingElement && !_this13.state.multiElement) {\\r\\n if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\\r\\n if (_this13.state.editingLinearElement && !_this13.state.editingLinearElement.isDragging) {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, _this13.state.editingLinearElement, _this13.state.gridSize);\\r\\n if (editingLinearElement !== _this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n editingLinearElement\\r\\n });\\r\\n }\\r\\n if (editingLinearElement.lastUncommittedPoint != null) {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(_this13.state.elementType)) {\\r\\n // Hovering with a selected tool or creating new linear element via click\\r\\n // and point\\r\\n const { draggingElement } = _this13.state;\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n _this13.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], _this13.state.startBoundElement);\\r\\n }\\r\\n else {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n }\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state;\\r\\n const { x: rx, y: ry } = multiElement;\\r\\n const { points, lastCommittedPoint } = multiElement;\\r\\n const lastPoint = points[points.length - 1];\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n if (lastPoint === lastCommittedPoint) {\\r\\n // if we haven't yet created a temp point and we're beyond commit-zone\\r\\n // threshold, add a point\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points, [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER); // in this branch, we're inside the commit zone, and no uncommitted\\r\\n // point exists. Thus do nothing (don't add/remove points).\\r\\n }\\r\\n }\\r\\n else if (points.length > 2 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: points.slice(0, -1)\\r\\n });\\r\\n }\\r\\n else {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, _this13.state.zoom.value)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n } // update last uncommitted point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points.slice(0, -1), [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n const hasDeselectedButton = Boolean(event.buttons);\\r\\n if (hasDeselectedButton || _this13.state.elementType !== \\\"selection\\\" && _this13.state.elementType !== \\\"text\\\") {\\r\\n return;\\r\\n }\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !isOverScrollBar && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType && elementWithTransformHandleType.transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1 && !isOverScrollBar) {\\r\\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType\\r\\n }));\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n _this13.hitLinkElement = _this13.getElementLinkAtPosition(scenePointer, hitElement);\\r\\n if (_this13.hitLinkElement && !_this13.state.selectedElementIds[_this13.hitLinkElement.id]) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.showHyperlinkTooltip)(_this13.hitLinkElement, _this13.state);\\r\\n _this13.attachLinkListener();\\r\\n }\\r\\n else {\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.hideHyperlinkToolip)();\\r\\n _this13.detachLinkListener();\\r\\n if (hitElement && hitElement.link && _this13.state.selectedElementIds[hitElement.id] && !_this13.contextMenuOpen && !_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: \\\"info\\\"\\r\\n });\\r\\n }\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n }\\r\\n else if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getElement(_this13.state.editingLinearElement.elementId);\\r\\n if (element && (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(element, _this13.state, [scenePointer.x, scenePointer.y])) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n else if ( // if using cmd/ctrl, we're not dragging\\r\\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (hitElement || _this13.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleTouchMove = function (event) {\\r\\n invalidateContextMenu = true;\\r\\n };\\r\\n this.handleCanvasPointerDown = function (event) {\\r\\n // remove any active selection when we start to interact with canvas\\r\\n // (mainly, we care about removing selection outside the component which\\r\\n // would prevent our copy handling otherwise)\\r\\n const selection = document.getSelection();\\r\\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n _this13.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\\r\\n _this13.maybeCleanupAfterMissingPointerUp(event); //fires only once, if pen is detected, penMode is enabled\\r\\n //the user can disable this by toggling the penMode button\\r\\n if (!_this13.state.penDetected && event.pointerType === \\\"pen\\\") {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: true,\\r\\n penDetected: true\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n _this13.lastPointerDown = event;\\r\\n _this13.setState({\\r\\n lastPointerDownWith: event.pointerType,\\r\\n cursorButton: \\\"down\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"down\\\");\\r\\n if (_this13.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\\r\\n return;\\r\\n } // only handle left mouse button or touch\\r\\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\\r\\n return;\\r\\n }\\r\\n _this13.updateGestureOnPointerDown(event); // don't select while panning\\r\\n if (gesture.pointers.size > 1) {\\r\\n return;\\r\\n } // State for the duration of a pointer interaction, which starts with a\\r\\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\\r\\n const pointerDownState = _this13.initialPointerDownState(event);\\r\\n if (_this13.handleDraggingScrollBar(event, pointerDownState)) {\\r\\n return;\\r\\n } // Since context menu closes on pointer down so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n _this13.clearSelectionIfNotUsingSelection();\\r\\n _this13.updateBindingEnabledOnPointerMove(event);\\r\\n if (_this13.handleSelectionOnPointerDown(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const allowOnPointerDown = !_this13.state.penMode || event.pointerType !== \\\"touch\\\" || _this13.state.elementType === \\\"selection\\\" || _this13.state.elementType === \\\"text\\\" || _this13.state.elementType === \\\"image\\\";\\r\\n if (!allowOnPointerDown) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n _this13.handleTextOnPointerDown(event, pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"arrow\\\" || _this13.state.elementType === \\\"line\\\") {\\r\\n _this13.handleLinearElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"image\\\") {\\r\\n // reset image preview on pointerdown\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n if (!_this13.state.pendingImageElement) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n draggingElement: _this13.state.pendingImageElement,\\r\\n editingElement: _this13.state.pendingImageElement,\\r\\n pendingImageElement: null,\\r\\n multiElement: null\\r\\n });\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_this13.state.pendingImageElement, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"freedraw\\\") {\\r\\n _this13.handleFreeDrawElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else {\\r\\n _this13.createGenericElementOnPointerDown(_this13.state.elementType, pointerDownState);\\r\\n }\\r\\n const onPointerMove = _this13.onPointerMoveFromPointerDownHandler(pointerDownState);\\r\\n const onPointerUp = _this13.onPointerUpFromPointerDownHandler(pointerDownState);\\r\\n const onKeyDown = _this13.onKeyDownFromPointerDownHandler(pointerDownState);\\r\\n const onKeyUp = _this13.onKeyUpFromPointerDownHandler(pointerDownState);\\r\\n lastPointerUp = onPointerUp;\\r\\n if (!_this13.state.viewModeEnabled) {\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\\r\\n pointerDownState.eventListeners.onMove = onPointerMove;\\r\\n pointerDownState.eventListeners.onUp = onPointerUp;\\r\\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\\r\\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\\r\\n }\\r\\n };\\r\\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = function (event) {\\r\\n // deal with opening context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\") {\\r\\n invalidateContextMenu = false;\\r\\n if (touchTimeout) {\\r\\n // If there's already a touchTimeout, this means that there's another\\r\\n // touch down and we are doing another touch, so we shouldn't open the\\r\\n // context menu.\\r\\n invalidateContextMenu = true;\\r\\n }\\r\\n else {\\r\\n // open the context menu with the first touch's clientX and clientY\\r\\n // if the touch is not moving\\r\\n touchTimeout = window.setTimeout(function () {\\r\\n touchTimeout = 0;\\r\\n if (!invalidateContextMenu) {\\r\\n _this13.handleCanvasContextMenu(event);\\r\\n }\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleCanvasPanUsingWheelOrSpaceDrag = function (event) {\\r\\n if (!(gesture.pointers.size === 0 && (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL || event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace || _this13.state.viewModeEnabled)) || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return false;\\r\\n }\\r\\n isPanning = true;\\r\\n event.preventDefault();\\r\\n let nextPastePrevented = false;\\r\\n const isLinux = /Linux/.test(window.navigator.platform);\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n let { clientX: lastX, clientY: lastY } = event;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const deltaX = lastX - event.clientX;\\r\\n const deltaY = lastY - event.clientY;\\r\\n lastX = event.clientX;\\r\\n lastY = event.clientY;\\r\\n /*\\r\\n * Prevent paste event if we move while middle clicking on Linux.\\r\\n * See issue #1383.\\r\\n */\\r\\n if (isLinux && !nextPastePrevented && (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\\r\\n nextPastePrevented = true;\\r\\n /* Prevent the next paste event */\\r\\n const preventNextPaste = function (event) {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n event.stopPropagation();\\r\\n };\\r\\n /*\\r\\n * Reenable next paste in case of disabled middle click paste for\\r\\n * any reason:\\r\\n * - rigth click paste\\r\\n * - empty clipboard\\r\\n */\\r\\n const enableNextPaste = function () {\\r\\n setTimeout(function () {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }, 100);\\r\\n };\\r\\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }\\r\\n _this13.setState({\\r\\n scrollX: _this13.state.scrollX - deltaX / _this13.state.zoom.value,\\r\\n scrollY: _this13.state.scrollY - deltaY / _this13.state.zoom.value\\r\\n });\\r\\n });\\r\\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(lastPointerUp = function () {\\r\\n lastPointerUp = null;\\r\\n isPanning = false;\\r\\n if (!isHoldingSpace) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\\r\\n passive: true\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n return true;\\r\\n };\\r\\n this.clearSelectionIfNotUsingSelection = function () {\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleSelectionOnPointerDown = function (event, pointerDownState) {\\r\\n var _a;\\r\\n if (_this13.state.elementType === \\\"selection\\\") {\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType != null) {\\r\\n _this13.setState({\\r\\n resizingElement: elementWithTransformHandleType.element\\r\\n });\\r\\n pointerDownState.resize.handleType = elementWithTransformHandleType.transformHandleType;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1) {\\r\\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n }\\r\\n if (pointerDownState.resize.handleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType: pointerDownState.resize.handleType\\r\\n }));\\r\\n pointerDownState.resize.isResizing = true;\\r\\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) && selectedElements[0].points.length === 2) {\\r\\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\\r\\n }\\r\\n }\\r\\n else {\\r\\n if (_this13.state.editingLinearElement) {\\r\\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, _this13.state, function (appState) {\\r\\n return _this13.setState(appState);\\r\\n }, _this13.history, pointerDownState.origin);\\r\\n if (ret.hitElement) {\\r\\n pointerDownState.hit.element = ret.hitElement;\\r\\n }\\r\\n if (ret.didAddPoint) {\\r\\n return true;\\r\\n }\\r\\n } // hitElement may already be set above, so check first\\r\\n pointerDownState.hit.element = (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : _this13.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n if (pointerDownState.hit.element) {\\r\\n // Early return if pointer is hitting link icon\\r\\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y])) {\\r\\n return false;\\r\\n }\\r\\n pointerDownState.hit.hasHitElementInside = (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\\r\\n } // For overlapped elements one position may hit\\r\\n // multiple elements\\r\\n pointerDownState.hit.allHitElements = _this13.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this13.isASelectedElement(element);\\r\\n });\\r\\n if ((hitElement === null || !someHitElementIsSelected) && !event.shiftKey && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.clearSelection(hitElement);\\r\\n }\\r\\n if (_this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [_this13.state.editingLinearElement.elementId]: true\\r\\n }\\r\\n }); // If we click on something\\r\\n }\\r\\n else if (hitElement != null) {\\r\\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return _objectSpread(_objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), {}, {\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }); // mark as not completely handled so as to allow dragging etc.\\r\\n return false;\\r\\n } // deselect if item is selected\\r\\n // if shift is not clicked, this will always return true\\r\\n // otherwise, it will trigger selection based on current\\r\\n // state of the box\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n // if we are currently editing a group, exiting editing mode and deselect the group.\\r\\n if (_this13.state.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, _this13.state.editingGroupId)) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n } // Add hit element to selection. At this point if we're not holding\\r\\n // SHIFT the previously selected element(s) were deselected above\\r\\n // (make sure you use setState updater to use latest state)\\r\\n if (!someHitElementIsSelected && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n }),\\r\\n showHyperlinkPopup: hitElement.link ? \\\"info\\\" : false\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this.handleTextOnPointerDown = function (event, pointerDownState) {\\r\\n // if we're currently still editing text, clicking outside\\r\\n // should only finalize it, not create another (irrespective\\r\\n // of state.elementLocked)\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return;\\r\\n }\\r\\n let sceneX = pointerDownState.origin.x;\\r\\n let sceneY = pointerDownState.origin.y;\\r\\n const element = _this13.getElementAtPosition(sceneX, sceneY, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n if (canBindText) {\\r\\n sceneX = element.x + element.width / 2;\\r\\n sceneY = element.y + element.height / 2;\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!_this13.state.elementLocked) {\\r\\n _this13.setState({\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleFreeDrawElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n // Begin a mark capture. This does not have to update state yet.\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\\r\\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n simulatePressure: event.pressure === 0.5\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n const pressures = element.simulatePressure ? element.pressures : [...element.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [[0, 0]],\\r\\n pressures\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n };\\r\\n this.createImageElement = function (_ref9) {\\r\\n let { sceneX, sceneY } = _ref9;\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(sceneX, sceneY, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newImageElement)({\\r\\n type: \\\"image\\\",\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness\\r\\n });\\r\\n return element;\\r\\n };\\r\\n this.handleLinearElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state; // finalize if completing a loop\\r\\n if (multiElement.type === \\\"line\\\" && (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, _this13.state.zoom.value)) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n const { x: rx, y: ry, lastCommittedPoint } = multiElement; // clicking inside commit zone → finalize arrow\\r\\n if (multiElement.points.length > 1 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [multiElement.id]: true\\r\\n })\\r\\n };\\r\\n }); // clicking outside commit zone → update reference for last committed\\r\\n // point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\\r\\n If so, we want it to be null for start and \\\"arrow\\\" for end. If the linear item is not\\r\\n an arrow, we want it to be null for both. Otherwise, we want it to use the\\r\\n values from appState. */\\r\\n const { currentItemStartArrowhead, currentItemEndArrowhead } = _this13.state;\\r\\n const [startArrowhead, endArrowhead] = elementType === \\\"arrow\\\" ? [currentItemStartArrowhead, currentItemEndArrowhead] : [null, null];\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n startArrowhead,\\r\\n endArrowhead\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [...element.points, [0, 0]]\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n };\\r\\n this.createGenericElementOnPointerDown = function (elementType, pointerDownState) {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness\\r\\n });\\r\\n if (element.type === \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectionElement: element,\\r\\n draggingElement: element\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n multiElement: null,\\r\\n draggingElement: element,\\r\\n editingElement: element\\r\\n });\\r\\n }\\r\\n };\\r\\n this.initializeImage = /*#__PURE__*/ function () {\\r\\n var _ref10 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (_ref11) {\\r\\n var _a, _b, _c, _d;\\r\\n let { imageFile, imageElement: _imageElement, showCursorImagePreview = false } = _ref11;\\r\\n // at this point this should be guaranteed image file, but we do this check\\r\\n // to satisfy TS down the line\\r\\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(imageFile)) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.unsupportedFileType\\\"));\\r\\n }\\r\\n const mimeType = imageFile.type;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, \\\"wait\\\");\\r\\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.normalizeSVG)(yield imageFile.text()), imageFile.name);\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error);\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.svgImageInsertError\\\"));\\r\\n }\\r\\n } // generate image id (by default the file digest) before any\\r\\n // resizing/compression takes place to keep it more portable\\r\\n const fileId = yield ((_b = (_a = _this13.props).generateIdForFile) === null || _b === void 0 ? void 0 : _b.call(_a, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.generateIdFromFile)(imageFile);\\r\\n if (!fileId) {\\r\\n console.warn(\\\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\\\");\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\"));\\r\\n }\\r\\n const existingFileData = _this13.files[fileId];\\r\\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\\r\\n try {\\r\\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error trying to resing image file on insertion\\\", error);\\r\\n }\\r\\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.fileTooBig\\\", {\\r\\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`\\r\\n }));\\r\\n }\\r\\n }\\r\\n if (showCursorImagePreview) {\\r\\n const dataURL = (_c = _this13.files[fileId]) === null || _c === void 0 ? void 0 : _c.dataURL; // optimization so that we don't unnecessarily resize the original\\r\\n // full-size file for cursor preview\\r\\n // (it's much faster to convert the resized dataURL to File)\\r\\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.dataURLToFile)(dataURL);\\r\\n _this13.setImagePreviewCursor(resizedFile || imageFile);\\r\\n }\\r\\n const dataURL = ((_d = _this13.files[fileId]) === null || _d === void 0 ? void 0 : _d.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imageFile));\\r\\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_imageElement, {\\r\\n fileId\\r\\n }, false);\\r\\n return new Promise(/*#__PURE__*/ function () {\\r\\n var _ref12 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (resolve, reject) {\\r\\n var _a, _b;\\r\\n try {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), {}, {\\r\\n [fileId]: {\\r\\n mimeType,\\r\\n id: fileId,\\r\\n dataURL,\\r\\n created: Date.now()\\r\\n }\\r\\n });\\r\\n const cachedImageData = _this13.imageCache.get(fileId);\\r\\n if (!cachedImageData) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n yield _this13.updateImageCache([imageElement]);\\r\\n }\\r\\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\\r\\n yield cachedImageData.image;\\r\\n }\\r\\n if (((_a = _this13.state.pendingImageElement) === null || _a === void 0 ? void 0 : _a.id) !== imageElement.id && ((_b = _this13.state.draggingElement) === null || _b === void 0 ? void 0 : _b.id) !== imageElement.id) {\\r\\n _this13.initializeImageDimensions(imageElement, true);\\r\\n }\\r\\n resolve(imageElement);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")));\\r\\n }\\r\\n finally {\\r\\n if (!showCursorImagePreview) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n }\\r\\n });\\r\\n return function (_x6, _x7) {\\r\\n return _ref12.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n });\\r\\n return function (_x5) {\\r\\n return _ref10.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.insertImageElement = /*#__PURE__*/ function () {\\r\\n var _ref13 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageElement, imageFile, showCursorImagePreview) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), imageElement]);\\r\\n try {\\r\\n yield _this13.initializeImage({\\r\\n imageFile,\\r\\n imageElement,\\r\\n showCursorImagePreview\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n isDeleted: true\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n _this13.setState({\\r\\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x8, _x9, _x10) {\\r\\n return _ref13.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.setImagePreviewCursor = /*#__PURE__*/ function () {\\r\\n var _ref14 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageFile) {\\r\\n // mustn't be larger than 128 px\\r\\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\\r\\n const cursorImageSizePx = 96;\\r\\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: cursorImageSizePx\\r\\n });\\r\\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imagePreview); // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\\r\\n // a small canvas\\r\\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.loadHTMLImageElement)(previewDataURL);\\r\\n let height = Math.min(img.height, cursorImageSizePx);\\r\\n let width = height * (img.width / img.height);\\r\\n if (width > cursorImageSizePx) {\\r\\n width = cursorImageSizePx;\\r\\n height = width * (img.height / img.width);\\r\\n }\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.height = height;\\r\\n canvas.width = width;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.drawImage(img, 0, 0, width, height);\\r\\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg);\\r\\n }\\r\\n if (_this13.state.pendingImageElement) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, `url(${previewDataURL}) 4 4, auto`);\\r\\n }\\r\\n });\\r\\n return function (_x11) {\\r\\n return _ref14.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.onImageAction = /*#__PURE__*/ function () {\\r\\n var _ref15 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let { insertOnCanvasDirectly } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\\r\\n insertOnCanvasDirectly: false\\r\\n };\\r\\n try {\\r\\n const clientX = _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.fileOpen)({\\r\\n description: \\\"Image\\\",\\r\\n extensions: [\\\"jpg\\\", \\\"png\\\", \\\"svg\\\", \\\"gif\\\"]\\r\\n });\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n });\\r\\n if (insertOnCanvasDirectly) {\\r\\n _this13.insertImageElement(imageElement, imageFile);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n pendingImageElement: imageElement\\r\\n }, function () {\\r\\n _this13.insertImageElement(imageElement, imageFile, \\r\\n /* showCursorImagePreview */\\r\\n true);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"AbortError\\\") {\\r\\n console.error(error);\\r\\n }\\r\\n else {\\r\\n console.warn(error);\\r\\n }\\r\\n _this13.setState({\\r\\n pendingImageElement: null,\\r\\n editingElement: null,\\r\\n elementType: \\\"selection\\\"\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref15.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.initializeImageDimensions = function (imageElement) {\\r\\n var _a;\\r\\n let forceNaturalSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(imageElement) && ((_a = _this13.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n if (!image || image instanceof Promise) {\\r\\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const placeholderSize = 100 / _this13.state.zoom.value;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x: imageElement.x - placeholderSize / 2,\\r\\n y: imageElement.y - placeholderSize / 2,\\r\\n width: placeholderSize,\\r\\n height: placeholderSize\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (forceNaturalSize || // if user-created bounding box is below threshold, assume the\\r\\n // intention was to click instead of drag, and use the image's\\r\\n // intrinsic size\\r\\n imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const minHeight = Math.max(_this13.state.height - 120, 160); // max 65% of canvas height, clamped to <300px, vh - 120px>\\r\\n const maxHeight = Math.min(minHeight, Math.floor(_this13.state.height * 0.5) / _this13.state.zoom.value);\\r\\n const height = Math.min(image.naturalHeight, maxHeight);\\r\\n const width = height * (image.naturalWidth / image.naturalHeight); // add current imageElement width/height to account for previous centering\\r\\n // of the placholder image\\r\\n const x = imageElement.x + imageElement.width / 2 - width / 2;\\r\\n const y = imageElement.y + imageElement.height / 2 - height / 2;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n };\\r\\n this.updateImageCache = /*#__PURE__*/ function () {\\r\\n var _ref16 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements) {\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.updateImageCache)({\\r\\n imageCache: _this13.imageCache,\\r\\n fileIds: elements.map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n if (updatedFiles.size || erroredFiles.size) {\\r\\n for (const element of elements) {\\r\\n if (updatedFiles.has(element.fileId)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (erroredFiles.size) {\\r\\n _this13.scene.replaceAllElements(_this13.scene.getElementsIncludingDeleted().map(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && erroredFiles.has(element.fileId)) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(element, {\\r\\n status: \\\"error\\\"\\r\\n });\\r\\n }\\r\\n return element;\\r\\n }));\\r\\n }\\r\\n return {\\r\\n updatedFiles,\\r\\n erroredFiles\\r\\n };\\r\\n });\\r\\n return function (_x12) {\\r\\n return _ref16.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.addNewImagesToImageCache = /*#__PURE__*/ function () {\\r\\n var _ref17 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let imageElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.getInitializedImageElements)(_this13.scene.getElements());\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const uncachedImageElements = imageElements.filter(function (element) {\\r\\n return !element.isDeleted && !_this13.imageCache.has(element.fileId);\\r\\n });\\r\\n if (uncachedImageElements.length) {\\r\\n const { updatedFiles } = yield _this13.updateImageCache(uncachedImageElements, files);\\r\\n if (updatedFiles.size) {\\r\\n _this13.scene.informMutation();\\r\\n }\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref17.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default()(function () {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.IMAGE_RENDER_TIMEOUT);\\r\\n this.updateBindingEnabledOnPointerMove = function (event) {\\r\\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\\r\\n if (_this13.state.isBindingEnabled !== shouldEnableBinding) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: shouldEnableBinding\\r\\n });\\r\\n }\\r\\n };\\r\\n this.maybeSuggestBindingAtCursor = function (pointerCoords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, _this13.scene);\\r\\n _this13.setState({\\r\\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : []\\r\\n });\\r\\n };\\r\\n this.maybeSuggestBindingsForLinearElementAtCoords = function (linearElement, pointerCoords, oppositeBindingBoundElement) {\\r\\n if (!pointerCoords.length) {\\r\\n return;\\r\\n }\\r\\n const suggestedBindings = pointerCoords.reduce(function (acc, coords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(coords, _this13.scene);\\r\\n if (hoveredBindableElement != null && !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\\r\\n acc.push(hoveredBindableElement);\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n _this13.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n };\\r\\n this.handleCanvasRef = function (canvas) {\\r\\n var _a, _b, _c;\\r\\n // canvas is null when unmounting\\r\\n if (canvas !== null) {\\r\\n _this13.canvas = canvas;\\r\\n _this13.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__[\\\"default\\\"].canvas(_this13.canvas);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel, {\\r\\n passive: false\\r\\n });\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n else {\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel);\\r\\n (_b = _this13.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n (_c = _this13.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n };\\r\\n this.handleAppOnDrop = /*#__PURE__*/ function () {\\r\\n var _ref18 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n try {\\r\\n if (_this13.props.onDrop) {\\r\\n try {\\r\\n if ((yield _this13.props.onDrop(event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (e) {\\r\\n console.error(e);\\r\\n }\\r\\n }\\r\\n const file = event.dataTransfer.files[0];\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file)) {\\r\\n // first attempt to decode scene from the image if it's embedded\\r\\n // ---------------------------------------------------------------------\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n return;\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"EncodingError\\\") {\\r\\n throw error;\\r\\n }\\r\\n }\\r\\n } // if no scene is embedded or we fail for whatever reason, fall back\\r\\n // to importing as regular image\\r\\n // ---------------------------------------------------------------------\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\\r\\n if (libraryShapes !== \\\"\\\") {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: JSON.parse(libraryShapes),\\r\\n position: event,\\r\\n files: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n const file = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files[0];\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib || ((_b = file === null || file === void 0 ? void 0 : file.name) === null || _b === void 0 ? void 0 : _b.endsWith(\\\".excalidrawlib\\\"))) {\\r\\n _this13.library.importLibrary(file).then(function () {\\r\\n // Close and then open to get the libraries updated\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }).catch(function (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }); // default: assume an Excalidraw file regardless of extension/MimeType\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n yield _this13.loadFileToCanvas(file);\\r\\n }\\r\\n });\\r\\n return function (_x13) {\\r\\n return _ref18.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.loadFileToCanvas = function (file) {\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n };\\r\\n this.handleCanvasContextMenu = function (event) {\\r\\n event.preventDefault();\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const element = _this13.getElementAtPosition(x, y, {\\r\\n preferSelected: true\\r\\n });\\r\\n const type = element ? \\\"element\\\" : \\\"canvas\\\";\\r\\n const container = _this13.excalidrawContainerRef.current;\\r\\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\\r\\n const left = event.clientX - offsetLeft;\\r\\n const top = event.clientY - offsetTop;\\r\\n if (element && !_this13.state.selectedElementIds[element.id]) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n }\\r\\n };\\r\\n this.maybeDragNewGenericElement = function (pointerDownState, event) {\\r\\n var _a;\\r\\n const draggingElement = _this13.state.draggingElement;\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"selection\\\") {\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event));\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this13.state.gridSize);\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(draggingElement) && ((_a = _this13.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n const aspectRatio = image && !(image instanceof Promise) ? image.width / image.height : null;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), aspectRatio);\\r\\n _this13.maybeSuggestBindingForAll([draggingElement]);\\r\\n }\\r\\n };\\r\\n this.maybeHandleResize = function (pointerDownState, event) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n const transformHandleType = pointerDownState.resize.handleType;\\r\\n _this13.setState({\\r\\n // TODO: rename this state field to \\\"isScaling\\\" to distinguish\\r\\n // it from the generic \\\"isResizing\\\" which includes scaling and\\r\\n // rotating\\r\\n isResizing: transformHandleType && transformHandleType !== \\\"rotation\\\",\\r\\n isRotating: transformHandleType === \\\"rotation\\\"\\r\\n });\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, _this13.state.gridSize);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(selectedElements[0]) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this._openContextMenu = function (_ref19, type) {\\r\\n let { left, top } = _ref19;\\r\\n if (_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n _this13.contextMenuOpen = true;\\r\\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const separator = \\\"separator\\\";\\r\\n const elements = _this13.scene.getElements();\\r\\n const options = [];\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\\r\\n }\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\\r\\n }\\r\\n if (type === \\\"canvas\\\") {\\r\\n const viewModeOptions = [...options, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats];\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: viewModeOptions,\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && navigator.clipboard && separator, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg, (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 || _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll, separator, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (type === \\\"element\\\") {\\r\\n const elementsWithUnbindedText = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state).some(function (element) {\\r\\n return !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n });\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut, _this13.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, _this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && separator, ...options, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles, _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles, separator, maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup, !elementsWithUnbindedText && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUnbindText, maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup, (maybeGroupAction || maybeUngroupAction) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront, separator, maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal, maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink.contextItemPredicate(elements, _this13.state) && _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n const { deltaX, deltaY } = event;\\r\\n const { selectedElementIds, previousSelectedElementIds } = _this13.state; // note that event.ctrlKey is necessary to handle pinch zooming\\r\\n if (event.metaKey || event.ctrlKey) {\\r\\n const sign = Math.sign(deltaY);\\r\\n const MAX_STEP = 10;\\r\\n let delta = Math.abs(deltaY);\\r\\n if (delta > MAX_STEP) {\\r\\n delta = MAX_STEP;\\r\\n }\\r\\n delta *= sign;\\r\\n if (Object.keys(previousSelectedElementIds).length !== 0) {\\r\\n setTimeout(function () {\\r\\n _this13.setState({\\r\\n selectedElementIds: previousSelectedElementIds,\\r\\n previousSelectedElementIds: {}\\r\\n });\\r\\n }, 1000);\\r\\n }\\r\\n let newZoom = _this13.state.zoom.value - delta / 100; // increase zoom steps the more zoomed-in we are (applies to >100% only)\\r\\n newZoom += Math.log10(Math.max(1, _this13.state.zoom.value)) * -sign; // round to nearest step\\r\\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom)\\r\\n }, state)), {}, {\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0 ? selectedElementIds : previousSelectedElementIds,\\r\\n shouldCacheIgnoreZoom: true\\r\\n });\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n return;\\r\\n } // scroll horizontally when shift pressed\\r\\n if (event.shiftKey) {\\r\\n _this13.setState(function (_ref20) {\\r\\n let { zoom, scrollX } = _ref20;\\r\\n return {\\r\\n // on Mac, shift+wheel tends to result in deltaX\\r\\n scrollX: scrollX - (deltaY || deltaX) / zoom.value\\r\\n };\\r\\n });\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (_ref21) {\\r\\n let { zoom, scrollX, scrollY } = _ref21;\\r\\n return {\\r\\n scrollX: scrollX - deltaX / zoom.value,\\r\\n scrollY: scrollY - deltaY / zoom.value\\r\\n };\\r\\n });\\r\\n });\\r\\n this.savePointer = function (x, y, button) {\\r\\n var _a, _b;\\r\\n if (!x || !y) {\\r\\n return;\\r\\n }\\r\\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: x,\\r\\n clientY: y\\r\\n }, _this13.state);\\r\\n if (isNaN(pointer.x) || isNaN(pointer.y)) { // sometimes the pointer goes off screen\\r\\n }\\r\\n (_b = (_a = _this13.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\\r\\n pointer,\\r\\n button,\\r\\n pointersMap: gesture.pointers\\r\\n });\\r\\n };\\r\\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n if (!_this13.unmounted) {\\r\\n _this13.setState({\\r\\n shouldCacheIgnoreZoom: false\\r\\n });\\r\\n }\\r\\n }, 300);\\r\\n this.updateDOMRect = function (cb) {\\r\\n var _a;\\r\\n if ((_a = _this13.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = _this13.excalidrawContainerRef.current;\\r\\n const { width, height, left: offsetLeft, top: offsetTop } = excalidrawContainer.getBoundingClientRect();\\r\\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft } = _this13.state;\\r\\n if (width === currentWidth && height === currentHeight && offsetLeft === currentOffsetLeft && offsetTop === currentOffsetTop) {\\r\\n if (cb) {\\r\\n cb();\\r\\n }\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n width,\\r\\n height,\\r\\n offsetLeft,\\r\\n offsetTop\\r\\n }, function () {\\r\\n cb && cb();\\r\\n });\\r\\n }\\r\\n };\\r\\n this.refresh = function () {\\r\\n _this13.setState(_objectSpread({}, _this13.getCanvasOffsets()));\\r\\n };\\r\\n};\\r\\nif (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n window.h = window.h || {};\\r\\n Object.defineProperties(window.h, {\\r\\n elements: {\\r\\n configurable: true,\\r\\n get() {\\r\\n return this.app.scene.getElementsIncludingDeleted();\\r\\n },\\r\\n set(elements) {\\r\\n return this.app.scene.replaceAllElements(elements);\\r\\n }\\r\\n }\\r\\n });\\r\\n}\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTdHLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSw4REFBcUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZJLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxTQUFTLEdBQUc7UUFDZixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0csSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFdEYsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENB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QUUsRUFBRSxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxPQUFPLEdBQUc7UUFDYixPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLElBQUksYUFBb0IsS0FBSyxpREFBUSxJQUFJLGFBQW9CLEtBQUssd0RBQWUsRUFBRTtJQUNqRixNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1FBQ2hDLFFBQVEsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBRWxCLEdBQUc7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxHQUFHLENBQUMsUUFBUTtnQkFDVixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7U0FFRjtLQUNGLENBQUMsQ0FBQztDQUNKO0FBRUQsaUVBQWUsR0FBRyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQXBwLnRzeD8zOGU2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiO1xuaW1wb3J0IHsgYWN0aW9uQWRkVG9MaWJyYXJ5LCBhY3Rpb25CcmluZ0ZvcndhcmQsIGFjdGlvbkJyaW5nVG9Gcm9udCwgYWN0aW9uQ29weSwgYWN0aW9uQ29weUFzUG5nLCBhY3Rpb25Db3B5QXNTdmcsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvbkN1dCwgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbiwgYWN0aW9uRmluYWxpemUsIGFjdGlvbkZsaXBIb3Jpem9udGFsLCBhY3Rpb25GbGlwVmVydGljYWwsIGFjdGlvbkdyb3VwLCBhY3Rpb25QYXN0ZVN0eWxlcywgYWN0aW9uU2VsZWN0QWxsLCBhY3Rpb25TZW5kQmFja3dhcmQsIGFjdGlvblNlbmRUb0JhY2ssIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0cywgYWN0aW9uVG9nZ2xlWmVuTW9kZSwgYWN0aW9uVW5iaW5kVGV4dCwgYWN0aW9uVW5ncm91cCwgem9vbVRvRml0RWxlbWVudHMsIGFjdGlvbkxpbmsgfSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IGNvcHlUb0NsaXBib2FyZCwgcGFyc2VDbGlwYm9hcmQsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iLCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0IH0gZnJvbSBcIi4uL2NsaXBib2FyZFwiO1xuaW1wb3J0IHsgQVBQX05BTUUsIENVUlNPUl9UWVBFLCBERUZBVUxUX01BWF9JTUFHRV9XSURUSF9PUl9IRUlHSFQsIERFRkFVTFRfVUlfT1BUSU9OUywgREVGQVVMVF9WRVJUSUNBTF9BTElHTiwgRFJBR0dJTkdfVEhSRVNIT0xELCBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQsIEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCwgRU5WLCBFVkVOVCwgR1JJRF9TSVpFLCBJTUFHRV9SRU5ERVJfVElNRU9VVCwgTElORV9DT05GSVJNX1RIUkVTSE9MRCwgTUFYX0FMTE9XRURfRklMRV9CWVRFUywgTUlNRV9UWVBFUywgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUsIE1RX01BWF9XSURUSF9MQU5EU0NBUEUsIE1RX01BWF9XSURUSF9QT1JUUkFJVCwgUE9JTlRFUl9CVVRUT04sIFNDUk9MTF9USU1FT1VULCBUQVBfVFdJQ0VfVElNRU9VVCwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQsIFRIRU1FLCBUT1VDSF9DVFhfTUVOVV9USU1FT1VULCBVUkxfSEFTSF9LRVlTLCBVUkxfUVVFUllfS0VZUywgWk9PTV9TVEVQIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9hZEZyb21CbG9iIH0gZnJvbSBcIi4uL2RhdGFcIjtcbmltcG9ydCB7IGlzVmFsaWRMaWJyYXJ5IH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4uL2RhdGEvbGlicmFyeVwiO1xuaW1wb3J0IHsgcmVzdG9yZSwgcmVzdG9yZUVsZW1lbnRzLCByZXN0b3JlTGlicmFyeUl0ZW1zIH0gZnJvbSBcIi4uL2RhdGEvcmVzdG9yZVwiO1xuaW1wb3J0IHsgZHJhZ05ld0VsZW1lbnQsIGRyYWdTZWxlY3RlZEVsZW1lbnRzLCBkdXBsaWNhdGVFbGVtZW50LCBnZXRDb21tb25Cb3VuZHMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCwgZ2V0RHJhZ09mZnNldFhZLCBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUsIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zLCBnZXRQZXJmZWN0RWxlbWVudFNpemUsIGdldFJlc2l6ZUFycm93RGlyZWN0aW9uLCBnZXRSZXNpemVPZmZzZXRYWSwgZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMsIGhpdFRlc3QsIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudCwgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsIGlzTm9uRGVsZXRlZEVsZW1lbnQsIGlzVGV4dEVsZW1lbnQsIG5ld0VsZW1lbnQsIG5ld0xpbmVhckVsZW1lbnQsIG5ld1RleHRFbGVtZW50LCBuZXdJbWFnZUVsZW1lbnQsIHRleHRXeXNpd3lnLCB0cmFuc2Zvcm1FbGVtZW50cywgdXBkYXRlVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cywgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uLCBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24sIGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nLCBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcsIGlzQmluZGluZ0VuYWJsZWQsIGlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZCwgbWF5YmVCaW5kTGluZWFyRWxlbWVudCwgc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudCwgdW5iaW5kTGluZWFyRWxlbWVudHMsIHVwZGF0ZUJvdW5kRWxlbWVudHMgfSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgYnVtcFZlcnNpb24sIG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZGVlcENvcHlFbGVtZW50LCBuZXdGcmVlRHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9uZXdFbGVtZW50XCI7XG5pbXBvcnQgeyBoYXNCb3VuZFRleHRFbGVtZW50LCBpc0JpbmRpbmdFbGVtZW50LCBpc0JpbmRpbmdFbGVtZW50VHlwZSwgaXNCb3VuZFRvQ29udGFpbmVyLCBpc0ltYWdlRWxlbWVudCwgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50LCBpc0xpbmVhckVsZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0Q2VudGVyLCBnZXREaXN0YW5jZSB9IGZyb20gXCIuLi9nZXN0dXJlXCI7XG5pbXBvcnQgeyBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQsIGdldEVsZW1lbnRzSW5Hcm91cCwgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudCwgZ2V0U2VsZWN0ZWRHcm91cElkcywgaXNFbGVtZW50SW5Hcm91cCwgaXNTZWxlY3RlZFZpYUdyb3VwLCBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nLCBnZXRMYW5ndWFnZSwgbGFuZ3VhZ2VzLCBzZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyBDT0RFUywgc2hvdWxkUmVzaXplRnJvbUNlbnRlciwgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbywgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUsIGlzQXJyb3dLZXksIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgZ2V0R3JpZFBvaW50LCBpc1BhdGhBTG9vcCwgcm90YXRlIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50IH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZVNjcm9sbENlbnRlciwgZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbiwgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLCBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbiwgZ2V0Tm9ybWFsaXplZFpvb20sIGdldFNlbGVjdGVkRWxlbWVudHMsIGhhc0JhY2tncm91bmQsIGlzT3ZlclNjcm9sbEJhcnMsIGlzU29tZUVsZW1lbnRTZWxlY3RlZCB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgZ2V0U3RhdGVGb3Jab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IGZpbmRTaGFwZUJ5S2V5IH0gZnJvbSBcIi4uL3NoYXBlc1wiO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRpc3RhbmNlLCBnZXRGb250U3RyaW5nLCBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciwgaXNJbnB1dExpa2UsIGlzVG9vbEljb24sIGlzV3JpdGFibGVFbGVtZW50LCByZXNldEN1cnNvciwgcmVzb2x2YWJsZVByb21pc2UsIHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcywgc2V0Q3Vyc29yLCBzZXRDdXJzb3JGb3JTaGFwZSwgdHVwbGVUb0Nvb3JzLCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMsIHdpdGhCYXRjaGVkVXBkYXRlcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IENvbnRleHRNZW51IGZyb20gXCIuL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgTGF5ZXJVSSBmcm9tIFwiLi9MYXllclVJXCI7XG5pbXBvcnQgeyBTdGF0cyB9IGZyb20gXCIuL1N0YXRzXCI7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gXCIuL1RvYXN0XCI7XG5pbXBvcnQgeyBhY3Rpb25Ub2dnbGVWaWV3TW9kZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblRvZ2dsZVZpZXdNb2RlXCI7XG5pbXBvcnQgeyBkYXRhVVJMVG9GaWxlLCBnZW5lcmF0ZUlkRnJvbUZpbGUsIGdldERhdGFVUkwsIGlzU3VwcG9ydGVkSW1hZ2VGaWxlLCByZXNpemVJbWFnZUZpbGUsIFNWR1N0cmluZ1RvRmlsZSB9IGZyb20gXCIuLi9kYXRhL2Jsb2JcIjtcbmltcG9ydCB7IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cywgbG9hZEhUTUxJbWFnZUVsZW1lbnQsIG5vcm1hbGl6ZVNWRywgdXBkYXRlSW1hZ2VDYWNoZSBhcyBfdXBkYXRlSW1hZ2VDYWNoZSB9IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcImxvZGFzaC50aHJvdHRsZVwiO1xuaW1wb3J0IHsgZmlsZU9wZW4sIG5hdGl2ZUZpbGVTeXN0ZW1TdXBwb3J0ZWQgfSBmcm9tIFwiLi4vZGF0YS9maWxlc3lzdGVtXCI7XG5pbXBvcnQgeyBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uLCBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LCBnZXRBcHByb3hNaW5MaW5lV2lkdGgsIGdldEJvdW5kVGV4dEVsZW1lbnRJZCB9IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveCB9IGZyb20gXCIuLi9lbGVtZW50L2NvbGxpc2lvblwiO1xuaW1wb3J0IHsgcmVzaXplU2luZ2xlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3Jlc2l6ZUVsZW1lbnRzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVMaW5rLCBzaG93SHlwZXJsaW5rVG9vbHRpcCwgaGlkZUh5cGVybGlua1Rvb2xpcCwgSHlwZXJsaW5rLCBpc1BvaW50SGl0dGluZ0xpbmtJY29uLCBpc0xvY2FsTGluayB9IGZyb20gXCIuLi9lbGVtZW50L0h5cGVybGlua1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBsZXQgc2hvd0ZvdXJ0aEZvbnQgPSBmYWxzZTtcbmNvbnN0IElzTW9iaWxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmV4cG9ydCBjb25zdCB1c2VJc01vYmlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoSXNNb2JpbGVDb250ZXh0KTtcbn07XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgY29udGFpbmVyOiBudWxsLFxuICBpZDogbnVsbFxufSk7XG5leHBvcnQgY29uc3QgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQpO1xufTtcbmxldCBkaWRUYXBUd2ljZSA9IGZhbHNlO1xubGV0IHRhcHBlZFR3aWNlVGltZXIgPSAwO1xubGV0IGN1cnNvclggPSAwO1xubGV0IGN1cnNvclkgPSAwO1xubGV0IGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG5sZXQgaXNQYW5uaW5nID0gZmFsc2U7XG5sZXQgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xubGV0IGN1cnJlbnRTY3JvbGxCYXJzID0ge1xuICBob3Jpem9udGFsOiBudWxsLFxuICB2ZXJ0aWNhbDogbnVsbFxufTtcbmxldCB0b3VjaFRpbWVvdXQgPSAwO1xubGV0IGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xubGV0IGxhc3RQb2ludGVyVXAgPSBudWxsO1xuY29uc3QgZ2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IG5ldyBNYXAoKSxcbiAgbGFzdENlbnRlcjogbnVsbCxcbiAgaW5pdGlhbERpc3RhbmNlOiBudWxsLFxuICBpbml0aWFsU2NhbGU6IG51bGxcbn07XG5cbmNsYXNzIEFwcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIocHJvcHMpO1xuICAgIF90aGlzID0gdGhpcztcblxuICAgIF9pbml0aWFsaXNlUHJvcHMuY2FsbCh0aGlzKTtcblxuICAgIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHplbk1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICBncmlkTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHRoZW1lID0gZGVmYXVsdEFwcFN0YXRlLnRoZW1lLFxuICAgICAgbmFtZSA9IGRlZmF1bHRBcHBTdGF0ZS5uYW1lXG4gICAgfSA9IHByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGVmYXVsdEFwcFN0YXRlKSwge30sIHtcbiAgICAgIHRoZW1lLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgfSwgdGhpcy5nZXRDYW52YXNPZmZzZXRzKCkpLCB7fSwge1xuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkU2l6ZTogZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIG5hbWUsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID0gXCJjdXJyZW50XCIgaW4gZXhjYWxpZHJhd1JlZiAmJiBleGNhbGlkcmF3UmVmLmN1cnJlbnQ/LnJlYWR5UHJvbWlzZSB8fCByZXNvbHZhYmxlUHJvbWlzZSgpO1xuICAgICAgY29uc3QgYXBpID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgYWRkRmlsZXM6IHRoaXMuYWRkRmlsZXMsXG4gICAgICAgIHJlc2V0U2NlbmU6IHRoaXMucmVzZXRTY2VuZSxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQsXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjbGVhcjogdGhpcy5yZXNldEhpc3RvcnlcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsVG9Db250ZW50OiB0aGlzLnNjcm9sbFRvQ29udGVudCxcbiAgICAgICAgem9vbVRvRml0OiB0aGlzLnpvb21Ub0ZpdCxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50czogdGhpcy5nZXRTY2VuZUVsZW1lbnRzLFxuICAgICAgICBnZXRBcHBTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RmlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuZmlsZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICAgICAgaW1wb3J0TGlicmFyeTogdGhpcy5pbXBvcnRMaWJyYXJ5RnJvbVVybCxcbiAgICAgICAgc2V0VG9hc3RNZXNzYWdlOiB0aGlzLnNldFRvYXN0TWVzc2FnZSxcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogdGhpcy51cGRhdGVDb250YWluZXJTaXplLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgc2V0TG9jYWxGb250OiB0aGlzLnNldExvY2FsRm9udCxcbiAgICAgICAgc2VsZWN0RWxlbWVudHM6IHRoaXMuc2VsZWN0RWxlbWVudHMsXG4gICAgICAgIHNlbmRCYWNrd2FyZDogdGhpcy5zZW5kQmFja3dhcmQsXG4gICAgICAgIGJyaW5nRm9yd2FyZDogdGhpcy5icmluZ0ZvcndhcmQsXG4gICAgICAgIHNlbmRUb0JhY2s6IHRoaXMuc2VuZFRvQmFjayxcbiAgICAgICAgYnJpbmdUb0Zyb250OiB0aGlzLmJyaW5nVG9Gcm9udFxuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGVvZiBleGNhbGlkcmF3UmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZihhcGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZi5jdXJyZW50ID0gYXBpO1xuICAgICAgfVxuXG4gICAgICByZWFkeVByb21pc2UucmVzb2x2ZShhcGkpO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0ge1xuICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfTtcbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcih0aGlzLnN5bmNBY3Rpb25SZXN1bHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdGF0ZTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWxsKGFjdGlvbnMpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVVbmRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVSZWRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICB9XG5cbiAgcmVuZGVyQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1NjYWxlID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWRcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhc0RPTVdpZHRoICogY2FudmFzU2NhbGU7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzRE9NSGVpZ2h0ICogY2FudmFzU2NhbGU7XG5cbiAgICBpZiAodmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJjYW52YXNcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhd19fY2FudmFzXCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICAgIGN1cnNvcjogQ1VSU09SX1RZUEUuR1JBQlxuICAgICAgICB9LFxuICAgICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICByZWY6IHRoaXMuaGFuZGxlQ2FudmFzUmVmLFxuICAgICAgICBvbkNvbnRleHRNZW51OiB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlLFxuICAgICAgICBvblBvaW50ZXJVcDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgICBvblBvaW50ZXJDYW5jZWw6IHRoaXMucmVtb3ZlUG9pbnRlcixcbiAgICAgICAgb25Ub3VjaE1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgICBvblBvaW50ZXJEb3duOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duLFxuICAgICAgICBjaGlsZHJlbjogdChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJjYW52YXNcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImV4Y2FsaWRyYXdfX2NhbnZhc1wiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgcmVmOiB0aGlzLmhhbmRsZUNhbnZhc1JlZixcbiAgICAgIG9uQ29udGV4dE1lbnU6IHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUsXG4gICAgICBvblBvaW50ZXJEb3duOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duLFxuICAgICAgb25Eb3VibGVDbGljazogdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayxcbiAgICAgIG9uUG9pbnRlck1vdmU6IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUsXG4gICAgICBvblBvaW50ZXJVcDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgb25Qb2ludGVyQ2FuY2VsOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICBvblRvdWNoTW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICBjaGlsZHJlbjogdChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBjb25zdCB7XG4gICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCB7XG4gICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgIHJlbmRlckZvb3RlcixcbiAgICAgIHJlbmRlckN1c3RvbVN0YXRzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChcImV4Y2FsaWRyYXcgZXhjYWxpZHJhdy1jb250YWluZXJcIiwge1xuICAgICAgICBcImV4Y2FsaWRyYXctLXZpZXctbW9kZVwiOiB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgIFwiZXhjYWxpZHJhdy0tbW9iaWxlXCI6IHRoaXMuaXNNb2JpbGVcbiAgICAgIH0pLFxuICAgICAgcmVmOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYsXG4gICAgICBvbkRyb3A6IHRoaXMuaGFuZGxlQXBwT25Ecm9wLFxuICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICBvbktleURvd246IHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duLFxuICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZSxcbiAgICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4cyhJc01vYmlsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5pc01vYmlsZSxcbiAgICAgICAgICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KExheWVyVUksIHtcbiAgICAgICAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGZpbGVzOiB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHRoaXMuc2V0QXBwU3RhdGUsXG4gICAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgICBlbGVtZW50czogdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgb25Db2xsYWJCdXR0b25DbGljazogb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgICAgICAgIG9uTG9ja1RvZ2dsZTogdGhpcy50b2dnbGVMb2NrLFxuICAgICAgICAgICAgb25QZW5Nb2RlVG9nZ2xlOiB0aGlzLnRvZ2dsZVBlbk1vZGUsXG4gICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzOiBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgZmlsZXM6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgemVuTW9kZUVuYWJsZWQ6IHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgdG9nZ2xlWmVuTW9kZTogdGhpcy50b2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgbGFuZ0NvZGU6IGdldExhbmd1YWdlKCkuY29kZSxcbiAgICAgICAgICAgIGlzQ29sbGFib3JhdGluZzogdGhpcy5wcm9wcy5pc0NvbGxhYm9yYXRpbmcsXG4gICAgICAgICAgICByZW5kZXJUb3BSaWdodFVJOiByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQ6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIHNob3dFeGl0WmVuTW9kZUJ0bjogdHlwZW9mIHRoaXMucHJvcHM/Lnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgc2hvd1RoZW1lQnRuOiB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5wcm9wcy5VSU9wdGlvbnMuY2FudmFzQWN0aW9ucy50aGVtZSxcbiAgICAgICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw6IHRoaXMucHJvcHMubGlicmFyeVJldHVyblVybCxcbiAgICAgICAgICAgIFVJT3B0aW9uczogdGhpcy5wcm9wcy5VSU9wdGlvbnMsXG4gICAgICAgICAgICBmb2N1c0NvbnRhaW5lcjogdGhpcy5mb2N1c0NvbnRhaW5lcixcbiAgICAgICAgICAgIGxpYnJhcnk6IHRoaXMubGlicmFyeSxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgb25JbWFnZUFjdGlvbjogdGhpcy5vbkltYWdlQWN0aW9uXG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIlxuICAgICAgICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiXG4gICAgICAgICAgfSksIHNlbGVjdGVkRWxlbWVudC5sZW5ndGggPT09IDEgJiYgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXAgJiYgLyojX19QVVJFX18qL19qc3goSHlwZXJsaW5rLCB7XG4gICAgICAgICAgICBlbGVtZW50OiBzZWxlY3RlZEVsZW1lbnRbMF0sXG4gICAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlOiB0aGlzLnNldEFwcFN0YXRlLFxuICAgICAgICAgICAgb25MaW5rT3BlbjogdGhpcy5wcm9wcy5vbkxpbmtPcGVuXG4gICAgICAgICAgfSwgc2VsZWN0ZWRFbGVtZW50WzBdLmlkKSwgdGhpcy5zdGF0ZS5zaG93U3RhdHMgJiYgLyojX19QVVJFX18qL19qc3goU3RhdHMsIHtcbiAgICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHRoaXMuc2V0QXBwU3RhdGUsXG4gICAgICAgICAgICBlbGVtZW50czogdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgb25DbG9zZTogdGhpcy50b2dnbGVTdGF0cyxcbiAgICAgICAgICAgIHJlbmRlckN1c3RvbVN0YXRzOiByZW5kZXJDdXN0b21TdGF0c1xuICAgICAgICAgIH0pLCB0aGlzLnN0YXRlLnRvYXN0TWVzc2FnZSAhPT0gbnVsbCAmJiAvKiNfX1BVUkVfXyovX2pzeChUb2FzdCwge1xuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2UsXG4gICAgICAgICAgICBjbGVhclRvYXN0OiB0aGlzLmNsZWFyVG9hc3RcbiAgICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJtYWluXCIsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnJlbmRlckNhbnZhcygpXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIF90aGlzMy51bm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID0gX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UKSB7XG4gICAgICAgIGNvbnN0IHNldFN0YXRlID0gX3RoaXMzLnNldFN0YXRlLmJpbmQoX3RoaXMzKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldFN0YXRlOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLnNldFN0YXRlKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcHA6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfdGhpczNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfdGhpczMuaGlzdG9yeVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMy5zY2VuZS5hZGRDYWxsYmFjayhfdGhpczMub25TY2VuZVVwZGF0ZWQpO1xuXG4gICAgICBfdGhpczMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgaWYgKF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgX3RoaXMzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzMy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gY29tcHV0ZSBpc01vYmlsZSBzdGF0ZVxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgfSA9IF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICBfdGhpczMuaXNNb2JpbGUgPSB3aWR0aCA8IE1RX01BWF9XSURUSF9QT1JUUkFJVCB8fCBoZWlnaHQgPCBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSAmJiB3aWR0aCA8IE1RX01BWF9XSURUSF9MQU5EU0NBUEU7IC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgICAgX3RoaXMzLnVwZGF0ZURPTVJlY3QoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzMy5yZXNpemVPYnNlcnZlcj8ub2JzZXJ2ZShfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgICAgY29uc3QgbWVkaWFRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKGAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9QT1JUUkFJVH1weCksIChtYXgtaGVpZ2h0OiAke01RX01BWF9IRUlHSFRfTEFORFNDQVBFfXB4KSBhbmQgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfTEFORFNDQVBFfXB4KWApO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5pc01vYmlsZSA9IG1lZGlhUXVlcnkubWF0Y2hlcztcbiAgICAgICAgfTtcblxuICAgICAgICBtZWRpYVF1ZXJ5LmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuXG4gICAgICAgIF90aGlzMy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbWVkaWFRdWVyeS5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpKTtcblxuICAgICAgaWYgKHNlYXJjaFBhcmFtcy5oYXMoXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpKSB7XG4gICAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICAgIF90aGlzMy5yZXN0b3JlRmlsZUZyb21TaGFyZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMzLnVwZGF0ZURPTVJlY3QoX3RoaXMzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5TQ1JPTEwsIHRoaXMub25TY3JvbGwpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk1PVVNFX01PVkUsIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9TVEFSVCwgdGhpcy5vbkdlc3R1cmVTdGFydCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9DSEFOR0UsIHRoaXMub25HZXN0dXJlQ2hhbmdlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0VORCwgdGhpcy5vbkdlc3R1cmVFbmQsIGZhbHNlKTtcbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7IC8vICMzNTUzXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcblxuICAgIGlmICh0aGlzLnByb3BzLmhhbmRsZUtleWJvYXJkR2xvYmFsbHkpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXAsIHtcbiAgICAgIHBhc3NpdmU6IHRydWVcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1PVVNFX01PVkUsIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uKTsgLy8gcmVyZW5kZXIgdGV4dCBlbGVtZW50cyBvbiBmb250IGxvYWQgdG8gZml4ICM2MzcgJiYgIzE1NTNcblxuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7IC8vIFNhZmFyaS1vbmx5IGRlc2t0b3AgcGluY2ggem9vbVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX1NUQVJULCB0aGlzLm9uR2VzdHVyZVN0YXJ0LCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0NIQU5HRSwgdGhpcy5vbkdlc3R1cmVDaGFuZ2UsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfRU5ELCB0aGlzLm9uR2VzdHVyZUVuZCwgZmFsc2UpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ1VULCB0aGlzLm9uQ3V0KTtcblxuICAgIGlmICh0aGlzLnByb3BzLmRldGVjdFNjcm9sbCkge1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciA9IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5TQ1JPTEwsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIC8vIEhpZGUgaHlwZXJsaW5rIHBvcHVwIGlmIHNob3duIHdoZW4gZWxlbWVudCB0eXBlIGlzIG5vdCBzZWxlY3Rpb25cbiAgICBpZiAocHJldlN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiICYmIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiYgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlN0YXRlLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB6ZW5Nb2RlRW5hYmxlZDogISF0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnRoZW1lICE9PSB0aGlzLnByb3BzLnRoZW1lICYmIHRoaXMucHJvcHMudGhlbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB0aGVtZTogdGhpcy5wcm9wcy50aGVtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMubmFtZSAmJiBwcmV2UHJvcHMubmFtZSAhPT0gdGhpcy5wcm9wcy5uYW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY2xhc3NMaXN0LnRvZ2dsZShcInRoZW1lLS1kYXJrXCIsIHRoaXMuc3RhdGUudGhlbWUgPT09IFwiZGFya1wiKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF0pIHtcbiAgICAgIC8vIGRlZmVyIHNvIHRoYXQgdGhlIGNvbW1pdFRvSGlzdG9yeSBmbGFnIGlzbid0IHJlc2V0IHZpYSBjdXJyZW50IHVwZGF0ZVxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgbXVsdGlFbGVtZW50XG4gICAgfSA9IHByZXZTdGF0ZTtcblxuICAgIGlmIChwcmV2U3RhdGUuZWxlbWVudFR5cGUgIT09IHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgJiYgbXVsdGlFbGVtZW50ICE9IG51bGwgJiYgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJiBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudCkpIHtcbiAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQobXVsdGlFbGVtZW50LCB0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLCB0dXBsZVRvQ29vcnMoTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhtdWx0aUVsZW1lbnQsIC0xKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvckJ1dHRvbiA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJWaWV3cG9ydENvb3JkcyA9IHt9O1xuICAgIGNvbnN0IHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJVc2VybmFtZXMgPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlclN0YXRlcyA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh1c2VyLCBzb2NrZXRJZCkge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0ucHVzaChzb2NrZXRJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1c2VyLnBvaW50ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VyLnVzZXJTdGF0ZSkge1xuICAgICAgICBwb2ludGVyVXNlclN0YXRlc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcG9pbnRlclZpZXdwb3J0Q29vcmRzW3NvY2tldElkXSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgIHNjZW5lWDogdXNlci5wb2ludGVyLngsXG4gICAgICAgIHNjZW5lWTogdXNlci5wb2ludGVyLnlcbiAgICAgIH0sIF90aGlzNC5zdGF0ZSk7XG4gICAgICBjdXJzb3JCdXR0b25bc29ja2V0SWRdID0gdXNlci5idXR0b247XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyaW5nRWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgaWYgKCAvLyBub3QgcGxhY2VkIG9uIGNhbnZhcyB5ZXQgKGJ1dCBpbiBlbGVtZW50cyBhcnJheSlcbiAgICAgICAgX3RoaXM0LnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQgJiYgZWxlbWVudC5pZCA9PT0gX3RoaXM0LnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQuaWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZG9uJ3QgcmVuZGVyIHRleHQgZWxlbWVudCB0aGF0J3MgYmVpbmcgY3VycmVudGx5IGVkaXRlZCAoaXQnc1xuICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG5cblxuICAgICAgcmV0dXJuICFfdGhpczQuc3RhdGUuZWRpdGluZ0VsZW1lbnQgfHwgX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8IGVsZW1lbnQuaWQgIT09IF90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZDtcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQsXG4gICAgICBzY3JvbGxCYXJzXG4gICAgfSA9IHJlbmRlclNjZW5lKHJlbmRlcmluZ0VsZW1lbnRzLCB0aGlzLnN0YXRlLCB0aGlzLnN0YXRlLnNlbGVjdGlvbkVsZW1lbnQsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCB0aGlzLnJjLCB0aGlzLmNhbnZhcywge1xuICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYLFxuICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZLFxuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yLFxuICAgICAgem9vbTogdGhpcy5zdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiBwb2ludGVyVmlld3BvcnRDb29yZHMsXG4gICAgICByZW1vdGVQb2ludGVyQnV0dG9uOiBjdXJzb3JCdXR0b24sXG4gICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiBwb2ludGVyVXNlcm5hbWVzLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHBvaW50ZXJVc2VyU3RhdGVzLFxuICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0aGlzLnN0YXRlLnNob3VsZENhY2hlSWdub3JlWm9vbSxcbiAgICAgIHRoZW1lOiB0aGlzLnN0YXRlLnRoZW1lLFxuICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgaXNFeHBvcnRpbmc6IGZhbHNlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogIXRoaXMuaXNNb2JpbGVcbiAgICB9KTtcblxuICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyA9IHNjcm9sbEJhcnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsZWRPdXRzaWRlID0gLy8gaGlkZSB3aGVuIGVkaXRpbmcgdGV4dFxuICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkgPyBmYWxzZSA6ICFhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQgJiYgcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoID4gMDtcblxuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsZWRPdXRzaWRlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmhpc3RvcnkucmVjb3JkKHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpO1xuICAgIHRoaXMuc2NoZWR1bGVJbWFnZVJlZnJlc2goKTsgLy8gRG8gbm90IG5vdGlmeSBjb25zdW1lcnMgaWYgd2UncmUgc3RpbGwgbG9hZGluZyB0aGUgc2NlbmUuIEFtb25nIG90aGVyXG4gICAgLy8gcG90ZW50aWFsIGlzc3VlcywgdGhpcyBmaXhlcyBhIGNhc2Ugd2hlcmUgdGhlIHRhYiBpc24ndCBmb2N1c2VkIGR1cmluZ1xuICAgIC8vIGluaXQsIHdoaWNoIHdvdWxkIHRyaWdnZXIgb25DaGFuZ2Ugd2l0aCBlbXB0eSBlbGVtZW50cywgd2hpY2ggd291bGQgdGhlblxuICAgIC8vIG92ZXJyaWRlIHdoYXRldmVyIGlzIGluIGxvY2FsU3RvcmFnZSBjdXJyZW50bHkuXG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4odGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgdGhpcy5zdGF0ZSwgdGhpcy5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHJlc2V0VGFwVHdpY2UoKSB7XG4gICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZFRleHRGcm9tUGFzdGUodGV4dCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICBjbGllbnRYOiBjdXJzb3JYLFxuICAgICAgY2xpZW50WTogY3Vyc29yWVxuICAgIH0sIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgdGV4dCxcbiAgICAgIHJhd1RleHQ6IHRleHQsXG4gICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOXG4gICAgfSk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICBbZWxlbWVudC5pZF06IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gIH0gLy8gQ29sbGFib3JhdGlvblxuXG5cbiAgc2VsZWN0U2hhcGVUb29sKGVsZW1lbnRUeXBlKSB7XG4gICAgaWYgKCFpc0hvbGRpbmdTcGFjZSkge1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIGVsZW1lbnRUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUb29sSWNvbihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICB0aGlzLm9uSW1hZ2VBY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCBfcmVmKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICBsZXQge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQgPSBmYWxzZVxuICAgIH0gPSBfcmVmO1xuXG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCwgcmF3VGV4dCwgbGluaykge1xuICAgICAgX3RoaXM1LnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXM1LnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoX2VsZW1lbnQpIHtcbiAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgaXNEZWxldGVkLFxuICAgICAgICAgICAgb3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgcmF3VGV4dDogcmF3VGV4dCA/PyBvcmlnaW5hbFRleHQsXG4gICAgICAgICAgICBsaW5rXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICB9KV0pO1xuICAgIH07XG5cbiAgICBpZiAoaXNFeGlzdGluZ0VsZW1lbnQgJiYgdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKF9lbGVtZW50KSB7XG4gICAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgaXNEZWxldGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB0ZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgICAgfSldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0ZXh0V3lzaXd5Zyh7XG4gICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICBnZXRWaWV3cG9ydENvb3JkczogZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHZpZXdwb3J0WCxcbiAgICAgICAgICB5OiB2aWV3cG9ydFlcbiAgICAgICAgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgIHNjZW5lWTogeVxuICAgICAgICB9LCBfdGhpczUuc3RhdGUpO1xuICAgICAgICByZXR1cm4gW3ZpZXdwb3J0WCAtIF90aGlzNS5zdGF0ZS5vZmZzZXRMZWZ0LCB2aWV3cG9ydFkgLSBfdGhpczUuc3RhdGUub2Zmc2V0VG9wXTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgdGV4dCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBvblN1Ym1pdDogd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdmlhS2V5Ym9hcmQsXG4gICAgICAgICAgb3JpZ2luYWxUZXh0XG4gICAgICAgIH0gPSBfcmVmMjtcbiAgICAgICAgY29uc3QgaXNEZWxldGVkID0gIXRleHQudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdUZXh0ID0gb3JpZ2luYWxUZXh0OyAvL3Nob3VsZCB0aGlzIGJlIG9yaWdpbmFsVGV4dD8/XG5cbiAgICAgICAgbGV0IGxpbmsgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKF90aGlzNS5wcm9wcy5vbkJlZm9yZVRleHRTdWJtaXQpIHtcbiAgICAgICAgICBjb25zdCBbdXBkYXRlZFRleHQsIHVwZGF0ZWRPcmlnaW5hbFRleHQsIGxdID0gX3RoaXM1LnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdChlbGVtZW50LCB0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCk7XG5cbiAgICAgICAgICB0ZXh0ID0gdXBkYXRlZFRleHQgPz8gdGV4dDtcbiAgICAgICAgICBvcmlnaW5hbFRleHQgPSB1cGRhdGVkT3JpZ2luYWxUZXh0ID8/IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICBsaW5rID0gbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgb3JpZ2luYWxUZXh0LCBpc0RlbGV0ZWQsIHJhd1RleHQsIGxpbmspOyAvLyBzZWxlY3QgdGhlIGNyZWF0ZWQgdGV4dCBlbGVtZW50IG9ubHkgaWYgc3VibWl0dGluZyB2aWEga2V5Ym9hcmRcbiAgICAgICAgLy8gKHdoZW4gc3VibWl0dGluZyB2aWEgY2xpY2sgaXQgc2hvdWxkIGFjdCBhcyBzaWduYWwgdG8gZGVzZWxlY3QpXG5cbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgJiYgdmlhS2V5Ym9hcmQpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRUb1NlbGVjdCA9IGVsZW1lbnQuY29udGFpbmVySWQgPyBlbGVtZW50LmNvbnRhaW5lcklkIDogZWxlbWVudC5pZDtcblxuICAgICAgICAgIF90aGlzNS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgW2VsZW1lbnRJZFRvU2VsZWN0XTogdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0RlbGV0ZWQpIHtcbiAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRGVsZXRpb24oX3RoaXM1LnNjZW5lLmdldEVsZW1lbnRzKCksIFtlbGVtZW50XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGVsZXRlZCB8fCBpc0V4aXN0aW5nRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzNS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM1LnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzNS5zdGF0ZS5lbGVtZW50TG9ja2VkKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXM1LmNhbnZhcywgX3RoaXM1LnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNS5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfSksXG4gICAgICBlbGVtZW50LFxuICAgICAgZXhjYWxpZHJhd0NvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBhcHA6IHRoaXNcbiAgICB9KTsgLy8gZGVzZWxlY3QgYWxsIG90aGVyIGVsZW1lbnRzIHdoZW4gaW5zZXJ0aW5nIHRleHRcblxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpOyAvLyBkbyBhbiBpbml0aWFsIHVwZGF0ZSB0byByZS1pbml0aWFsaXplIGVsZW1lbnQgcG9zaXRpb24gc2luY2Ugd2Ugd2VyZVxuICAgIC8vIG1vZGlmeWluZyBlbGVtZW50J3MgeC95IGZvciBzYWtlIG9mIGVkaXRvciAoY2FzZTogc3luY2luZyB0byByZW1vdGUpXG5cbiAgICB1cGRhdGVFbGVtZW50KGVsZW1lbnQudGV4dCwgZWxlbWVudC5vcmlnaW5hbFRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIGRlc2VsZWN0RWxlbWVudHMoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiAhZWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSwgb3B0cykge1xuICAgIGNvbnN0IGFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oeCwgeSwgb3B0cz8uaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQpO1xuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID0gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07IC8vIElmIHdlJ3JlIGhpdHRpbmcgZWxlbWVudCB3aXRoIGhpZ2hlc3Qgei1pbmRleCBvbmx5IG9uIGl0cyBib3VuZGluZyBib3hcbiAgICAgIC8vIHdoaWxlIGFsc28gaGl0dGluZyBvdGhlciBlbGVtZW50IGZpZ3VyZSwgdGhlIGxhdHRlciBzaG91bGQgYmUgY29uc2lkZXJlZC5cblxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsIHRoaXMuc3RhdGUsIHgsIHkpID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl0gOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIGxldCBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgY29uc3QgZWxlbWVudHMgPSBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA/IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSA6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAhKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbihlbGVtZW50cywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBoaXRUZXN0KGVsZW1lbnQsIF90aGlzNi5zdGF0ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpIHtcbiAgICBpZiAobGFzdFBvaW50ZXJVcCAhPT0gbnVsbCkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHdlIGRvbid0IGdldCBhIHBvaW50ZXJ1cCBhZnRlciBhIHBvaW50ZXJkb3duLFxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb250ZXh0dWFsIG1lbnUgb3IgYWxlcnQgaXMgdHJpZ2dlcmVkLiBJbiBvcmRlciB0byBhdm9pZFxuICAgICAgLy8gYmVpbmcgaW4gYSB3ZWlyZCBzdGF0ZSwgd2UgY2xlYW4gdXAgb24gdGhlIG5leHQgcG9pbnRlcmRvd25cbiAgICAgIGxhc3RQb2ludGVyVXAoZXZlbnQpO1xuICAgIH1cbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgcGFubmluZ1xuXG5cbiAgdXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgfSk7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbFBvaW50ZXJEb3duU3RhdGUoZXZlbnQpIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKGdldEdyaWRQb2ludChvcmlnaW4ueCwgb3JpZ2luLnksIHRoaXMuc3RhdGUuZ3JpZFNpemUpKSxcbiAgICAgIHNjcm9sbGJhcnM6IGlzT3ZlclNjcm9sbEJhcnMoY3VycmVudFNjcm9sbEJhcnMsIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCksXG4gICAgICAvLyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBiZWNhdXNlIHdlJ2xsIGJlIHVwZGF0aW5nIHRoaXMgc3RhdGVcbiAgICAgIGxhc3RDb29yZHM6IF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbiksXG4gICAgICBvcmlnaW5hbEVsZW1lbnRzOiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICAgICAgYWNjLnNldChlbGVtZW50LmlkLCBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcCgpKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LFxuICAgICAgICBhcnJvd0RpcmVjdGlvbjogXCJvcmlnaW5cIixcbiAgICAgICAgY2VudGVyOiB7XG4gICAgICAgICAgeDogKG1heFggKyBtaW5YKSAvIDIsXG4gICAgICAgICAgeTogKG1heFkgKyBtaW5ZKSAvIDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpdDoge1xuICAgICAgICBlbGVtZW50OiBudWxsLFxuICAgICAgICBhbGxIaXRFbGVtZW50czogW10sXG4gICAgICAgIHdhc0FkZGVkVG9TZWxlY3Rpb246IGZhbHNlLFxuICAgICAgICBoYXNCZWVuRHVwbGljYXRlZDogZmFsc2UsXG4gICAgICAgIGhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzOiB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKG9yaWdpbiwgc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgIGhhc0hpdEVsZW1lbnRJbnNpZGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsXG4gICAgICB9LFxuICAgICAgYm94U2VsZWN0aW9uOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG5cblxuICBoYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgaWYgKCEocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlckVpdGhlciAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczcuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXM3LmNhbnZhcywgX3RoaXM3LnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICBfdGhpczcuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzNy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIH0pO1xuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzQVNlbGVjdGVkRWxlbWVudChoaXRFbGVtZW50KSB7XG4gICAgcmV0dXJuIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXTtcbiAgfVxuXG4gIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKHBvaW50LCBzZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gSG93IG1hbnkgcGl4ZWxzIG9mZiB0aGUgc2hhcGUgYm91bmRhcnkgd2Ugc3RpbGwgY29uc2lkZXIgYSBoaXRcblxuXG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4gcG9pbnQueCA+IHgxIC0gdGhyZXNob2xkICYmIHBvaW50LnggPCB4MiArIHRocmVzaG9sZCAmJiBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiYgcG9pbnQueSA8IHkyICsgdGhyZXNob2xkO1xuICB9XG5cbiAgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKF90aGlzOC5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczgubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKF90aGlzOS5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczkubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgZHJhZ09mZnNldFhZIG9ubHkgYWZ0ZXIgd2UndmUgdXBkYXRlZFxuICAgICAgLy8gYHN0YXRlLnNlbGVjdGVkRWxlbWVudElkc2Agb24gcG9pbnRlckRvd24uIERvaW5nIGl0IGhlcmUgaW4gcG9pbnRlck1vdmVcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgc2hvdWxkIGhvcGVmdWxseSBlbnN1cmUgd2UncmUgYWxyZWFkeSB3b3JraW5nIHdpdGhcbiAgICAgIC8vIHRoZSB1cGRhdGVkIHN0YXRlLlxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQgPT09IG51bGwpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9IHR1cGxlVG9Db29ycyhnZXREcmFnT2Zmc2V0WFkoZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTAuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEwLnN0YXRlKTtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTsgLy8gZm9yIGFycm93cy9saW5lcywgZG9uJ3Qgc3RhcnQgZHJhZ2dpbmcgdW50aWwgYSBnaXZlbiB0aHJlc2hvbGRcbiAgICAgIC8vIHRvIGVuc3VyZSB3ZSBkb24ndCBjcmVhdGUgYSAyLXBvaW50IGFycm93IGJ5IG1pc3Rha2Ugd2hlblxuICAgICAgLy8gdXNlciBjbGlja3MgbW91c2UgaW4gYSB3YXkgdGhhdCBpdCBtb3ZlcyBhIHRpbnkgYml0ICh0aHVzXG4gICAgICAvLyB0cmlnZ2VyaW5nIHBvaW50ZXJtb3ZlKVxuXG4gICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8IF90aGlzMTAuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKSkge1xuICAgICAgICBpZiAoZGlzdGFuY2UyZChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkgPCBEUkFHR0lOR19USFJFU0hPTEQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuXG4gICAgICAgIGlmIChfdGhpczEwLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoX3RoaXMxMC5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTAuc2V0U3RhdGUoYXBwU3RhdGUpO1xuICAgICAgICB9LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZnVuY3Rpb24gKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSB7XG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhlbGVtZW50LCBwb2ludHNTY2VuZUNvb3Jkcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaWREcmFnKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczEwLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoKGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgfHwgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpICYmICggLy8gdGhpcyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzIHdoZW4gY2xpY2tpbmcgaW5zaWRlIHRoZVxuICAgICAgLy8gbGluZSdzIGJvdW5kaW5nIGJveFxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgIWV2ZW50LnNoaWZ0S2V5KSAmJiAoIC8vIGJveC1zZWxlY3Rpbmcgd2l0aG91dCBzaGlmdCB3aGVuIGVkaXRpbmcgbGluZSwgbm90IGNsaWNraW5nIG9uIGEgbGluZVxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudD8uZWxlbWVudElkICE9PSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50Py5pZCB8fCBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKSkge1xuICAgICAgICAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpOyAvLyBwcmV2ZW50IGRyYWdnaW5nIGV2ZW4gaWYgd2UncmUgbm8gbG9uZ2VyIGhvbGRpbmcgY21kL2N0cmwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGl0IHdvdWxkIGhhdmUgd2VpcmQgcmVzdWx0cyAoc3R1ZmYganVtcGluZyBhbGwgb3ZlciB0aGUgc2NyZWVuKVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgIXBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCkge1xuICAgICAgICAgIGNvbnN0IFtkcmFnWCwgZHJhZ1ldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCwgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbTWF0aC5hYnMocG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCksIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpXTsgLy8gV2Ugb25seSBkcmFnIGluIG9uZSBkaXJlY3Rpb24gaWYgc2hpZnQgaXMgcHJlc3NlZFxuXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICAgIGRyYWdTZWxlY3RlZEVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUsIHNlbGVjdGVkRWxlbWVudHMsIGRyYWdYLCBkcmFnWSwgbG9ja0RpcmVjdGlvbiwgZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWSwgX3RoaXMxMC5zdGF0ZSk7XG5cbiAgICAgICAgICBfdGhpczEwLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7IC8vIFdlIGR1cGxpY2F0ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpZiBhbHQgaXMgcHJlc3NlZCBvbiBwb2ludGVyIG1vdmVcblxuXG4gICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgdG9wIG9mIHRoZSB6IGluZGV4IHN0YWNrLCBhbmRcbiAgICAgICAgICAgIC8vIHB1dCB0aGUgZHVwbGljYXRlcyB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdXNlZCB0byBiZS5cbiAgICAgICAgICAgIC8vICh0aGUgb3JpZ2luIHBvaW50IHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydGVkKVxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c1RvQXBwZW5kID0gW107XG4gICAgICAgICAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkSWRUb0R1cGxpY2F0ZWRJZCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudElkcyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIF90aGlzMTAuc3RhdGUsIHRydWUpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fCAvLyBjYXNlOiB0aGUgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzIG1pZ2h0IG5vdCBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgLy8gdXBkYXRlZCB5ZXQgYnkgdGhlIHRpbWUgdGhpcyBtb3VzZW1vdmUgZXZlbnQgaXMgZmlyZWRcbiAgICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaGl0RWxlbWVudD8uaWQgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZWRFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEwLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KGR1cGxpY2F0ZWRFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICB4OiBkdXBsaWNhdGVkRWxlbWVudC54ICsgKG9yaWdpbkRyYWdYIC0gZHJhZ1gpLFxuICAgICAgICAgICAgICAgICAgeTogZHVwbGljYXRlZEVsZW1lbnQueSArIChvcmlnaW5EcmFnWSAtIGRyYWdZKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRTY2VuZUVsZW1lbnRzID0gWy4uLm5leHRFbGVtZW50cywgLi4uZWxlbWVudHNUb0FwcGVuZF07XG4gICAgICAgICAgICBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHNUb0FwcGVuZCwgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG4gICAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dFNjZW5lRWxlbWVudHMsIGVsZW1lbnRzVG9BcHBlbmQsIG9sZElkVG9EdXBsaWNhdGVkSWQsIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIik7XG5cbiAgICAgICAgICAgIF90aGlzMTAuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRTY2VuZUVsZW1lbnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gcmVhZCB0aGlzLnN0YXRlIHdpdGhpbiBlYWNoIG1vdmUgZXZlbnQsXG4gICAgICAvLyBvdGhlcndpc2Ugd2Ugd291bGQgcmVhZCBhIHN0YWxlIG9uZSFcblxuXG4gICAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSBfdGhpczEwLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcblxuICAgICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBjb25zdCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBjb25zdCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55O1xuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IGRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlc1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gZ3JpZFggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gZ3JpZFkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpICYmIHBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgd2lkdGg6IGR4LFxuICAgICAgICAgICAgaGVpZ2h0OiBkeVxuICAgICAgICAgIH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSwgZHgsIGR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtkeCwgZHldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIF90aGlzMTAubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZHJhZ2dpbmdFbGVtZW50LCBbcG9pbnRlckNvb3Jkc10sIF90aGlzMTAuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG5cbiAgICAgICAgX3RoaXMxMC5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIC8vIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgKHdpdGhvdXQgc2hpZnQpXG4gICAgICAgICFfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmIGlzU29tZUVsZW1lbnRTZWxlY3RlZChlbGVtZW50cywgX3RoaXMxMC5zdGF0ZSkpIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLCBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBib3gtc2VsZWN0IGxpbmUgZWRpdG9yIHBvaW50c1xuXG5cbiAgICAgICAgaWYgKF90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZUJveFNlbGVjdGlvbihldmVudCwgX3RoaXMxMC5zdGF0ZSwgX3RoaXMxMC5zZXRTdGF0ZS5iaW5kKF90aGlzMTApKTsgLy8gcmVndWxhciBib3gtc2VsZWN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihlbGVtZW50cywgZHJhZ2dpbmdFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgIH0sIHt9KSksIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPyB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTogIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aFxuICAgICAgICAgICAgICB9IDogbnVsbCksXG4gICAgICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoID09PSAxICYmIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uWzBdLmxpbmsgPyBcImluZm9cIiA6IGZhbHNlXG4gICAgICAgICAgICB9KSwgX3RoaXMxMC5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9IC8vIFJldHVybnMgd2hldGhlciB0aGUgcG9pbnRlciBtb3ZlIGhhcHBlbmVkIG92ZXIgZWl0aGVyIHNjcm9sbGJhclxuXG5cbiAgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlclZlcnRpY2FsKSB7XG4gICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnN0IGR5ID0geSAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSAtIGR5IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICB9KTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0geTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzMTEgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoY2hpbGRFdmVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudCxcbiAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgZWxlbWVudExvY2tlZCxcbiAgICAgICAgaXNSZXNpemluZyxcbiAgICAgICAgaXNSb3RhdGluZ1xuICAgICAgfSA9IF90aGlzMTEuc3RhdGU7XG5cbiAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2UsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogbnVsbCxcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIC8vIHRleHQgZWxlbWVudHMgYXJlIHJlc2V0IG9uIGZpbmFsaXplLCBhbmQgcmVzZXR0aW5nIG9uIHBvaW50ZXJ1cFxuICAgICAgICAvLyBtYXkgY2F1c2UgaXNzdWVzIHdpdGggZG91YmxlIHRhcHNcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG11bHRpRWxlbWVudCB8fCBpc1RleHRFbGVtZW50KF90aGlzMTEuc3RhdGUuZWRpdGluZ0VsZW1lbnQpID8gX3RoaXMxMS5zdGF0ZS5lZGl0aW5nRWxlbWVudCA6IG51bGxcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczExLnNhdmVQb2ludGVyKGNoaWxkRXZlbnQuY2xpZW50WCwgY2hpbGRFdmVudC5jbGllbnRZLCBcInVwXCIpOyAvLyBIYW5kbGUgZW5kIG9mIGRyYWdnaW5nIGEgcG9pbnQgb2YgYSBsaW5lYXIgZWxlbWVudCwgbWlnaHQgY2xvc2UgYSBsb29wXG4gICAgICAvLyBhbmQgc2V0cyBiaW5kaW5nIGVsZW1lbnRcblxuXG4gICAgICBpZiAoX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkICYmIChwb2ludGVyRG93blN0YXRlLmhpdD8uZWxlbWVudD8uaWQgIT09IF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkIHx8ICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKSkge1xuICAgICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKGNoaWxkRXZlbnQsIF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsIF90aGlzMTEuc3RhdGUpO1xuXG4gICAgICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSBfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uVXApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24pO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCk7XG5cbiAgICAgIGlmIChfdGhpczExLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZSk7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBsZXQgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTsgLy8gQWxsb3dzIGRvdHMgdG8gYXZvaWQgYmVpbmcgZmxhZ2dlZCBhcyBpbmZpbml0ZWx5IHNtYWxsXG5cbiAgICAgICAgaWYgKGR4ID09PSBwb2ludHNbMF1bMF0gJiYgZHkgPT09IHBvaW50c1swXVsxXSkge1xuICAgICAgICAgIGR5ICs9IDAuMDAwMTtcbiAgICAgICAgICBkeCArPSAwLjAwMDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IFtdIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGNoaWxkRXZlbnQucHJlc3N1cmVdO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IFtkeCwgZHldXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IGRyYWdnaW5nRWxlbWVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIF90aGlzMTEuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICBfdGhpczExLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkO1xuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBfdGhpczExLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGNoaWxkRXZlbnQsIF90aGlzMTEuc3RhdGUpO1xuXG4gICAgICAgIGlmICghcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmIGRyYWdnaW5nRWxlbWVudCAmJiAhbXVsdGlFbGVtZW50KSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLmRyYWdnaW5nRWxlbWVudC5wb2ludHMsIFtwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueCwgcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50LnldXVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQ6IGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBfdGhpczExLnN0YXRlLmRyYWdnaW5nRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhbXVsdGlFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGlzQmluZGluZ0VuYWJsZWQoX3RoaXMxMS5zdGF0ZSkgJiYgaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMS5zdGF0ZSwgX3RoaXMxMS5zY2VuZSwgcG9pbnRlckNvb3Jkcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogbnVsbFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFlbGVtZW50TG9ja2VkKSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcihfdGhpczExLmNhbnZhcyk7XG5cbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBbX3RoaXMxMS5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgW190aGlzMTEuc3RhdGUuZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiBkcmFnZ2luZ0VsZW1lbnQgJiYgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAvLyByZW1vdmUgaW52aXNpYmxlIGVsZW1lbnQgd2hpY2ggd2FzIGFkZGVkIGluIG9uUG9pbnRlckRvd25cbiAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5zbGljZSgwLCAtMSkpO1xuXG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGRyYWdnaW5nRWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50KSB7XG4gICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChyZXNpemluZ0VsZW1lbnQpKSB7XG4gICAgICAgIF90aGlzMTEuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5pZCAhPT0gcmVzaXppbmdFbGVtZW50LmlkO1xuICAgICAgICB9KSk7XG4gICAgICB9IC8vIENvZGUgYmVsb3cgaGFuZGxlcyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50KHMpIHdlcmVuJ3RcbiAgICAgIC8vIGRyYWcgb3IgYWRkZWQgdG8gc2VsZWN0aW9uIG9uIHBvaW50ZXIgZG93biBwaGFzZS5cblxuXG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcblxuICAgICAgaWYgKGhpdEVsZW1lbnQgJiYgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiAmJiAoIC8vIGlmIHdlJ3JlIGVkaXRpbmcgYSBsaW5lLCBwb2ludGVydXAgc2hvdWxkbid0IHN3aXRjaCBzZWxlY3Rpb24gaWZcbiAgICAgIC8vIGJveCBzZWxlY3RlZFxuICAgICAgIV90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgIXBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkKSkge1xuICAgICAgICAvLyB3aGVuIGluc2lkZSBsaW5lIGVkaXRvciwgc2hpZnQgc2VsZWN0cyBwb2ludHMgaW5zdGVhZFxuICAgICAgICBpZiAoY2hpbGRFdmVudC5zaGlmdEtleSAmJiAhX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIGlmIChfdGhpczExLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXSkge1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRWaWFHcm91cChfdGhpczExLnN0YXRlLCBoaXRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVuc2VsZWN0IGFsbCBncm91cHMgaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdyb3Vwc1xuICAgICAgICAgICAgICAvLyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgY29uc3QgaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzID0gaGl0RWxlbWVudC5ncm91cElkcy5mbGF0TWFwKGZ1bmN0aW9uIChncm91cElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRzSW5Hcm91cChfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCksIGdyb3VwSWQpO1xuICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAocHJldklkLCBhY2MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2SWQpLCBhY2MpO1xuICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAoX3ByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgaGl0RWxlbWVudC5ncm91cElkcy5tYXAoZnVuY3Rpb24gKGdJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIFtnSWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBhY2MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldiksIGFjYyk7XG4gICAgICAgICAgICAgICAgICB9LCB7fSkpLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVsZW1lbnQgZnJvbSBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG4gICAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KSwgX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChfcHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50cygpKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIV90aGlzMTEuc3RhdGUuaXNSZXNpemluZyAmJiAoaGl0RWxlbWVudCAmJiBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQoaGl0RWxlbWVudCwgX3RoaXMxMS5zdGF0ZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkgfHwgIWhpdEVsZW1lbnQgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpKSB7XG4gICAgICAgIC8vIERlc2VsZWN0IHNlbGVjdGVkIGVsZW1lbnRzXG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnRMb2NrZWQgJiYgZWxlbWVudFR5cGUgIT09IFwiZnJlZWRyYXdcIiAmJiBkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiB8fCBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczExLnN0YXRlKSkge1xuICAgICAgICBfdGhpczExLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgfHwgaXNSZXNpemluZyB8fCBpc1JvdGF0aW5nKSB7XG4gICAgICAgIChpc0JpbmRpbmdFbmFibGVkKF90aGlzMTEuc3RhdGUpID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyA6IHVuYmluZExpbmVhckVsZW1lbnRzKShnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMS5zdGF0ZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnRMb2NrZWQgJiYgZWxlbWVudFR5cGUgIT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICByZXNldEN1cnNvcihfdGhpczExLmNhbnZhcyk7XG5cbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBtYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3NcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKGhpdEVsZW1lbnQpIHtcbiAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAvLyBDb250aW51ZSBlZGl0aW5nIHRoZSBzYW1lIGdyb3VwIGlmIHRoZSB1c2VyIHNlbGVjdGVkIGEgZGlmZmVyZW50XG4gICAgICAgIC8vIGVsZW1lbnQgZnJvbSBpdFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCkgPyBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgOiBudWxsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbih4LCB5LCBhcHBTdGF0ZSwgY2FudmFzLCBzY2FsZSkge1xuICAgIGNvbnN0IGVsZW1lbnRDbGlja2VkSW5zaWRlID0gZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbih0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuICFpc1RleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pLCB4LCB5KTtcblxuICAgIGlmIChlbGVtZW50Q2xpY2tlZEluc2lkZSkge1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclggPSBlbGVtZW50Q2xpY2tlZEluc2lkZS54ICsgZWxlbWVudENsaWNrZWRJbnNpZGUud2lkdGggLyAyO1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclkgPSBlbGVtZW50Q2xpY2tlZEluc2lkZS55ICsgZWxlbWVudENsaWNrZWRJbnNpZGUuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlVG9DZW50ZXIgPSBNYXRoLmh5cG90KHggLSBlbGVtZW50Q2VudGVyWCwgeSAtIGVsZW1lbnRDZW50ZXJZKTtcbiAgICAgIGNvbnN0IGlzU25hcHBlZFRvQ2VudGVyID0gZGlzdGFuY2VUb0NlbnRlciA8IFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xEO1xuXG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHZpZXdwb3J0WCxcbiAgICAgICAgICB5OiB2aWV3cG9ydFlcbiAgICAgICAgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgICAgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCxcbiAgICAgICAgICBzY2VuZVk6IGVsZW1lbnRDZW50ZXJZXG4gICAgICAgIH0sIGFwcFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2aWV3cG9ydFgsXG4gICAgICAgICAgdmlld3BvcnRZLFxuICAgICAgICAgIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICAgIGVsZW1lbnRDZW50ZXJZXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FudmFzT2Zmc2V0cygpIHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxlZnQsXG4gICAgICAgIHRvcFxuICAgICAgfSA9IGV4Y2FsaWRyYXdDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvZmZzZXRMZWZ0OiBsZWZ0LFxuICAgICAgICBvZmZzZXRUb3A6IHRvcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0TGVmdDogMCxcbiAgICAgIG9mZnNldFRvcDogMFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVMYW5ndWFnZSgpIHtcbiAgICB2YXIgX3RoaXMxMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gbGFuZ3VhZ2VzLmZpbmQoZnVuY3Rpb24gKGxhbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmcuY29kZSA9PT0gX3RoaXMxMi5wcm9wcy5sYW5nQ29kZTtcbiAgICAgIH0pIHx8IGRlZmF1bHRMYW5nO1xuICAgICAgeWllbGQgc2V0TGFuZ3VhZ2UoY3VycmVudExhbmcpO1xuXG4gICAgICBfdGhpczEyLnNldEFwcFN0YXRlKHt9KTtcbiAgICB9KSgpO1xuICB9XG5cbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRFU1QgSE9PS1Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuQXBwLmRlZmF1bHRQcm9wcyA9IHtcbiAgLy8gbmVlZGVkIGZvciB0ZXN0cyB0byBwYXNzIHNpbmNlIHdlIGRpcmVjdGx5IHJlbmRlciBBcHAgaW4gbWFueSB0ZXN0c1xuICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OU1xufTtcblxudmFyIF9pbml0aWFsaXNlUHJvcHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpczEzID0gdGhpcztcblxuICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gIHRoaXMucmMgPSBudWxsO1xuICB0aGlzLnVubW91bnRlZCA9IGZhbHNlO1xuICB0aGlzLmlzTW9iaWxlID0gZmFsc2U7XG4gIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgdGhpcy5maWxlcyA9IHt9O1xuICB0aGlzLmltYWdlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gIHRoaXMubGFzdFBvaW50ZXJEb3duID0gbnVsbDtcbiAgdGhpcy5sYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcblxuICB0aGlzLmZvY3VzQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdGhpczEzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gIH07XG5cbiAgdGhpcy5nZXRTY2VuZUVsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gIH07XG5cbiAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChhY3Rpb25SZXN1bHQpIHtcbiAgICAvLyBTaW5jZSBjb250ZXh0IG1lbnUgY2xvc2VzIHdoZW4gYWN0aW9uIHRyaWdnZXJlZCBzbyBzZXR0aW5nIHRvIGZhbHNlXG4gICAgX3RoaXMxMy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcblxuICAgIGlmIChfdGhpczEzLnVubW91bnRlZCB8fCBhY3Rpb25SZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVkaXRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIGlmIChhY3Rpb25SZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgIGFjdGlvblJlc3VsdC5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZCA9PT0gZWxlbWVudC5pZCAmJiBfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50ICYmIGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhhY3Rpb25SZXN1bHQuZWxlbWVudHMpO1xuXG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvblJlc3VsdC5maWxlcykge1xuICAgICAgX3RoaXMxMy5maWxlcyA9IGFjdGlvblJlc3VsdC5yZXBsYWNlRmlsZXMgPyBhY3Rpb25SZXN1bHQuZmlsZXMgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBhY3Rpb25SZXN1bHQuZmlsZXMpO1xuXG4gICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwgZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZpZXdNb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnZpZXdNb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgIGxldCB6ZW5Nb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lnplbk1vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgbGV0IGdyaWRTaXplID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uZ3JpZFNpemUgfHwgbnVsbDtcbiAgICAgIGxldCB0aGVtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnRoZW1lIHx8IFRIRU1FLkxJR0hUO1xuICAgICAgbGV0IG5hbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5uYW1lID8/IF90aGlzMTMuc3RhdGUubmFtZTtcblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB2aWV3TW9kZUVuYWJsZWQgPSBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLnplbk1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHplbk1vZGVFbmFibGVkID0gX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBncmlkU2l6ZSA9IF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLnRoZW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoZW1lID0gX3RoaXMxMy5wcm9wcy50aGVtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBfdGhpczEzLnByb3BzLm5hbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgbmFtZSA9IF90aGlzMTMucHJvcHMubmFtZTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gdXNpbmcgT2JqZWN0LmFzc2lnbiBpbnN0ZWFkIG9mIHNwcmVhZCB0byBmb29sIFRTIDQuMi4yKyBpbnRvXG4gICAgICAgIC8vIHJlZ2FyZGluZyB0aGUgcmVzdWx0aW5nIHR5cGUgYXMgbm90IGNvbnRhaW5pbmcgdW5kZWZpbmVkXG4gICAgICAgIC8vICh3aGljaCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2lsbCBuZXZlciBjb250YWluKVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwge30sIHtcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogZWRpdGluZ0VsZW1lbnQgfHwgYWN0aW9uUmVzdWx0LmFwcFN0YXRlPy5lZGl0aW5nRWxlbWVudCB8fCBudWxsLFxuICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICBncmlkU2l6ZSxcbiAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICBuYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LnN5bmNIaXN0b3J5KSB7XG4gICAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnNldEN1cnJlbnRTdGF0ZShfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbkJsdXIgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5vblVubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLm9uQmx1cigpO1xuICB9O1xuXG4gIHRoaXMuZGlzYWJsZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICB0aGlzLm9uRm9udExvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLm9uU2NlbmVVcGRhdGVkKCk7XG4gIH07XG5cbiAgdGhpcy5pbXBvcnRMaWJyYXJ5RnJvbVVybCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICh1cmwsIHRva2VuKSB7XG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2guaW5jbHVkZXMoVVJMX0hBU0hfS0VZUy5hZGRMaWJyYXJ5KSkge1xuICAgICAgICBjb25zdCBoYXNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSk7XG4gICAgICAgIGhhc2guZGVsZXRlKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSk7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgQVBQX05BTUUsIGAjJHtoYXNoLnRvU3RyaW5nKCl9YCk7XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBxdWVyeS5kZWxldGUoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSk7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgQVBQX05BTUUsIGA/JHtxdWVyeS50b1N0cmluZygpfWApO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0geWllbGQgZmV0Y2goZGVjb2RlVVJJQ29tcG9uZW50KHVybCkpO1xuICAgICAgICBjb25zdCBibG9iID0geWllbGQgcmVxdWVzdC5ibG9iKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHlpZWxkIGJsb2IudGV4dCgpKTtcblxuICAgICAgICBpZiAoIWlzVmFsaWRMaWJyYXJ5KGpzb24pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4gPT09IF90aGlzMTMuaWQgfHwgd2luZG93LmNvbmZpcm0odChcImFsZXJ0cy5jb25maXJtQWRkTGlicmFyeVwiLCB7XG4gICAgICAgICAgbnVtU2hhcGVzOiAoanNvbi5saWJyYXJ5SXRlbXMgfHwganNvbi5saWJyYXJ5IHx8IFtdKS5sZW5ndGhcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgeWllbGQgX3RoaXMxMy5saWJyYXJ5LmltcG9ydExpYnJhcnkoYmxvYiwgXCJwdWJsaXNoZWRcIik7IC8vIGhhY2sgdG8gcmVyZW5kZXIgdGhlIGxpYnJhcnkgaXRlbXMgYWZ0ZXIgaW1wb3J0XG5cbiAgICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5pc0xpYnJhcnlPcGVuKSB7XG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgaXNMaWJyYXJ5T3BlbjogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNMaWJyYXJ5T3BlbjogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB3aW5kb3cuYWxlcnQodChcImFsZXJ0cy5lcnJvckxvYWRpbmdMaWJyYXJ5XCIpKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfdGhpczEzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94LCBfeDIpIHtcbiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLnJlc2V0SGlzdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfTtcblxuICB0aGlzLnJlc2V0U2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0RGVmYXVsdEFwcFN0YXRlKCkpLCB7fSwge1xuICAgICAgICBpc0xvYWRpbmc6IG9wdHM/LnJlc2V0TG9hZGluZ1N0YXRlID8gZmFsc2UgOiBzdGF0ZS5pc0xvYWRpbmcsXG4gICAgICAgIHRoZW1lOiBfdGhpczEzLnN0YXRlLnRoZW1lXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIF90aGlzMTMucmVzZXRIaXN0b3J5KCk7XG4gIH0pO1xuICB0aGlzLmluaXRpYWxpemVTY2VuZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIGlmIChcImxhdW5jaFF1ZXVlXCIgaW4gd2luZG93ICYmIFwiTGF1bmNoUGFyYW1zXCIgaW4gd2luZG93KSB7XG4gICAgICB3aW5kb3cubGF1bmNoUXVldWUuc2V0Q29uc3VtZXIoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmNSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAobGF1bmNoUGFyYW1zKSB7XG4gICAgICAgICAgaWYgKCFsYXVuY2hQYXJhbXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGxhdW5jaFBhcmFtcy5maWxlc1swXTtcbiAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgYmxvYi5oYW5kbGUgPSBmaWxlSGFuZGxlO1xuICAgICAgICAgIGxvYWRGcm9tQmxvYihibG9iLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKS50aGVuKGZ1bmN0aW9uIChzY2VuZSkge1xuICAgICAgICAgICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUpLCB7fSwge1xuICAgICAgICAgICAgICBhcHBTdGF0ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZS5hcHBTdGF0ZSB8fCBfdGhpczEzLnN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94Mykge1xuICAgICAgICAgIHJldHVybiBfcmVmNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSgpKTtcbiAgICB9XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGluaXRpYWxEYXRhID0gKHlpZWxkIF90aGlzMTMucHJvcHMuaW5pdGlhbERhdGEpIHx8IG51bGw7XG5cbiAgICAgIGlmIChpbml0aWFsRGF0YT8ubGlicmFyeUl0ZW1zKSB7XG4gICAgICAgIF90aGlzMTMubGlicmFyeUl0ZW1zRnJvbVN0b3JhZ2UgPSByZXN0b3JlTGlicmFyeUl0ZW1zKGluaXRpYWxEYXRhLmxpYnJhcnlJdGVtcywgXCJ1bnB1Ymxpc2hlZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgXCJFbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgaW1wb3J0aW5nIG9yIHJlc3RvcmluZyBzY2VuZSBkYXRhXCJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2VuZSA9IHJlc3RvcmUoaW5pdGlhbERhdGEsIG51bGwsIG51bGwpO1xuICAgIHNjZW5lLmFwcFN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZS5hcHBTdGF0ZSksIHt9LCB7XG4gICAgICBlbGVtZW50VHlwZTogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIiA/IFwic2VsZWN0aW9uXCIgOiBzY2VuZS5hcHBTdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9KTtcblxuICAgIGlmIChpbml0aWFsRGF0YT8uc2Nyb2xsVG9Db250ZW50KSB7XG4gICAgICBzY2VuZS5hcHBTdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCBjYWxjdWxhdGVTY3JvbGxDZW50ZXIoc2NlbmUuZWxlbWVudHMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCB7fSwge1xuICAgICAgICB3aWR0aDogX3RoaXMxMy5zdGF0ZS53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBfdGhpczEzLnN0YXRlLmhlaWdodCxcbiAgICAgICAgb2Zmc2V0VG9wOiBfdGhpczEzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0XG4gICAgICB9KSwgbnVsbCkpO1xuICAgIH1cblxuICAgIF90aGlzMTMucmVzZXRIaXN0b3J5KCk7XG5cbiAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICB9KSk7XG5cbiAgICBjb25zdCBsaWJyYXJ5VXJsID0gLy8gY3VycmVudFxuICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkpLmdldChVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpIHx8IC8vIGxlZ2FjeSwga2VwdCBmb3IgY29tcGF0IHJlYXNvbnNcbiAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KTtcblxuICAgIGlmIChsaWJyYXJ5VXJsKSB7XG4gICAgICB5aWVsZCBfdGhpczEzLmltcG9ydExpYnJhcnlGcm9tVXJsKGxpYnJhcnlVcmwpO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25SZXNpemUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHt9KTtcbiAgfSk7XG4gIHRoaXMub25TY3JvbGwgPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0VG9wLFxuICAgICAgb2Zmc2V0TGVmdFxuICAgIH0gPSBfdGhpczEzLmdldENhbnZhc09mZnNldHMoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0VG9wLFxuICAgICAgICBvZmZzZXRMZWZ0XG4gICAgICB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG4gIHRoaXMub25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUgfHwgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuY3V0QWxsKCk7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcbiAgdGhpcy5vbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUgfHwgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuY29weUFsbCgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgdGhpcy5jdXRBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5jb3B5QWxsKCk7XG5cbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWxldGVTZWxlY3RlZCk7XG4gIH07XG5cbiAgdGhpcy5jb3B5QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGNvcHlUb0NsaXBib2FyZChfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuZmlsZXMpO1xuICB9O1xuXG4gIHRoaXMub25UYXBTdGFydCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICghZGlkVGFwVHdpY2UpIHtcbiAgICAgIGRpZFRhcFR3aWNlID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICAgIHRhcHBlZFR3aWNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChBcHAucmVzZXRUYXBUd2ljZSwgVEFQX1RXSUNFX1RJTUVPVVQpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gaW5zZXJ0IHRleHQgb25seSBpZiB3ZSB0YXBwZWQgdHdpY2Ugd2l0aCBhIHNpbmdsZSBmaW5nZXJcbiAgICAvLyBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSB3aWxsIGFsc28gcHJldmVudCBpbnNlcnRpbmcgdGV4dCB3aGVuIHVzZXIncyB6b29taW5nXG5cblxuICAgIGlmIChkaWRUYXBUd2ljZSAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgW3RvdWNoXSA9IGV2ZW50LnRvdWNoZXM7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgX3RoaXMxMy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFlcbiAgICAgIH0pO1xuXG4gICAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5vblRhcEVuZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX3RoaXMxMy5zdGF0ZS5wcmV2aW91c1NlbGVjdGVkRWxlbWVudElkc1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkID0gd2l0aEJhdGNoZWRVcGRhdGVzKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZXZlbnQpIHtcbiAgICAgIC8vICM2ODZcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBpc0V4Y2FsaWRyYXdBY3RpdmUgPSBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY29udGFpbnModGFyZ2V0KTtcblxuICAgICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGN1cnNvclgsIGN1cnNvclkpO1xuXG4gICAgICBpZiAoIC8vIGlmIG5vIENsaXBib2FyZEV2ZW50IHN1cHBsaWVkLCBhc3N1bWUgd2UncmUgcGFzdGluZyB2aWEgY29udGV4dE1lbnVcbiAgICAgIC8vIHRodXMgdGhlc2UgY2hlY2tzIGRvbid0IG1ha2Ugc2Vuc2VcbiAgICAgIGV2ZW50ICYmICghKGVsZW1lbnRVbmRlckN1cnNvciBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB8fCBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG11c3QgYmUgY2FsbGVkIGluIHRoZSBzYW1lIGZyYW1lICh0aHVzIGJlZm9yZSBhbnkgYXdhaXRzKSBhcyB0aGUgcGFzdGVcbiAgICAgIC8vIGV2ZW50IGVsc2Ugc29tZSBicm93c2VycyAoRkYuLi4pIHdpbGwgY2xlYXIgdGhlIGNsaXBib2FyZERhdGFcbiAgICAgIC8vIChzb21ldGhpbmcgc29tZXRoaW5nIHNlY3VyaXR5KVxuXG5cbiAgICAgIGxldCBmaWxlID0gZXZlbnQ/LmNsaXBib2FyZERhdGE/LmZpbGVzWzBdO1xuICAgICAgY29uc3QgZGF0YSA9IHlpZWxkIHBhcnNlQ2xpcGJvYXJkKGV2ZW50KTtcblxuICAgICAgaWYgKCFmaWxlICYmIGRhdGEudGV4dCkge1xuICAgICAgICBjb25zdCBzdHJpbmcgPSBkYXRhLnRleHQudHJpbSgpO1xuXG4gICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aChcIjxzdmdcIikgJiYgc3RyaW5nLmVuZHNXaXRoKFwiPC9zdmc+XCIpKSB7XG4gICAgICAgICAgLy8gaWdub3JlIFNWRyB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24gd2hpY2ggd2lsbCBiZSBkb25lIGR1cmluZyBpbWFnZVxuICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgZmlsZSA9IFNWR1N0cmluZ1RvRmlsZShzdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9IC8vIHByZWZlciBzcHJlYWRzaGVldCBkYXRhIG92ZXIgaW1hZ2UgZmlsZSAoTVMgT2ZmaWNlL0xpYnJlIE9mZmljZSlcblxuXG4gICAgICBpZiAoaXNTdXBwb3J0ZWRJbWFnZUZpbGUoZmlsZSkgJiYgIWRhdGEuc3ByZWFkc2hlZXQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHNjZW5lWCxcbiAgICAgICAgICB5OiBzY2VuZVlcbiAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICAgICAgY2xpZW50WDogY3Vyc29yWCxcbiAgICAgICAgICBjbGllbnRZOiBjdXJzb3JZXG4gICAgICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IF90aGlzMTMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgc2NlbmVZXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG5cbiAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vblBhc3RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCh5aWVsZCBfdGhpczEzLnByb3BzLm9uUGFzdGUoZGF0YSwgZXZlbnQpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGVycm9yTWVzc2FnZTogZGF0YS5lcnJvck1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuc3ByZWFkc2hlZXQpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGFzdGVEaWFsb2c6IHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEuc3ByZWFkc2hlZXQsXG4gICAgICAgICAgICBzaG93bjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgX3RoaXMxMy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgZWxlbWVudHM6IGRhdGEuZWxlbWVudHMsXG4gICAgICAgICAgZmlsZXM6IGRhdGEuZmlsZXMgfHwgbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogXCJjdXJzb3JcIlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50ZXh0KSB7XG4gICAgICAgIF90aGlzMTMuYWRkVGV4dEZyb21QYXN0ZShkYXRhLnRleHQpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcblxuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94NCkge1xuICAgICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpKTtcblxuICB0aGlzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHJlc3RvcmVFbGVtZW50cyhvcHRzLmVsZW1lbnRzLCBudWxsKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoZWxlbWVudHMpO1xuICAgIGNvbnN0IGVsZW1lbnRzQ2VudGVyWCA9IGRpc3RhbmNlKG1pblgsIG1heFgpIC8gMjtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclkgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSAvIDI7XG4gICAgY29uc3QgY2xpZW50WCA9IHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiID8gb3B0cy5wb3NpdGlvbi5jbGllbnRYIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIiA/IGN1cnNvclggOiBfdGhpczEzLnN0YXRlLndpZHRoIC8gMiArIF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjbGllbnRZID0gdHlwZW9mIG9wdHMucG9zaXRpb24gPT09IFwib2JqZWN0XCIgPyBvcHRzLnBvc2l0aW9uLmNsaWVudFkgOiBvcHRzLnBvc2l0aW9uID09PSBcImN1cnNvclwiID8gY3Vyc29yWSA6IF90aGlzMTMuc3RhdGUuaGVpZ2h0IC8gMiArIF90aGlzMTMuc3RhdGUub2Zmc2V0VG9wO1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICBjbGllbnRYLFxuICAgICAgY2xpZW50WVxuICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IGR4ID0geCAtIGVsZW1lbnRzQ2VudGVyWDtcbiAgICBjb25zdCBkeSA9IHkgLSBlbGVtZW50c0NlbnRlclk7XG4gICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChkeCwgZHksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgbmV3RWxlbWVudHMgPSBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQsIGdyb3VwSWRNYXAsIGVsZW1lbnQsIHtcbiAgICAgICAgeDogZWxlbWVudC54ICsgZ3JpZFggLSBtaW5YLFxuICAgICAgICB5OiBlbGVtZW50LnkgKyBncmlkWSAtIG1pbllcbiAgICAgIH0pO1xuICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgbmV3RWxlbWVudC5pZCk7XG4gICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICB9KTtcbiAgICBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uKG5ld0VsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG4gICAgY29uc3QgbmV4dEVsZW1lbnRzID0gWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIC4uLm5ld0VsZW1lbnRzXTtcbiAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG5cbiAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgX3RoaXMxMy5maWxlcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5maWxlcyksIG9wdHMuZmlsZXMpO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRFbGVtZW50cyk7XG5cbiAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLnN0YXRlKSwge30sIHtcbiAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlLFxuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBuZXdFbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgZWxlbWVudCkge1xuICAgICAgICBpZiAoIWlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgICAgICAgIG1hcFtlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfSwge30pLFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge31cbiAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICB9O1xuXG4gIHRoaXMuc2V0QXBwU3RhdGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShvYmopO1xuICB9O1xuXG4gIHRoaXMucmVtb3ZlUG9pbnRlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIF90aGlzMTMubGFzdFBvaW50ZXJVcCA9IGV2ZW50OyAvLyByZW1vdmUgdG91Y2ggaGFuZGxlciBmb3IgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcblxuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gXCJ0b3VjaFwiICYmIHRvdWNoVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2VzdHVyZS5wb2ludGVycy5kZWxldGUoZXZlbnQucG9pbnRlcklkKTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZUxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50TG9ja2VkOiAhcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwcmV2U3RhdGUuZWxlbWVudExvY2tlZCA/IFwic2VsZWN0aW9uXCIgOiBwcmV2U3RhdGUuZWxlbWVudFR5cGVcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVQZW5Nb2RlID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGVuTW9kZTogIXByZXZTdGF0ZS5wZW5Nb2RlXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMudG9nZ2xlWmVuTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVaZW5Nb2RlKTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZVN0YXRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zaG93U3RhdHMpIHtcbiAgICAgIHRyYWNrRXZlbnQoXCJkaWFsb2dcIiwgXCJzdGF0c1wiKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVTdGF0cyk7XG4gIH07XG5cbiAgdGhpcy5zY3JvbGxUb0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKHt9LCBjYWxjdWxhdGVTY3JvbGxDZW50ZXIoQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF0sIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzKSkpO1xuICB9O1xuXG4gIHRoaXMuem9vbVRvRml0ID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCB0YXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICBsZXQgbWF4Wm9vbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICBsZXQgbWFyZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwLjAzO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4Wm9vbSA9IDE7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh6b29tVG9GaXRFbGVtZW50cyh0YXJnZXQsIF90aGlzMTMuc3RhdGUsIGZhbHNlLCBtYXhab29tLCBtYXJnaW4pLmFwcFN0YXRlKTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZUNvbnRhaW5lclNpemUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGNvbnRhaW5lcnMpIHtcbiAgICBjb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBjb25zdCBbeCwgeV0gPSByb3RhdGUoZWwueCArIGVsLndpZHRoLCBlbC55ICsgZWwuaGVpZ2h0LCBlbC54ICsgZWwud2lkdGggLyAyLCBlbC55ICsgZWwuaGVpZ2h0IC8gMiwgZWwuYW5nbGUpO1xuICAgICAgcmVzaXplU2luZ2xlRWxlbWVudChlbCwgdHJ1ZSwgZWwsIFwic2VcIiwgdHJ1ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuY2xlYXJUb2FzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHRvYXN0TWVzc2FnZTogbnVsbFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuc2V0VG9hc3RNZXNzYWdlID0gZnVuY3Rpb24gKHRvYXN0TWVzc2FnZSkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgdG9hc3RNZXNzYWdlXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXN0b3JlRmlsZUZyb21TaGFyZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0geWllbGQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuICAgICAgY29uc3QgZmlsZSA9IHlpZWxkIHdlYlNoYXJlVGFyZ2V0Q2FjaGUubWF0Y2goXCJzaGFyZWQtZmlsZVwiKTtcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGUuYmxvYigpO1xuXG4gICAgICAgIF90aGlzMTMubG9hZEZpbGVUb0NhbnZhcyhibG9iKTtcblxuICAgICAgICB5aWVsZCB3ZWJTaGFyZVRhcmdldENhY2hlLmRlbGV0ZShcInNoYXJlZC1maWxlXCIpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgQVBQX05BTUUsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMuYWRkRmlsZXMgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZXNNYXAgPSBmaWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZmlsZURhdGEpIHtcbiAgICAgIGFjYy5zZXQoZmlsZURhdGEuaWQsIGZpbGVEYXRhKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IE1hcCgpKTtcbiAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVzTWFwKSk7IC8vIGJ1bXAgdmVyc2lvbnMgZm9yIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGFkZGVkIGZpbGVzIHNvIHRoYXRcbiAgICAvLyB3ZS9ob3N0IGFwcHMgY2FuIGRldGVjdCB0aGUgY2hhbmdlLCBhbmQgaW52YWxpZGF0ZSB0aGUgaW1hZ2UgJiBzaGFwZVxuICAgIC8vIGNhY2hlXG5cbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNNYXAuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICBfdGhpczEzLmltYWdlQ2FjaGUuZGVsZXRlKGVsZW1lbnQuZmlsZUlkKTtcblxuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBidW1wVmVyc2lvbihlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcblxuICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0pO1xuXG4gIHRoaXMuc2V0TG9jYWxGb250ID0gZnVuY3Rpb24gKHNob3dPblBhbmVsKSB7XG4gICAgc2hvd0ZvdXJ0aEZvbnQgPSBzaG93T25QYW5lbDtcbiAgfTtcblxuICB0aGlzLnNlbGVjdEVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZSh7XG4gICAgICBhcHBTdGF0ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLnN0YXRlKSwge30sIHtcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogZWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0sIHt9KVxuICAgICAgfSksXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmJyaW5nVG9Gcm9udCA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMuc2VsZWN0RWxlbWVudHMoZWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZShhY3Rpb25CcmluZ1RvRnJvbnQucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpKTtcbiAgfTtcblxuICB0aGlzLmJyaW5nRm9yd2FyZCA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMuc2VsZWN0RWxlbWVudHMoZWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZShhY3Rpb25CcmluZ0ZvcndhcmQucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpKTtcbiAgfTtcblxuICB0aGlzLnNlbmRUb0JhY2sgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICBfdGhpczEzLnNlbGVjdEVsZW1lbnRzKGVsZW1lbnRzKTtcblxuICAgIF90aGlzMTMudXBkYXRlU2NlbmUoYWN0aW9uU2VuZFRvQmFjay5wZXJmb3JtKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSkpO1xuICB9O1xuXG4gIHRoaXMuc2VuZEJhY2t3YXJkID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy5zZWxlY3RFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZVNjZW5lKGFjdGlvblNlbmRCYWNrd2FyZC5wZXJmb3JtKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSkpO1xuICB9O1xuXG4gIHRoaXMudXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKHNjZW5lRGF0YSkge1xuICAgIGlmIChzY2VuZURhdGEuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHNjZW5lRGF0YS5hcHBTdGF0ZSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuZWxlbWVudHMpIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgfVxuXG4gICAgaWYgKHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEubGlicmFyeUl0ZW1zKSB7XG4gICAgICBfdGhpczEzLmxpYnJhcnkuc2F2ZUxpYnJhcnkocmVzdG9yZUxpYnJhcnlJdGVtcyhzY2VuZURhdGEubGlicmFyeUl0ZW1zLCBcInVucHVibGlzaGVkXCIpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMub25TY2VuZVVwZGF0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7fSk7XG4gIH07XG5cbiAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgY3Vyc29yWSA9IGV2ZW50LmNsaWVudFk7XG4gIH0pO1xuICB0aGlzLm9uS2V5RG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBub3JtYWxpemUgYGV2ZW50LmtleWAgd2hlbiBDYXBzTG9jayBpcyBwcmVzc2VkICMyMzcyXG4gICAgaWYgKFwiUHJveHlcIiBpbiB3aW5kb3cgJiYgKCFldmVudC5zaGlmdEtleSAmJiAvXltBLVpdJC8udGVzdChldmVudC5rZXkpIHx8IGV2ZW50LnNoaWZ0S2V5ICYmIC9eW2Etel0kLy50ZXN0KGV2ZW50LmtleSkpKSB7XG4gICAgICBldmVudCA9IG5ldyBQcm94eShldmVudCwge1xuICAgICAgICBnZXQoZXYsIHByb3ApIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2W3Byb3BdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBmaXggZm9yIFByb3hpZXMgaGlqYWNraW5nIGB0aGlzYFxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBwcm9wID09PSBcImtleVwiID8gLy8gQ2Fwc0xvY2sgaW52ZXJ0cyBjYXBpdGFsaXphdGlvbiBiYXNlZCBvbiBTaGlmdEtleSwgc28gaW52ZXJ0XG4gICAgICAgICAgLy8gaXQgYmFja1xuICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gZXYua2V5LnRvVXBwZXJDYXNlKCkgOiBldi5rZXkudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpICYmIGV2ZW50LmtleSAhPT0gS0VZUy5FU0NBUEUgfHwgLy8gY2FzZTogdXNpbmcgYXJyb3dzIHRvIG1vdmUgYmV0d2VlbiBidXR0b25zXG4gICAgaXNBcnJvd0tleShldmVudC5rZXkpICYmIGlzSW5wdXRMaWtlKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlFVRVNUSU9OX01BUkspIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzaG93SGVscERpYWxvZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuYWN0aW9uTWFuYWdlci5oYW5kbGVLZXlEb3duKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiBfdGhpczEzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0JpbmRpbmdFbmFibGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLlpFUk8pIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xpYnJhcnlPcGVuOiAhX3RoaXMxMy5zdGF0ZS5pc0xpYnJhcnlPcGVuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzdGVwID0gX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSAmJiAoZXZlbnQuc2hpZnRLZXkgPyBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQgOiBfdGhpczEzLnN0YXRlLmdyaWRTaXplKSB8fCAoZXZlbnQuc2hpZnRLZXkgPyBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQgOiBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlLCB0cnVlKTtcbiAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19MRUZUKSB7XG4gICAgICAgIG9mZnNldFggPSAtc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1JJR0hUKSB7XG4gICAgICAgIG9mZnNldFggPSBzdGVwO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfVVApIHtcbiAgICAgICAgb2Zmc2V0WSA9IC1zdGVwO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfRE9XTikge1xuICAgICAgICBvZmZzZXRZID0gc3RlcDtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHg6IGVsZW1lbnQueCArIG9mZnNldFgsXG4gICAgICAgICAgeTogZWxlbWVudC55ICsgb2Zmc2V0WVxuICAgICAgICB9KTtcbiAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICAgICAgc2ltdWx0YW5lb3VzbHlVcGRhdGVkOiBzZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgIT09IHNlbGVjdGVkRWxlbWVudHNbMF0uaWQpIHtcbiAgICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG5cbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBfdGhpczEzLnNjZW5lKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmICFpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcblxuICAgICAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICAgIHNjZW5lWDogc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyLFxuICAgICAgICAgIHNjZW5lWTogc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICBzaG91bGRCaW5kOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgX3RoaXMxMy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNoYXBlID0gZmluZFNoYXBlQnlLZXkoZXZlbnQua2V5KTtcblxuICAgICAgaWYgKHNoYXBlKSB7XG4gICAgICAgIF90aGlzMTMuc2VsZWN0U2hhcGVUb29sKHNoYXBlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgX3RoaXMxMy50b2dnbGVMb2NrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgIGlzSG9sZGluZ1NwYWNlID0gdHJ1ZTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgfHwgZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiICYmICFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuRyAmJiAoaGFzQmFja2dyb3VuZChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKSB8fCBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JhY2tncm91bmQoZWxlbWVudC50eXBlKTtcbiAgICAgIH0pKSkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuUG9wdXA6IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUykge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuUG9wdXA6IFwic3Ryb2tlQ29sb3JQaWNrZXJcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uS2V5VXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAhX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQoX3RoaXMxMy5zdGF0ZSkgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpIDogdW5iaW5kTGluZWFyRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25HZXN0dXJlU3RhcnQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgIH0pO1xuXG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZUNoYW5nZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBvbkdlc3R1cmVDaGFuZ2Ugb25seSBoYXMgem9vbSBmYWN0b3IgYnV0IG5vdCB0aGUgY2VudGVyLlxuICAgIC8vIElmIHdlJ3JlIG9uIGlQYWQgb3IgaVBob25lLCB0aGVuIHdlIHJlY29nbml6ZSBtdWx0aS10b3VjaCBhbmQgd2lsbFxuICAgIC8vIHpvb20gaW4gYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIG9uIHRoZSB0b3VjaE1vdmUgaGFuZGxlciBhbHJlYWR5LlxuICAgIC8vIE9uIE1hY2Jvb2ssIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG5cbiAgICBpZiAoaW5pdGlhbFNjYWxlKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgZ2V0U3RhdGVGb3Jab29tKHtcbiAgICAgICAgICB2aWV3cG9ydFg6IGN1cnNvclgsXG4gICAgICAgICAgdmlld3BvcnRZOiBjdXJzb3JZLFxuICAgICAgICAgIG5leHRab29tOiBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBldmVudC5zY2FsZSlcbiAgICAgICAgfSwgc3RhdGUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25HZXN0dXJlRW5kID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX3RoaXMxMy5zdGF0ZS5wcmV2aW91c1NlbGVjdGVkRWxlbWVudElkc1xuICAgIH0pO1xuXG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICB9KTtcblxuICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcgPSBmdW5jdGlvbiAoX3JlZjgpIHtcbiAgICBsZXQge1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZLFxuICAgICAgc2hvdWxkQmluZCxcbiAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyID0gdHJ1ZVxuICAgIH0gPSBfcmVmODtcblxuICAgIGxldCBwYXJlbnRDZW50ZXJQb3NpdGlvbiA9IGluc2VydEF0UGFyZW50Q2VudGVyICYmIF90aGlzMTMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5jYW52YXMsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTsgLy8gYmluZCB0byBjb250YWluZXIgd2hlbiBzaG91bGRCaW5kIGlzIHRydWUgb3JcbiAgICAvLyBjbGlja2VkIG9uIGNlbnRlciBvZiBjb250YWluZXJcblxuXG4gICAgY29uc3QgY29udGFpbmVyID0gc2hvdWxkQmluZCB8fCBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IGdldEVsZW1lbnRDb250YWluaW5nUG9zaXRpb24oX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gIWlzVGV4dEVsZW1lbnQoZWxlKTtcbiAgICB9KSwgc2NlbmVYLCBzY2VuZVkpIDogbnVsbDtcblxuICAgIGxldCBleGlzdGluZ1RleHRFbGVtZW50ID0gX3RoaXMxMy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpOyAvLyBjb25zaWRlciBib3VuZGVkIHRleHQgZWxlbWVudCBpZiBjb250YWluZXIgcHJlc2VudFxuXG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcblxuICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnRJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFleGlzdGluZ1RleHRFbGVtZW50ICYmIGNvbnRhaW5lcikge1xuICAgICAgY29uc3QgZm9udFN0cmluZyA9IHtcbiAgICAgICAgZm9udFNpemU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHlcbiAgICAgIH07XG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGdldEFwcHJveE1pbkxpbmVXaWR0aChnZXRGb250U3RyaW5nKGZvbnRTdHJpbmcpKTtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IGdldEFwcHJveE1pbkxpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1heChjb250YWluZXIuaGVpZ2h0LCBtaW5IZWlnaHQpO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heChjb250YWluZXIud2lkdGgsIG1pbldpZHRoKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgIGhlaWdodDogbmV3SGVpZ2h0LFxuICAgICAgICB3aWR0aDogbmV3V2lkdGhcbiAgICAgIH0pO1xuICAgICAgc2NlbmVYID0gY29udGFpbmVyLnggKyBuZXdXaWR0aCAvIDI7XG4gICAgICBzY2VuZVkgPSBjb250YWluZXIueSArIG5ld0hlaWdodCAvIDI7XG5cbiAgICAgIGlmIChwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBwYXJlbnRDZW50ZXJQb3NpdGlvbiA9IF90aGlzMTMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5jYW52YXMsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZXhpc3RpbmdUZXh0RWxlbWVudCA/IGV4aXN0aW5nVGV4dEVsZW1lbnQgOiBuZXdUZXh0RWxlbWVudCh7XG4gICAgICB4OiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJYIDogc2NlbmVYLFxuICAgICAgeTogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWSA6IHNjZW5lWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgdGV4dDogXCJcIixcbiAgICAgIHJhd1RleHQ6IFwiXCIsXG4gICAgICBmb250U2l6ZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgZm9udEZhbWlseTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uID8gXCJjZW50ZXJcIiA6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IFwibWlkZGxlXCIgOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgY29udGFpbmVySWQ6IGNvbnRhaW5lcj8uaWQgPz8gdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBJZHM6IGNvbnRhaW5lcj8uZ3JvdXBJZHMgPz8gW11cbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICB9KTtcblxuICAgIGlmIChleGlzdGluZ1RleHRFbGVtZW50KSB7XG4gICAgICAvLyBpZiB0ZXh0IGVsZW1lbnQgaXMgbm8gbG9uZ2VyIGNlbnRlcmVkIHRvIGEgY29udGFpbmVyLCByZXNldFxuICAgICAgLy8gdmVydGljYWxBbGlnbiB0byBkZWZhdWx0IGJlY2F1c2UgaXQncyBjdXJyZW50bHkgaW50ZXJuYWwtb25seVxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbiB8fCBlbGVtZW50LnRleHRBbGlnbiAhPT0gXCJjZW50ZXJcIikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pOyAvLyBjYXNlOiBjcmVhdGluZyBuZXcgdGV4dCBub3QgY2VudGVyZWQgdG8gcGFyZW50IGVsZW1lbmVudCDihpIgb2Zmc2V0IFlcbiAgICAgIC8vIHNvIHRoYXQgdGhlIHRleHQgaXMgY2VudGVyZWQgdG8gY3Vyc29yIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB5OiBlbGVtZW50LnkgLSBlbGVtZW50LmJhc2VsaW5lIC8gMlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLmhhbmRsZVRleHRXeXNpd3lnKGVsZW1lbnQsIHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50OiAhIWV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gY2FzZTogZG91YmxlLWNsaWNraW5nIHdpdGggYXJyb3cvbGluZSB0b29sIHNlbGVjdGVkIHdvdWxkIGJvdGggY3JlYXRlXG4gICAgLy8gdGV4dCBhbmQgZW50ZXIgbXVsdGlFbGVtZW50IG1vZGVcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHdlIHNob3VsZCBvbmx5IGJlIGFibGUgdG8gZG91YmxlIGNsaWNrIHdoZW4gbW9kZSBpcyBzZWxlY3Rpb25cblxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkKSB7XG4gICAgICAgIF90aGlzMTMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3Ioc2VsZWN0ZWRFbGVtZW50c1swXSwgX3RoaXMxMy5zY2VuZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gICAgbGV0IHtcbiAgICAgIHg6IHNjZW5lWCxcbiAgICAgIHk6IHNjZW5lWVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZHMgPSBnZXRTZWxlY3RlZEdyb3VwSWRzKF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWQgPSBoaXRFbGVtZW50ICYmIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQoaGl0RWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEdyb3VwSWRzKTtcblxuICAgICAgaWYgKHNlbGVjdGVkR3JvdXBJZCkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogc2VsZWN0ZWRHcm91cElkLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9XG4gICAgICAgICAgfSksIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG5cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICFfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGNhbkJpbmRUZXh0ID0gaGFzQm91bmRUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChjYW5CaW5kVGV4dCkge1xuICAgICAgICAgIHNjZW5lWCA9IHNlbGVjdGVkRWxlbWVudC54ICsgc2VsZWN0ZWRFbGVtZW50LndpZHRoIC8gMjtcbiAgICAgICAgICBzY2VuZVkgPSBzZWxlY3RlZEVsZW1lbnQueSArIHNlbGVjdGVkRWxlbWVudC5oZWlnaHQgLyAyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICBzaG91bGRCaW5kOiBmYWxzZSxcbiAgICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChzY2VuZVBvaW50ZXIsIGhpdEVsZW1lbnQpIHtcbiAgICAvLyBSZXZlcnNpbmcgc28gd2UgdHJhdmVyc2UgdGhlIGVsZW1lbnRzIGluIGRlY3JlYXNpbmcgb3JkZXJcbiAgICAvLyBvZiB6LWluZGV4XG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkuc2xpY2UoKS5yZXZlcnNlKCk7XG5cbiAgICBsZXQgaGl0RWxlbWVudEluZGV4ID0gSW5maW5pdHk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50LmlkKSB7XG4gICAgICAgIGhpdEVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWxlbWVudC5saW5rICYmIGlzUG9pbnRIaXR0aW5nTGlua0ljb24oZWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW3NjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueV0pICYmIGluZGV4IDw9IGhpdEVsZW1lbnRJbmRleDtcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnJlZGlyZWN0VG9MaW5rID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKF90aGlzMTMubGFzdFBvaW50ZXJEb3duLCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBsYXN0UG9pbnRlckRvd25IaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtsYXN0UG9pbnRlckRvd25Db29yZHMueCwgbGFzdFBvaW50ZXJEb3duQ29vcmRzLnldKTtcbiAgICBjb25zdCBsYXN0UG9pbnRlclVwQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKF90aGlzMTMubGFzdFBvaW50ZXJVcCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3QgTGFzdFBvaW50ZXJVcEhpdHRpbmdMaW5rSWNvbiA9IGlzUG9pbnRIaXR0aW5nTGlua0ljb24oX3RoaXMxMy5oaXRMaW5rRWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW2xhc3RQb2ludGVyVXBDb29yZHMueCwgbGFzdFBvaW50ZXJVcENvb3Jkcy55XSk7XG5cbiAgICBpZiAobGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uICYmIExhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24pIHtcbiAgICAgIGNvbnN0IHVybCA9IF90aGlzMTMuaGl0TGlua0VsZW1lbnQ/Lmxpbms7XG5cbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgaWYgKF90aGlzMTMucHJvcHMub25MaW5rT3Blbikge1xuICAgICAgICAgIF90aGlzMTMucHJvcHMub25MaW5rT3Blbih1cmwsIGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0xvY2FsTGluayh1cmwpID8gXCJfc2VsZlwiIDogXCJfYmxhbmtcIjtcbiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSB3aW5kb3cub3Blbih1bmRlZmluZWQsIHRhcmdldCk7IC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5naXRodWIuaW8vcmVsLW5vb3BlbmVyL1xuXG4gICAgICAgICAgaWYgKG5ld1dpbmRvdykge1xuICAgICAgICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgICAgICAgICBuZXdXaW5kb3cubG9jYXRpb24gPSBub3JtYWxpemVMaW5rKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuYXR0YWNoTGlua0xpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuY2FudmFzPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgX3RoaXMxMy5yZWRpcmVjdFRvTGluayk7XG4gIH07XG5cbiAgdGhpcy5kZXRhY2hMaW5rTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBfdGhpczEzLnJlZGlyZWN0VG9MaW5rKTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgX3RoaXMxMy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBfdGhpczEzLnN0YXRlLmN1cnNvckJ1dHRvbik7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5oYXMoZXZlbnQucG9pbnRlcklkKSkge1xuICAgICAgZ2VzdHVyZS5wb2ludGVycy5zZXQoZXZlbnQucG9pbnRlcklkLCB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMiAmJiBnZXN0dXJlLmxhc3RDZW50ZXIgJiYgaW5pdGlhbFNjYWxlICYmIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlKSB7XG4gICAgICBjb25zdCBjZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBjb25zdCBkZWx0YVggPSBjZW50ZXIueCAtIGdlc3R1cmUubGFzdENlbnRlci54O1xuICAgICAgY29uc3QgZGVsdGFZID0gY2VudGVyLnkgLSBnZXN0dXJlLmxhc3RDZW50ZXIueTtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGNlbnRlcjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgICBjb25zdCBzY2FsZUZhY3RvciA9IF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiZnJlZWRyYXdcIiAmJiBfdGhpczEzLnN0YXRlLnBlbk1vZGUgPyAxIDogZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcbiAgICAgIGNvbnN0IG5leHRab29tID0gc2NhbGVGYWN0b3IgPyBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBzY2FsZUZhY3RvcikgOiBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHpvb21TdGF0ZSA9IGdldFN0YXRlRm9yWm9vbSh7XG4gICAgICAgICAgdmlld3BvcnRYOiBjZW50ZXIueCxcbiAgICAgICAgICB2aWV3cG9ydFk6IGNlbnRlci55LFxuICAgICAgICAgIG5leHRab29tXG4gICAgICAgIH0sIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB6b29tOiB6b29tU3RhdGUuem9vbSxcbiAgICAgICAgICBzY3JvbGxYOiB6b29tU3RhdGUuc2Nyb2xsWCArIGRlbHRhWCAvIG5leHRab29tLFxuICAgICAgICAgIHNjcm9sbFk6IHpvb21TdGF0ZS5zY3JvbGxZICsgZGVsdGFZIC8gbmV4dFpvb20sXG4gICAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoY3VycmVudFNjcm9sbEJhcnMsIGV2ZW50LmNsaWVudFggLSBfdGhpczEzLnN0YXRlLm9mZnNldExlZnQsIGV2ZW50LmNsaWVudFkgLSBfdGhpczEzLnN0YXRlLm9mZnNldFRvcCk7XG4gICAgY29uc3QgaXNPdmVyU2Nyb2xsQmFyID0gaXNQb2ludGVyT3ZlclNjcm9sbEJhcnMuaXNPdmVyRWl0aGVyO1xuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3Qge1xuICAgICAgeDogc2NlbmVQb2ludGVyWCxcbiAgICAgIHk6IHNjZW5lUG9pbnRlcllcbiAgICB9ID0gc2NlbmVQb2ludGVyO1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50LCBzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSBfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0JpbmRpbmdFbGVtZW50VHlwZShfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKSkge1xuICAgICAgLy8gSG92ZXJpbmcgd2l0aCBhIHNlbGVjdGVkIHRvb2wgb3IgY3JlYXRpbmcgbmV3IGxpbmVhciBlbGVtZW50IHZpYSBjbGlja1xuICAgICAgLy8gYW5kIHBvaW50XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG5cbiAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhkcmFnZ2luZ0VsZW1lbnQsIFtzY2VuZVBvaW50ZXJdLCBfdGhpczEzLnN0YXRlLnN0YXJ0Qm91bmRFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG11bHRpRWxlbWVudFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IHJ4LFxuICAgICAgICB5OiByeVxuICAgICAgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRcbiAgICAgIH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpO1xuXG4gICAgICBpZiAobGFzdFBvaW50ID09PSBsYXN0Q29tbWl0dGVkUG9pbnQpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCB5ZXQgY3JlYXRlZCBhIHRlbXAgcG9pbnQgYW5kIHdlJ3JlIGJleW9uZCBjb21taXQtem9uZVxuICAgICAgICAvLyB0aHJlc2hvbGQsIGFkZCBhIHBvaW50XG4gICAgICAgIGlmIChkaXN0YW5jZTJkKHNjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5LCBsYXN0UG9pbnRbMF0sIGxhc3RQb2ludFsxXSkgPj0gTElORV9DT05GSVJNX1RIUkVTSE9MRCkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTsgLy8gaW4gdGhpcyBicmFuY2gsIHdlJ3JlIGluc2lkZSB0aGUgY29tbWl0IHpvbmUsIGFuZCBubyB1bmNvbW1pdHRlZFxuICAgICAgICAgIC8vIHBvaW50IGV4aXN0cy4gVGh1cyBkbyBub3RoaW5nIChkb24ndCBhZGQvcmVtb3ZlIHBvaW50cykuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDIgJiYgbGFzdENvbW1pdHRlZFBvaW50ICYmIGRpc3RhbmNlMmQoc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnksIGxhc3RDb21taXR0ZWRQb2ludFswXSwgbGFzdENvbW1pdHRlZFBvaW50WzFdKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IHBvaW50cy5zbGljZSgwLCAtMSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNQYXRoQUxvb3AocG9pbnRzLCBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgfSAvLyB1cGRhdGUgbGFzdCB1bmNvbW1pdHRlZCBwb2ludFxuXG5cbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMuc2xpY2UoMCwgLTEpLCBbc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnldXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRCdXR0b24gPSBCb29sZWFuKGV2ZW50LmJ1dHRvbnMpO1xuXG4gICAgaWYgKGhhc0Rlc2VsZWN0ZWRCdXR0b24gfHwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmICFpc092ZXJTY3JvbGxCYXIgJiYgIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSA9IGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZShlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSwgc2NlbmVQb2ludGVyWCwgc2NlbmVQb2ludGVyWSwgX3RoaXMxMy5zdGF0ZS56b29tLCBldmVudC5wb2ludGVyVHlwZSk7XG5cbiAgICAgIGlmIChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSAmJiAhaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMoZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLCBzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcblxuICAgICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGVcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGl0RWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVQb2ludGVyLngsIHNjZW5lUG9pbnRlci55KTtcblxuICAgIF90aGlzMTMuaGl0TGlua0VsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihzY2VuZVBvaW50ZXIsIGhpdEVsZW1lbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuaGl0TGlua0VsZW1lbnQgJiYgIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW190aGlzMTMuaGl0TGlua0VsZW1lbnQuaWRdKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgc2hvd0h5cGVybGlua1Rvb2x0aXAoX3RoaXMxMy5oaXRMaW5rRWxlbWVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIF90aGlzMTMuYXR0YWNoTGlua0xpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGVIeXBlcmxpbmtUb29saXAoKTtcblxuICAgICAgX3RoaXMxMy5kZXRhY2hMaW5rTGlzdGVuZXIoKTtcblxuICAgICAgaWYgKGhpdEVsZW1lbnQgJiYgaGl0RWxlbWVudC5saW5rICYmIF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdICYmICFfdGhpczEzLmNvbnRleHRNZW51T3BlbiAmJiAhX3RoaXMxMy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXApIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2hvd0h5cGVybGlua1BvcHVwOiBcImluZm9cIlxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgaXNUZXh0RWxlbWVudChoaXRFbGVtZW50KSA/IENVUlNPUl9UWVBFLlRFWFQgOiBDVVJTT1JfVFlQRS5DUk9TU0hBSVIpO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkKTtcblxuICAgICAgICBpZiAoZWxlbWVudCAmJiBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50LCBfdGhpczEzLnN0YXRlLCBbc2NlbmVQb2ludGVyLngsIHNjZW5lUG9pbnRlci55XSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIC8vIGlmIHVzaW5nIGNtZC9jdHJsLCB3ZSdyZSBub3QgZHJhZ2dpbmdcbiAgICAgICFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAoaGl0RWxlbWVudCB8fCBfdGhpczEzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKHNjZW5lUG9pbnRlciwgc2VsZWN0ZWRFbGVtZW50cykpKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IHRydWU7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIHJlbW92ZSBhbnkgYWN0aXZlIHNlbGVjdGlvbiB3aGVuIHdlIHN0YXJ0IHRvIGludGVyYWN0IHdpdGggY2FudmFzXG4gICAgLy8gKG1haW5seSwgd2UgY2FyZSBhYm91dCByZW1vdmluZyBzZWxlY3Rpb24gb3V0c2lkZSB0aGUgY29tcG9uZW50IHdoaWNoXG4gICAgLy8gIHdvdWxkIHByZXZlbnQgb3VyIGNvcHkgaGFuZGxpbmcgb3RoZXJ3aXNlKVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgaWYgKHNlbGVjdGlvbj8uYW5jaG9yTm9kZSkge1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cblxuICAgIF90aGlzMTMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuXG4gICAgX3RoaXMxMy5tYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpOyAvL2ZpcmVzIG9ubHkgb25jZSwgaWYgcGVuIGlzIGRldGVjdGVkLCBwZW5Nb2RlIGlzIGVuYWJsZWRcbiAgICAvL3RoZSB1c2VyIGNhbiBkaXNhYmxlIHRoaXMgYnkgdG9nZ2xpbmcgdGhlIHBlbk1vZGUgYnV0dG9uXG5cblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5wZW5EZXRlY3RlZCAmJiBldmVudC5wb2ludGVyVHlwZSA9PT0gXCJwZW5cIikge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGVuTW9kZTogdHJ1ZSxcbiAgICAgICAgICBwZW5EZXRlY3RlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMubGFzdFBvaW50ZXJEb3duID0gZXZlbnQ7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGxhc3RQb2ludGVyRG93bldpdGg6IGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgY3Vyc29yQnV0dG9uOiBcImRvd25cIlxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcImRvd25cIik7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBvbmx5IGhhbmRsZSBsZWZ0IG1vdXNlIGJ1dHRvbiBvciB0b3VjaFxuXG5cbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmIGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uVE9VQ0gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLnVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKGV2ZW50KTsgLy8gZG9uJ3Qgc2VsZWN0IHdoaWxlIHBhbm5pbmdcblxuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA+IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFN0YXRlIGZvciB0aGUgZHVyYXRpb24gb2YgYSBwb2ludGVyIGludGVyYWN0aW9uLCB3aGljaCBzdGFydHMgd2l0aCBhXG4gICAgLy8gcG9pbnRlckRvd24gZXZlbnQsIGVuZHMgd2l0aCBhIHBvaW50ZXJVcCBldmVudCAob3IgYW5vdGhlciBwb2ludGVyRG93bilcblxuXG4gICAgY29uc3QgcG9pbnRlckRvd25TdGF0ZSA9IF90aGlzMTMuaW5pdGlhbFBvaW50ZXJEb3duU3RhdGUoZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTaW5jZSBjb250ZXh0IG1lbnUgY2xvc2VzIG9uIHBvaW50ZXIgZG93biBzbyBzZXR0aW5nIHRvIGZhbHNlXG5cblxuICAgIF90aGlzMTMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7XG5cbiAgICBfdGhpczEzLmNsZWFyU2VsZWN0aW9uSWZOb3RVc2luZ1NlbGVjdGlvbigpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd09uUG9pbnRlckRvd24gPSAhX3RoaXMxMy5zdGF0ZS5wZW5Nb2RlIHx8IGV2ZW50LnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIgfHwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCI7XG5cbiAgICBpZiAoIWFsbG93T25Qb2ludGVyRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVUZXh0T25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIC8vIHJlc2V0IGltYWdlIHByZXZpZXcgb24gcG9pbnRlcmRvd25cbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcblxuICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBtdXRhdGVFbGVtZW50KF90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVGcmVlRHJhd0VsZW1lbnRPblBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5jcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24oX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IF90aGlzMTMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IF90aGlzMTMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gX3RoaXMxMy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlVcCA9IF90aGlzMTMub25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgb25LZXlEb3duKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCBvbktleVVwKTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlID0gb25Qb2ludGVyTW92ZTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCA9IG9uUG9pbnRlclVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwID0gb25LZXlVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duID0gb25LZXlEb3duO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlT3BlbkNvbnRleHRNZW51QWZ0ZXJQb2ludGVyRG93bk9uVG91Y2hEZXZpY2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcblxuICAgICAgICAgIGlmICghaW52YWxpZGF0ZUNvbnRleHRNZW51KSB7XG4gICAgICAgICAgICBfdGhpczEzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51KGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICghKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCAmJiAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5XSEVFTCB8fCBldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgaXNIb2xkaW5nU3BhY2UgfHwgX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpKSB8fCBpc1RleHRFbGVtZW50KF90aGlzMTMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBuZXh0UGFzdGVQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBpc0xpbnV4ID0gL0xpbnV4Ly50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pO1xuICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgIGxldCB7XG4gICAgICBjbGllbnRYOiBsYXN0WCxcbiAgICAgIGNsaWVudFk6IGxhc3RZXG4gICAgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBjb25zdCBkZWx0YVggPSBsYXN0WCAtIGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBsYXN0WSAtIGV2ZW50LmNsaWVudFk7XG4gICAgICBsYXN0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBsYXN0WSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICAvKlxuICAgICAgICogUHJldmVudCBwYXN0ZSBldmVudCBpZiB3ZSBtb3ZlIHdoaWxlIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eC5cbiAgICAgICAqIFNlZSBpc3N1ZSAjMTM4My5cbiAgICAgICAqL1xuXG4gICAgICBpZiAoaXNMaW51eCAmJiAhbmV4dFBhc3RlUHJldmVudGVkICYmIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSkpIHtcbiAgICAgICAgbmV4dFBhc3RlUHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgLyogUHJldmVudCB0aGUgbmV4dCBwYXN0ZSBldmVudCAqL1xuXG4gICAgICAgIGNvbnN0IHByZXZlbnROZXh0UGFzdGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuICAgICAgICAvKlxuICAgICAgICAgKiBSZWVuYWJsZSBuZXh0IHBhc3RlIGluIGNhc2Ugb2YgZGlzYWJsZWQgbWlkZGxlIGNsaWNrIHBhc3RlIGZvclxuICAgICAgICAgKiBhbnkgcmVhc29uOlxuICAgICAgICAgKiAtIHJpZ3RoIGNsaWNrIHBhc3RlXG4gICAgICAgICAqIC0gZW1wdHkgY2xpcGJvYXJkXG4gICAgICAgICAqL1xuXG5cbiAgICAgICAgY29uc3QgZW5hYmxlTmV4dFBhc3RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogX3RoaXMxMy5zdGF0ZS5zY3JvbGxYIC0gZGVsdGFYIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiBfdGhpczEzLnN0YXRlLnNjcm9sbFkgLSBkZWx0YVkgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlYXJkb3duID0gd2l0aEJhdGNoZWRVcGRhdGVzKGxhc3RQb2ludGVyVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGVhcmRvd24pO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICAgIGlmIChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcmVzaXppbmdFbGVtZW50OiBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUuZWxlbWVudFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS50cmFuc2Zvcm1IYW5kbGVUeXBlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlID0gZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMoZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGU6IHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGVcbiAgICAgICAgfSkpO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKGdldFJlc2l6ZU9mZnNldFhZKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHMsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmIHNlbGVjdGVkRWxlbWVudHNbMF0ucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uID0gZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24ocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSwgc2VsZWN0ZWRFbGVtZW50c1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMxMy5zZXRTdGF0ZShhcHBTdGF0ZSk7XG4gICAgICAgICAgfSwgX3RoaXMxMy5oaXN0b3J5LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbik7XG5cbiAgICAgICAgICBpZiAocmV0LmhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSByZXQuaGl0RWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gaGl0RWxlbWVudCBtYXkgYWxyZWFkeSBiZSBzZXQgYWJvdmUsIHNvIGNoZWNrIGZpcnN0XG5cblxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/PyBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpO1xuXG4gICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgLy8gRWFybHkgcmV0dXJuIGlmIHBvaW50ZXIgaXMgaGl0dGluZyBsaW5rIGljb25cbiAgICAgICAgICBpZiAoaXNQb2ludEhpdHRpbmdMaW5rSWNvbihwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LCBfdGhpczEzLnN0YXRlLCBbcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSA9IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSk7XG4gICAgICAgIH0gLy8gRm9yIG92ZXJsYXBwZWQgZWxlbWVudHMgb25lIHBvc2l0aW9uIG1heSBoaXRcbiAgICAgICAgLy8gbXVsdGlwbGUgZWxlbWVudHNcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gX3RoaXMxMy5nZXRFbGVtZW50c0F0UG9zaXRpb24ocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSk7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoKGhpdEVsZW1lbnQgPT09IG51bGwgfHwgIXNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy8gSWYgd2UgY2xpY2sgb24gc29tZXRoaW5nXG5cbiAgICAgICAgfSBlbHNlIGlmIChoaXRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBvbiBDTUQvQ1RSTCwgZHJpbGwgZG93biB0byBoaXQgZWxlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwcyBldGMuXG4gICAgICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50KHByZXZTdGF0ZSwgaGl0RWxlbWVudCkpLCB7fSwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pOyAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuXG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuXG5cbiAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcgYSBncm91cCwgZXhpdGluZyBlZGl0aW5nIG1vZGUgYW5kIGRlc2VsZWN0IHRoZSBncm91cC5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuXG5cbiAgICAgICAgICAgIGlmICghc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGhpdEVsZW1lbnQubGluayA/IFwiaW5mb1wiIDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgLy8gaWYgd2UncmUgY3VycmVudGx5IHN0aWxsIGVkaXRpbmcgdGV4dCwgY2xpY2tpbmcgb3V0c2lkZVxuICAgIC8vIHNob3VsZCBvbmx5IGZpbmFsaXplIGl0LCBub3QgY3JlYXRlIGFub3RoZXIgKGlycmVzcGVjdGl2ZVxuICAgIC8vIG9mIHN0YXRlLmVsZW1lbnRMb2NrZWQpXG4gICAgaWYgKGlzVGV4dEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2NlbmVYID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueDtcbiAgICBsZXQgc2NlbmVZID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuQmluZFRleHQgPSBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICBzY2VuZVggPSBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9XG5cbiAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZLFxuICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleVxuICAgIH0pO1xuXG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICAvLyBCZWdpbiBhIG1hcmsgY2FwdHVyZS4gVGhpcyBkb2VzIG5vdCBoYXZlIHRvIHVwZGF0ZSBzdGF0ZSB5ZXQuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgbnVsbCk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjVcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBlbGVtZW50LnByZXNzdXJlcyA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzOiBbWzAsIDBdXSxcbiAgICAgIHByZXNzdXJlc1xuICAgIH0pO1xuICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyRG93blN0YXRlLm9yaWdpbiwgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCA9IGZ1bmN0aW9uIChfcmVmOSkge1xuICAgIGxldCB7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVlcbiAgICB9ID0gX3JlZjk7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoc2NlbmVYLCBzY2VuZVksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdJbWFnZUVsZW1lbnQoe1xuICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzXG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbXVsdGlFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTsgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcblxuICAgICAgaWYgKG11bHRpRWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJiBpc1BhdGhBTG9vcChtdWx0aUVsZW1lbnQucG9pbnRzLCBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB4OiByeCxcbiAgICAgICAgeTogcnksXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFxuICAgICAgfSA9IG11bHRpRWxlbWVudDsgLy8gY2xpY2tpbmcgaW5zaWRlIGNvbW1pdCB6b25lIOKGkiBmaW5hbGl6ZSBhcnJvd1xuXG4gICAgICBpZiAobXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmIGxhc3RDb21taXR0ZWRQb2ludCAmJiBkaXN0YW5jZTJkKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHJ5LCBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sIGxhc3RDb21taXR0ZWRQb2ludFsxXSkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEKSB7XG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pOyAvLyBjbGlja2luZyBvdXRzaWRlIGNvbW1pdCB6b25lIOKGkiB1cGRhdGUgcmVmZXJlbmNlIGZvciBsYXN0IGNvbW1pdHRlZFxuICAgICAgLy8gcG9pbnRcblxuXG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgfSk7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgIC8qIElmIGFycm93IGlzIHByZS1hcnJvd2hlYWRzLCBpdCB3aWxsIGhhdmUgdW5kZWZpbmVkIGZvciBib3RoIHN0YXJ0IGFuZCBlbmQgYXJyb3doZWFkcy5cbiAgICAgIElmIHNvLCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIHN0YXJ0IGFuZCBcImFycm93XCIgZm9yIGVuZC4gSWYgdGhlIGxpbmVhciBpdGVtIGlzIG5vdFxuICAgICAgYW4gYXJyb3csIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3IgYm90aC4gT3RoZXJ3aXNlLCB3ZSB3YW50IGl0IHRvIHVzZSB0aGVcbiAgICAgIHZhbHVlcyBmcm9tIGFwcFN0YXRlLiAqL1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGN1cnJlbnRJdGVtU3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGN1cnJlbnRJdGVtRW5kQXJyb3doZWFkXG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9IGVsZW1lbnRUeXBlID09PSBcImFycm93XCIgPyBbY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRdIDogW251bGwsIG51bGxdO1xuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgIHBvaW50czogWy4uLmVsZW1lbnQucG9pbnRzLCBbMCwgMF1dXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyRG93blN0YXRlLm9yaWdpbiwgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaW5pdGlhbGl6ZUltYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjEwID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChfcmVmMTEpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgaW1hZ2VFbGVtZW50OiBfaW1hZ2VFbGVtZW50LFxuICAgICAgICBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ID0gZmFsc2VcbiAgICAgIH0gPSBfcmVmMTE7XG5cbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBpbWFnZSBmaWxlLCBidXQgd2UgZG8gdGhpcyBjaGVja1xuICAgICAgLy8gdG8gc2F0aXNmeSBUUyBkb3duIHRoZSBsaW5lXG4gICAgICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGltYWdlRmlsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMudW5zdXBwb3J0ZWRGaWxlVHlwZVwiKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gaW1hZ2VGaWxlLnR5cGU7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIFwid2FpdFwiKTtcblxuICAgICAgaWYgKG1pbWVUeXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGltYWdlRmlsZSA9IFNWR1N0cmluZ1RvRmlsZSh5aWVsZCBub3JtYWxpemVTVkcoeWllbGQgaW1hZ2VGaWxlLnRleHQoKSksIGltYWdlRmlsZS5uYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnN2Z0ltYWdlSW5zZXJ0RXJyb3JcIikpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGdlbmVyYXRlIGltYWdlIGlkIChieSBkZWZhdWx0IHRoZSBmaWxlIGRpZ2VzdCkgYmVmb3JlIGFueVxuICAgICAgLy8gcmVzaXppbmcvY29tcHJlc3Npb24gdGFrZXMgcGxhY2UgdG8ga2VlcCBpdCBtb3JlIHBvcnRhYmxlXG5cblxuICAgICAgY29uc3QgZmlsZUlkID0geWllbGQgX3RoaXMxMy5wcm9wcy5nZW5lcmF0ZUlkRm9yRmlsZT8uKGltYWdlRmlsZSkgfHwgZ2VuZXJhdGVJZEZyb21GaWxlKGltYWdlRmlsZSk7XG5cbiAgICAgIGlmICghZmlsZUlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkbid0IGdlbmVyYXRlIGZpbGUgaWQgb3IgdGhlIHN1cHBsaWVkIGBnZW5lcmF0ZUlkRm9yRmlsZWAgZGlkbid0IHJlc29sdmUgdG8gb25lLlwiKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZURhdGEgPSBfdGhpczEzLmZpbGVzW2ZpbGVJZF07XG5cbiAgICAgIGlmICghZXhpc3RpbmdGaWxlRGF0YT8uZGF0YVVSTCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGltYWdlRmlsZSA9IHlpZWxkIHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgICAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciB0cnlpbmcgdG8gcmVzaW5nIGltYWdlIGZpbGUgb24gaW5zZXJ0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZUZpbGUuc2l6ZSA+IE1BWF9BTExPV0VEX0ZJTEVfQllURVMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5maWxlVG9vQmlnXCIsIHtcbiAgICAgICAgICAgIG1heFNpemU6IGAke01hdGgudHJ1bmMoTUFYX0FMTE9XRURfRklMRV9CWVRFUyAvIDEwMjQgLyAxMDI0KX1NQmBcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgY29uc3QgZGF0YVVSTCA9IF90aGlzMTMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTDsgLy8gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgdW5uZWNlc3NhcmlseSByZXNpemUgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIGZ1bGwtc2l6ZSBmaWxlIGZvciBjdXJzb3IgcHJldmlld1xuICAgICAgICAvLyAoaXQncyBtdWNoIGZhc3RlciB0byBjb252ZXJ0IHRoZSByZXNpemVkIGRhdGFVUkwgdG8gRmlsZSlcblxuICAgICAgICBjb25zdCByZXNpemVkRmlsZSA9IGRhdGFVUkwgJiYgZGF0YVVSTFRvRmlsZShkYXRhVVJMKTtcblxuICAgICAgICBfdGhpczEzLnNldEltYWdlUHJldmlld0N1cnNvcihyZXNpemVkRmlsZSB8fCBpbWFnZUZpbGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhVVJMID0gX3RoaXMxMy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMIHx8ICh5aWVsZCBnZXREYXRhVVJMKGltYWdlRmlsZSkpO1xuICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gbXV0YXRlRWxlbWVudChfaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIGZpbGVJZFxuICAgICAgfSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZjEyID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX3RoaXMxMy5maWxlcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5maWxlcyksIHt9LCB7XG4gICAgICAgICAgICAgIFtmaWxlSWRdOiB7XG4gICAgICAgICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZEltYWdlRGF0YSA9IF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoZmlsZUlkKTtcblxuICAgICAgICAgICAgaWYgKCFjYWNoZWRJbWFnZURhdGEpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcblxuICAgICAgICAgICAgICB5aWVsZCBfdGhpczEzLnVwZGF0ZUltYWdlQ2FjaGUoW2ltYWdlRWxlbWVudF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkSW1hZ2VEYXRhPy5pbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgeWllbGQgY2FjaGVkSW1hZ2VEYXRhLmltYWdlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50Py5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkICYmIF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50Py5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGltYWdlRWxlbWVudCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIikpKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKCFzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2LCBfeDcpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZjEyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDUpIHtcbiAgICAgIHJldHVybiBfcmVmMTAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGltYWdlRWxlbWVudCwgaW1hZ2VGaWxlLCBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgaW1hZ2VFbGVtZW50XSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHlpZWxkIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlKHtcbiAgICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgICAgaW1hZ2VFbGVtZW50LFxuICAgICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXdcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICAgIGlzRGVsZXRlZDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3g4LCBfeDksIF94MTApIHtcbiAgICAgIHJldHVybiBfcmVmMTMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5zZXRJbWFnZVByZXZpZXdDdXJzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTQgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGltYWdlRmlsZSkge1xuICAgICAgLy8gbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiAxMjggcHhcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfQmFzaWNfVXNlcl9JbnRlcmZhY2UvVXNpbmdfVVJMX3ZhbHVlc19mb3JfdGhlX2N1cnNvcl9wcm9wZXJ0eVxuICAgICAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSA5NjtcbiAgICAgIGNvbnN0IGltYWdlUHJldmlldyA9IHlpZWxkIHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgICAgbWF4V2lkdGhPckhlaWdodDogY3Vyc29ySW1hZ2VTaXplUHhcbiAgICAgIH0pO1xuICAgICAgbGV0IHByZXZpZXdEYXRhVVJMID0geWllbGQgZ2V0RGF0YVVSTChpbWFnZVByZXZpZXcpOyAvLyBTVkcgY2Fubm90IGJlIHJlc2l6ZWQgdmlhIGByZXNpemVJbWFnZUZpbGVgIHNvIHdlIHJlc2l6ZSBieSByZW5kZXJpbmcgdG9cbiAgICAgIC8vIGEgc21hbGwgY2FudmFzXG5cbiAgICAgIGlmIChpbWFnZUZpbGUudHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgY29uc3QgaW1nID0geWllbGQgbG9hZEhUTUxJbWFnZUVsZW1lbnQocHJldmlld0RhdGFVUkwpO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gTWF0aC5taW4oaW1nLmhlaWdodCwgY3Vyc29ySW1hZ2VTaXplUHgpO1xuICAgICAgICBsZXQgd2lkdGggPSBoZWlnaHQgKiAoaW1nLndpZHRoIC8gaW1nLmhlaWdodCk7XG5cbiAgICAgICAgaWYgKHdpZHRoID4gY3Vyc29ySW1hZ2VTaXplUHgpIHtcbiAgICAgICAgICB3aWR0aCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogKGltZy5oZWlnaHQgLyBpbWcud2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBwcmV2aWV3RGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgNCA0LCBhdXRvYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTEpIHtcbiAgICAgIHJldHVybiBfcmVmMTQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5vbkltYWdlQWN0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE1ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGluc2VydE9uQ2FudmFzRGlyZWN0bHlcbiAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHtcbiAgICAgICAgaW5zZXJ0T25DYW52YXNEaXJlY3RseTogZmFsc2VcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsaWVudFggPSBfdGhpczEzLnN0YXRlLndpZHRoIC8gMiArIF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdDtcbiAgICAgICAgY29uc3QgY2xpZW50WSA9IF90aGlzMTMuc3RhdGUuaGVpZ2h0IC8gMiArIF90aGlzMTMuc3RhdGUub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgICAgIGNsaWVudFgsXG4gICAgICAgICAgY2xpZW50WVxuICAgICAgICB9LCBfdGhpczEzLnN0YXRlKTtcbiAgICAgICAgY29uc3QgaW1hZ2VGaWxlID0geWllbGQgZmlsZU9wZW4oe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkltYWdlXCIsXG4gICAgICAgICAgZXh0ZW5zaW9uczogW1wianBnXCIsIFwicG5nXCIsIFwic3ZnXCIsIFwiZ2lmXCJdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IF90aGlzMTMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgICBzY2VuZVg6IHgsXG4gICAgICAgICAgc2NlbmVZOiB5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbnNlcnRPbkNhbnZhc0RpcmVjdGx5KSB7XG4gICAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUpO1xuXG4gICAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG5cbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IGltYWdlRWxlbWVudFxuICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgaW1hZ2VGaWxlLFxuICAgICAgICAgICAgLyogc2hvd0N1cnNvckltYWdlUHJldmlldyAqL1xuICAgICAgICAgICAgdHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5uYW1lICE9PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfcmVmMTUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zID0gZnVuY3Rpb24gKGltYWdlRWxlbWVudCkge1xuICAgIGxldCBmb3JjZU5hdHVyYWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBjb25zdCBpbWFnZSA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50KSAmJiBfdGhpczEzLmltYWdlQ2FjaGUuZ2V0KGltYWdlRWxlbWVudC5maWxlSWQpPy5pbWFnZTtcblxuICAgIGlmICghaW1hZ2UgfHwgaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBpZiAoaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlICYmIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJTaXplID0gMTAwIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICAgIHg6IGltYWdlRWxlbWVudC54IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB5OiBpbWFnZUVsZW1lbnQueSAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgd2lkdGg6IHBsYWNlaG9sZGVyU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyU2l6ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JjZU5hdHVyYWxTaXplIHx8IC8vIGlmIHVzZXItY3JlYXRlZCBib3VuZGluZyBib3ggaXMgYmVsb3cgdGhyZXNob2xkLCBhc3N1bWUgdGhlXG4gICAgLy8gaW50ZW50aW9uIHdhcyB0byBjbGljayBpbnN0ZWFkIG9mIGRyYWcsIGFuZCB1c2UgdGhlIGltYWdlJ3NcbiAgICAvLyBpbnRyaW5zaWMgc2l6ZVxuICAgIGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSAmJiBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSB7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBNYXRoLm1heChfdGhpczEzLnN0YXRlLmhlaWdodCAtIDEyMCwgMTYwKTsgLy8gbWF4IDY1JSBvZiBjYW52YXMgaGVpZ2h0LCBjbGFtcGVkIHRvIDwzMDBweCwgdmggLSAxMjBweD5cblxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWluSGVpZ2h0LCBNYXRoLmZsb29yKF90aGlzMTMuc3RhdGUuaGVpZ2h0ICogMC41KSAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihpbWFnZS5uYXR1cmFsSGVpZ2h0LCBtYXhIZWlnaHQpO1xuICAgICAgY29uc3Qgd2lkdGggPSBoZWlnaHQgKiAoaW1hZ2UubmF0dXJhbFdpZHRoIC8gaW1hZ2UubmF0dXJhbEhlaWdodCk7IC8vIGFkZCBjdXJyZW50IGltYWdlRWxlbWVudCB3aWR0aC9oZWlnaHQgdG8gYWNjb3VudCBmb3IgcHJldmlvdXMgY2VudGVyaW5nXG4gICAgICAvLyBvZiB0aGUgcGxhY2hvbGRlciBpbWFnZVxuXG4gICAgICBjb25zdCB4ID0gaW1hZ2VFbGVtZW50LnggKyBpbWFnZUVsZW1lbnQud2lkdGggLyAyIC0gd2lkdGggLyAyO1xuICAgICAgY29uc3QgeSA9IGltYWdlRWxlbWVudC55ICsgaW1hZ2VFbGVtZW50LmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyO1xuICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMudXBkYXRlSW1hZ2VDYWNoZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZWxlbWVudHMpIHtcbiAgICAgIGxldCBmaWxlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogX3RoaXMxMy5maWxlcztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXBkYXRlZEZpbGVzLFxuICAgICAgICBlcnJvcmVkRmlsZXNcbiAgICAgIH0gPSB5aWVsZCBfdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgICAgIGltYWdlQ2FjaGU6IF90aGlzMTMuaW1hZ2VDYWNoZSxcbiAgICAgICAgZmlsZUlkczogZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsZUlkO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsZXNcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUgfHwgZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKHVwZGF0ZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJiBlcnJvcmVkRmlsZXMuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZWRGaWxlcyxcbiAgICAgICAgZXJyb3JlZEZpbGVzXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDEyKSB7XG4gICAgICByZXR1cm4gX3JlZjE2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE3ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIGxldCBpbWFnZUVsZW1lbnRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgIGxldCBmaWxlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogX3RoaXMxMy5maWxlcztcbiAgICAgIGNvbnN0IHVuY2FjaGVkSW1hZ2VFbGVtZW50cyA9IGltYWdlRWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAhZWxlbWVudC5pc0RlbGV0ZWQgJiYgIV90aGlzMTMuaW1hZ2VDYWNoZS5oYXMoZWxlbWVudC5maWxlSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh1bmNhY2hlZEltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB1cGRhdGVkRmlsZXNcbiAgICAgICAgfSA9IHlpZWxkIF90aGlzMTMudXBkYXRlSW1hZ2VDYWNoZSh1bmNhY2hlZEltYWdlRWxlbWVudHMsIGZpbGVzKTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgICBfdGhpczEzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3JlZjE3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMuc2NoZWR1bGVJbWFnZVJlZnJlc2ggPSB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgfSwgSU1BR0VfUkVOREVSX1RJTUVPVVQpO1xuXG4gIHRoaXMudXBkYXRlQmluZGluZ0VuYWJsZWRPblBvaW50ZXJNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlQmluZGluZyA9IHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCAhPT0gc2hvdWxkRW5hYmxlQmluZGluZykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHNob3VsZEVuYWJsZUJpbmRpbmdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvciA9IGZ1bmN0aW9uIChwb2ludGVyQ29vcmRzKSB7XG4gICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyQ29vcmRzLCBfdGhpczEzLnNjZW5lKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCA/IFtob3ZlcmVkQmluZGFibGVFbGVtZW50XSA6IFtdXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyA9IGZ1bmN0aW9uIChsaW5lYXJFbGVtZW50LCBwb2ludGVyQ29vcmRzLCBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQpIHtcbiAgICBpZiAoIXBvaW50ZXJDb29yZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3VnZ2VzdGVkQmluZGluZ3MgPSBwb2ludGVyQ29vcmRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjb29yZHMpIHtcbiAgICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoY29vcmRzLCBfdGhpczEzLnNjZW5lKTtcblxuICAgICAgaWYgKGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCAmJiAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKGxpbmVhckVsZW1lbnQsIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudD8uaWQsIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQpKSB7XG4gICAgICAgIGFjYy5wdXNoKGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3NcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1JlZiA9IGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAvLyBjYW52YXMgaXMgbnVsbCB3aGVuIHVubW91bnRpbmdcbiAgICBpZiAoY2FudmFzICE9PSBudWxsKSB7XG4gICAgICBfdGhpczEzLmNhbnZhcyA9IGNhbnZhcztcbiAgICAgIF90aGlzMTMucmMgPSByb3VnaC5jYW52YXMoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCBfdGhpczEzLmhhbmRsZVdoZWVsLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgX3RoaXMxMy5vblRhcFN0YXJ0KTtcblxuICAgICAgX3RoaXMxMy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9FTkQsIF90aGlzMTMub25UYXBFbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgX3RoaXMxMy5oYW5kbGVXaGVlbCk7XG4gICAgICBfdGhpczEzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgX3RoaXMxMy5vblRhcFN0YXJ0KTtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgX3RoaXMxMy5vblRhcEVuZCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQXBwT25Ecm9wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE4ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChldmVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKF90aGlzMTMucHJvcHMub25Ecm9wKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICgoeWllbGQgX3RoaXMxMy5wcm9wcy5vbkRyb3AoZXZlbnQpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXTtcblxuICAgICAgICBpZiAoaXNTdXBwb3J0ZWRJbWFnZUZpbGUoZmlsZSkpIHtcbiAgICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBzY2VuZSBmcm9tIHRoZSBpbWFnZSBpZiBpdCdzIGVtYmVkZGVkXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgaWYgKGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMucG5nIHx8IGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAobmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgb25seSB3b3JrIGFzIG9mIENocm9tZSA4NixcbiAgICAgICAgICAgICAgICAgIC8vIGJ1dCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgb24gb2xkZXIgcmVsZWFzZXMuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgICAgICAgICAgZmlsZS5oYW5kbGUgPSB5aWVsZCBpdGVtLmdldEFzRmlsZVN5c3RlbUhhbmRsZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3Qgc2NlbmUgPSB5aWVsZCBsb2FkRnJvbUJsb2IoZmlsZSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG5cbiAgICAgICAgICAgICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUpLCB7fSwge1xuICAgICAgICAgICAgICAgIGFwcFN0YXRlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlIHx8IF90aGlzMTMuc3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VGaWxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lICE9PSBcIkVuY29kaW5nRXJyb3JcIikge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBpZiBubyBzY2VuZSBpcyBlbWJlZGRlZCBvciB3ZSBmYWlsIGZvciB3aGF0ZXZlciByZWFzb24sIGZhbGwgYmFja1xuICAgICAgICAgIC8vIHRvIGltcG9ydGluZyBhcyByZWd1bGFyIGltYWdlXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHg6IHNjZW5lWCxcbiAgICAgICAgICAgIHk6IHNjZW5lWVxuICAgICAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gX3RoaXMxMy5jcmVhdGVJbWFnZUVsZW1lbnQoe1xuICAgICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgICAgc2NlbmVZXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuXG4gICAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG5cbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpYnJhcnlTaGFwZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIpO1xuXG4gICAgICBpZiAobGlicmFyeVNoYXBlcyAhPT0gXCJcIikge1xuICAgICAgICBfdGhpczEzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICBlbGVtZW50czogSlNPTi5wYXJzZShsaWJyYXJ5U2hhcGVzKSxcbiAgICAgICAgICBwb3NpdGlvbjogZXZlbnQsXG4gICAgICAgICAgZmlsZXM6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlc1swXTtcblxuICAgICAgaWYgKGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYiB8fCBmaWxlPy5uYW1lPy5lbmRzV2l0aChcIi5leGNhbGlkcmF3bGliXCIpKSB7XG4gICAgICAgIF90aGlzMTMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGZpbGUpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIENsb3NlIGFuZCB0aGVuIG9wZW4gdG8gZ2V0IHRoZSBsaWJyYXJpZXMgdXBkYXRlZFxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNMaWJyYXJ5T3BlbjogZmFsc2VcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNMaWJyYXJ5T3BlbjogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pOyAvLyBkZWZhdWx0OiBhc3N1bWUgYW4gRXhjYWxpZHJhdyBmaWxlIHJlZ2FyZGxlc3Mgb2YgZXh0ZW5zaW9uL01pbWVUeXBlXG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgb25seSB3b3JrIGFzIG9mIENocm9tZSA4NixcbiAgICAgICAgICAgIC8vIGJ1dCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgb24gb2xkZXIgcmVsZWFzZXMuXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgICAgZmlsZS5oYW5kbGUgPSB5aWVsZCBpdGVtLmdldEFzRmlsZVN5c3RlbUhhbmRsZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgeWllbGQgX3RoaXMxMy5sb2FkRmlsZVRvQ2FudmFzKGZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDEzKSB7XG4gICAgICByZXR1cm4gX3JlZjE4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHRoaXMubG9hZEZpbGVUb0NhbnZhcyA9IGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgbG9hZEZyb21CbG9iKGZpbGUsIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpLnRoZW4oZnVuY3Rpb24gKHNjZW5lKSB7XG4gICAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICAgIGFwcFN0YXRlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlIHx8IF90aGlzMTMuc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICAgICAgfSksXG4gICAgICAgIHJlcGxhY2VGaWxlczogdHJ1ZSxcbiAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgICB9KSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSwge1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50ID8gXCJlbGVtZW50XCIgOiBcImNhbnZhc1wiO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGNvbnN0IHtcbiAgICAgIHRvcDogb2Zmc2V0VG9wLFxuICAgICAgbGVmdDogb2Zmc2V0TGVmdFxuICAgIH0gPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgIGNvbnN0IHRvcCA9IGV2ZW50LmNsaWVudFkgLSBvZmZzZXRUb3A7XG5cbiAgICBpZiAoZWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICBbZWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczEzLl9vcGVuQ29udGV4dE1lbnUoe1xuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0XG4gICAgICAgIH0sIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuX29wZW5Db250ZXh0TWVudSh7XG4gICAgICAgIHRvcCxcbiAgICAgICAgbGVmdFxuICAgICAgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSBmdW5jdGlvbiAocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpIHtcbiAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSBfdGhpczEzLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuXG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGRyYWdOZXdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJDb29yZHMueCksIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIHBvaW50ZXJDb29yZHMueSksIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgIGNvbnN0IGltYWdlID0gaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpICYmIF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoZHJhZ2dpbmdFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSBpbWFnZSAmJiAhKGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkgPyBpbWFnZS53aWR0aCAvIGltYWdlLmhlaWdodCA6IG51bGw7XG4gICAgICBkcmFnTmV3RWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRYLCBncmlkWSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgZ3JpZFgpLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LCBncmlkWSksIGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCkgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSwgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksIGFzcGVjdFJhdGlvKTtcblxuICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFtkcmFnZ2luZ0VsZW1lbnRdKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5tYXliZUhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlLCBldmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlVHlwZSA9IHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGU7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIC8vIFRPRE86IHJlbmFtZSB0aGlzIHN0YXRlIGZpZWxkIHRvIFwiaXNTY2FsaW5nXCIgdG8gZGlzdGluZ3Vpc2hcbiAgICAgIC8vIGl0IGZyb20gdGhlIGdlbmVyaWMgXCJpc1Jlc2l6aW5nXCIgd2hpY2ggaW5jbHVkZXMgc2NhbGluZyBhbmRcbiAgICAgIC8vIHJvdGF0aW5nXG4gICAgICBpc1Jlc2l6aW5nOiB0cmFuc2Zvcm1IYW5kbGVUeXBlICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwicm90YXRpb25cIixcbiAgICAgIGlzUm90YXRpbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIlxuICAgIH0pO1xuXG4gICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3JkcztcbiAgICBjb25zdCBbcmVzaXplWCwgcmVzaXplWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldC55LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGlmICh0cmFuc2Zvcm1FbGVtZW50cyhwb2ludGVyRG93blN0YXRlLCB0cmFuc2Zvcm1IYW5kbGVUeXBlLCBzZWxlY3RlZEVsZW1lbnRzLCBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5hcnJvd0RpcmVjdGlvbiwgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSwgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNJbWFnZUVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCkgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSwgcmVzaXplWCwgcmVzaXplWSwgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLngsIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci55KSkge1xuICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdGhpcy5fb3BlbkNvbnRleHRNZW51ID0gZnVuY3Rpb24gKF9yZWYxOSwgdHlwZSkge1xuICAgIGxldCB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wXG4gICAgfSA9IF9yZWYxOTtcblxuICAgIGlmIChfdGhpczEzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF90aGlzMTMuY29udGV4dE1lbnVPcGVuID0gdHJ1ZTtcbiAgICBjb25zdCBtYXliZUdyb3VwQWN0aW9uID0gYWN0aW9uR3JvdXAuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZUZsaXBIb3Jpem9udGFsID0gYWN0aW9uRmxpcEhvcml6b250YWwuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3QgbWF5YmVGbGlwVmVydGljYWwgPSBhY3Rpb25GbGlwVmVydGljYWwuY29udGV4dEl0ZW1QcmVkaWNhdGUoX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSk7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gXCJzZXBhcmF0b3JcIjtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IFtdO1xuXG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNQbmcpO1xuICAgIH1cblxuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNTdmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImNhbnZhc1wiKSB7XG4gICAgICBjb25zdCB2aWV3TW9kZU9wdGlvbnMgPSBbLi4ub3B0aW9ucywgdHlwZW9mIF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVaZW5Nb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlVmlld01vZGUsIGFjdGlvblRvZ2dsZVN0YXRzXTtcblxuICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IHZpZXdNb2RlT3B0aW9ucyxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBlbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IFtfdGhpczEzLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgcGVyZm9ybTogZnVuY3Rpb24gKGVsZW1lbnRzLCBhcHBTdGF0ZXMpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIlxuICAgICAgICAgIH0sIF90aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBzZXBhcmF0b3IsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgYWN0aW9uQ29weUFzUG5nLCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgYWN0aW9uQ29weUFzU3ZnLCAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCB8fCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApICYmIHNlcGFyYXRvciwgYWN0aW9uU2VsZWN0QWxsLCBzZXBhcmF0b3IsIHR5cGVvZiBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVHcmlkTW9kZSwgdHlwZW9mIF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSwgdHlwZW9mIF90aGlzMTMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVZpZXdNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0c10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgY29uc3QgZWxlbWVudHNXaXRoVW5iaW5kZWRUZXh0ID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSkuc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gIWhhc0JvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IFtuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksIC4uLm9wdGlvbnNdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGVsZW1lbnRzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW190aGlzMTMuaXNNb2JpbGUgJiYgYWN0aW9uQ3V0LCBfdGhpczEzLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSwgX3RoaXMxMy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgIHBlcmZvcm06IGZ1bmN0aW9uIChlbGVtZW50cywgYXBwU3RhdGVzKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCJcbiAgICAgICAgICB9LCBfdGhpczEzLmlzTW9iaWxlICYmIHNlcGFyYXRvciwgLi4ub3B0aW9ucywgc2VwYXJhdG9yLCBhY3Rpb25Db3B5U3R5bGVzLCBhY3Rpb25QYXN0ZVN0eWxlcywgc2VwYXJhdG9yLCBtYXliZUdyb3VwQWN0aW9uICYmIGFjdGlvbkdyb3VwLCAhZWxlbWVudHNXaXRoVW5iaW5kZWRUZXh0ICYmIGFjdGlvblVuYmluZFRleHQsIG1heWJlVW5ncm91cEFjdGlvbiAmJiBhY3Rpb25Vbmdyb3VwLCAobWF5YmVHcm91cEFjdGlvbiB8fCBtYXliZVVuZ3JvdXBBY3Rpb24pICYmIHNlcGFyYXRvciwgYWN0aW9uQWRkVG9MaWJyYXJ5LCBzZXBhcmF0b3IsIGFjdGlvblNlbmRCYWNrd2FyZCwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25TZW5kVG9CYWNrLCBhY3Rpb25CcmluZ1RvRnJvbnQsIHNlcGFyYXRvciwgbWF5YmVGbGlwSG9yaXpvbnRhbCAmJiBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgbWF5YmVGbGlwVmVydGljYWwgJiYgYWN0aW9uRmxpcFZlcnRpY2FsLCAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25MaW5rLmNvbnRleHRJdGVtUHJlZGljYXRlKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKSAmJiBhY3Rpb25MaW5rLCBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sIGFjdGlvbkRlbGV0ZVNlbGVjdGVkXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBlbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVXaGVlbCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWVxuICAgIH0gPSBldmVudDtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkc1xuICAgIH0gPSBfdGhpczEzLnN0YXRlOyAvLyBub3RlIHRoYXQgZXZlbnQuY3RybEtleSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHBpbmNoIHpvb21pbmdcblxuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuXG4gICAgICBpZiAoZGVsdGEgPiBNQVhfU1RFUCkge1xuICAgICAgICBkZWx0YSA9IE1BWF9TVEVQO1xuICAgICAgfVxuXG4gICAgICBkZWx0YSAqPSBzaWduO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge31cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdab29tID0gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlIC0gZGVsdGEgLyAxMDA7IC8vIGluY3JlYXNlIHpvb20gc3RlcHMgdGhlIG1vcmUgem9vbWVkLWluIHdlIGFyZSAoYXBwbGllcyB0byA+MTAwJSBvbmx5KVxuXG4gICAgICBuZXdab29tICs9IE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSkgKiAtc2lnbjsgLy8gcm91bmQgdG8gbmVhcmVzdCBzdGVwXG5cbiAgICAgIG5ld1pvb20gPSBNYXRoLnJvdW5kKG5ld1pvb20gKiBaT09NX1NURVAgKiAxMDApIC8gKFpPT01fU1RFUCAqIDEwMCk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldFN0YXRlRm9yWm9vbSh7XG4gICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICBuZXh0Wm9vbTogZ2V0Tm9ybWFsaXplZFpvb20obmV3Wm9vbSlcbiAgICAgICAgfSwgc3RhdGUpKSwge30sIHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiBPYmplY3Qua2V5cyhzZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCA/IHNlbGVjdGVkRWxlbWVudElkcyA6IHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNjcm9sbCBob3Jpem9udGFsbHkgd2hlbiBzaGlmdCBwcmVzc2VkXG5cblxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjIwKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICBzY3JvbGxYXG4gICAgICAgIH0gPSBfcmVmMjA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLy8gb24gTWFjLCBzaGlmdCt3aGVlbCB0ZW5kcyB0byByZXN1bHQgaW4gZGVsdGFYXG4gICAgICAgICAgc2Nyb2xsWDogc2Nyb2xsWCAtIChkZWx0YVkgfHwgZGVsdGFYKSAvIHpvb20udmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjIxKSB7XG4gICAgICBsZXQge1xuICAgICAgICB6b29tLFxuICAgICAgICBzY3JvbGxYLFxuICAgICAgICBzY3JvbGxZXG4gICAgICB9ID0gX3JlZjIxO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Nyb2xsWDogc2Nyb2xsWCAtIGRlbHRhWCAvIHpvb20udmFsdWUsXG4gICAgICAgIHNjcm9sbFk6IHNjcm9sbFkgLSBkZWx0YVkgLyB6b29tLnZhbHVlXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcblxuICB0aGlzLnNhdmVQb2ludGVyID0gZnVuY3Rpb24gKHgsIHksIGJ1dHRvbikge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WDogeCxcbiAgICAgIGNsaWVudFk6IHlcbiAgICB9LCBfdGhpczEzLnN0YXRlKTtcblxuICAgIGlmIChpc05hTihwb2ludGVyLngpIHx8IGlzTmFOKHBvaW50ZXIueSkpIHsvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgX3RoaXMxMy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnNcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3RoaXMxMy51bm1vdW50ZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgdGhpcy51cGRhdGVET01SZWN0ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgaWYgKF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgY29uc3QgZXhjYWxpZHJhd0NvbnRhaW5lciA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICB0b3A6IG9mZnNldFRvcFxuICAgICAgfSA9IGV4Y2FsaWRyYXdDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoOiBjdXJyZW50V2lkdGgsXG4gICAgICAgIGhlaWdodDogY3VycmVudEhlaWdodCxcbiAgICAgICAgb2Zmc2V0VG9wOiBjdXJyZW50T2Zmc2V0VG9wLFxuICAgICAgICBvZmZzZXRMZWZ0OiBjdXJyZW50T2Zmc2V0TGVmdFxuICAgICAgfSA9IF90aGlzMTMuc3RhdGU7XG5cbiAgICAgIGlmICh3aWR0aCA9PT0gY3VycmVudFdpZHRoICYmIGhlaWdodCA9PT0gY3VycmVudEhlaWdodCAmJiBvZmZzZXRMZWZ0ID09PSBjdXJyZW50T2Zmc2V0TGVmdCAmJiBvZmZzZXRUb3AgPT09IGN1cnJlbnRPZmZzZXRUb3ApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG9mZnNldExlZnQsXG4gICAgICAgIG9mZnNldFRvcFxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZ2V0Q2FudmFzT2Zmc2V0cygpKSk7XG4gIH07XG59O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlQpIHtcbiAgd2luZG93LmggPSB3aW5kb3cuaCB8fCB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICBlbGVtZW50czoge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNldChlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHAuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgIH1cblxuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../components/App.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/App.tsx?");
1920
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"showFourthFont\\\": () => (/* binding */ showFourthFont),\\n/* harmony export */ \\\"useIsMobile\\\": () => (/* binding */ useIsMobile),\\n/* harmony export */ \\\"useExcalidrawContainer\\\": () => (/* binding */ useExcalidrawContainer),\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! nanoid */ \\\"../../../node_modules/nanoid/index.dev.js\\\");\\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \\\"../../actions/index.ts\\\");\\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \\\"../../actions/actionHistory.tsx\\\");\\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \\\"../../actions/manager.tsx\\\");\\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \\\"../../actions/register.ts\\\");\\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \\\"../../analytics.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \\\"../../clipboard.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \\\"../../data/index.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \\\"../../gesture.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \\\"../../history.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer */ \\\"../../renderer/index.ts\\\");\\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \\\"../../scene/index.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \\\"../../scene/zoom.ts\\\");\\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \\\"../../shapes.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \\\"../../components/ContextMenu.tsx\\\");\\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \\\"../../components/LayerUI.tsx\\\");\\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Stats */ \\\"../../components/Stats.tsx\\\");\\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Toast */ \\\"../../components/Toast.tsx\\\");\\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \\\"../../actions/actionToggleViewMode.tsx\\\");\\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../data/blob */ \\\"../../data/blob.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! lodash.throttle */ \\\"../../../node_modules/lodash.throttle/index.js\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_43__);\\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../data/filesystem */ \\\"../../data/filesystem.ts\\\");\\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_resizeElements__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../element/resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../element/Hyperlink */ \\\"../../element/Hyperlink.tsx\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nlet showFourthFont = false;\\r\\nconst IsMobileContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext(false);\\r\\nconst useIsMobile = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(IsMobileContext);\\r\\n};\\r\\nconst ExcalidrawContainerContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext({\\r\\n container: null,\\r\\n id: null\\r\\n});\\r\\nconst useExcalidrawContainer = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(ExcalidrawContainerContext);\\r\\n};\\r\\nlet didTapTwice = false;\\r\\nlet tappedTwiceTimer = 0;\\r\\nlet cursorX = 0;\\r\\nlet cursorY = 0;\\r\\nlet isHoldingSpace = false;\\r\\nlet isPanning = false;\\r\\nlet isDraggingScrollBar = false;\\r\\nlet currentScrollBars = {\\r\\n horizontal: null,\\r\\n vertical: null\\r\\n};\\r\\nlet touchTimeout = 0;\\r\\nlet invalidateContextMenu = false;\\r\\nlet lastPointerUp = null;\\r\\nconst gesture = {\\r\\n pointers: new Map(),\\r\\n lastCenter: null,\\r\\n initialDistance: null,\\r\\n initialScale: null\\r\\n};\\r\\nclass App extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {\\r\\n constructor(props) {\\r\\n var _a;\\r\\n var _this;\\r\\n super(props);\\r\\n _this = this;\\r\\n _initialiseProps.call(this);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\\r\\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name } = props;\\r\\n this.state = _objectSpread(_objectSpread(_objectSpread({}, defaultAppState), {}, {\\r\\n theme,\\r\\n isLoading: true\\r\\n }, this.getCanvasOffsets()), {}, {\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\\r\\n name,\\r\\n width: window.innerWidth,\\r\\n height: window.innerHeight,\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_50__.nanoid)();\\r\\n if (excalidrawRef) {\\r\\n const readyPromise = \\\"current\\\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\\r\\n const api = {\\r\\n ready: true,\\r\\n readyPromise,\\r\\n updateScene: this.updateScene,\\r\\n addFiles: this.addFiles,\\r\\n resetScene: this.resetScene,\\r\\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\\r\\n history: {\\r\\n clear: this.resetHistory\\r\\n },\\r\\n scrollToContent: this.scrollToContent,\\r\\n zoomToFit: this.zoomToFit,\\r\\n getSceneElements: this.getSceneElements,\\r\\n getAppState: function () {\\r\\n return _this.state;\\r\\n },\\r\\n getFiles: function () {\\r\\n return _this.files;\\r\\n },\\r\\n refresh: this.refresh,\\r\\n importLibrary: this.importLibraryFromUrl,\\r\\n setToastMessage: this.setToastMessage,\\r\\n updateContainerSize: this.updateContainerSize,\\r\\n id: this.id,\\r\\n setLocalFont: this.setLocalFont,\\r\\n selectElements: this.selectElements,\\r\\n sendBackward: this.sendBackward,\\r\\n bringForward: this.bringForward,\\r\\n sendToBack: this.sendToBack,\\r\\n bringToFront: this.bringToFront\\r\\n };\\r\\n if (typeof excalidrawRef === \\\"function\\\") {\\r\\n excalidrawRef(api);\\r\\n }\\r\\n else {\\r\\n excalidrawRef.current = api;\\r\\n }\\r\\n readyPromise.resolve(api);\\r\\n }\\r\\n this.excalidrawContainerValue = {\\r\\n container: this.excalidrawContainerRef.current,\\r\\n id: this.id\\r\\n };\\r\\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__[\\\"default\\\"]();\\r\\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__[\\\"default\\\"](this);\\r\\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__[\\\"default\\\"]();\\r\\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, function () {\\r\\n return _this.state;\\r\\n }, function () {\\r\\n return _this.scene.getElementsIncludingDeleted();\\r\\n }, this);\\r\\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\\r\\n }\\r\\n renderCanvas() {\\r\\n const canvasScale = window.devicePixelRatio;\\r\\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled } = this.state;\\r\\n const canvasWidth = canvasDOMWidth * canvasScale;\\r\\n const canvasHeight = canvasDOMHeight * canvasScale;\\r\\n if (viewModeEnabled) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight,\\r\\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n onDoubleClick: this.handleCanvasDoubleClick,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n render() {\\r\\n var _a, _b;\\r\\n var _this2 = this;\\r\\n const { zenModeEnabled, viewModeEnabled } = this.state;\\r\\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\\r\\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats } = this.props;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"div\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"])(\\\"excalidraw excalidraw-container\\\", {\\r\\n \\\"excalidraw--view-mode\\\": viewModeEnabled,\\r\\n \\\"excalidraw--mobile\\\": this.isMobile\\r\\n }),\\r\\n ref: this.excalidrawContainerRef,\\r\\n onDrop: this.handleAppOnDrop,\\r\\n tabIndex: 0,\\r\\n onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(ExcalidrawContainerContext.Provider, {\\r\\n value: this.excalidrawContainerValue,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsxs)(IsMobileContext.Provider, {\\r\\n value: this.isMobile,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__[\\\"default\\\"], {\\r\\n canvas: this.canvas,\\r\\n appState: this.state,\\r\\n files: this.files,\\r\\n setAppState: this.setAppState,\\r\\n actionManager: this.actionManager,\\r\\n elements: this.scene.getElements(),\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n onLockToggle: this.toggleLock,\\r\\n onPenModeToggle: this.togglePenMode,\\r\\n onInsertElements: function (elements) {\\r\\n return _this2.addElementsFromPasteOrLibrary({\\r\\n elements,\\r\\n position: \\\"center\\\",\\r\\n files: null\\r\\n });\\r\\n },\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n toggleZenMode: this.toggleZenMode,\\r\\n langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code,\\r\\n isCollaborating: this.props.isCollaborating,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderCustomFooter: renderFooter,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \\\"undefined\\\" && zenModeEnabled,\\r\\n showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \\\"undefined\\\" && this.props.UIOptions.canvasActions.theme,\\r\\n libraryReturnUrl: this.props.libraryReturnUrl,\\r\\n UIOptions: this.props.UIOptions,\\r\\n focusContainer: this.focusContainer,\\r\\n library: this.library,\\r\\n id: this.id,\\r\\n onImageAction: this.onImageAction\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-textEditorContainer\\\"\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-contextMenuContainer\\\"\\r\\n }), selectedElement.length === 1 && this.state.showHyperlinkPopup && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.Hyperlink, {\\r\\n element: selectedElement[0],\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n onLinkOpen: this.props.onLinkOpen\\r\\n }, selectedElement[0].id), this.state.showStats && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_38__.Stats, {\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n elements: this.scene.getElements(),\\r\\n onClose: this.toggleStats,\\r\\n renderCustomStats: renderCustomStats\\r\\n }), this.state.toastMessage !== null && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_39__.Toast, {\\r\\n message: this.state.toastMessage,\\r\\n clearToast: this.clearToast\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_49__.jsx)(\\\"main\\\", {\\r\\n children: this.renderCanvas()\\r\\n })]\\r\\n })\\r\\n })\\r\\n });\\r\\n }\\r\\n componentDidMount() {\\r\\n var _this3 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a, _b;\\r\\n _this3.unmounted = false;\\r\\n _this3.excalidrawContainerValue.container = _this3.excalidrawContainerRef.current;\\r\\n if (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n const setState = _this3.setState.bind(_this3);\\r\\n Object.defineProperties(window.h, {\\r\\n state: {\\r\\n configurable: true,\\r\\n get: function () {\\r\\n return _this3.state;\\r\\n }\\r\\n },\\r\\n setState: {\\r\\n configurable: true,\\r\\n value: function () {\\r\\n return _this3.setState(...arguments);\\r\\n }\\r\\n },\\r\\n app: {\\r\\n configurable: true,\\r\\n value: _this3\\r\\n },\\r\\n history: {\\r\\n configurable: true,\\r\\n value: _this3.history\\r\\n }\\r\\n });\\r\\n }\\r\\n _this3.scene.addCallback(_this3.onSceneUpdated);\\r\\n _this3.addEventListeners();\\r\\n if (_this3.excalidrawContainerRef.current) {\\r\\n _this3.focusContainer();\\r\\n }\\r\\n if (\\\"ResizeObserver\\\" in window && ((_a = _this3.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\\r\\n _this3.resizeObserver = new ResizeObserver(function () {\\r\\n // compute isMobile state\\r\\n // ---------------------------------------------------------------------\\r\\n const { width, height } = _this3.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this3.isMobile = width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE; // refresh offsets\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.updateDOMRect();\\r\\n });\\r\\n (_b = _this3.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n else if (window.matchMedia) {\\r\\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\\r\\n const handler = function () {\\r\\n return _this3.isMobile = mediaQuery.matches;\\r\\n };\\r\\n mediaQuery.addListener(handler);\\r\\n _this3.detachIsMobileMqHandler = function () {\\r\\n return mediaQuery.removeListener(handler);\\r\\n };\\r\\n }\\r\\n const searchParams = new URLSearchParams(window.location.search.slice(1));\\r\\n if (searchParams.has(\\\"web-share-target\\\")) {\\r\\n // Obtain a file that was shared via the Web Share Target API.\\r\\n _this3.restoreFileFromShare();\\r\\n }\\r\\n else {\\r\\n _this3.updateDOMRect(_this3.initializeScene);\\r\\n }\\r\\n })();\\r\\n }\\r\\n componentWillUnmount() {\\r\\n var _a;\\r\\n this.files = {};\\r\\n this.imageCache.clear();\\r\\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\\r\\n this.unmounted = true;\\r\\n this.removeEventListeners();\\r\\n this.scene.destroy();\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n }\\r\\n removeEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n (_d = this.detachIsMobileMqHandler) === null || _d === void 0 ? void 0 : _d.call(this);\\r\\n }\\r\\n addEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n this.removeEventListeners();\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n if (this.props.handleKeyboardGlobally) {\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, {\\r\\n passive: true\\r\\n });\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition); // rerender text elements on font load to fix #637 && #1553\\r\\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \\\"loadingdone\\\", this.onFontLoaded); // Safari-only desktop pinch zoom\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n if (this.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n if (this.props.detectScroll) {\\r\\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\\r\\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n }\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n }\\r\\n componentDidUpdate(prevProps, prevState) {\\r\\n var _a, _b, _c;\\r\\n var _this4 = this;\\r\\n // Hide hyperlink popup if shown when element type is not selection\\r\\n if (prevState.elementType === \\\"selection\\\" && this.state.elementType !== \\\"selection\\\" && this.state.showHyperlinkPopup) {\\r\\n this.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n if (prevProps.langCode !== this.props.langCode) {\\r\\n this.updateLanguage();\\r\\n }\\r\\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\\r\\n this.setState({\\r\\n viewModeEnabled: !!this.props.viewModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\\r\\n this.addEventListeners();\\r\\n this.deselectElements();\\r\\n }\\r\\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\\r\\n this.setState({\\r\\n zenModeEnabled: !!this.props.zenModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevProps.theme !== this.props.theme && this.props.theme) {\\r\\n this.setState({\\r\\n theme: this.props.theme\\r\\n });\\r\\n }\\r\\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\\r\\n this.setState({\\r\\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null\\r\\n });\\r\\n }\\r\\n if (this.props.name && prevProps.name !== this.props.name) {\\r\\n this.setState({\\r\\n name: this.props.name\\r\\n });\\r\\n }\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\\\"theme--dark\\\", this.state.theme === \\\"dark\\\");\\r\\n if (this.state.editingLinearElement && !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\\r\\n // defer so that the commitToHistory flag isn't reset via current update\\r\\n setTimeout(function () {\\r\\n _this4.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n const { multiElement } = prevState;\\r\\n if (prevState.elementType !== this.state.elementType && multiElement != null && (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\\r\\n }\\r\\n const cursorButton = {};\\r\\n const pointerViewportCoords = {};\\r\\n const remoteSelectedElementIds = {};\\r\\n const pointerUsernames = {};\\r\\n const pointerUserStates = {};\\r\\n this.state.collaborators.forEach(function (user, socketId) {\\r\\n if (user.selectedElementIds) {\\r\\n for (const id of Object.keys(user.selectedElementIds)) {\\r\\n if (!(id in remoteSelectedElementIds)) {\\r\\n remoteSelectedElementIds[id] = [];\\r\\n }\\r\\n remoteSelectedElementIds[id].push(socketId);\\r\\n }\\r\\n }\\r\\n if (!user.pointer) {\\r\\n return;\\r\\n }\\r\\n if (user.username) {\\r\\n pointerUsernames[socketId] = user.username;\\r\\n }\\r\\n if (user.userState) {\\r\\n pointerUserStates[socketId] = user.userState;\\r\\n }\\r\\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: user.pointer.x,\\r\\n sceneY: user.pointer.y\\r\\n }, _this4.state);\\r\\n cursorButton[socketId] = user.button;\\r\\n });\\r\\n const renderingElements = this.scene.getElements().filter(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(element)) {\\r\\n if ( // not placed on canvas yet (but in elements array)\\r\\n _this4.state.pendingImageElement && element.id === _this4.state.pendingImageElement.id) {\\r\\n return false;\\r\\n }\\r\\n } // don't render text element that's being currently edited (it's\\r\\n // rendered on remote only)\\r\\n return !_this4.state.editingElement || _this4.state.editingElement.type !== \\\"text\\\" || element.id !== _this4.state.editingElement.id;\\r\\n });\\r\\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_29__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\\r\\n scrollX: this.state.scrollX,\\r\\n scrollY: this.state.scrollY,\\r\\n viewBackgroundColor: this.state.viewBackgroundColor,\\r\\n zoom: this.state.zoom,\\r\\n remotePointerViewportCoords: pointerViewportCoords,\\r\\n remotePointerButton: cursorButton,\\r\\n remoteSelectedElementIds,\\r\\n remotePointerUsernames: pointerUsernames,\\r\\n remotePointerUserStates: pointerUserStates,\\r\\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\\r\\n theme: this.state.theme,\\r\\n imageCache: this.imageCache,\\r\\n isExporting: false,\\r\\n renderScrollbars: !this.isMobile\\r\\n });\\r\\n if (scrollBars) {\\r\\n currentScrollBars = scrollBars;\\r\\n }\\r\\n const scrolledOutside = // hide when editing text\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(this.state.editingElement) ? false : !atLeastOneVisibleElement && renderingElements.length > 0;\\r\\n if (this.state.scrolledOutside !== scrolledOutside) {\\r\\n this.setState({\\r\\n scrolledOutside\\r\\n });\\r\\n }\\r\\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\\r\\n this.scheduleImageRefresh(); // Do not notify consumers if we're still loading the scene. Among other\\r\\n // potential issues, this fixes a case where the tab isn't focused during\\r\\n // init, which would trigger onChange with empty elements, which would then\\r\\n // override whatever is in localStorage currently.\\r\\n if (!this.state.isLoading) {\\r\\n (_c = (_b = this.props).onChange) === null || _c === void 0 ? void 0 : _c.call(_b, this.scene.getElementsIncludingDeleted(), this.state, this.files);\\r\\n }\\r\\n }\\r\\n static resetTapTwice() {\\r\\n didTapTwice = false;\\r\\n }\\r\\n addTextFromPaste(text) {\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, this.state);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x,\\r\\n y,\\r\\n strokeColor: this.state.currentItemStrokeColor,\\r\\n backgroundColor: this.state.currentItemBackgroundColor,\\r\\n fillStyle: this.state.currentItemFillStyle,\\r\\n strokeWidth: this.state.currentItemStrokeWidth,\\r\\n strokeStyle: this.state.currentItemStrokeStyle,\\r\\n roughness: this.state.currentItemRoughness,\\r\\n opacity: this.state.currentItemOpacity,\\r\\n strokeSharpness: this.state.currentItemStrokeSharpness,\\r\\n text,\\r\\n rawText: text,\\r\\n fontSize: this.state.currentItemFontSize,\\r\\n fontFamily: this.state.currentItemFontFamily,\\r\\n textAlign: this.state.currentItemTextAlign,\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted(), element]);\\r\\n this.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n });\\r\\n this.history.resumeRecording();\\r\\n } // Collaboration\\r\\n selectShapeTool(elementType) {\\r\\n if (!isHoldingSpace) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, elementType);\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\\r\\n this.focusContainer();\\r\\n }\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(elementType)) {\\r\\n this.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n if (elementType === \\\"image\\\") {\\r\\n this.onImageAction();\\r\\n }\\r\\n if (elementType !== \\\"selection\\\") {\\r\\n this.setState({\\r\\n elementType,\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n else {\\r\\n this.setState({\\r\\n elementType\\r\\n });\\r\\n }\\r\\n }\\r\\n handleTextWysiwyg(element, _ref) {\\r\\n var _this5 = this;\\r\\n let { isExistingElement = false } = _ref;\\r\\n const updateElement = function (text, originalText, isDeleted, rawText, link) {\\r\\n _this5.scene.replaceAllElements([..._this5.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted,\\r\\n originalText,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText,\\r\\n link\\r\\n });\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n };\\r\\n if (isExistingElement && this.props.onBeforeTextEdit) {\\r\\n const text = this.props.onBeforeTextEdit(element);\\r\\n if (text) {\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted: false,\\r\\n originalText: text\\r\\n });\\r\\n return element;\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n }\\r\\n }\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\\r\\n id: element.id,\\r\\n canvas: this.canvas,\\r\\n getViewportCoords: function (x, y) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n }, _this5.state);\\r\\n return [viewportX - _this5.state.offsetLeft, viewportY - _this5.state.offsetTop];\\r\\n },\\r\\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (text) {\\r\\n updateElement(text, text, false);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\\r\\n }\\r\\n }),\\r\\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (_ref2) {\\r\\n let { text, viaKeyboard, originalText } = _ref2;\\r\\n const isDeleted = !text.trim();\\r\\n const rawText = originalText; //should this be originalText??\\r\\n let link = undefined;\\r\\n if (_this5.props.onBeforeTextSubmit) {\\r\\n const [updatedText, updatedOriginalText, l] = _this5.props.onBeforeTextSubmit(element, text, originalText, isDeleted);\\r\\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\\r\\n originalText = updatedOriginalText !== null && updatedOriginalText !== void 0 ? updatedOriginalText : originalText;\\r\\n link = l;\\r\\n }\\r\\n updateElement(text, originalText, isDeleted, rawText, link); // select the created text element only if submitting via keyboard\\r\\n // (when submitting via click it should act as signal to deselect)\\r\\n if (!isDeleted && viaKeyboard) {\\r\\n const elementIdToSelect = element.containerId ? element.containerId : element.id;\\r\\n _this5.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [elementIdToSelect]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isDeleted) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(_this5.scene.getElements(), [element]);\\r\\n }\\r\\n if (!isDeleted || isExistingElement) {\\r\\n _this5.history.resumeRecording();\\r\\n }\\r\\n _this5.setState({\\r\\n draggingElement: null,\\r\\n editingElement: null\\r\\n });\\r\\n if (_this5.state.elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this5.canvas, _this5.state.elementType);\\r\\n }\\r\\n _this5.focusContainer();\\r\\n }),\\r\\n element,\\r\\n excalidrawContainer: this.excalidrawContainerRef.current,\\r\\n app: this\\r\\n }); // deselect all other elements when inserting text\\r\\n this.deselectElements(); // do an initial update to re-initialize element position since we were\\r\\n // modifying element's x/y for sake of editor (case: syncing to remote)\\r\\n updateElement(element.text, element.originalText, false);\\r\\n }\\r\\n deselectElements() {\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n getTextElementAtPosition(x, y) {\\r\\n const element = this.getElementAtPosition(x, y, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\\r\\n return element;\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementAtPosition(x, y, opts) {\\r\\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement);\\r\\n if (allHitElements.length > 1) {\\r\\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\\r\\n for (let index = allHitElements.length - 1; index > -1; index--) {\\r\\n if (this.state.selectedElementIds[allHitElements[index].id]) {\\r\\n return allHitElements[index];\\r\\n }\\r\\n }\\r\\n }\\r\\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1]; // If we're hitting element with highest z-index only on its bounding box\\r\\n // while also hitting other element figure, the latter should be considered.\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y) ? allHitElements[allHitElements.length - 2] : elementWithHighestZIndex;\\r\\n }\\r\\n if (allHitElements.length === 1) {\\r\\n return allHitElements[0];\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementsAtPosition(x, y) {\\r\\n var _this6 = this;\\r\\n let includeBoundTextElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\r\\n const elements = includeBoundTextElement ? this.scene.getElements() : this.scene.getElements().filter(function (element) {\\r\\n return !((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && element.containerId);\\r\\n });\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(elements, function (element) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, _this6.state, x, y);\\r\\n });\\r\\n }\\r\\n maybeCleanupAfterMissingPointerUp(event) {\\r\\n if (lastPointerUp !== null) {\\r\\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\\r\\n // this can happen when a contextual menu or alert is triggered. In order to avoid\\r\\n // being in a weird state, we clean up on the next pointerdown\\r\\n lastPointerUp(event);\\r\\n }\\r\\n } // Returns whether the event is a panning\\r\\n updateGestureOnPointerDown(event) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n if (gesture.pointers.size === 2) {\\r\\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n gesture.initialScale = this.state.zoom.value;\\r\\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n }\\r\\n }\\r\\n initialPointerDownState(event) {\\r\\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return {\\r\\n origin,\\r\\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\\r\\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\\r\\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\\r\\n // we need to duplicate because we'll be updating this state\\r\\n lastCoords: _objectSpread({}, origin),\\r\\n originalElements: this.scene.getElements().reduce(function (acc, element) {\\r\\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\\r\\n return acc;\\r\\n }, new Map()),\\r\\n resize: {\\r\\n handleType: false,\\r\\n isResizing: false,\\r\\n offset: {\\r\\n x: 0,\\r\\n y: 0\\r\\n },\\r\\n arrowDirection: \\\"origin\\\",\\r\\n center: {\\r\\n x: (maxX + minX) / 2,\\r\\n y: (maxY + minY) / 2\\r\\n }\\r\\n },\\r\\n hit: {\\r\\n element: null,\\r\\n allHitElements: [],\\r\\n wasAddedToSelection: false,\\r\\n hasBeenDuplicated: false,\\r\\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\\r\\n hasHitElementInside: false\\r\\n },\\r\\n drag: {\\r\\n hasOccurred: false,\\r\\n offset: null\\r\\n },\\r\\n eventListeners: {\\r\\n onMove: null,\\r\\n onUp: null,\\r\\n onKeyUp: null,\\r\\n onKeyDown: null\\r\\n },\\r\\n boxSelection: {\\r\\n hasOccurred: false\\r\\n }\\r\\n };\\r\\n } // Returns whether the event is a dragging a scrollbar\\r\\n handleDraggingScrollBar(event, pointerDownState) {\\r\\n var _this7 = this;\\r\\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\\r\\n return false;\\r\\n }\\r\\n isDraggingScrollBar = true;\\r\\n pointerDownState.lastCoords.x = event.clientX;\\r\\n pointerDownState.lastCoords.y = event.clientY;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n _this7.handlePointerMoveOverScrollbars(event, pointerDownState);\\r\\n });\\r\\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isDraggingScrollBar = false;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this7.canvas, _this7.state.elementType);\\r\\n lastPointerUp = null;\\r\\n _this7.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this7.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n });\\r\\n lastPointerUp = onPointerUp;\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n return true;\\r\\n }\\r\\n isASelectedElement(hitElement) {\\r\\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\\r\\n }\\r\\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\\r\\n if (selectedElements.length < 2) {\\r\\n return false;\\r\\n } // How many pixels off the shape boundary we still consider a hit\\r\\n const threshold = 10 / this.state.zoom.value;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return point.x > x1 - threshold && point.x < x2 + threshold && point.y > y1 - threshold && point.y < y2 + threshold;\\r\\n }\\r\\n onKeyDownFromPointerDownHandler(pointerDownState) {\\r\\n var _this8 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (_this8.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this8.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onKeyUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this9 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // Prevents focus from escaping excalidraw tab\\r\\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\\r\\n if (_this9.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this9.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onPointerMoveFromPointerDownHandler(pointerDownState) {\\r\\n var _this10 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a, _b;\\r\\n // We need to initialize dragOffsetXY only after we've updated\\r\\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\\r\\n // event handler should hopefully ensure we're already working with\\r\\n // the updated state.\\r\\n if (pointerDownState.drag.offset === null) {\\r\\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state), pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n }\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n if (_this10.handlePointerMoveOverScrollbars(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this10.state);\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this10.state.gridSize); // for arrows/lines, don't start dragging until a given threshold\\r\\n // to ensure we don't create a 2-point arrow by mistake when\\r\\n // user clicks mouse in a way that it moves a tiny bit (thus\\r\\n // triggering pointermove)\\r\\n if (!pointerDownState.drag.hasOccurred && (_this10.state.elementType === \\\"arrow\\\" || _this10.state.elementType === \\\"line\\\")) {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n if (pointerDownState.resize.isResizing) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n if (_this10.maybeHandleResize(pointerDownState, event)) {\\r\\n return true;\\r\\n }\\r\\n }\\r\\n if (_this10.state.editingLinearElement) {\\r\\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(_this10.state, function (appState) {\\r\\n return _this10.setState(appState);\\r\\n }, pointerCoords.x, pointerCoords.y, function (element, pointsSceneCoords) {\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\\r\\n });\\r\\n if (didDrag) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this10.isASelectedElement(element);\\r\\n });\\r\\n if ((hasHitASelectedElement || pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) && ( // this allows for box-selecting points when clicking inside the\\r\\n // line's bounding box\\r\\n !_this10.state.editingLinearElement || !event.shiftKey) && ( // box-selecting without shift when editing line, not clicking on a line\\r\\n !_this10.state.editingLinearElement || ((_a = _this10.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !== ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) || pointerDownState.hit.hasHitElementInside)) {\\r\\n // Marking that click was used for dragging to check\\r\\n // if elements should be deselected on pointerup\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state); // prevent dragging even if we're no longer holding cmd/ctrl otherwise\\r\\n // it would have weird results (stuff jumping all over the screen)\\r\\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\\r\\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n const [dragDistanceX, dragDistanceY] = [Math.abs(pointerCoords.x - pointerDownState.origin.x), Math.abs(pointerCoords.y - pointerDownState.origin.y)]; // We only drag in one direction if shift is pressed\\r\\n const lockDirection = event.shiftKey;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, _this10.state);\\r\\n _this10.maybeSuggestBindingForAll(selectedElements); // We duplicate the selected element if alt is pressed on pointer move\\r\\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\\r\\n // Move the currently selected elements to the top of the z index stack, and\\r\\n // put the duplicates where the selected elements used to be.\\r\\n // (the origin point where the dragging started)\\r\\n pointerDownState.hit.hasBeenDuplicated = true;\\r\\n const nextElements = [];\\r\\n const elementsToAppend = [];\\r\\n const groupIdMap = new Map();\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const elements = _this10.scene.getElementsIncludingDeleted();\\r\\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this10.state, true).map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n for (const element of elements) {\\r\\n if (selectedElementIds.includes(element.id) || // case: the state.selectedElementIds might not have been\\r\\n // updated yet by the time this mousemove event is fired\\r\\n element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) && pointerDownState.hit.wasAddedToSelection) {\\r\\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this10.state.editingGroupId, groupIdMap, element);\\r\\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\\r\\n x: duplicatedElement.x + (originDragX - dragX),\\r\\n y: duplicatedElement.y + (originDragY - dragY)\\r\\n });\\r\\n nextElements.push(duplicatedElement);\\r\\n elementsToAppend.push(element);\\r\\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\\r\\n }\\r\\n else {\\r\\n nextElements.push(element);\\r\\n }\\r\\n }\\r\\n const nextSceneElements = [...nextElements, ...elementsToAppend];\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \\\"duplicatesServeAsOld\\\");\\r\\n _this10.scene.replaceAllElements(nextSceneElements);\\r\\n }\\r\\n return;\\r\\n }\\r\\n } // It is very important to read this.state within each move event,\\r\\n // otherwise we would read a stale one!\\r\\n const draggingElement = _this10.state.draggingElement;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"freedraw\\\") {\\r\\n const points = draggingElement.points;\\r\\n const dx = pointerCoords.x - draggingElement.x;\\r\\n const dy = pointerCoords.y - draggingElement.y;\\r\\n const pressures = draggingElement.simulatePressure ? draggingElement.pressures : [...draggingElement.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const points = draggingElement.points;\\r\\n let dx = gridX - draggingElement.x;\\r\\n let dy = gridY - draggingElement.y;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\\r\\n ({\\r\\n width: dx,\\r\\n height: dy\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(_this10.state.elementType, dx, dy));\\r\\n }\\r\\n if (points.length === 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]]\\r\\n });\\r\\n }\\r\\n else if (points.length > 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points.slice(0, -1), [dx, dy]]\\r\\n });\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n // When creating a linear element by dragging\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], _this10.state.startBoundElement);\\r\\n }\\r\\n }\\r\\n else {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n _this10.maybeDragNewGenericElement(pointerDownState, event);\\r\\n }\\r\\n if (_this10.state.elementType === \\\"selection\\\") {\\r\\n pointerDownState.boxSelection.hasOccurred = true;\\r\\n const elements = _this10.scene.getElements();\\r\\n if (!event.shiftKey && // allows for box-selecting points (without shift)\\r\\n !_this10.state.editingLinearElement && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, _this10.state)) {\\r\\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [pointerDownState.hit.element.id]: true\\r\\n }\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this10.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n } // box-select line editor points\\r\\n if (_this10.state.editingLinearElement) {\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handleBoxSelection(event, _this10.state, _this10.setState.bind(_this10)); // regular box-select\\r\\n }\\r\\n else {\\r\\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread(_objectSpread({}, prevState.selectedElementIds), elementsWithinSelection.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})), pointerDownState.hit.element ? {\\r\\n // if using ctrl/cmd, select the hitElement only if we\\r\\n // haven't box-selected anything else\\r\\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length\\r\\n } : null),\\r\\n showHyperlinkPopup: elementsWithinSelection.length === 1 && elementsWithinSelection[0].link ? \\\"info\\\" : false\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n } // Returns whether the pointer move happened over either scrollbar\\r\\n handlePointerMoveOverScrollbars(event, pointerDownState) {\\r\\n if (pointerDownState.scrollbars.isOverHorizontal) {\\r\\n const x = event.clientX;\\r\\n const dx = x - pointerDownState.lastCoords.x;\\r\\n this.setState({\\r\\n scrollX: this.state.scrollX - dx / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.x = x;\\r\\n return true;\\r\\n }\\r\\n if (pointerDownState.scrollbars.isOverVertical) {\\r\\n const y = event.clientY;\\r\\n const dy = y - pointerDownState.lastCoords.y;\\r\\n this.setState({\\r\\n scrollY: this.state.scrollY - dy / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.y = y;\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n }\\r\\n onPointerUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this11 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (childEvent) {\\r\\n var _a, _b;\\r\\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating } = _this11.state;\\r\\n _this11.setState({\\r\\n isResizing: false,\\r\\n isRotating: false,\\r\\n resizingElement: null,\\r\\n selectionElement: null,\\r\\n cursorButton: \\\"up\\\",\\r\\n // text elements are reset on finalize, and resetting on pointerup\\r\\n // may cause issues with double taps\\r\\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this11.state.editingElement) ? _this11.state.editingElement : null\\r\\n });\\r\\n _this11.savePointer(childEvent.clientX, childEvent.clientY, \\\"up\\\"); // Handle end of dragging a point of a linear element, might close a loop\\r\\n // and sets binding element\\r\\n if (_this11.state.editingLinearElement) {\\r\\n if (!pointerDownState.boxSelection.hasOccurred && (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !== _this11.state.editingLinearElement.elementId || !pointerDownState.hit.hasHitElementInside)) {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n else {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, _this11.state.editingLinearElement, _this11.state);\\r\\n if (editingLinearElement !== _this11.state.editingLinearElement) {\\r\\n _this11.setState({\\r\\n editingLinearElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n lastPointerUp = null;\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\\r\\n if (_this11.state.pendingImageElement) {\\r\\n _this11.setState({\\r\\n pendingImageElement: null\\r\\n });\\r\\n }\\r\\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \\\"freedraw\\\") {\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n const points = draggingElement.points;\\r\\n let dx = pointerCoords.x - draggingElement.x;\\r\\n let dy = pointerCoords.y - draggingElement.y; // Allows dots to avoid being flagged as infinitely small\\r\\n if (dx === points[0][0] && dy === points[0][1]) {\\r\\n dy += 0.0001;\\r\\n dx += 0.0001;\\r\\n }\\r\\n const pressures = draggingElement.simulatePressure ? [] : [...draggingElement.pressures, childEvent.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures,\\r\\n lastCommittedPoint: [dx, dy]\\r\\n });\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement)) {\\r\\n const imageElement = draggingElement;\\r\\n try {\\r\\n _this11.initializeImageDimensions(imageElement);\\r\\n _this11.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== imageElement.id;\\r\\n }));\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n if (draggingElement.points.length > 1) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n if (!pointerDownState.drag.hasOccurred && draggingElement && !multiElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...draggingElement.points, [pointerCoords.x - draggingElement.x, pointerCoords.y - draggingElement.y]]\\r\\n });\\r\\n _this11.setState({\\r\\n multiElement: draggingElement,\\r\\n editingElement: _this11.state.draggingElement\\r\\n });\\r\\n }\\r\\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, _this11.state, _this11.scene, pointerCoords);\\r\\n }\\r\\n _this11.setState({\\r\\n suggestedBindings: [],\\r\\n startBoundElement: null\\r\\n });\\r\\n if (!elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n elementType: \\\"selection\\\",\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" && draggingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\\r\\n // remove invisible element which was added in onPointerDown\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().slice(0, -1));\\r\\n _this11.setState({\\r\\n draggingElement: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (draggingElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\\r\\n }\\r\\n if (resizingElement) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== resizingElement.id;\\r\\n }));\\r\\n } // Code below handles selection when element(s) weren't\\r\\n // drag or added to selection on pointer down phase.\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n if (hitElement && !pointerDownState.drag.hasOccurred && !pointerDownState.hit.wasAddedToSelection && ( // if we're editing a line, pointerup shouldn't switch selection if\\r\\n // box selected\\r\\n !_this11.state.editingLinearElement || !pointerDownState.boxSelection.hasOccurred)) {\\r\\n // when inside line editor, shift selects points instead\\r\\n if (childEvent.shiftKey && !_this11.state.editingLinearElement) {\\r\\n if (_this11.state.selectedElementIds[hitElement.id]) {\\r\\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(_this11.state, hitElement)) {\\r\\n // We want to unselect all groups hitElement is part of\\r\\n // as well as all elements that are part of the groups\\r\\n // hitElement is part of\\r\\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds.flatMap(function (groupId) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(_this11.scene.getElements(), groupId);\\r\\n }).map(function (element) {\\r\\n return {\\r\\n [element.id]: false\\r\\n };\\r\\n }).reduce(function (prevId, acc) {\\r\\n return _objectSpread(_objectSpread({}, prevId), acc);\\r\\n }, {});\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedGroupIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), hitElement.groupIds.map(function (gId) {\\r\\n return {\\r\\n [gId]: false\\r\\n };\\r\\n }).reduce(function (prev, acc) {\\r\\n return _objectSpread(_objectSpread({}, prev), acc);\\r\\n }, {})),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups)\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n // remove element from selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: false\\r\\n })\\r\\n }), _this11.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n // add element to selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return _objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n }\\r\\n }), _this11.scene.getElements()));\\r\\n });\\r\\n }\\r\\n }\\r\\n if (!_this11.state.editingLinearElement && !pointerDownState.drag.hasOccurred && !_this11.state.isResizing && (hitElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, _this11.state, pointerDownState.origin.x, pointerDownState.origin.y) || !hitElement && pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements)) {\\r\\n // Deselect selected elements\\r\\n _this11.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\" && draggingElement) {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" || (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(_this11.scene.getElements(), _this11.state)) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\\r\\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this11.scene.getElements(), _this11.state));\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: [],\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n }\\r\\n maybeSuggestBindingForAll(selectedElements) {\\r\\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\\r\\n this.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n }\\r\\n clearSelection(hitElement) {\\r\\n this.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n // Continue editing the same group if the user selected a different\\r\\n // element from it\\r\\n editingGroupId: prevState.editingGroupId && hitElement != null && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId) ? prevState.editingGroupId : null\\r\\n };\\r\\n });\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: this.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\\r\\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(this.scene.getElementsIncludingDeleted().filter(function (element) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element);\\r\\n }), x, y);\\r\\n if (elementClickedInside) {\\r\\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\\r\\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\\r\\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\\r\\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\\r\\n if (isSnappedToCenter) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: elementCenterX,\\r\\n sceneY: elementCenterY\\r\\n }, appState);\\r\\n return {\\r\\n viewportX,\\r\\n viewportY,\\r\\n elementCenterX,\\r\\n elementCenterY\\r\\n };\\r\\n }\\r\\n }\\r\\n }\\r\\n getCanvasOffsets() {\\r\\n var _a;\\r\\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = this.excalidrawContainerRef.current;\\r\\n const { left, top } = excalidrawContainer.getBoundingClientRect();\\r\\n return {\\r\\n offsetLeft: left,\\r\\n offsetTop: top\\r\\n };\\r\\n }\\r\\n return {\\r\\n offsetLeft: 0,\\r\\n offsetTop: 0\\r\\n };\\r\\n }\\r\\n updateLanguage() {\\r\\n var _this12 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find(function (lang) {\\r\\n return lang.code === _this12.props.langCode;\\r\\n }) || _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\\r\\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\\r\\n _this12.setAppState({});\\r\\n })();\\r\\n }\\r\\n} // -----------------------------------------------------------------------------\\r\\n// TEST HOOKS\\r\\n// -----------------------------------------------------------------------------\\r\\nApp.defaultProps = {\\r\\n // needed for tests to pass since we directly render App in many tests\\r\\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS\\r\\n};\\r\\nvar _initialiseProps = function () {\\r\\n var _this13 = this;\\r\\n this.canvas = null;\\r\\n this.rc = null;\\r\\n this.unmounted = false;\\r\\n this.isMobile = false;\\r\\n this.excalidrawContainerRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createRef();\\r\\n this.files = {};\\r\\n this.imageCache = new Map();\\r\\n this.lastPointerDown = null;\\r\\n this.lastPointerUp = null;\\r\\n this.contextMenuOpen = false;\\r\\n this.focusContainer = function () {\\r\\n var _a;\\r\\n if (_this13.props.autoFocus) {\\r\\n (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\\r\\n }\\r\\n };\\r\\n this.getSceneElementsIncludingDeleted = function () {\\r\\n return _this13.scene.getElementsIncludingDeleted();\\r\\n };\\r\\n this.getSceneElements = function () {\\r\\n return _this13.scene.getElements();\\r\\n };\\r\\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (actionResult) {\\r\\n var _a, _b, _c, _d, _e, _f;\\r\\n // Since context menu closes when action triggered so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n if (_this13.unmounted || actionResult === false) {\\r\\n return;\\r\\n }\\r\\n let editingElement = null;\\r\\n if (actionResult.elements) {\\r\\n actionResult.elements.forEach(function (element) {\\r\\n var _a;\\r\\n if (((_a = _this13.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id && _this13.state.editingElement !== element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n editingElement = element;\\r\\n }\\r\\n });\\r\\n _this13.scene.replaceAllElements(actionResult.elements);\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n }\\r\\n if (actionResult.files) {\\r\\n _this13.files = actionResult.replaceFiles ? actionResult.files : _objectSpread(_objectSpread({}, _this13.files), actionResult.files);\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n if (actionResult.appState || editingElement) {\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\\r\\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\\r\\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\\r\\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_12__.THEME.LIGHT;\\r\\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : _this13.state.name;\\r\\n if (typeof _this13.props.viewModeEnabled !== \\\"undefined\\\") {\\r\\n viewModeEnabled = _this13.props.viewModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.zenModeEnabled !== \\\"undefined\\\") {\\r\\n zenModeEnabled = _this13.props.zenModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.gridModeEnabled !== \\\"undefined\\\") {\\r\\n gridSize = _this13.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\\r\\n }\\r\\n if (typeof _this13.props.theme !== \\\"undefined\\\") {\\r\\n theme = _this13.props.theme;\\r\\n }\\r\\n if (typeof _this13.props.name !== \\\"undefined\\\") {\\r\\n name = _this13.props.name;\\r\\n }\\r\\n _this13.setState(function (state) {\\r\\n var _a;\\r\\n // using Object.assign instead of spread to fool TS 4.2.2+ into\\r\\n // regarding the resulting type as not containing undefined\\r\\n // (which the following expression will never contain)\\r\\n return Object.assign(actionResult.appState || {}, {\\r\\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize,\\r\\n theme,\\r\\n name\\r\\n });\\r\\n }, function () {\\r\\n if (actionResult.syncHistory) {\\r\\n _this13.history.setCurrentState(_this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n }\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isHoldingSpace = false;\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n });\\r\\n this.onUnload = function () {\\r\\n _this13.onBlur();\\r\\n };\\r\\n this.disableEvent = function (event) {\\r\\n event.preventDefault();\\r\\n };\\r\\n this.onFontLoaded = function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.onSceneUpdated();\\r\\n };\\r\\n this.importLibraryFromUrl = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (url, token) {\\r\\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary)) {\\r\\n const hash = new URLSearchParams(window.location.hash.slice(1));\\r\\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `#${hash.toString()}`);\\r\\n }\\r\\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary)) {\\r\\n const query = new URLSearchParams(window.location.search);\\r\\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `?${query.toString()}`);\\r\\n }\\r\\n try {\\r\\n const request = yield fetch(decodeURIComponent(url));\\r\\n const blob = yield request.blob();\\r\\n const json = JSON.parse(yield blob.text());\\r\\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_14__.isValidLibrary)(json)) {\\r\\n throw new Error();\\r\\n }\\r\\n if (token === _this13.id || window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.confirmAddLibrary\\\", {\\r\\n numShapes: (json.libraryItems || json.library || []).length\\r\\n }))) {\\r\\n yield _this13.library.importLibrary(blob, \\\"published\\\"); // hack to rerender the library items after import\\r\\n if (_this13.state.isLibraryOpen) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n }\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.errorLoadingLibrary\\\"));\\r\\n console.error(error);\\r\\n }\\r\\n finally {\\r\\n _this13.focusContainer();\\r\\n }\\r\\n });\\r\\n return function (_x, _x2) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.resetHistory = function () {\\r\\n _this13.history.clear();\\r\\n };\\r\\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (opts) {\\r\\n _this13.scene.replaceAllElements([]);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), {}, {\\r\\n isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading,\\r\\n theme: _this13.state.theme\\r\\n });\\r\\n });\\r\\n _this13.resetHistory();\\r\\n });\\r\\n this.initializeScene = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n if (\\\"launchQueue\\\" in window && \\\"LaunchParams\\\" in window) {\\r\\n window.launchQueue.setConsumer(/*#__PURE__*/ function () {\\r\\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (launchParams) {\\r\\n if (!launchParams.files.length) {\\r\\n return;\\r\\n }\\r\\n const fileHandle = launchParams.files[0];\\r\\n const blob = yield fileHandle.getFile();\\r\\n blob.handle = fileHandle;\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(blob, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n });\\r\\n return function (_x3) {\\r\\n return _ref5.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n }\\r\\n if (!_this13.state.isLoading) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n }\\r\\n let initialData = null;\\r\\n try {\\r\\n initialData = (yield _this13.props.initialData) || null;\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\\r\\n _this13.libraryItemsFromStorage = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(initialData.libraryItems, \\\"unpublished\\\");\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n initialData = {\\r\\n appState: {\\r\\n errorMessage: error.message || \\\"Encountered an error during importing or restoring scene data\\\"\\r\\n }\\r\\n };\\r\\n }\\r\\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n elementType: scene.appState.elementType === \\\"image\\\" ? \\\"selection\\\" : scene.appState.elementType,\\r\\n isLoading: false\\r\\n });\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n width: _this13.state.width,\\r\\n height: _this13.state.height,\\r\\n offsetTop: _this13.state.offsetTop,\\r\\n offsetLeft: _this13.state.offsetLeft\\r\\n }), null));\\r\\n }\\r\\n _this13.resetHistory();\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n commitToHistory: true\\r\\n }));\\r\\n const libraryUrl = // current\\r\\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary) || // legacy, kept for compat reasons\\r\\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n if (libraryUrl) {\\r\\n yield _this13.importLibraryFromUrl(libraryUrl);\\r\\n }\\r\\n });\\r\\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n return (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n });\\r\\n _this13.setState({});\\r\\n });\\r\\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n const { offsetTop, offsetLeft } = _this13.getCanvasOffsets();\\r\\n _this13.setState(function (state) {\\r\\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\\r\\n return null;\\r\\n }\\r\\n return {\\r\\n offsetTop,\\r\\n offsetLeft\\r\\n };\\r\\n });\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\\r\\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.cutAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.copyAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.cutAll = function () {\\r\\n _this13.copyAll();\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected);\\r\\n };\\r\\n this.copyAll = function () {\\r\\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.copyToClipboard)(_this13.scene.getElements(), _this13.state, _this13.files);\\r\\n };\\r\\n this.onTapStart = function (event) {\\r\\n if (!didTapTwice) {\\r\\n didTapTwice = true;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\\r\\n return;\\r\\n } // insert text only if we tapped twice with a single finger\\r\\n // event.touches.length === 1 will also prevent inserting text when user's zooming\\r\\n if (didTapTwice && event.touches.length === 1) {\\r\\n const [touch] = event.touches; // @ts-ignore\\r\\n _this13.handleCanvasDoubleClick({\\r\\n clientX: touch.clientX,\\r\\n clientY: touch.clientY\\r\\n });\\r\\n didTapTwice = false;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n }\\r\\n event.preventDefault();\\r\\n if (event.touches.length === 2) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n };\\r\\n this.onTapEnd = function (event) {\\r\\n if (event.touches.length > 0) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n };\\r\\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(/*#__PURE__*/ function () {\\r\\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n // #686\\r\\n const target = document.activeElement;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);\\r\\n if (!isExcalidrawActive) {\\r\\n return;\\r\\n }\\r\\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\\r\\n if ( // if no ClipboardEvent supplied, assume we're pasting via contextMenu\\r\\n // thus these checks don't make sense\\r\\n event && (!(elementUnderCursor instanceof HTMLCanvasElement) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\\r\\n return;\\r\\n } // must be called in the same frame (thus before any awaits) as the paste\\r\\n // event else some browsers (FF...) will clear the clipboardData\\r\\n // (something something security)\\r\\n let file = (_b = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _b === void 0 ? void 0 : _b.files[0];\\r\\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\\r\\n if (!file && data.text) {\\r\\n const string = data.text.trim();\\r\\n if (string.startsWith(\\\"<svg\\\") && string.endsWith(\\\"</svg>\\\")) {\\r\\n // ignore SVG validation/normalization which will be done during image\\r\\n // initialization\\r\\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(string);\\r\\n }\\r\\n } // prefer spreadsheet data over image file (MS Office/Libre Office)\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file) && !data.spreadsheet) {\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (_this13.props.onPaste) {\\r\\n try {\\r\\n if ((yield _this13.props.onPaste(data, event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if (data.errorMessage) {\\r\\n _this13.setState({\\r\\n errorMessage: data.errorMessage\\r\\n });\\r\\n }\\r\\n else if (data.spreadsheet) {\\r\\n _this13.setState({\\r\\n pasteDialog: {\\r\\n data: data.spreadsheet,\\r\\n shown: true\\r\\n }\\r\\n });\\r\\n }\\r\\n else if (data.elements) {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: data.elements,\\r\\n files: data.files || null,\\r\\n position: \\\"cursor\\\"\\r\\n });\\r\\n }\\r\\n else if (data.text) {\\r\\n _this13.addTextFromPaste(data.text);\\r\\n }\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n event === null || event === void 0 ? void 0 : event.preventDefault();\\r\\n });\\r\\n return function (_x4) {\\r\\n return _ref6.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n this.addElementsFromPasteOrLibrary = function (opts) {\\r\\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\\r\\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\\r\\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\\r\\n const clientX = typeof opts.position === \\\"object\\\" ? opts.position.clientX : opts.position === \\\"cursor\\\" ? cursorX : _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = typeof opts.position === \\\"object\\\" ? opts.position.clientY : opts.position === \\\"cursor\\\" ? cursorY : _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const dx = x - elementsCenterX;\\r\\n const dy = y - elementsCenterY;\\r\\n const groupIdMap = new Map();\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, _this13.state.gridSize);\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const newElements = elements.map(function (element) {\\r\\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this13.state.editingGroupId, groupIdMap, element, {\\r\\n x: element.x + gridX - minX,\\r\\n y: element.y + gridY - minY\\r\\n });\\r\\n oldIdToDuplicatedId.set(element.id, newElement.id);\\r\\n return newElement;\\r\\n });\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\\r\\n const nextElements = [..._this13.scene.getElementsIncludingDeleted(), ...newElements];\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\\r\\n if (opts.files) {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), opts.files);\\r\\n }\\r\\n _this13.scene.replaceAllElements(nextElements);\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n isLibraryOpen: false,\\r\\n selectedElementIds: newElements.reduce(function (map, element) {\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(element)) {\\r\\n map[element.id] = true;\\r\\n }\\r\\n return map;\\r\\n }, {}),\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements()), function () {\\r\\n if (opts.files) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n });\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n };\\r\\n this.setAppState = function (obj) {\\r\\n _this13.setState(obj);\\r\\n };\\r\\n this.removePointer = function (event) {\\r\\n _this13.lastPointerUp = event; // remove touch handler for context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\" && touchTimeout) {\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n invalidateContextMenu = false;\\r\\n }\\r\\n gesture.pointers.delete(event.pointerId);\\r\\n };\\r\\n this.toggleLock = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n elementLocked: !prevState.elementLocked,\\r\\n elementType: prevState.elementLocked ? \\\"selection\\\" : prevState.elementType\\r\\n };\\r\\n });\\r\\n };\\r\\n this.togglePenMode = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: !prevState.penMode\\r\\n };\\r\\n });\\r\\n };\\r\\n this.toggleZenMode = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode);\\r\\n };\\r\\n this.toggleStats = function () {\\r\\n if (!_this13.state.showStats) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\\\"dialog\\\", \\\"stats\\\");\\r\\n }\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats);\\r\\n };\\r\\n this.scrollToContent = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n _this13.setState(_objectSpread({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], _this13.state, _this13.canvas)));\\r\\n };\\r\\n this.zoomToFit = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n let maxZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\\r\\n let margin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;\\r\\n if (!target) {\\r\\n target = _this13.scene.getElements();\\r\\n }\\r\\n if (target.length === 0) {\\r\\n maxZoom = 1;\\r\\n }\\r\\n _this13.setState((0,_actions__WEBPACK_IMPORTED_MODULE_5__.zoomToFitElements)(target, _this13.state, false, maxZoom, margin).appState);\\r\\n };\\r\\n this.updateContainerSize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (containers) {\\r\\n containers.forEach(function (el) {\\r\\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.rotate)(el.x + el.width, el.y + el.height, el.x + el.width / 2, el.y + el.height / 2, el.angle);\\r\\n (0,_element_resizeElements__WEBPACK_IMPORTED_MODULE_47__.resizeSingleElement)(el, true, el, \\\"se\\\", true, x, y);\\r\\n });\\r\\n });\\r\\n this.clearToast = function () {\\r\\n _this13.setState({\\r\\n toastMessage: null\\r\\n });\\r\\n };\\r\\n this.setToastMessage = function (toastMessage) {\\r\\n _this13.setState({\\r\\n toastMessage\\r\\n });\\r\\n };\\r\\n this.restoreFileFromShare = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n try {\\r\\n const webShareTargetCache = yield caches.open(\\\"web-share-target\\\");\\r\\n const file = yield webShareTargetCache.match(\\\"shared-file\\\");\\r\\n if (file) {\\r\\n const blob = yield file.blob();\\r\\n _this13.loadFileToCanvas(blob);\\r\\n yield webShareTargetCache.delete(\\\"shared-file\\\");\\r\\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (files) {\\r\\n const filesMap = files.reduce(function (acc, fileData) {\\r\\n acc.set(fileData.id, fileData);\\r\\n return acc;\\r\\n }, new Map());\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), Object.fromEntries(filesMap)); // bump versions for elements that reference added files so that\\r\\n // we/host apps can detect the change, and invalidate the image & shape\\r\\n // cache\\r\\n _this13.scene.getElements().forEach(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && filesMap.has(element.fileId)) {\\r\\n _this13.imageCache.delete(element.fileId);\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.bumpVersion)(element);\\r\\n }\\r\\n });\\r\\n _this13.scene.informMutation();\\r\\n _this13.addNewImagesToImageCache();\\r\\n });\\r\\n this.setLocalFont = function (showOnPanel) {\\r\\n showFourthFont = showOnPanel;\\r\\n };\\r\\n this.selectElements = function (elements) {\\r\\n _this13.updateScene({\\r\\n appState: _objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n editingGroupId: null,\\r\\n selectedElementIds: elements.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})\\r\\n }),\\r\\n commitToHistory: true\\r\\n });\\r\\n };\\r\\n this.bringToFront = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.bringForward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.sendToBack = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.sendBackward = function (elements) {\\r\\n _this13.selectElements(elements);\\r\\n _this13.updateScene(_actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward.perform(_this13.scene.getElements(), _this13.state));\\r\\n };\\r\\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (sceneData) {\\r\\n if (sceneData.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n if (sceneData.appState) {\\r\\n _this13.setState(sceneData.appState);\\r\\n }\\r\\n if (sceneData.elements) {\\r\\n _this13.scene.replaceAllElements(sceneData.elements);\\r\\n }\\r\\n if (sceneData.collaborators) {\\r\\n _this13.setState({\\r\\n collaborators: sceneData.collaborators\\r\\n });\\r\\n }\\r\\n if (sceneData.libraryItems) {\\r\\n _this13.library.saveLibrary((0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(sceneData.libraryItems, \\\"unpublished\\\"));\\r\\n }\\r\\n });\\r\\n this.onSceneUpdated = function () {\\r\\n _this13.setState({});\\r\\n };\\r\\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n cursorX = event.clientX;\\r\\n cursorY = event.clientY;\\r\\n });\\r\\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // normalize `event.key` when CapsLock is pressed #2372\\r\\n if (\\\"Proxy\\\" in window && (!event.shiftKey && /^[A-Z]$/.test(event.key) || event.shiftKey && /^[a-z]$/.test(event.key))) {\\r\\n event = new Proxy(event, {\\r\\n get(ev, prop) {\\r\\n const value = ev[prop];\\r\\n if (typeof value === \\\"function\\\") {\\r\\n // fix for Proxies hijacking `this`\\r\\n return value.bind(ev);\\r\\n }\\r\\n return prop === \\\"key\\\" ? // CapsLock inverts capitalization based on ShiftKey, so invert\\r\\n // it back\\r\\n event.shiftKey ? ev.key.toUpperCase() : ev.key.toLowerCase() : value;\\r\\n }\\r\\n });\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE || // case: using arrows to move between buttons\\r\\n (0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target)) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\\r\\n _this13.setState({\\r\\n showHelpDialog: true\\r\\n });\\r\\n }\\r\\n if (_this13.actionManager.handleKeyDown(event)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && _this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: false\\r\\n });\\r\\n }\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.ZERO) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: !_this13.state.isLibraryOpen\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const step = _this13.state.gridSize && (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT : _this13.state.gridSize) || (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state, true);\\r\\n let offsetX = 0;\\r\\n let offsetY = 0;\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\\r\\n offsetX = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\\r\\n offsetX = step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\\r\\n offsetY = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\\r\\n offsetY = step;\\r\\n }\\r\\n selectedElements.forEach(function (element) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n x: element.x + offsetX,\\r\\n y: element.y + offsetY\\r\\n });\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length === 1 && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n const selectedElement = selectedElements[0];\\r\\n _this13.startTextEditing({\\r\\n sceneX: selectedElement.x + selectedElement.width / 2,\\r\\n sceneY: selectedElement.y + selectedElement.height / 2,\\r\\n shouldBind: true\\r\\n });\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (!event.ctrlKey && !event.altKey && !event.metaKey && _this13.state.draggingElement === null) {\\r\\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\\r\\n if (shape) {\\r\\n _this13.selectShapeTool(shape);\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\\r\\n _this13.toggleLock();\\r\\n }\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\\r\\n isHoldingSpace = true;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n event.preventDefault();\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (_this13.state.elementType === \\\"selection\\\" && !selectedElements.length) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G && ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(_this13.state.elementType) || selectedElements.some(function (element) {\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type);\\r\\n }))) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"backgroundColorPicker\\\"\\r\\n });\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"strokeColorPicker\\\"\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"selection\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n isHoldingSpace = false;\\r\\n }\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this13.state) ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements) : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n gesture.initialScale = _this13.state.zoom.value;\\r\\n });\\r\\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // onGestureChange only has zoom factor but not the center.\\r\\n // If we're on iPad or iPhone, then we recognize multi-touch and will\\r\\n // zoom in at the right location on the touchMove handler already.\\r\\n // On Macbook, we don't have those events so will zoom in at the\\r\\n // current location instead.\\r\\n if (gesture.pointers.size === 2) {\\r\\n return;\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (initialScale) {\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale)\\r\\n }, state));\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n gesture.initialScale = null;\\r\\n });\\r\\n this.startTextEditing = function (_ref8) {\\r\\n var _a, _b;\\r\\n let { sceneX, sceneY, shouldBind, insertAtParentCenter = true } = _ref8;\\r\\n let parentCenterPosition = insertAtParentCenter && _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio); // bind to container when shouldBind is true or\\r\\n // clicked on center of container\\r\\n const container = shouldBind || parentCenterPosition ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(_this13.scene.getElements().filter(function (ele) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(ele);\\r\\n }), sceneX, sceneY) : null;\\r\\n let existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY); // consider bounded text element if container present\\r\\n if (container) {\\r\\n const boundTextElementId = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getBoundTextElementId)(container);\\r\\n if (boundTextElementId) {\\r\\n existingTextElement = _this13.scene.getElement(boundTextElementId);\\r\\n }\\r\\n }\\r\\n if (!existingTextElement && container) {\\r\\n const fontString = {\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily\\r\\n };\\r\\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const newHeight = Math.max(container.height, minHeight);\\r\\n const newWidth = Math.max(container.width, minWidth);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(container, {\\r\\n height: newHeight,\\r\\n width: newWidth\\r\\n });\\r\\n sceneX = container.x + newWidth / 2;\\r\\n sceneY = container.y + newHeight / 2;\\r\\n if (parentCenterPosition) {\\r\\n parentCenterPosition = _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n }\\r\\n }\\r\\n const element = existingTextElement ? existingTextElement : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x: parentCenterPosition ? parentCenterPosition.elementCenterX : sceneX,\\r\\n y: parentCenterPosition ? parentCenterPosition.elementCenterY : sceneY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n text: \\\"\\\",\\r\\n rawText: \\\"\\\",\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily,\\r\\n textAlign: parentCenterPosition ? \\\"center\\\" : _this13.state.currentItemTextAlign,\\r\\n verticalAlign: parentCenterPosition ? \\\"middle\\\" : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\\r\\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\\r\\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : []\\r\\n });\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n if (existingTextElement) {\\r\\n // if text element is no longer centered to a container, reset\\r\\n // verticalAlign to default because it's currently internal-only\\r\\n if (!parentCenterPosition || element.textAlign !== \\\"center\\\") {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]); // case: creating new text not centered to parent elemenent → offset Y\\r\\n // so that the text is centered to cursor position\\r\\n if (!parentCenterPosition) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n y: element.y - element.baseline / 2\\r\\n });\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n _this13.handleTextWysiwyg(element, {\\r\\n isExistingElement: !!existingTextElement\\r\\n });\\r\\n };\\r\\n this.handleCanvasDoubleClick = function (event) {\\r\\n // case: double-clicking with arrow/line tool selected would both create\\r\\n // text and enter multiElement mode\\r\\n if (_this13.state.multiElement) {\\r\\n return;\\r\\n } // we should only be able to double click when mode is selection\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(_this13.state);\\r\\n if (selectedGroupIds.length > 0) {\\r\\n const hitElement = _this13.getElementAtPosition(sceneX, sceneY);\\r\\n const selectedGroupId = hitElement && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, _this13.state.selectedGroupIds);\\r\\n if (selectedGroupId) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n editingGroupId: selectedGroupId,\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n },\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.viewModeEnabled) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n const selectedElement = selectedElements[0];\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(selectedElement);\\r\\n if (canBindText) {\\r\\n sceneX = selectedElement.x + selectedElement.width / 2;\\r\\n sceneY = selectedElement.y + selectedElement.height / 2;\\r\\n }\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n }\\r\\n };\\r\\n this.getElementLinkAtPosition = function (scenePointer, hitElement) {\\r\\n // Reversing so we traverse the elements in decreasing order\\r\\n // of z-index\\r\\n const elements = _this13.scene.getElements().slice().reverse();\\r\\n let hitElementIndex = Infinity;\\r\\n return elements.find(function (element, index) {\\r\\n if (hitElement && element.id === hitElement.id) {\\r\\n hitElementIndex = index;\\r\\n }\\r\\n return element.link && (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(element, _this13.state, [scenePointer.x, scenePointer.y]) && index <= hitElementIndex;\\r\\n });\\r\\n };\\r\\n this.redirectToLink = function (event) {\\r\\n var _a;\\r\\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerDown, _this13.state);\\r\\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerDownCoords.x, lastPointerDownCoords.y]);\\r\\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(_this13.lastPointerUp, _this13.state);\\r\\n const LastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(_this13.hitLinkElement, _this13.state, [lastPointerUpCoords.x, lastPointerUpCoords.y]);\\r\\n if (lastPointerDownHittingLinkIcon && LastPointerUpHittingLinkIcon) {\\r\\n const url = (_a = _this13.hitLinkElement) === null || _a === void 0 ? void 0 : _a.link;\\r\\n if (url) {\\r\\n if (_this13.props.onLinkOpen) {\\r\\n _this13.props.onLinkOpen(url, event);\\r\\n }\\r\\n else {\\r\\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isLocalLink)(url) ? \\\"_self\\\" : \\\"_blank\\\";\\r\\n const newWindow = window.open(undefined, target); // https://mathiasbynens.github.io/rel-noopener/\\r\\n if (newWindow) {\\r\\n newWindow.opener = null;\\r\\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.normalizeLink)(url);\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n };\\r\\n this.attachLinkListener = function () {\\r\\n var _a;\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.addEventListener(\\\"click\\\", _this13.redirectToLink);\\r\\n };\\r\\n this.detachLinkListener = function () {\\r\\n var _a;\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(\\\"click\\\", _this13.redirectToLink);\\r\\n };\\r\\n this.handleCanvasPointerMove = function (event) {\\r\\n _this13.savePointer(event.clientX, event.clientY, _this13.state.cursorButton);\\r\\n if (gesture.pointers.has(event.pointerId)) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (gesture.pointers.size === 2 && gesture.lastCenter && initialScale && gesture.initialDistance) {\\r\\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n const deltaX = center.x - gesture.lastCenter.x;\\r\\n const deltaY = center.y - gesture.lastCenter.y;\\r\\n gesture.lastCenter = center;\\r\\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n const scaleFactor = _this13.state.elementType === \\\"freedraw\\\" && _this13.state.penMode ? 1 : distance / gesture.initialDistance;\\r\\n const nextZoom = scaleFactor ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor) : _this13.state.zoom.value;\\r\\n _this13.setState(function (state) {\\r\\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: center.x,\\r\\n viewportY: center.y,\\r\\n nextZoom\\r\\n }, state);\\r\\n return {\\r\\n zoom: zoomState.zoom,\\r\\n scrollX: zoomState.scrollX + deltaX / nextZoom,\\r\\n scrollY: zoomState.scrollY + deltaY / nextZoom,\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n }\\r\\n else {\\r\\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\\r\\n }\\r\\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\\r\\n return;\\r\\n }\\r\\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - _this13.state.offsetLeft, event.clientY - _this13.state.offsetTop);\\r\\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\\r\\n if (!_this13.state.draggingElement && !_this13.state.multiElement) {\\r\\n if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\\r\\n if (_this13.state.editingLinearElement && !_this13.state.editingLinearElement.isDragging) {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, _this13.state.editingLinearElement, _this13.state.gridSize);\\r\\n if (editingLinearElement !== _this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n editingLinearElement\\r\\n });\\r\\n }\\r\\n if (editingLinearElement.lastUncommittedPoint != null) {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(_this13.state.elementType)) {\\r\\n // Hovering with a selected tool or creating new linear element via click\\r\\n // and point\\r\\n const { draggingElement } = _this13.state;\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n _this13.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], _this13.state.startBoundElement);\\r\\n }\\r\\n else {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n }\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state;\\r\\n const { x: rx, y: ry } = multiElement;\\r\\n const { points, lastCommittedPoint } = multiElement;\\r\\n const lastPoint = points[points.length - 1];\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n if (lastPoint === lastCommittedPoint) {\\r\\n // if we haven't yet created a temp point and we're beyond commit-zone\\r\\n // threshold, add a point\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points, [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER); // in this branch, we're inside the commit zone, and no uncommitted\\r\\n // point exists. Thus do nothing (don't add/remove points).\\r\\n }\\r\\n }\\r\\n else if (points.length > 2 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: points.slice(0, -1)\\r\\n });\\r\\n }\\r\\n else {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, _this13.state.zoom.value)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n } // update last uncommitted point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points.slice(0, -1), [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n const hasDeselectedButton = Boolean(event.buttons);\\r\\n if (hasDeselectedButton || _this13.state.elementType !== \\\"selection\\\" && _this13.state.elementType !== \\\"text\\\") {\\r\\n return;\\r\\n }\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !isOverScrollBar && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType && elementWithTransformHandleType.transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1 && !isOverScrollBar) {\\r\\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType\\r\\n }));\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n _this13.hitLinkElement = _this13.getElementLinkAtPosition(scenePointer, hitElement);\\r\\n if (_this13.hitLinkElement && !_this13.state.selectedElementIds[_this13.hitLinkElement.id]) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.showHyperlinkTooltip)(_this13.hitLinkElement, _this13.state);\\r\\n if (_this13.props.onLinkHover) {\\r\\n _this13.props.onLinkHover(_this13.hitLinkElement, event);\\r\\n }\\r\\n _this13.attachLinkListener();\\r\\n }\\r\\n else {\\r\\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.hideHyperlinkToolip)();\\r\\n _this13.detachLinkListener();\\r\\n if (hitElement && hitElement.link && _this13.state.selectedElementIds[hitElement.id] && !_this13.contextMenuOpen && !_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: \\\"info\\\"\\r\\n });\\r\\n }\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n }\\r\\n else if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getElement(_this13.state.editingLinearElement.elementId);\\r\\n if (element && (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(element, _this13.state, [scenePointer.x, scenePointer.y])) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n else if ( // if using cmd/ctrl, we're not dragging\\r\\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (hitElement || _this13.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleTouchMove = function (event) {\\r\\n invalidateContextMenu = true;\\r\\n };\\r\\n this.handleCanvasPointerDown = function (event) {\\r\\n // remove any active selection when we start to interact with canvas\\r\\n // (mainly, we care about removing selection outside the component which\\r\\n // would prevent our copy handling otherwise)\\r\\n const selection = document.getSelection();\\r\\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n _this13.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\\r\\n _this13.maybeCleanupAfterMissingPointerUp(event); //fires only once, if pen is detected, penMode is enabled\\r\\n //the user can disable this by toggling the penMode button\\r\\n if (!_this13.state.penDetected && event.pointerType === \\\"pen\\\") {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n penMode: true,\\r\\n penDetected: true\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n _this13.lastPointerDown = event;\\r\\n _this13.setState({\\r\\n lastPointerDownWith: event.pointerType,\\r\\n cursorButton: \\\"down\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"down\\\");\\r\\n if (_this13.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\\r\\n return;\\r\\n } // only handle left mouse button or touch\\r\\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\\r\\n return;\\r\\n }\\r\\n _this13.updateGestureOnPointerDown(event); // don't select while panning\\r\\n if (gesture.pointers.size > 1) {\\r\\n return;\\r\\n } // State for the duration of a pointer interaction, which starts with a\\r\\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\\r\\n const pointerDownState = _this13.initialPointerDownState(event);\\r\\n if (_this13.handleDraggingScrollBar(event, pointerDownState)) {\\r\\n return;\\r\\n } // Since context menu closes on pointer down so setting to false\\r\\n _this13.contextMenuOpen = false;\\r\\n _this13.clearSelectionIfNotUsingSelection();\\r\\n _this13.updateBindingEnabledOnPointerMove(event);\\r\\n if (_this13.handleSelectionOnPointerDown(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const allowOnPointerDown = !_this13.state.penMode || event.pointerType !== \\\"touch\\\" || _this13.state.elementType === \\\"selection\\\" || _this13.state.elementType === \\\"text\\\" || _this13.state.elementType === \\\"image\\\";\\r\\n if (!allowOnPointerDown) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n _this13.handleTextOnPointerDown(event, pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"arrow\\\" || _this13.state.elementType === \\\"line\\\") {\\r\\n _this13.handleLinearElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"image\\\") {\\r\\n // reset image preview on pointerdown\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n if (!_this13.state.pendingImageElement) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n draggingElement: _this13.state.pendingImageElement,\\r\\n editingElement: _this13.state.pendingImageElement,\\r\\n pendingImageElement: null,\\r\\n multiElement: null\\r\\n });\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_this13.state.pendingImageElement, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"freedraw\\\") {\\r\\n _this13.handleFreeDrawElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else {\\r\\n _this13.createGenericElementOnPointerDown(_this13.state.elementType, pointerDownState);\\r\\n }\\r\\n const onPointerMove = _this13.onPointerMoveFromPointerDownHandler(pointerDownState);\\r\\n const onPointerUp = _this13.onPointerUpFromPointerDownHandler(pointerDownState);\\r\\n const onKeyDown = _this13.onKeyDownFromPointerDownHandler(pointerDownState);\\r\\n const onKeyUp = _this13.onKeyUpFromPointerDownHandler(pointerDownState);\\r\\n lastPointerUp = onPointerUp;\\r\\n if (!_this13.state.viewModeEnabled) {\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\\r\\n pointerDownState.eventListeners.onMove = onPointerMove;\\r\\n pointerDownState.eventListeners.onUp = onPointerUp;\\r\\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\\r\\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\\r\\n }\\r\\n };\\r\\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = function (event) {\\r\\n // deal with opening context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\") {\\r\\n invalidateContextMenu = false;\\r\\n if (touchTimeout) {\\r\\n // If there's already a touchTimeout, this means that there's another\\r\\n // touch down and we are doing another touch, so we shouldn't open the\\r\\n // context menu.\\r\\n invalidateContextMenu = true;\\r\\n }\\r\\n else {\\r\\n // open the context menu with the first touch's clientX and clientY\\r\\n // if the touch is not moving\\r\\n touchTimeout = window.setTimeout(function () {\\r\\n touchTimeout = 0;\\r\\n if (!invalidateContextMenu) {\\r\\n _this13.handleCanvasContextMenu(event);\\r\\n }\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleCanvasPanUsingWheelOrSpaceDrag = function (event) {\\r\\n if (!(gesture.pointers.size === 0 && (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL || event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace || _this13.state.viewModeEnabled)) || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return false;\\r\\n }\\r\\n isPanning = true;\\r\\n event.preventDefault();\\r\\n let nextPastePrevented = false;\\r\\n const isLinux = /Linux/.test(window.navigator.platform);\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n let { clientX: lastX, clientY: lastY } = event;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const deltaX = lastX - event.clientX;\\r\\n const deltaY = lastY - event.clientY;\\r\\n lastX = event.clientX;\\r\\n lastY = event.clientY;\\r\\n /*\\r\\n * Prevent paste event if we move while middle clicking on Linux.\\r\\n * See issue #1383.\\r\\n */\\r\\n if (isLinux && !nextPastePrevented && (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\\r\\n nextPastePrevented = true;\\r\\n /* Prevent the next paste event */\\r\\n const preventNextPaste = function (event) {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n event.stopPropagation();\\r\\n };\\r\\n /*\\r\\n * Reenable next paste in case of disabled middle click paste for\\r\\n * any reason:\\r\\n * - rigth click paste\\r\\n * - empty clipboard\\r\\n */\\r\\n const enableNextPaste = function () {\\r\\n setTimeout(function () {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }, 100);\\r\\n };\\r\\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }\\r\\n _this13.setState({\\r\\n scrollX: _this13.state.scrollX - deltaX / _this13.state.zoom.value,\\r\\n scrollY: _this13.state.scrollY - deltaY / _this13.state.zoom.value\\r\\n });\\r\\n });\\r\\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(lastPointerUp = function () {\\r\\n lastPointerUp = null;\\r\\n isPanning = false;\\r\\n if (!isHoldingSpace) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\\r\\n passive: true\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n return true;\\r\\n };\\r\\n this.clearSelectionIfNotUsingSelection = function () {\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleSelectionOnPointerDown = function (event, pointerDownState) {\\r\\n var _a;\\r\\n if (_this13.state.elementType === \\\"selection\\\") {\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType != null) {\\r\\n _this13.setState({\\r\\n resizingElement: elementWithTransformHandleType.element\\r\\n });\\r\\n pointerDownState.resize.handleType = elementWithTransformHandleType.transformHandleType;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1) {\\r\\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n }\\r\\n if (pointerDownState.resize.handleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType: pointerDownState.resize.handleType\\r\\n }));\\r\\n pointerDownState.resize.isResizing = true;\\r\\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) && selectedElements[0].points.length === 2) {\\r\\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\\r\\n }\\r\\n }\\r\\n else {\\r\\n if (_this13.state.editingLinearElement) {\\r\\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, _this13.state, function (appState) {\\r\\n return _this13.setState(appState);\\r\\n }, _this13.history, pointerDownState.origin);\\r\\n if (ret.hitElement) {\\r\\n pointerDownState.hit.element = ret.hitElement;\\r\\n }\\r\\n if (ret.didAddPoint) {\\r\\n return true;\\r\\n }\\r\\n } // hitElement may already be set above, so check first\\r\\n pointerDownState.hit.element = (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : _this13.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n if (pointerDownState.hit.element) {\\r\\n // Early return if pointer is hitting link icon\\r\\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_48__.isPointHittingLinkIcon)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y])) {\\r\\n return false;\\r\\n }\\r\\n pointerDownState.hit.hasHitElementInside = (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\\r\\n } // For overlapped elements one position may hit\\r\\n // multiple elements\\r\\n pointerDownState.hit.allHitElements = _this13.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this13.isASelectedElement(element);\\r\\n });\\r\\n if ((hitElement === null || !someHitElementIsSelected) && !event.shiftKey && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.clearSelection(hitElement);\\r\\n }\\r\\n if (_this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [_this13.state.editingLinearElement.elementId]: true\\r\\n }\\r\\n }); // If we click on something\\r\\n }\\r\\n else if (hitElement != null) {\\r\\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return _objectSpread(_objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), {}, {\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }); // mark as not completely handled so as to allow dragging etc.\\r\\n return false;\\r\\n } // deselect if item is selected\\r\\n // if shift is not clicked, this will always return true\\r\\n // otherwise, it will trigger selection based on current\\r\\n // state of the box\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n // if we are currently editing a group, exiting editing mode and deselect the group.\\r\\n if (_this13.state.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, _this13.state.editingGroupId)) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n } // Add hit element to selection. At this point if we're not holding\\r\\n // SHIFT the previously selected element(s) were deselected above\\r\\n // (make sure you use setState updater to use latest state)\\r\\n if (!someHitElementIsSelected && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n }),\\r\\n showHyperlinkPopup: hitElement.link ? \\\"info\\\" : false\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this.handleTextOnPointerDown = function (event, pointerDownState) {\\r\\n // if we're currently still editing text, clicking outside\\r\\n // should only finalize it, not create another (irrespective\\r\\n // of state.elementLocked)\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return;\\r\\n }\\r\\n let sceneX = pointerDownState.origin.x;\\r\\n let sceneY = pointerDownState.origin.y;\\r\\n const element = _this13.getElementAtPosition(sceneX, sceneY, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n if (canBindText) {\\r\\n sceneX = element.x + element.width / 2;\\r\\n sceneY = element.y + element.height / 2;\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!_this13.state.elementLocked) {\\r\\n _this13.setState({\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleFreeDrawElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n // Begin a mark capture. This does not have to update state yet.\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\\r\\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n simulatePressure: event.pressure === 0.5\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n const pressures = element.simulatePressure ? element.pressures : [...element.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [[0, 0]],\\r\\n pressures\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n };\\r\\n this.createImageElement = function (_ref9) {\\r\\n let { sceneX, sceneY } = _ref9;\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(sceneX, sceneY, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newImageElement)({\\r\\n type: \\\"image\\\",\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness\\r\\n });\\r\\n return element;\\r\\n };\\r\\n this.handleLinearElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state; // finalize if completing a loop\\r\\n if (multiElement.type === \\\"line\\\" && (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, _this13.state.zoom.value)) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n const { x: rx, y: ry, lastCommittedPoint } = multiElement; // clicking inside commit zone → finalize arrow\\r\\n if (multiElement.points.length > 1 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [multiElement.id]: true\\r\\n })\\r\\n };\\r\\n }); // clicking outside commit zone → update reference for last committed\\r\\n // point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\\r\\n If so, we want it to be null for start and \\\"arrow\\\" for end. If the linear item is not\\r\\n an arrow, we want it to be null for both. Otherwise, we want it to use the\\r\\n values from appState. */\\r\\n const { currentItemStartArrowhead, currentItemEndArrowhead } = _this13.state;\\r\\n const [startArrowhead, endArrowhead] = elementType === \\\"arrow\\\" ? [currentItemStartArrowhead, currentItemEndArrowhead] : [null, null];\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n startArrowhead,\\r\\n endArrowhead\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [...element.points, [0, 0]]\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n };\\r\\n this.createGenericElementOnPointerDown = function (elementType, pointerDownState) {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness\\r\\n });\\r\\n if (element.type === \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectionElement: element,\\r\\n draggingElement: element\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n multiElement: null,\\r\\n draggingElement: element,\\r\\n editingElement: element\\r\\n });\\r\\n }\\r\\n };\\r\\n this.initializeImage = /*#__PURE__*/ function () {\\r\\n var _ref10 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (_ref11) {\\r\\n var _a, _b, _c, _d;\\r\\n let { imageFile, imageElement: _imageElement, showCursorImagePreview = false } = _ref11;\\r\\n // at this point this should be guaranteed image file, but we do this check\\r\\n // to satisfy TS down the line\\r\\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(imageFile)) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.unsupportedFileType\\\"));\\r\\n }\\r\\n const mimeType = imageFile.type;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, \\\"wait\\\");\\r\\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.normalizeSVG)(yield imageFile.text()), imageFile.name);\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error);\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.svgImageInsertError\\\"));\\r\\n }\\r\\n } // generate image id (by default the file digest) before any\\r\\n // resizing/compression takes place to keep it more portable\\r\\n const fileId = yield ((_b = (_a = _this13.props).generateIdForFile) === null || _b === void 0 ? void 0 : _b.call(_a, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.generateIdFromFile)(imageFile);\\r\\n if (!fileId) {\\r\\n console.warn(\\\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\\\");\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\"));\\r\\n }\\r\\n const existingFileData = _this13.files[fileId];\\r\\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\\r\\n try {\\r\\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error trying to resing image file on insertion\\\", error);\\r\\n }\\r\\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.fileTooBig\\\", {\\r\\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`\\r\\n }));\\r\\n }\\r\\n }\\r\\n if (showCursorImagePreview) {\\r\\n const dataURL = (_c = _this13.files[fileId]) === null || _c === void 0 ? void 0 : _c.dataURL; // optimization so that we don't unnecessarily resize the original\\r\\n // full-size file for cursor preview\\r\\n // (it's much faster to convert the resized dataURL to File)\\r\\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.dataURLToFile)(dataURL);\\r\\n _this13.setImagePreviewCursor(resizedFile || imageFile);\\r\\n }\\r\\n const dataURL = ((_d = _this13.files[fileId]) === null || _d === void 0 ? void 0 : _d.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imageFile));\\r\\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_imageElement, {\\r\\n fileId\\r\\n }, false);\\r\\n return new Promise(/*#__PURE__*/ function () {\\r\\n var _ref12 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (resolve, reject) {\\r\\n var _a, _b;\\r\\n try {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), {}, {\\r\\n [fileId]: {\\r\\n mimeType,\\r\\n id: fileId,\\r\\n dataURL,\\r\\n created: Date.now()\\r\\n }\\r\\n });\\r\\n const cachedImageData = _this13.imageCache.get(fileId);\\r\\n if (!cachedImageData) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n yield _this13.updateImageCache([imageElement]);\\r\\n }\\r\\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\\r\\n yield cachedImageData.image;\\r\\n }\\r\\n if (((_a = _this13.state.pendingImageElement) === null || _a === void 0 ? void 0 : _a.id) !== imageElement.id && ((_b = _this13.state.draggingElement) === null || _b === void 0 ? void 0 : _b.id) !== imageElement.id) {\\r\\n _this13.initializeImageDimensions(imageElement, true);\\r\\n }\\r\\n resolve(imageElement);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")));\\r\\n }\\r\\n finally {\\r\\n if (!showCursorImagePreview) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n }\\r\\n });\\r\\n return function (_x6, _x7) {\\r\\n return _ref12.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n });\\r\\n return function (_x5) {\\r\\n return _ref10.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.insertImageElement = /*#__PURE__*/ function () {\\r\\n var _ref13 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageElement, imageFile, showCursorImagePreview) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), imageElement]);\\r\\n try {\\r\\n yield _this13.initializeImage({\\r\\n imageFile,\\r\\n imageElement,\\r\\n showCursorImagePreview\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n isDeleted: true\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n _this13.setState({\\r\\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x8, _x9, _x10) {\\r\\n return _ref13.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.setImagePreviewCursor = /*#__PURE__*/ function () {\\r\\n var _ref14 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageFile) {\\r\\n // mustn't be larger than 128 px\\r\\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\\r\\n const cursorImageSizePx = 96;\\r\\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: cursorImageSizePx\\r\\n });\\r\\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imagePreview); // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\\r\\n // a small canvas\\r\\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.loadHTMLImageElement)(previewDataURL);\\r\\n let height = Math.min(img.height, cursorImageSizePx);\\r\\n let width = height * (img.width / img.height);\\r\\n if (width > cursorImageSizePx) {\\r\\n width = cursorImageSizePx;\\r\\n height = width * (img.height / img.width);\\r\\n }\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.height = height;\\r\\n canvas.width = width;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.drawImage(img, 0, 0, width, height);\\r\\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg);\\r\\n }\\r\\n if (_this13.state.pendingImageElement) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, `url(${previewDataURL}) 4 4, auto`);\\r\\n }\\r\\n });\\r\\n return function (_x11) {\\r\\n return _ref14.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.onImageAction = /*#__PURE__*/ function () {\\r\\n var _ref15 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let { insertOnCanvasDirectly } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\\r\\n insertOnCanvasDirectly: false\\r\\n };\\r\\n try {\\r\\n const clientX = _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.fileOpen)({\\r\\n description: \\\"Image\\\",\\r\\n extensions: [\\\"jpg\\\", \\\"png\\\", \\\"svg\\\", \\\"gif\\\"]\\r\\n });\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n });\\r\\n if (insertOnCanvasDirectly) {\\r\\n _this13.insertImageElement(imageElement, imageFile);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n pendingImageElement: imageElement\\r\\n }, function () {\\r\\n _this13.insertImageElement(imageElement, imageFile, \\r\\n /* showCursorImagePreview */\\r\\n true);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"AbortError\\\") {\\r\\n console.error(error);\\r\\n }\\r\\n else {\\r\\n console.warn(error);\\r\\n }\\r\\n _this13.setState({\\r\\n pendingImageElement: null,\\r\\n editingElement: null,\\r\\n elementType: \\\"selection\\\"\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref15.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.initializeImageDimensions = function (imageElement) {\\r\\n var _a;\\r\\n let forceNaturalSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(imageElement) && ((_a = _this13.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n if (!image || image instanceof Promise) {\\r\\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const placeholderSize = 100 / _this13.state.zoom.value;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x: imageElement.x - placeholderSize / 2,\\r\\n y: imageElement.y - placeholderSize / 2,\\r\\n width: placeholderSize,\\r\\n height: placeholderSize\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (forceNaturalSize || // if user-created bounding box is below threshold, assume the\\r\\n // intention was to click instead of drag, and use the image's\\r\\n // intrinsic size\\r\\n imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const minHeight = Math.max(_this13.state.height - 120, 160); // max 65% of canvas height, clamped to <300px, vh - 120px>\\r\\n const maxHeight = Math.min(minHeight, Math.floor(_this13.state.height * 0.5) / _this13.state.zoom.value);\\r\\n const height = Math.min(image.naturalHeight, maxHeight);\\r\\n const width = height * (image.naturalWidth / image.naturalHeight); // add current imageElement width/height to account for previous centering\\r\\n // of the placholder image\\r\\n const x = imageElement.x + imageElement.width / 2 - width / 2;\\r\\n const y = imageElement.y + imageElement.height / 2 - height / 2;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n };\\r\\n this.updateImageCache = /*#__PURE__*/ function () {\\r\\n var _ref16 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements) {\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.updateImageCache)({\\r\\n imageCache: _this13.imageCache,\\r\\n fileIds: elements.map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n if (updatedFiles.size || erroredFiles.size) {\\r\\n for (const element of elements) {\\r\\n if (updatedFiles.has(element.fileId)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (erroredFiles.size) {\\r\\n _this13.scene.replaceAllElements(_this13.scene.getElementsIncludingDeleted().map(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && erroredFiles.has(element.fileId)) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(element, {\\r\\n status: \\\"error\\\"\\r\\n });\\r\\n }\\r\\n return element;\\r\\n }));\\r\\n }\\r\\n return {\\r\\n updatedFiles,\\r\\n erroredFiles\\r\\n };\\r\\n });\\r\\n return function (_x12) {\\r\\n return _ref16.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.addNewImagesToImageCache = /*#__PURE__*/ function () {\\r\\n var _ref17 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let imageElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.getInitializedImageElements)(_this13.scene.getElements());\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const uncachedImageElements = imageElements.filter(function (element) {\\r\\n return !element.isDeleted && !_this13.imageCache.has(element.fileId);\\r\\n });\\r\\n if (uncachedImageElements.length) {\\r\\n const { updatedFiles } = yield _this13.updateImageCache(uncachedImageElements, files);\\r\\n if (updatedFiles.size) {\\r\\n _this13.scene.informMutation();\\r\\n }\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref17.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default()(function () {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.IMAGE_RENDER_TIMEOUT);\\r\\n this.updateBindingEnabledOnPointerMove = function (event) {\\r\\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\\r\\n if (_this13.state.isBindingEnabled !== shouldEnableBinding) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: shouldEnableBinding\\r\\n });\\r\\n }\\r\\n };\\r\\n this.maybeSuggestBindingAtCursor = function (pointerCoords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, _this13.scene);\\r\\n _this13.setState({\\r\\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : []\\r\\n });\\r\\n };\\r\\n this.maybeSuggestBindingsForLinearElementAtCoords = function (linearElement, pointerCoords, oppositeBindingBoundElement) {\\r\\n if (!pointerCoords.length) {\\r\\n return;\\r\\n }\\r\\n const suggestedBindings = pointerCoords.reduce(function (acc, coords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(coords, _this13.scene);\\r\\n if (hoveredBindableElement != null && !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\\r\\n acc.push(hoveredBindableElement);\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n _this13.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n };\\r\\n this.handleCanvasRef = function (canvas) {\\r\\n var _a, _b, _c;\\r\\n // canvas is null when unmounting\\r\\n if (canvas !== null) {\\r\\n _this13.canvas = canvas;\\r\\n _this13.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__[\\\"default\\\"].canvas(_this13.canvas);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel, {\\r\\n passive: false\\r\\n });\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n else {\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel);\\r\\n (_b = _this13.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n (_c = _this13.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n };\\r\\n this.handleAppOnDrop = /*#__PURE__*/ function () {\\r\\n var _ref18 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n try {\\r\\n if (_this13.props.onDrop) {\\r\\n try {\\r\\n if ((yield _this13.props.onDrop(event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (e) {\\r\\n console.error(e);\\r\\n }\\r\\n }\\r\\n const file = event.dataTransfer.files[0];\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file)) {\\r\\n // first attempt to decode scene from the image if it's embedded\\r\\n // ---------------------------------------------------------------------\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n return;\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"EncodingError\\\") {\\r\\n throw error;\\r\\n }\\r\\n }\\r\\n } // if no scene is embedded or we fail for whatever reason, fall back\\r\\n // to importing as regular image\\r\\n // ---------------------------------------------------------------------\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\\r\\n if (libraryShapes !== \\\"\\\") {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: JSON.parse(libraryShapes),\\r\\n position: event,\\r\\n files: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n const file = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files[0];\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib || ((_b = file === null || file === void 0 ? void 0 : file.name) === null || _b === void 0 ? void 0 : _b.endsWith(\\\".excalidrawlib\\\"))) {\\r\\n _this13.library.importLibrary(file).then(function () {\\r\\n // Close and then open to get the libraries updated\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }).catch(function (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }); // default: assume an Excalidraw file regardless of extension/MimeType\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n yield _this13.loadFileToCanvas(file);\\r\\n }\\r\\n });\\r\\n return function (_x13) {\\r\\n return _ref18.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.loadFileToCanvas = function (file) {\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n };\\r\\n this.handleCanvasContextMenu = function (event) {\\r\\n event.preventDefault();\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const element = _this13.getElementAtPosition(x, y, {\\r\\n preferSelected: true\\r\\n });\\r\\n const type = element ? \\\"element\\\" : \\\"canvas\\\";\\r\\n const container = _this13.excalidrawContainerRef.current;\\r\\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\\r\\n const left = event.clientX - offsetLeft;\\r\\n const top = event.clientY - offsetTop;\\r\\n if (element && !_this13.state.selectedElementIds[element.id]) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n }\\r\\n };\\r\\n this.maybeDragNewGenericElement = function (pointerDownState, event) {\\r\\n var _a;\\r\\n const draggingElement = _this13.state.draggingElement;\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"selection\\\") {\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event));\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this13.state.gridSize);\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(draggingElement) && ((_a = _this13.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n const aspectRatio = image && !(image instanceof Promise) ? image.width / image.height : null;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), aspectRatio);\\r\\n _this13.maybeSuggestBindingForAll([draggingElement]);\\r\\n }\\r\\n };\\r\\n this.maybeHandleResize = function (pointerDownState, event) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n const transformHandleType = pointerDownState.resize.handleType;\\r\\n _this13.setState({\\r\\n // TODO: rename this state field to \\\"isScaling\\\" to distinguish\\r\\n // it from the generic \\\"isResizing\\\" which includes scaling and\\r\\n // rotating\\r\\n isResizing: transformHandleType && transformHandleType !== \\\"rotation\\\",\\r\\n isRotating: transformHandleType === \\\"rotation\\\"\\r\\n });\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, _this13.state.gridSize);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(selectedElements[0]) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this._openContextMenu = function (_ref19, type) {\\r\\n let { left, top } = _ref19;\\r\\n if (_this13.state.showHyperlinkPopup) {\\r\\n _this13.setState({\\r\\n showHyperlinkPopup: false\\r\\n });\\r\\n }\\r\\n _this13.contextMenuOpen = true;\\r\\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const separator = \\\"separator\\\";\\r\\n const elements = _this13.scene.getElements();\\r\\n const options = [];\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\\r\\n }\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\\r\\n }\\r\\n if (type === \\\"canvas\\\") {\\r\\n const viewModeOptions = [...options, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats];\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: viewModeOptions,\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && navigator.clipboard && separator, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg, (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 || _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll, separator, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (type === \\\"element\\\") {\\r\\n const elementsWithUnbindedText = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state).some(function (element) {\\r\\n return !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n });\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut, _this13.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, _this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && separator, ...options, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles, _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles, separator, maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup, !elementsWithUnbindedText && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUnbindText, maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup, (maybeGroupAction || maybeUngroupAction) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront, separator, maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal, maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink.contextItemPredicate(elements, _this13.state) && _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current,\\r\\n elements\\r\\n });\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n const { deltaX, deltaY } = event;\\r\\n const { selectedElementIds, previousSelectedElementIds } = _this13.state; // note that event.ctrlKey is necessary to handle pinch zooming\\r\\n if (event.metaKey || event.ctrlKey) {\\r\\n const sign = Math.sign(deltaY);\\r\\n const MAX_STEP = 10;\\r\\n let delta = Math.abs(deltaY);\\r\\n if (delta > MAX_STEP) {\\r\\n delta = MAX_STEP;\\r\\n }\\r\\n delta *= sign;\\r\\n if (Object.keys(previousSelectedElementIds).length !== 0) {\\r\\n setTimeout(function () {\\r\\n _this13.setState({\\r\\n selectedElementIds: previousSelectedElementIds,\\r\\n previousSelectedElementIds: {}\\r\\n });\\r\\n }, 1000);\\r\\n }\\r\\n let newZoom = _this13.state.zoom.value - delta / 100; // increase zoom steps the more zoomed-in we are (applies to >100% only)\\r\\n newZoom += Math.log10(Math.max(1, _this13.state.zoom.value)) * -sign; // round to nearest step\\r\\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getStateForZoom)({\\r\\n viewportX: cursorX,\\r\\n viewportY: cursorY,\\r\\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom)\\r\\n }, state)), {}, {\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0 ? selectedElementIds : previousSelectedElementIds,\\r\\n shouldCacheIgnoreZoom: true\\r\\n });\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n return;\\r\\n } // scroll horizontally when shift pressed\\r\\n if (event.shiftKey) {\\r\\n _this13.setState(function (_ref20) {\\r\\n let { zoom, scrollX } = _ref20;\\r\\n return {\\r\\n // on Mac, shift+wheel tends to result in deltaX\\r\\n scrollX: scrollX - (deltaY || deltaX) / zoom.value\\r\\n };\\r\\n });\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (_ref21) {\\r\\n let { zoom, scrollX, scrollY } = _ref21;\\r\\n return {\\r\\n scrollX: scrollX - deltaX / zoom.value,\\r\\n scrollY: scrollY - deltaY / zoom.value\\r\\n };\\r\\n });\\r\\n });\\r\\n this.savePointer = function (x, y, button) {\\r\\n var _a, _b;\\r\\n if (!x || !y) {\\r\\n return;\\r\\n }\\r\\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: x,\\r\\n clientY: y\\r\\n }, _this13.state);\\r\\n if (isNaN(pointer.x) || isNaN(pointer.y)) { // sometimes the pointer goes off screen\\r\\n }\\r\\n (_b = (_a = _this13.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\\r\\n pointer,\\r\\n button,\\r\\n pointersMap: gesture.pointers\\r\\n });\\r\\n };\\r\\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n if (!_this13.unmounted) {\\r\\n _this13.setState({\\r\\n shouldCacheIgnoreZoom: false\\r\\n });\\r\\n }\\r\\n }, 300);\\r\\n this.updateDOMRect = function (cb) {\\r\\n var _a;\\r\\n if ((_a = _this13.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = _this13.excalidrawContainerRef.current;\\r\\n const { width, height, left: offsetLeft, top: offsetTop } = excalidrawContainer.getBoundingClientRect();\\r\\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft } = _this13.state;\\r\\n if (width === currentWidth && height === currentHeight && offsetLeft === currentOffsetLeft && offsetTop === currentOffsetTop) {\\r\\n if (cb) {\\r\\n cb();\\r\\n }\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n width,\\r\\n height,\\r\\n offsetLeft,\\r\\n offsetTop\\r\\n }, function () {\\r\\n cb && cb();\\r\\n });\\r\\n }\\r\\n };\\r\\n this.refresh = function () {\\r\\n _this13.setState(_objectSpread({}, _this13.getCanvasOffsets()));\\r\\n };\\r\\n};\\r\\nif (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n window.h = window.h || {};\\r\\n Object.defineProperties(window.h, {\\r\\n elements: {\\r\\n configurable: true,\\r\\n get() {\\r\\n return this.app.scene.getElementsIncludingDeleted();\\r\\n },\\r\\n set(elements) {\\r\\n return this.app.scene.replaceAllElements(elements);\\r\\n }\\r\\n }\\r\\n });\\r\\n}\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTdHLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSw4REFBcUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZJLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxTQUFTLEdBQUc7UUFDZixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0csSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFdEYsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENB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QkFDTjtnQkFFRCxPQUFPO2FBQ1I7WUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNmLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixVQUFVO2dCQUNWLFNBQVM7YUFDVixFQUFFO2dCQUNELEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsT0FBTyxHQUFHO1FBQ2IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixJQUFJLGFBQW9CLEtBQUssaURBQVEsSUFBSSxhQUFvQixLQUFLLHdEQUFlLEVBQUU7SUFDakYsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUVsQixHQUFHO2dCQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1lBRUQsR0FBRyxDQUFDLFFBQVE7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxDQUFDO1NBRUY7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUVELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MzhlNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWRcIjtcbmltcG9ydCB7IGFjdGlvbkFkZFRvTGlicmFyeSwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25CcmluZ1RvRnJvbnQsIGFjdGlvbkNvcHksIGFjdGlvbkNvcHlBc1BuZywgYWN0aW9uQ29weUFzU3ZnLCBhY3Rpb25Db3B5U3R5bGVzLCBhY3Rpb25DdXQsIGFjdGlvbkRlbGV0ZVNlbGVjdGVkLCBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sIGFjdGlvbkZpbmFsaXplLCBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgYWN0aW9uRmxpcFZlcnRpY2FsLCBhY3Rpb25Hcm91cCwgYWN0aW9uUGFzdGVTdHlsZXMsIGFjdGlvblNlbGVjdEFsbCwgYWN0aW9uU2VuZEJhY2t3YXJkLCBhY3Rpb25TZW5kVG9CYWNrLCBhY3Rpb25Ub2dnbGVHcmlkTW9kZSwgYWN0aW9uVG9nZ2xlU3RhdHMsIGFjdGlvblRvZ2dsZVplbk1vZGUsIGFjdGlvblVuYmluZFRleHQsIGFjdGlvblVuZ3JvdXAsIHpvb21Ub0ZpdEVsZW1lbnRzLCBhY3Rpb25MaW5rIH0gZnJvbSBcIi4uL2FjdGlvbnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlZG9BY3Rpb24sIGNyZWF0ZVVuZG9BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25IaXN0b3J5XCI7XG5pbXBvcnQgeyBBY3Rpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL2FjdGlvbnMvbWFuYWdlclwiO1xuaW1wb3J0IHsgYWN0aW9ucyB9IGZyb20gXCIuLi9hY3Rpb25zL3JlZ2lzdGVyXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBjb3B5VG9DbGlwYm9hcmQsIHBhcnNlQ2xpcGJvYXJkLCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCB9IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcbmltcG9ydCB7IEFQUF9OQU1FLCBDVVJTT1JfVFlQRSwgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULCBERUZBVUxUX1VJX09QVElPTlMsIERFRkFVTFRfVkVSVElDQUxfQUxJR04sIERSQUdHSU5HX1RIUkVTSE9MRCwgRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5ULCBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQsIEVOViwgRVZFTlQsIEdSSURfU0laRSwgSU1BR0VfUkVOREVSX1RJTUVPVVQsIExJTkVfQ09ORklSTV9USFJFU0hPTEQsIE1BWF9BTExPV0VEX0ZJTEVfQllURVMsIE1JTUVfVFlQRVMsIE1RX01BWF9IRUlHSFRfTEFORFNDQVBFLCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFLCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQsIFBPSU5URVJfQlVUVE9OLCBTQ1JPTExfVElNRU9VVCwgVEFQX1RXSUNFX1RJTUVPVVQsIFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xELCBUSEVNRSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCwgVVJMX0hBU0hfS0VZUywgVVJMX1FVRVJZX0tFWVMsIFpPT01fU1RFUCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvYWRGcm9tQmxvYiB9IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cywgcmVzdG9yZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7IGRyYWdOZXdFbGVtZW50LCBkcmFnU2VsZWN0ZWRFbGVtZW50cywgZHVwbGljYXRlRWxlbWVudCwgZ2V0Q29tbW9uQm91bmRzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsIGdldERyYWdPZmZzZXRYWSwgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLCBnZXROb3JtYWxpemVkRGltZW5zaW9ucywgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLCBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbiwgZ2V0UmVzaXplT2Zmc2V0WFksIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLCBoaXRUZXN0LCBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LCBpc05vbkRlbGV0ZWRFbGVtZW50LCBpc1RleHRFbGVtZW50LCBuZXdFbGVtZW50LCBuZXdMaW5lYXJFbGVtZW50LCBuZXdUZXh0RWxlbWVudCwgbmV3SW1hZ2VFbGVtZW50LCB0ZXh0V3lzaXd5ZywgdHJhbnNmb3JtRWxlbWVudHMsIHVwZGF0ZVRleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbiwgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLCBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZywgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLCBpc0JpbmRpbmdFbmFibGVkLCBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsIG1heWJlQmluZExpbmVhckVsZW1lbnQsIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsIHVuYmluZExpbmVhckVsZW1lbnRzLCB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYmluZGluZ1wiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uLCBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHsgaGFzQm91bmRUZXh0RWxlbWVudCwgaXNCaW5kaW5nRWxlbWVudCwgaXNCaW5kaW5nRWxlbWVudFR5cGUsIGlzQm91bmRUb0NvbnRhaW5lciwgaXNJbWFnZUVsZW1lbnQsIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQsIGlzTGluZWFyRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50VHlwZSB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHsgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LCBnZXRFbGVtZW50c0luR3JvdXAsIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsIGdldFNlbGVjdGVkR3JvdXBJZHMsIGlzRWxlbWVudEluR3JvdXAsIGlzU2VsZWN0ZWRWaWFHcm91cCwgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi9oaXN0b3J5XCI7XG5pbXBvcnQgeyBkZWZhdWx0TGFuZywgZ2V0TGFuZ3VhZ2UsIGxhbmd1YWdlcywgc2V0TGFuZ3VhZ2UsIHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgQ09ERVMsIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8sIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlLCBpc0Fycm93S2V5LCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIGdldEdyaWRQb2ludCwgaXNQYXRoQUxvb3AsIHJvdGF0ZSB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlclwiO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVTY3JvbGxDZW50ZXIsIGdldEVsZW1lbnRDb250YWluaW5nUG9zaXRpb24sIGdldEVsZW1lbnRzQXRQb3NpdGlvbiwgZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24sIGdldE5vcm1hbGl6ZWRab29tLCBnZXRTZWxlY3RlZEVsZW1lbnRzLCBoYXNCYWNrZ3JvdW5kLCBpc092ZXJTY3JvbGxCYXJzLCBpc1NvbWVFbGVtZW50U2VsZWN0ZWQgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGdldFN0YXRlRm9yWm9vbSB9IGZyb20gXCIuLi9zY2VuZS96b29tXCI7XG5pbXBvcnQgeyBmaW5kU2hhcGVCeUtleSB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7IGRlYm91bmNlLCBkaXN0YW5jZSwgZ2V0Rm9udFN0cmluZywgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsIGlzSW5wdXRMaWtlLCBpc1Rvb2xJY29uLCBpc1dyaXRhYmxlRWxlbWVudCwgcmVzZXRDdXJzb3IsIHJlc29sdmFibGVQcm9taXNlLCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsIHNldEN1cnNvciwgc2V0Q3Vyc29yRm9yU2hhcGUsIHR1cGxlVG9Db29ycywgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLCB3aXRoQmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBDb250ZXh0TWVudSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHsgZGF0YVVSTFRvRmlsZSwgZ2VuZXJhdGVJZEZyb21GaWxlLCBnZXREYXRhVVJMLCBpc1N1cHBvcnRlZEltYWdlRmlsZSwgcmVzaXplSW1hZ2VGaWxlLCBTVkdTdHJpbmdUb0ZpbGUgfSBmcm9tIFwiLi4vZGF0YS9ibG9iXCI7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsIGxvYWRIVE1MSW1hZ2VFbGVtZW50LCBub3JtYWxpemVTVkcsIHVwZGF0ZUltYWdlQ2FjaGUgYXMgX3VwZGF0ZUltYWdlQ2FjaGUgfSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gudGhyb3R0bGVcIjtcbmltcG9ydCB7IGZpbGVPcGVuLCBuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkIH0gZnJvbSBcIi4uL2RhdGEvZmlsZXN5c3RlbVwiO1xuaW1wb3J0IHsgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiwgZ2V0QXBwcm94TWluTGluZUhlaWdodCwgZ2V0QXBwcm94TWluTGluZVdpZHRoLCBnZXRCb3VuZFRleHRFbGVtZW50SWQgfSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi4vZWxlbWVudC9jb2xsaXNpb25cIjtcbmltcG9ydCB7IHJlc2l6ZVNpbmdsZUVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9yZXNpemVFbGVtZW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplTGluaywgc2hvd0h5cGVybGlua1Rvb2x0aXAsIGhpZGVIeXBlcmxpbmtUb29saXAsIEh5cGVybGluaywgaXNQb2ludEhpdHRpbmdMaW5rSWNvbiwgaXNMb2NhbExpbmsgfSBmcm9tIFwiLi4vZWxlbWVudC9IeXBlcmxpbmtcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgbGV0IHNob3dGb3VydGhGb250ID0gZmFsc2U7XG5jb25zdCBJc01vYmlsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChmYWxzZSk7XG5leHBvcnQgY29uc3QgdXNlSXNNb2JpbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KElzTW9iaWxlQ29udGV4dCk7XG59O1xuY29uc3QgRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgaWQ6IG51bGxcbn0pO1xuZXhwb3J0IGNvbnN0IHVzZUV4Y2FsaWRyYXdDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0KTtcbn07XG5sZXQgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbmxldCB0YXBwZWRUd2ljZVRpbWVyID0gMDtcbmxldCBjdXJzb3JYID0gMDtcbmxldCBjdXJzb3JZID0gMDtcbmxldCBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xubGV0IGlzUGFubmluZyA9IGZhbHNlO1xubGV0IGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSBmYWxzZTtcbmxldCBjdXJyZW50U2Nyb2xsQmFycyA9IHtcbiAgaG9yaXpvbnRhbDogbnVsbCxcbiAgdmVydGljYWw6IG51bGxcbn07XG5sZXQgdG91Y2hUaW1lb3V0ID0gMDtcbmxldCBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcbmxldCBsYXN0UG9pbnRlclVwID0gbnVsbDtcbmNvbnN0IGdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBuZXcgTWFwKCksXG4gIGxhc3RDZW50ZXI6IG51bGwsXG4gIGluaXRpYWxEaXN0YW5jZTogbnVsbCxcbiAgaW5pdGlhbFNjYWxlOiBudWxsXG59O1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHN1cGVyKHByb3BzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBfaW5pdGlhbGlzZVByb3BzLmNhbGwodGhpcyk7XG5cbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBleGNhbGlkcmF3UmVmLFxuICAgICAgdmlld01vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgZ3JpZE1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB0aGVtZSA9IGRlZmF1bHRBcHBTdGF0ZS50aGVtZSxcbiAgICAgIG5hbWUgPSBkZWZhdWx0QXBwU3RhdGUubmFtZVxuICAgIH0gPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRBcHBTdGF0ZSksIHt9LCB7XG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgIH0sIHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpKSwge30sIHtcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgZ3JpZFNpemU6IGdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGwsXG4gICAgICBuYW1lLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5pZCA9IG5hbm9pZCgpO1xuXG4gICAgaWYgKGV4Y2FsaWRyYXdSZWYpIHtcbiAgICAgIGNvbnN0IHJlYWR5UHJvbWlzZSA9IFwiY3VycmVudFwiIGluIGV4Y2FsaWRyYXdSZWYgJiYgZXhjYWxpZHJhd1JlZi5jdXJyZW50Py5yZWFkeVByb21pc2UgfHwgcmVzb2x2YWJsZVByb21pc2UoKTtcbiAgICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIHJlYWR5UHJvbWlzZSxcbiAgICAgICAgdXBkYXRlU2NlbmU6IHRoaXMudXBkYXRlU2NlbmUsXG4gICAgICAgIGFkZEZpbGVzOiB0aGlzLmFkZEZpbGVzLFxuICAgICAgICByZXNldFNjZW5lOiB0aGlzLnJlc2V0U2NlbmUsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkOiB0aGlzLmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkLFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY2xlYXI6IHRoaXMucmVzZXRIaXN0b3J5XG4gICAgICAgIH0sXG4gICAgICAgIHNjcm9sbFRvQ29udGVudDogdGhpcy5zY3JvbGxUb0NvbnRlbnQsXG4gICAgICAgIHpvb21Ub0ZpdDogdGhpcy56b29tVG9GaXQsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHM6IHRoaXMuZ2V0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgZ2V0QXBwU3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEZpbGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmZpbGVzO1xuICAgICAgICB9LFxuICAgICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgICAgIGltcG9ydExpYnJhcnk6IHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwsXG4gICAgICAgIHNldFRvYXN0TWVzc2FnZTogdGhpcy5zZXRUb2FzdE1lc3NhZ2UsXG4gICAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IHRoaXMudXBkYXRlQ29udGFpbmVyU2l6ZSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHNldExvY2FsRm9udDogdGhpcy5zZXRMb2NhbEZvbnQsXG4gICAgICAgIHNlbGVjdEVsZW1lbnRzOiB0aGlzLnNlbGVjdEVsZW1lbnRzLFxuICAgICAgICBzZW5kQmFja3dhcmQ6IHRoaXMuc2VuZEJhY2t3YXJkLFxuICAgICAgICBicmluZ0ZvcndhcmQ6IHRoaXMuYnJpbmdGb3J3YXJkLFxuICAgICAgICBzZW5kVG9CYWNrOiB0aGlzLnNlbmRUb0JhY2ssXG4gICAgICAgIGJyaW5nVG9Gcm9udDogdGhpcy5icmluZ1RvRnJvbnRcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2YgZXhjYWxpZHJhd1JlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYuY3VycmVudCA9IGFwaTtcbiAgICAgIH1cblxuICAgICAgcmVhZHlQcm9taXNlLnJlc29sdmUoYXBpKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZSA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBpZDogdGhpcy5pZFxuICAgIH07XG4gICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIodGhpcy5zeW5jQWN0aW9uUmVzdWx0LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc3RhdGU7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFsbChhY3Rpb25zKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlVW5kb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlUmVkb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgfVxuXG4gIHJlbmRlckNhbnZhcygpIHtcbiAgICBjb25zdCBjYW52YXNTY2FsZSA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgdmlld01vZGVFbmFibGVkXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXNET01XaWR0aCAqIGNhbnZhc1NjYWxlO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNhbnZhc0RPTUhlaWdodCAqIGNhbnZhc1NjYWxlO1xuXG4gICAgaWYgKHZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiY2FudmFzXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImV4Y2FsaWRyYXdfX2NhbnZhc1wiLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgICBjdXJzb3I6IENVUlNPUl9UWVBFLkdSQUJcbiAgICAgICAgfSxcbiAgICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhc0hlaWdodCxcbiAgICAgICAgcmVmOiB0aGlzLmhhbmRsZUNhbnZhc1JlZixcbiAgICAgICAgb25Db250ZXh0TWVudTogdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSxcbiAgICAgICAgb25Qb2ludGVyTW92ZTogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZSxcbiAgICAgICAgb25Qb2ludGVyVXA6IHRoaXMucmVtb3ZlUG9pbnRlcixcbiAgICAgICAgb25Qb2ludGVyQ2FuY2VsOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICAgIG9uVG91Y2hNb3ZlOiB0aGlzLmhhbmRsZVRvdWNoTW92ZSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bixcbiAgICAgICAgY2hpbGRyZW46IHQoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiY2FudmFzXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3X19jYW52YXNcIixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHRcbiAgICAgIH0sXG4gICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0hlaWdodCxcbiAgICAgIHJlZjogdGhpcy5oYW5kbGVDYW52YXNSZWYsXG4gICAgICBvbkNvbnRleHRNZW51OiB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51LFxuICAgICAgb25Qb2ludGVyRG93bjogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bixcbiAgICAgIG9uRG91YmxlQ2xpY2s6IHRoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2ssXG4gICAgICBvblBvaW50ZXJNb3ZlOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlLFxuICAgICAgb25Qb2ludGVyVXA6IHRoaXMucmVtb3ZlUG9pbnRlcixcbiAgICAgIG9uUG9pbnRlckNhbmNlbDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgb25Ub3VjaE1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgY2hpbGRyZW46IHQoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgY29uc3Qge1xuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWRcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3Qge1xuICAgICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXIsXG4gICAgICByZW5kZXJDdXN0b21TdGF0c1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goXCJleGNhbGlkcmF3IGV4Y2FsaWRyYXctY29udGFpbmVyXCIsIHtcbiAgICAgICAgXCJleGNhbGlkcmF3LS12aWV3LW1vZGVcIjogdmlld01vZGVFbmFibGVkLFxuICAgICAgICBcImV4Y2FsaWRyYXctLW1vYmlsZVwiOiB0aGlzLmlzTW9iaWxlXG4gICAgICB9KSxcbiAgICAgIHJlZjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLFxuICAgICAgb25Ecm9wOiB0aGlzLmhhbmRsZUFwcE9uRHJvcCxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgb25LZXlEb3duOiB0aGlzLnByb3BzLmhhbmRsZUtleWJvYXJkR2xvYmFsbHkgPyB1bmRlZmluZWQgOiB0aGlzLm9uS2V5RG93bixcbiAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUsXG4gICAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeHMoSXNNb2JpbGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuaXNNb2JpbGUsXG4gICAgICAgICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChMYXllclVJLCB7XG4gICAgICAgICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBmaWxlczogdGhpcy5maWxlcyxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlOiB0aGlzLnNldEFwcFN0YXRlLFxuICAgICAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgICAgZWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s6IG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICAgICAgICBvbkxvY2tUb2dnbGU6IHRoaXMudG9nZ2xlTG9jayxcbiAgICAgICAgICAgIG9uUGVuTW9kZVRvZ2dsZTogdGhpcy50b2dnbGVQZW5Nb2RlLFxuICAgICAgICAgICAgb25JbnNlcnRFbGVtZW50czogZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBudWxsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHplbk1vZGVFbmFibGVkOiB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIHRvZ2dsZVplbk1vZGU6IHRoaXMudG9nZ2xlWmVuTW9kZSxcbiAgICAgICAgICAgIGxhbmdDb2RlOiBnZXRMYW5ndWFnZSgpLmNvZGUsXG4gICAgICAgICAgICBpc0NvbGxhYm9yYXRpbmc6IHRoaXMucHJvcHMuaXNDb2xsYWJvcmF0aW5nLFxuICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVSTogcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgICAgICAgIHJlbmRlckN1c3RvbUZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgICAgICAgdmlld01vZGVFbmFibGVkOiB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgICBzaG93RXhpdFplbk1vZGVCdG46IHR5cGVvZiB0aGlzLnByb3BzPy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIHNob3dUaGVtZUJ0bjogdHlwZW9mIHRoaXMucHJvcHM/LnRoZW1lID09PSBcInVuZGVmaW5lZFwiICYmIHRoaXMucHJvcHMuVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMudGhlbWUsXG4gICAgICAgICAgICBsaWJyYXJ5UmV0dXJuVXJsOiB0aGlzLnByb3BzLmxpYnJhcnlSZXR1cm5VcmwsXG4gICAgICAgICAgICBVSU9wdGlvbnM6IHRoaXMucHJvcHMuVUlPcHRpb25zLFxuICAgICAgICAgICAgZm9jdXNDb250YWluZXI6IHRoaXMuZm9jdXNDb250YWluZXIsXG4gICAgICAgICAgICBsaWJyYXJ5OiB0aGlzLmxpYnJhcnksXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIG9uSW1hZ2VBY3Rpb246IHRoaXMub25JbWFnZUFjdGlvblxuICAgICAgICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCJcbiAgICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImV4Y2FsaWRyYXctY29udGV4dE1lbnVDb250YWluZXJcIlxuICAgICAgICAgIH0pLCBzZWxlY3RlZEVsZW1lbnQubGVuZ3RoID09PSAxICYmIHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwICYmIC8qI19fUFVSRV9fKi9fanN4KEh5cGVybGluaywge1xuICAgICAgICAgICAgZWxlbWVudDogc2VsZWN0ZWRFbGVtZW50WzBdLFxuICAgICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBzZXRBcHBTdGF0ZTogdGhpcy5zZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgIG9uTGlua09wZW46IHRoaXMucHJvcHMub25MaW5rT3BlblxuICAgICAgICAgIH0sIHNlbGVjdGVkRWxlbWVudFswXS5pZCksIHRoaXMuc3RhdGUuc2hvd1N0YXRzICYmIC8qI19fUFVSRV9fKi9fanN4KFN0YXRzLCB7XG4gICAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlOiB0aGlzLnNldEFwcFN0YXRlLFxuICAgICAgICAgICAgZWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgIG9uQ2xvc2U6IHRoaXMudG9nZ2xlU3RhdHMsXG4gICAgICAgICAgICByZW5kZXJDdXN0b21TdGF0czogcmVuZGVyQ3VzdG9tU3RhdHNcbiAgICAgICAgICB9KSwgdGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2UgIT09IG51bGwgJiYgLyojX19QVVJFX18qL19qc3goVG9hc3QsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuc3RhdGUudG9hc3RNZXNzYWdlLFxuICAgICAgICAgICAgY2xlYXJUb2FzdDogdGhpcy5jbGVhclRvYXN0XG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwibWFpblwiLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5yZW5kZXJDYW52YXMoKVxuICAgICAgICAgIH0pXVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBfdGhpczMudW5tb3VudGVkID0gZmFsc2U7XG4gICAgICBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlLmNvbnRhaW5lciA9IF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVCkge1xuICAgICAgICBjb25zdCBzZXRTdGF0ZSA9IF90aGlzMy5zZXRTdGF0ZS5iaW5kKF90aGlzMyk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zZXRTdGF0ZSguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX3RoaXMzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX3RoaXMzLmhpc3RvcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpczMuc2NlbmUuYWRkQ2FsbGJhY2soX3RoaXMzLm9uU2NlbmVVcGRhdGVkKTtcblxuICAgICAgX3RoaXMzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgIGlmIChfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyAmJiBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgICBfdGhpczMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGNvbXB1dGUgaXNNb2JpbGUgc3RhdGVcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgIH0gPSBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgX3RoaXMzLmlzTW9iaWxlID0gd2lkdGggPCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQgfHwgaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFOyAvLyByZWZyZXNoIG9mZnNldHNcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICAgIF90aGlzMy51cGRhdGVET01SZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpczMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUoX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfUE9SVFJBSVR9cHgpLCAobWF4LWhlaWdodDogJHtNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRX1weCkgYW5kIChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX0xBTkRTQ0FQRX1weClgKTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuaXNNb2JpbGUgPSBtZWRpYVF1ZXJ5Lm1hdGNoZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcblxuICAgICAgICBfdGhpczMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lZGlhUXVlcnkucmVtb3ZlTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICAgIGlmIChzZWFyY2hQYXJhbXMuaGFzKFwid2ViLXNoYXJlLXRhcmdldFwiKSkge1xuICAgICAgICAvLyBPYnRhaW4gYSBmaWxlIHRoYXQgd2FzIHNoYXJlZCB2aWEgdGhlIFdlYiBTaGFyZSBUYXJnZXQgQVBJLlxuICAgICAgICBfdGhpczMucmVzdG9yZUZpbGVGcm9tU2hhcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMy51cGRhdGVET01SZWN0KF90aGlzMy5pbml0aWFsaXplU2NlbmUpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmZpbGVzID0ge307XG4gICAgdGhpcy5pbWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DVVQsIHRoaXMub25DdXQpO1xuICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuU0NST0xMLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5NT1VTRV9NT1ZFLCB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbiwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUkVTSVpFLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVU5MT0FELCB0aGlzLm9uVW5sb2FkLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGhpcy5vbkJsdXIsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5EUkFHX09WRVIsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRFJPUCwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfU1RBUlQsIHRoaXMub25HZXN0dXJlU3RhcnQsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfQ0hBTkdFLCB0aGlzLm9uR2VzdHVyZUNoYW5nZSwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9FTkQsIHRoaXMub25HZXN0dXJlRW5kLCBmYWxzZSk7XG4gICAgdGhpcy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlcj8uKCk7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpOyAvLyAjMzU1M1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NT1VTRV9NT1ZFLCB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbik7IC8vIHJlcmVuZGVyIHRleHQgZWxlbWVudHMgb24gZm9udCBsb2FkIHRvIGZpeCAjNjM3ICYmICMxNTUzXG5cbiAgICBkb2N1bWVudC5mb250cz8uYWRkRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpOyAvLyBTYWZhcmktb25seSBkZXNrdG9wIHBpbmNoIHpvb21cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9TVEFSVCwgdGhpcy5vbkdlc3R1cmVTdGFydCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9DSEFOR0UsIHRoaXMub25HZXN0dXJlQ2hhbmdlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0VORCwgdGhpcy5vbkdlc3R1cmVFbmQsIGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5kZXRlY3RTY3JvbGwpIHtcbiAgICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcih0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuU0NST0xMLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAvLyBIaWRlIGh5cGVybGluayBwb3B1cCBpZiBzaG93biB3aGVuIGVsZW1lbnQgdHlwZSBpcyBub3Qgc2VsZWN0aW9uXG4gICAgaWYgKHByZXZTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJiB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmIHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5sYW5nQ29kZSAhPT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkge1xuICAgICAgdGhpcy51cGRhdGVMYW5ndWFnZSgpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZpZXdNb2RlRW5hYmxlZDogISF0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnplbk1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgemVuTW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdGhlbWU6IHRoaXMucHJvcHMudGhlbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGdyaWRTaXplOiB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm5hbWUgJiYgcHJldlByb3BzLm5hbWUgIT09IHRoaXMucHJvcHMubmFtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNsYXNzTGlzdC50b2dnbGUoXCJ0aGVtZS0tZGFya1wiLCB0aGlzLnN0YXRlLnRoZW1lID09PSBcImRhcmtcIik7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWRdKSB7XG4gICAgICAvLyBkZWZlciBzbyB0aGF0IHRoZSBjb21taXRUb0hpc3RvcnkgZmxhZyBpc24ndCByZXNldCB2aWEgY3VycmVudCB1cGRhdGVcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczQuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIG11bHRpRWxlbWVudFxuICAgIH0gPSBwcmV2U3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlLmVsZW1lbnRUeXBlICE9PSB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICYmIG11bHRpRWxlbWVudCAhPSBudWxsICYmIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSkgJiYgaXNCaW5kaW5nRWxlbWVudChtdWx0aUVsZW1lbnQpKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KG11bHRpRWxlbWVudCwgdGhpcy5zdGF0ZSwgdGhpcy5zY2VuZSwgdHVwbGVUb0Nvb3JzKExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMobXVsdGlFbGVtZW50LCAtMSkpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JCdXR0b24gPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVmlld3BvcnRDb29yZHMgPSB7fTtcbiAgICBjb25zdCByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMgPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlcm5hbWVzID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXMgPSB7fTtcbiAgICB0aGlzLnN0YXRlLmNvbGxhYm9yYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodXNlciwgc29ja2V0SWQpIHtcbiAgICAgIGlmICh1c2VyLnNlbGVjdGVkRWxlbWVudElkcykge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgIGlmICghKGlkIGluIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcykpIHtcbiAgICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0gPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXNlci5wb2ludGVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHVzZXIudXNlcm5hbWUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJuYW1lc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJuYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHBvaW50ZXJWaWV3cG9ydENvb3Jkc1tzb2NrZXRJZF0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoe1xuICAgICAgICBzY2VuZVg6IHVzZXIucG9pbnRlci54LFxuICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55XG4gICAgICB9LCBfdGhpczQuc3RhdGUpO1xuICAgICAgY3Vyc29yQnV0dG9uW3NvY2tldElkXSA9IHVzZXIuYnV0dG9uO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGlmICggLy8gbm90IHBsYWNlZCBvbiBjYW52YXMgeWV0IChidXQgaW4gZWxlbWVudHMgYXJyYXkpXG4gICAgICAgIF90aGlzNC5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50ICYmIGVsZW1lbnQuaWQgPT09IF90aGlzNC5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LmlkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IC8vIGRvbid0IHJlbmRlciB0ZXh0IGVsZW1lbnQgdGhhdCdzIGJlaW5nIGN1cnJlbnRseSBlZGl0ZWQgKGl0J3NcbiAgICAgIC8vIHJlbmRlcmVkIG9uIHJlbW90ZSBvbmx5KVxuXG5cbiAgICAgIHJldHVybiAhX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50IHx8IF90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudC50eXBlICE9PSBcInRleHRcIiB8fCBlbGVtZW50LmlkICE9PSBfdGhpczQuc3RhdGUuZWRpdGluZ0VsZW1lbnQuaWQ7XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50LFxuICAgICAgc2Nyb2xsQmFyc1xuICAgIH0gPSByZW5kZXJTY2VuZShyZW5kZXJpbmdFbGVtZW50cywgdGhpcy5zdGF0ZSwgdGhpcy5zdGF0ZS5zZWxlY3Rpb25FbGVtZW50LCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgdGhpcy5yYywgdGhpcy5jYW52YXMsIHtcbiAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCxcbiAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSxcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUudmlld0JhY2tncm91bmRDb2xvcixcbiAgICAgIHpvb206IHRoaXMuc3RhdGUuem9vbSxcbiAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3JkczogcG9pbnRlclZpZXdwb3J0Q29vcmRzLFxuICAgICAgcmVtb3RlUG9pbnRlckJ1dHRvbjogY3Vyc29yQnV0dG9uLFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczogcG9pbnRlclVzZXJuYW1lcyxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiBwb2ludGVyVXNlclN0YXRlcyxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdGhpcy5zdGF0ZS5zaG91bGRDYWNoZUlnbm9yZVpvb20sXG4gICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgIGltYWdlQ2FjaGU6IHRoaXMuaW1hZ2VDYWNoZSxcbiAgICAgIGlzRXhwb3J0aW5nOiBmYWxzZSxcbiAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmlzTW9iaWxlXG4gICAgfSk7XG5cbiAgICBpZiAoc2Nyb2xsQmFycykge1xuICAgICAgY3VycmVudFNjcm9sbEJhcnMgPSBzY3JvbGxCYXJzO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9IC8vIGhpZGUgd2hlbiBlZGl0aW5nIHRleHRcbiAgICBpc1RleHRFbGVtZW50KHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpID8gZmFsc2UgOiAhYXRMZWFzdE9uZVZpc2libGVFbGVtZW50ICYmIHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zY3JvbGxlZE91dHNpZGUgIT09IHNjcm9sbGVkT3V0c2lkZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbGVkT3V0c2lkZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5oaXN0b3J5LnJlY29yZCh0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcbiAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7IC8vIERvIG5vdCBub3RpZnkgY29uc3VtZXJzIGlmIHdlJ3JlIHN0aWxsIGxvYWRpbmcgdGhlIHNjZW5lLiBBbW9uZyBvdGhlclxuICAgIC8vIHBvdGVudGlhbCBpc3N1ZXMsIHRoaXMgZml4ZXMgYSBjYXNlIHdoZXJlIHRoZSB0YWIgaXNuJ3QgZm9jdXNlZCBkdXJpbmdcbiAgICAvLyBpbml0LCB3aGljaCB3b3VsZCB0cmlnZ2VyIG9uQ2hhbmdlIHdpdGggZW1wdHkgZWxlbWVudHMsIHdoaWNoIHdvdWxkIHRoZW5cbiAgICAvLyBvdmVycmlkZSB3aGF0ZXZlciBpcyBpbiBsb2NhbFN0b3JhZ2UgY3VycmVudGx5LlxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZT8uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIHRoaXMuc3RhdGUsIHRoaXMuZmlsZXMpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXNldFRhcFR3aWNlKCkge1xuICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gIH1cblxuICBhZGRUZXh0RnJvbVBhc3RlKHRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WDogY3Vyc29yWCxcbiAgICAgIGNsaWVudFk6IGN1cnNvcllcbiAgICB9LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHRleHQsXG4gICAgICByYXdUZXh0OiB0ZXh0LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTlxuICAgIH0pO1xuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgW2VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICB9IC8vIENvbGxhYm9yYXRpb25cblxuXG4gIHNlbGVjdFNoYXBlVG9vbChlbGVtZW50VHlwZSkge1xuICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCBlbGVtZW50VHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzVG9vbEljb24oZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTGluZWFyRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgdGhpcy5vbkltYWdlQWN0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwgX3JlZikge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgbGV0IHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50ID0gZmFsc2VcbiAgICB9ID0gX3JlZjtcblxuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodGV4dCwgb3JpZ2luYWxUZXh0LCBpc0RlbGV0ZWQsIHJhd1RleHQsIGxpbmspIHtcbiAgICAgIF90aGlzNS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzNS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKF9lbGVtZW50KSB7XG4gICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgIHJldHVybiB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgICAgIHJhd1RleHQ6IHJhd1RleHQgPz8gb3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgbGlua1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgfSldKTtcbiAgICB9O1xuXG4gICAgaWYgKGlzRXhpc3RpbmdFbGVtZW50ICYmIHRoaXMucHJvcHMub25CZWZvcmVUZXh0RWRpdCkge1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucHJvcHMub25CZWZvcmVUZXh0RWRpdChlbGVtZW50KTtcblxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKGZ1bmN0aW9uIChfZWxlbWVudCkge1xuICAgICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogdGV4dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICAgIH0pXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGV4dFd5c2l3eWcoe1xuICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgZ2V0Vmlld3BvcnRDb29yZHM6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiB2aWV3cG9ydFgsXG4gICAgICAgICAgeTogdmlld3BvcnRZXG4gICAgICAgIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoe1xuICAgICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgICBzY2VuZVk6IHlcbiAgICAgICAgfSwgX3RoaXM1LnN0YXRlKTtcbiAgICAgICAgcmV0dXJuIFt2aWV3cG9ydFggLSBfdGhpczUuc3RhdGUub2Zmc2V0TGVmdCwgdmlld3BvcnRZIC0gX3RoaXM1LnN0YXRlLm9mZnNldFRvcF07XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIHRleHQsIGZhbHNlKTtcblxuICAgICAgICBpZiAoaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgb25TdWJtaXQ6IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIHZpYUtleWJvYXJkLFxuICAgICAgICAgIG9yaWdpbmFsVGV4dFxuICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgIGNvbnN0IGlzRGVsZXRlZCA9ICF0ZXh0LnRyaW0oKTtcbiAgICAgICAgY29uc3QgcmF3VGV4dCA9IG9yaWdpbmFsVGV4dDsgLy9zaG91bGQgdGhpcyBiZSBvcmlnaW5hbFRleHQ/P1xuXG4gICAgICAgIGxldCBsaW5rID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChfdGhpczUucHJvcHMub25CZWZvcmVUZXh0U3VibWl0KSB7XG4gICAgICAgICAgY29uc3QgW3VwZGF0ZWRUZXh0LCB1cGRhdGVkT3JpZ2luYWxUZXh0LCBsXSA9IF90aGlzNS5wcm9wcy5vbkJlZm9yZVRleHRTdWJtaXQoZWxlbWVudCwgdGV4dCwgb3JpZ2luYWxUZXh0LCBpc0RlbGV0ZWQpO1xuXG4gICAgICAgICAgdGV4dCA9IHVwZGF0ZWRUZXh0ID8/IHRleHQ7XG4gICAgICAgICAgb3JpZ2luYWxUZXh0ID0gdXBkYXRlZE9yaWdpbmFsVGV4dCA/PyBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgbGluayA9IGw7XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkLCByYXdUZXh0LCBsaW5rKTsgLy8gc2VsZWN0IHRoZSBjcmVhdGVkIHRleHQgZWxlbWVudCBvbmx5IGlmIHN1Ym1pdHRpbmcgdmlhIGtleWJvYXJkXG4gICAgICAgIC8vICh3aGVuIHN1Ym1pdHRpbmcgdmlhIGNsaWNrIGl0IHNob3VsZCBhY3QgYXMgc2lnbmFsIHRvIGRlc2VsZWN0KVxuXG4gICAgICAgIGlmICghaXNEZWxldGVkICYmIHZpYUtleWJvYXJkKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkVG9TZWxlY3QgPSBlbGVtZW50LmNvbnRhaW5lcklkID8gZWxlbWVudC5jb250YWluZXJJZCA6IGVsZW1lbnQuaWQ7XG5cbiAgICAgICAgICBfdGhpczUuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgIFtlbGVtZW50SWRUb1NlbGVjdF06IHRydWVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWxldGVkKSB7XG4gICAgICAgICAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uKF90aGlzNS5zY2VuZS5nZXRFbGVtZW50cygpLCBbZWxlbWVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgfHwgaXNFeGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgICBfdGhpczUuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfdGhpczUuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzNS5jYW52YXMsIF90aGlzNS5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczUuZm9jdXNDb250YWluZXIoKTtcbiAgICAgIH0pLFxuICAgICAgZWxlbWVudCxcbiAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgYXBwOiB0aGlzXG4gICAgfSk7IC8vIGRlc2VsZWN0IGFsbCBvdGhlciBlbGVtZW50cyB3aGVuIGluc2VydGluZyB0ZXh0XG5cbiAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTsgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuXG4gICAgdXBkYXRlRWxlbWVudChlbGVtZW50LnRleHQsIGVsZW1lbnQub3JpZ2luYWxUZXh0LCBmYWxzZSk7XG4gIH1cblxuICBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbih4LCB5KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSwge1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIG9wdHMpIHtcbiAgICBjb25zdCBhbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHksIG9wdHM/LmluY2x1ZGVCb3VuZFRleHRFbGVtZW50KTtcblxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAob3B0cz8ucHJlZmVyU2VsZWN0ZWQpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBhbGxIaXRFbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+IC0xOyBpbmRleC0tKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2FsbEhpdEVsZW1lbnRzW2luZGV4XS5pZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1tpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleCA9IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDFdOyAvLyBJZiB3ZSdyZSBoaXR0aW5nIGVsZW1lbnQgd2l0aCBoaWdoZXN0IHotaW5kZXggb25seSBvbiBpdHMgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aGlsZSBhbHNvIGhpdHRpbmcgb3RoZXIgZWxlbWVudCBmaWd1cmUsIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG5cbiAgICAgIHJldHVybiBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQoZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4LCB0aGlzLnN0YXRlLCB4LCB5KSA/IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDJdIDogZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4O1xuICAgIH1cblxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEVsZW1lbnRzQXRQb3NpdGlvbih4LCB5KSB7XG4gICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICBsZXQgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQgPyB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkgOiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gIShpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQuY29udGFpbmVySWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBnZXRFbGVtZW50c0F0UG9zaXRpb24oZWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gaGl0VGVzdChlbGVtZW50LCBfdGhpczYuc3RhdGUsIHgsIHkpO1xuICAgIH0pO1xuICB9XG5cbiAgbWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KSB7XG4gICAgaWYgKGxhc3RQb2ludGVyVXAgIT09IG51bGwpIHtcbiAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHNvbWV0aW1lcyB3ZSBkb24ndCBnZXQgYSBwb2ludGVydXAgYWZ0ZXIgYSBwb2ludGVyZG93bixcbiAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29udGV4dHVhbCBtZW51IG9yIGFsZXJ0IGlzIHRyaWdnZXJlZC4gSW4gb3JkZXIgdG8gYXZvaWRcbiAgICAgIC8vIGJlaW5nIGluIGEgd2VpcmQgc3RhdGUsIHdlIGNsZWFuIHVwIG9uIHRoZSBuZXh0IHBvaW50ZXJkb3duXG4gICAgICBsYXN0UG9pbnRlclVwKGV2ZW50KTtcbiAgICB9XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcblxuXG4gIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgZ2VzdHVyZS5wb2ludGVycy5zZXQoZXZlbnQucG9pbnRlcklkLCB7XG4gICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luLFxuICAgICAgd2l0aENtZE9yQ3RybDogZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG4gICAgICBvcmlnaW5JbkdyaWQ6IHR1cGxlVG9Db29ycyhnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKGN1cnJlbnRTY3JvbGxCYXJzLCBldmVudC5jbGllbnRYIC0gdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LCBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3ApLFxuICAgICAgLy8gd2UgbmVlZCB0byBkdXBsaWNhdGUgYmVjYXVzZSB3ZSdsbCBiZSB1cGRhdGluZyB0aGlzIHN0YXRlXG4gICAgICBsYXN0Q29vcmRzOiBfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW4pLFxuICAgICAgb3JpZ2luYWxFbGVtZW50czogdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBlbGVtZW50KSB7XG4gICAgICAgIGFjYy5zZXQoZWxlbWVudC5pZCwgZGVlcENvcHlFbGVtZW50KGVsZW1lbnQpKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIG5ldyBNYXAoKSksXG4gICAgICByZXNpemU6IHtcbiAgICAgICAgaGFuZGxlVHlwZTogZmFsc2UsXG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIsXG4gICAgICAgIGNlbnRlcjoge1xuICAgICAgICAgIHg6IChtYXhYICsgbWluWCkgLyAyLFxuICAgICAgICAgIHk6IChtYXhZICsgbWluWSkgLyAyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoaXQ6IHtcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgYWxsSGl0RWxlbWVudHM6IFtdLFxuICAgICAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhvcmlnaW4sIHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBoYXNIaXRFbGVtZW50SW5zaWRlOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGRyYWc6IHtcbiAgICAgICAgaGFzT2NjdXJyZWQ6IGZhbHNlLFxuICAgICAgICBvZmZzZXQ6IG51bGxcbiAgICAgIH0sXG4gICAgICBldmVudExpc3RlbmVyczoge1xuICAgICAgICBvbk1vdmU6IG51bGwsXG4gICAgICAgIG9uVXA6IG51bGwsXG4gICAgICAgIG9uS2V5VXA6IG51bGwsXG4gICAgICAgIG9uS2V5RG93bjogbnVsbFxuICAgICAgfSxcbiAgICAgIGJveFNlbGVjdGlvbjoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuICB9IC8vIFJldHVybnMgd2hldGhlciB0aGUgZXZlbnQgaXMgYSBkcmFnZ2luZyBhIHNjcm9sbGJhclxuXG5cbiAgaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgIGlmICghKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJFaXRoZXIgJiYgIXRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSB0cnVlO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gZXZlbnQuY2xpZW50WDtcbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXM3LmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0pO1xuICAgIGNvbnN0IG9uUG9pbnRlclVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSBmYWxzZTtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzNy5jYW52YXMsIF90aGlzNy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcblxuICAgICAgX3RoaXM3LnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCJcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczcuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICB9KTtcbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc0FTZWxlY3RlZEVsZW1lbnQoaGl0RWxlbWVudCkge1xuICAgIHJldHVybiBoaXRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF07XG4gIH1cblxuICBpc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhwb2ludCwgc2VsZWN0ZWRFbGVtZW50cykge1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIEhvdyBtYW55IHBpeGVscyBvZmYgdGhlIHNoYXBlIGJvdW5kYXJ5IHdlIHN0aWxsIGNvbnNpZGVyIGEgaGl0XG5cblxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIHBvaW50LnggPiB4MSAtIHRocmVzaG9sZCAmJiBwb2ludC54IDwgeDIgKyB0aHJlc2hvbGQgJiYgcG9pbnQueSA+IHkxIC0gdGhyZXNob2xkICYmIHBvaW50LnkgPCB5MiArIHRocmVzaG9sZDtcbiAgfVxuXG4gIG9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczggPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpczgubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXM4Lm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBQcmV2ZW50cyBmb2N1cyBmcm9tIGVzY2FwaW5nIGV4Y2FsaWRyYXcgdGFiXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuQUxUICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChfdGhpczkubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXM5Lm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBpbml0aWFsaXplIGRyYWdPZmZzZXRYWSBvbmx5IGFmdGVyIHdlJ3ZlIHVwZGF0ZWRcbiAgICAgIC8vIGBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNgIG9uIHBvaW50ZXJEb3duLiBEb2luZyBpdCBoZXJlIGluIHBvaW50ZXJNb3ZlXG4gICAgICAvLyBldmVudCBoYW5kbGVyIHNob3VsZCBob3BlZnVsbHkgZW5zdXJlIHdlJ3JlIGFscmVhZHkgd29ya2luZyB3aXRoXG4gICAgICAvLyB0aGUgdXBkYXRlZCBzdGF0ZS5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID09PSBudWxsKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQgPSB0dXBsZVRvQ29vcnMoZ2V0RHJhZ09mZnNldFhZKGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMC5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEwLnN0YXRlKSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMC5zdGF0ZSk7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgX3RoaXMxMC5zdGF0ZS5ncmlkU2l6ZSk7IC8vIGZvciBhcnJvd3MvbGluZXMsIGRvbid0IHN0YXJ0IGRyYWdnaW5nIHVudGlsIGEgZ2l2ZW4gdGhyZXNob2xkXG4gICAgICAvLyB0byBlbnN1cmUgd2UgZG9uJ3QgY3JlYXRlIGEgMi1wb2ludCBhcnJvdyBieSBtaXN0YWtlIHdoZW5cbiAgICAgIC8vIHVzZXIgY2xpY2tzIG1vdXNlIGluIGEgd2F5IHRoYXQgaXQgbW92ZXMgYSB0aW55IGJpdCAodGh1c1xuICAgICAgLy8gdHJpZ2dlcmluZyBwb2ludGVybW92ZSlcblxuICAgICAgaWYgKCFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgKF90aGlzMTAuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fCBfdGhpczEwLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIikpIHtcbiAgICAgICAgaWYgKGRpc3RhbmNlMmQocG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpIDwgRFJBR0dJTkdfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcblxuICAgICAgICBpZiAoX3RoaXMxMC5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBkaWREcmFnID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludERyYWdnaW5nKF90aGlzMTAuc3RhdGUsIGZ1bmN0aW9uIChhcHBTdGF0ZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczEwLnNldFN0YXRlKGFwcFN0YXRlKTtcbiAgICAgICAgfSwgcG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIGZ1bmN0aW9uIChlbGVtZW50LCBwb2ludHNTY2VuZUNvb3Jkcykge1xuICAgICAgICAgIF90aGlzMTAubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZWxlbWVudCwgcG9pbnRzU2NlbmVDb29yZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZGlkRHJhZykge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNIaXRBU2VsZWN0ZWRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMuc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMxMC5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKChoYXNIaXRBU2VsZWN0ZWRFbGVtZW50IHx8IHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSAmJiAoIC8vIHRoaXMgYWxsb3dzIGZvciBib3gtc2VsZWN0aW5nIHBvaW50cyB3aGVuIGNsaWNraW5nIGluc2lkZSB0aGVcbiAgICAgIC8vIGxpbmUncyBib3VuZGluZyBib3hcbiAgICAgICFfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFldmVudC5zaGlmdEtleSkgJiYgKCAvLyBib3gtc2VsZWN0aW5nIHdpdGhvdXQgc2hpZnQgd2hlbiBlZGl0aW5nIGxpbmUsIG5vdCBjbGlja2luZyBvbiBhIGxpbmVcbiAgICAgICFfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8IF90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmVsZW1lbnRJZCAhPT0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudD8uaWQgfHwgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSkpIHtcbiAgICAgICAgLy8gTWFya2luZyB0aGF0IGNsaWNrIHdhcyB1c2VkIGZvciBkcmFnZ2luZyB0byBjaGVja1xuICAgICAgICAvLyBpZiBlbGVtZW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZCBvbiBwb2ludGVydXBcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMC5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEwLnN0YXRlKTsgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmICFwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwpIHtcbiAgICAgICAgICBjb25zdCBbZHJhZ1gsIGRyYWdZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSwgX3RoaXMxMC5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICAgICAgY29uc3QgW2RyYWdEaXN0YW5jZVgsIGRyYWdEaXN0YW5jZVldID0gW01hdGguYWJzKHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngpLCBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KV07IC8vIFdlIG9ubHkgZHJhZyBpbiBvbmUgZGlyZWN0aW9uIGlmIHNoaWZ0IGlzIHByZXNzZWRcblxuICAgICAgICAgIGNvbnN0IGxvY2tEaXJlY3Rpb24gPSBldmVudC5zaGlmdEtleTtcbiAgICAgICAgICBkcmFnU2VsZWN0ZWRFbGVtZW50cyhwb2ludGVyRG93blN0YXRlLCBzZWxlY3RlZEVsZW1lbnRzLCBkcmFnWCwgZHJhZ1ksIGxvY2tEaXJlY3Rpb24sIGRyYWdEaXN0YW5jZVgsIGRyYWdEaXN0YW5jZVksIF90aGlzMTAuc3RhdGUpO1xuXG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpOyAvLyBXZSBkdXBsaWNhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaWYgYWx0IGlzIHByZXNzZWQgb24gcG9pbnRlciBtb3ZlXG5cblxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0FwcGVuZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEwLnN0YXRlLCB0cnVlKS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRJZHMuaW5jbHVkZXMoZWxlbWVudC5pZCkgfHwgLy8gY2FzZTogdGhlIHN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyBtaWdodCBub3QgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgIGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoX3RoaXMxMC5zdGF0ZS5lZGl0aW5nR3JvdXBJZCwgZ3JvdXBJZE1hcCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbkRyYWdYLCBvcmlnaW5EcmFnWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSwgX3RoaXMxMC5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgICAgICAgICAgICAgbXV0YXRlRWxlbWVudChkdXBsaWNhdGVkRWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgeDogZHVwbGljYXRlZEVsZW1lbnQueCArIChvcmlnaW5EcmFnWCAtIGRyYWdYKSxcbiAgICAgICAgICAgICAgICAgIHk6IGR1cGxpY2F0ZWRFbGVtZW50LnkgKyAob3JpZ2luRHJhZ1kgLSBkcmFnWSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudHMucHVzaChkdXBsaWNhdGVkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudHNUb0FwcGVuZC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIGR1cGxpY2F0ZWRFbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihuZXh0RWxlbWVudHMsIGVsZW1lbnRzVG9BcHBlbmQsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuICAgICAgICAgICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRTY2VuZUVsZW1lbnRzLCBlbGVtZW50c1RvQXBwZW5kLCBvbGRJZFRvRHVwbGljYXRlZElkLCBcImR1cGxpY2F0ZXNTZXJ2ZUFzT2xkXCIpO1xuXG4gICAgICAgICAgICBfdGhpczEwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IC8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIHJlYWQgdGhpcy5zdGF0ZSB3aXRoaW4gZWFjaCBtb3ZlIGV2ZW50LFxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIHJlYWQgYSBzdGFsZSBvbmUhXG5cblxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gX3RoaXMxMC5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG5cbiAgICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgY29uc3QgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcbiAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBkcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGV2ZW50LnByZXNzdXJlXTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICBwcmVzc3VyZXNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIHdpZHRoOiBkeCxcbiAgICAgICAgICAgIGhlaWdodDogZHlcbiAgICAgICAgICB9ID0gZ2V0UGVyZmVjdEVsZW1lbnRTaXplKF90aGlzMTAuc3RhdGUuZWxlbWVudFR5cGUsIGR4LCBkeSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMuc2xpY2UoMCwgLTEpLCBbZHgsIGR5XV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBXaGVuIGNyZWF0aW5nIGEgbGluZWFyIGVsZW1lbnQgYnkgZHJhZ2dpbmdcbiAgICAgICAgICBfdGhpczEwLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKGRyYWdnaW5nRWxlbWVudCwgW3BvaW50ZXJDb29yZHNdLCBfdGhpczEwLnN0YXRlLnN0YXJ0Qm91bmRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuXG4gICAgICAgIF90aGlzMTAubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiAvLyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzICh3aXRob3V0IHNoaWZ0KVxuICAgICAgICAhX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIF90aGlzMTAuc3RhdGUpKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgICBfdGhpczEwLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSwgX3RoaXMxMC5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczEwLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gYm94LXNlbGVjdCBsaW5lIGVkaXRvciBwb2ludHNcblxuXG4gICAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVCb3hTZWxlY3Rpb24oZXZlbnQsIF90aGlzMTAuc3RhdGUsIF90aGlzMTAuc2V0U3RhdGUuYmluZChfdGhpczEwKSk7IC8vIHJlZ3VsYXIgYm94LXNlbGVjdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uID0gZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24oZWxlbWVudHMsIGRyYWdnaW5nRWxlbWVudCk7XG5cbiAgICAgICAgICBfdGhpczEwLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLnJlZHVjZShmdW5jdGlvbiAobWFwLCBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICB9LCB7fSkpLCBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID8ge1xuICAgICAgICAgICAgICAgIC8vIGlmIHVzaW5nIGN0cmwvY21kLCBzZWxlY3QgdGhlIGhpdEVsZW1lbnQgb25seSBpZiB3ZVxuICAgICAgICAgICAgICAgIC8vIGhhdmVuJ3QgYm94LXNlbGVjdGVkIGFueXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudC5pZF06ICFlbGVtZW50c1dpdGhpblNlbGVjdGlvbi5sZW5ndGhcbiAgICAgICAgICAgICAgfSA6IG51bGwpLFxuICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSAmJiBlbGVtZW50c1dpdGhpblNlbGVjdGlvblswXS5saW5rID8gXCJpbmZvXCIgOiBmYWxzZVxuICAgICAgICAgICAgfSksIF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHMoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvaW50ZXIgbW92ZSBoYXBwZW5lZCBvdmVyIGVpdGhlciBzY3JvbGxiYXJcblxuXG4gIGhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3Zlckhvcml6b250YWwpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZHggPSB4IC0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLng7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYIC0gZHggLyB0aGlzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvblBvaW50ZXJVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGNoaWxkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGlzUmVzaXppbmcsXG4gICAgICAgIGlzUm90YXRpbmdcbiAgICAgIH0gPSBfdGhpczExLnN0YXRlO1xuXG4gICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlLFxuICAgICAgICByZXNpemluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIHNlbGVjdGlvbkVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICAvLyB0ZXh0IGVsZW1lbnRzIGFyZSByZXNldCBvbiBmaW5hbGl6ZSwgYW5kIHJlc2V0dGluZyBvbiBwb2ludGVydXBcbiAgICAgICAgLy8gbWF5IGNhdXNlIGlzc3VlcyB3aXRoIGRvdWJsZSB0YXBzXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBtdWx0aUVsZW1lbnQgfHwgaXNUZXh0RWxlbWVudChfdGhpczExLnN0YXRlLmVkaXRpbmdFbGVtZW50KSA/IF90aGlzMTEuc3RhdGUuZWRpdGluZ0VsZW1lbnQgOiBudWxsXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMS5zYXZlUG9pbnRlcihjaGlsZEV2ZW50LmNsaWVudFgsIGNoaWxkRXZlbnQuY2xpZW50WSwgXCJ1cFwiKTsgLy8gSGFuZGxlIGVuZCBvZiBkcmFnZ2luZyBhIHBvaW50IG9mIGEgbGluZWFyIGVsZW1lbnQsIG1pZ2h0IGNsb3NlIGEgbG9vcFxuICAgICAgLy8gYW5kIHNldHMgYmluZGluZyBlbGVtZW50XG5cblxuICAgICAgaWYgKF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCAmJiAocG9pbnRlckRvd25TdGF0ZS5oaXQ/LmVsZW1lbnQ/LmlkICE9PSBfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCB8fCAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSkpIHtcbiAgICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJVcChjaGlsZEV2ZW50LCBfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LCBfdGhpczExLnN0YXRlKTtcblxuICAgICAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXApO1xuXG4gICAgICBpZiAoX3RoaXMxMS5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQ/LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGNoaWxkRXZlbnQsIF90aGlzMTEuc3RhdGUpO1xuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBsZXQgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7IC8vIEFsbG93cyBkb3RzIHRvIGF2b2lkIGJlaW5nIGZsYWdnZWQgYXMgaW5maW5pdGVseSBzbWFsbFxuXG4gICAgICAgIGlmIChkeCA9PT0gcG9pbnRzWzBdWzBdICYmIGR5ID09PSBwb2ludHNbMF1bMV0pIHtcbiAgICAgICAgICBkeSArPSAwLjAwMDE7XG4gICAgICAgICAgZHggKz0gMC4wMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBbXSA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBjaGlsZEV2ZW50LnByZXNzdXJlXTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICBwcmVzc3VyZXMsXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBbZHgsIGR5XVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBkcmFnZ2luZ0VsZW1lbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBfdGhpczExLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuaWQgIT09IGltYWdlRWxlbWVudC5pZDtcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBfdGhpczExLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgX3RoaXMxMS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhjaGlsZEV2ZW50LCBfdGhpczExLnN0YXRlKTtcblxuICAgICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiBkcmFnZ2luZ0VsZW1lbnQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucG9pbnRzLCBbcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50LngsIHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55XV1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbXVsdGlFbGVtZW50OiBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudDogX3RoaXMxMS5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIGlmIChpc0JpbmRpbmdFbmFibGVkKF90aGlzMTEuc3RhdGUpICYmIGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgICAgbWF5YmVCaW5kTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIF90aGlzMTEuc3RhdGUsIF90aGlzMTEuc2NlbmUsIHBvaW50ZXJDb29yZHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IG51bGxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMS5jYW52YXMpO1xuXG4gICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgW190aGlzMTEuc3RhdGUuZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtfdGhpczExLnN0YXRlLmRyYWdnaW5nRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiYgZHJhZ2dpbmdFbGVtZW50ICYmIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgLy8gcmVtb3ZlIGludmlzaWJsZSBlbGVtZW50IHdoaWNoIHdhcyBhZGRlZCBpbiBvblBvaW50ZXJEb3duXG4gICAgICAgIF90aGlzMTEuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuc2xpY2UoMCwgLTEpKTtcblxuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBnZXROb3JtYWxpemVkRGltZW5zaW9ucyhkcmFnZ2luZ0VsZW1lbnQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCkge1xuICAgICAgICBfdGhpczExLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQgJiYgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQocmVzaXppbmdFbGVtZW50KSkge1xuICAgICAgICBfdGhpczExLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICByZXR1cm4gZWwuaWQgIT09IHJlc2l6aW5nRWxlbWVudC5pZDtcbiAgICAgICAgfSkpO1xuICAgICAgfSAvLyBDb2RlIGJlbG93IGhhbmRsZXMgc2VsZWN0aW9uIHdoZW4gZWxlbWVudChzKSB3ZXJlbid0XG4gICAgICAvLyBkcmFnIG9yIGFkZGVkIHRvIHNlbGVjdGlvbiBvbiBwb2ludGVyIGRvd24gcGhhc2UuXG5cblxuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG5cbiAgICAgIGlmIChoaXRFbGVtZW50ICYmICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gJiYgKCAvLyBpZiB3ZSdyZSBlZGl0aW5nIGEgbGluZSwgcG9pbnRlcnVwIHNob3VsZG4ndCBzd2l0Y2ggc2VsZWN0aW9uIGlmXG4gICAgICAvLyBib3ggc2VsZWN0ZWRcbiAgICAgICFfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFwb2ludGVyRG93blN0YXRlLmJveFNlbGVjdGlvbi5oYXNPY2N1cnJlZCkpIHtcbiAgICAgICAgLy8gd2hlbiBpbnNpZGUgbGluZSBlZGl0b3IsIHNoaWZ0IHNlbGVjdHMgcG9pbnRzIGluc3RlYWRcbiAgICAgICAgaWYgKGNoaWxkRXZlbnQuc2hpZnRLZXkgJiYgIV90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXMxMS5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkVmlhR3JvdXAoX3RoaXMxMS5zdGF0ZSwgaGl0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1bnNlbGVjdCBhbGwgZ3JvdXBzIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBncm91cHNcbiAgICAgICAgICAgICAgLy8gaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIGNvbnN0IGlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyA9IGhpdEVsZW1lbnQuZ3JvdXBJZHMuZmxhdE1hcChmdW5jdGlvbiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50c0luR3JvdXAoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50cygpLCBncm91cElkKTtcbiAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHByZXZJZCwgYWNjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldklkKSwgYWNjKTtcbiAgICAgICAgICAgICAgfSwge30pO1xuXG4gICAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKF9wcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIGhpdEVsZW1lbnQuZ3JvdXBJZHMubWFwKGZ1bmN0aW9uIChnSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICBbZ0lkXTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAocHJldiwgYWNjKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXYpLCBhY2MpO1xuICAgICAgICAgICAgICAgICAgfSwge30pKSxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIGlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcylcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSksIF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHMoKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAoX3ByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHMoKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFfdGhpczExLnN0YXRlLmlzUmVzaXppbmcgJiYgKGhpdEVsZW1lbnQgJiYgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KGhpdEVsZW1lbnQsIF90aGlzMTEuc3RhdGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpIHx8ICFoaXRFbGVtZW50ICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSkge1xuICAgICAgICAvLyBEZXNlbGVjdCBzZWxlY3RlZCBlbGVtZW50c1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIgJiYgZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgfHwgaXNTb21lRWxlbWVudFNlbGVjdGVkKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMS5zdGF0ZSkpIHtcbiAgICAgICAgX3RoaXMxMS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkIHx8IGlzUmVzaXppbmcgfHwgaXNSb3RhdGluZykge1xuICAgICAgICAoaXNCaW5kaW5nRW5hYmxlZChfdGhpczExLnN0YXRlKSA/IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMgOiB1bmJpbmRMaW5lYXJFbGVtZW50cykoZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTEuc3RhdGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMS5jYW52YXMpO1xuXG4gICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgY29uc3Qgc3VnZ2VzdGVkQmluZGluZ3MgPSBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzXG4gICAgfSk7XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbihoaXRFbGVtZW50KSB7XG4gICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgLy8gQ29udGludWUgZWRpdGluZyB0aGUgc2FtZSBncm91cCBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpZmZlcmVudFxuICAgICAgICAvLyBlbGVtZW50IGZyb20gaXRcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCAmJiBoaXRFbGVtZW50ICE9IG51bGwgJiYgaXNFbGVtZW50SW5Hcm91cChoaXRFbGVtZW50LCBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQpID8gcHJldlN0YXRlLmVkaXRpbmdHcm91cElkIDogbnVsbFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNcbiAgICB9KTtcbiAgfVxuXG4gIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oeCwgeSwgYXBwU3RhdGUsIGNhbnZhcywgc2NhbGUpIHtcbiAgICBjb25zdCBlbGVtZW50Q2xpY2tlZEluc2lkZSA9IGdldEVsZW1lbnRDb250YWluaW5nUG9zaXRpb24odGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAhaXNUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICB9KSwgeCwgeSk7XG5cbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID0gZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID0gZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdCh4IC0gZWxlbWVudENlbnRlclgsIHkgLSBlbGVtZW50Q2VudGVyWSk7XG4gICAgICBjb25zdCBpc1NuYXBwZWRUb0NlbnRlciA9IGRpc3RhbmNlVG9DZW50ZXIgPCBURVhUX1RPX0NFTlRFUl9TTkFQX1RIUkVTSE9MRDtcblxuICAgICAgaWYgKGlzU25hcHBlZFRvQ2VudGVyKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiB2aWV3cG9ydFgsXG4gICAgICAgICAgeTogdmlld3BvcnRZXG4gICAgICAgIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoe1xuICAgICAgICAgIHNjZW5lWDogZWxlbWVudENlbnRlclgsXG4gICAgICAgICAgc2NlbmVZOiBlbGVtZW50Q2VudGVyWVxuICAgICAgICB9LCBhcHBTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmlld3BvcnRYLFxuICAgICAgICAgIHZpZXdwb3J0WSxcbiAgICAgICAgICBlbGVtZW50Q2VudGVyWCxcbiAgICAgICAgICBlbGVtZW50Q2VudGVyWVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENhbnZhc09mZnNldHMoKSB7XG4gICAgaWYgKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgY29uc3QgZXhjYWxpZHJhd0NvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICBsZWZ0LFxuICAgICAgICB0b3BcbiAgICAgIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0TGVmdDogbGVmdCxcbiAgICAgICAgb2Zmc2V0VG9wOiB0b3BcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDBcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgdmFyIF90aGlzMTIgPSB0aGlzO1xuXG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IGxhbmd1YWdlcy5maW5kKGZ1bmN0aW9uIChsYW5nKSB7XG4gICAgICAgIHJldHVybiBsYW5nLmNvZGUgPT09IF90aGlzMTIucHJvcHMubGFuZ0NvZGU7XG4gICAgICB9KSB8fCBkZWZhdWx0TGFuZztcbiAgICAgIHlpZWxkIHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcblxuICAgICAgX3RoaXMxMi5zZXRBcHBTdGF0ZSh7fSk7XG4gICAgfSkoKTtcbiAgfVxuXG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBURVNUIEhPT0tTXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbkFwcC5kZWZhdWx0UHJvcHMgPSB7XG4gIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgVUlPcHRpb25zOiBERUZBVUxUX1VJX09QVElPTlNcbn07XG5cbnZhciBfaW5pdGlhbGlzZVByb3BzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMxMyA9IHRoaXM7XG5cbiAgdGhpcy5jYW52YXMgPSBudWxsO1xuICB0aGlzLnJjID0gbnVsbDtcbiAgdGhpcy51bm1vdW50ZWQgPSBmYWxzZTtcbiAgdGhpcy5pc01vYmlsZSA9IGZhbHNlO1xuICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gIHRoaXMuZmlsZXMgPSB7fTtcbiAgdGhpcy5pbWFnZUNhY2hlID0gbmV3IE1hcCgpO1xuICB0aGlzLmxhc3RQb2ludGVyRG93biA9IG51bGw7XG4gIHRoaXMubGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gIHRoaXMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5mb2N1c0NvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX3RoaXMxMy5wcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgIF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICB9O1xuXG4gIHRoaXMuZ2V0U2NlbmVFbGVtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICB9O1xuXG4gIHRoaXMuc3luY0FjdGlvblJlc3VsdCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoYWN0aW9uUmVzdWx0KSB7XG4gICAgLy8gU2luY2UgY29udGV4dCBtZW51IGNsb3NlcyB3aGVuIGFjdGlvbiB0cmlnZ2VyZWQgc28gc2V0dGluZyB0byBmYWxzZVxuICAgIF90aGlzMTMuY29udGV4dE1lbnVPcGVuID0gZmFsc2U7XG5cbiAgICBpZiAoX3RoaXMxMy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlZGl0aW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKSB7XG4gICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudD8uaWQgPT09IGVsZW1lbnQuaWQgJiYgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCAhPT0gZWxlbWVudCAmJiBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb25SZXN1bHQuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBhY3Rpb25SZXN1bHQucmVwbGFjZUZpbGVzID8gYWN0aW9uUmVzdWx0LmZpbGVzIDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgYWN0aW9uUmVzdWx0LmZpbGVzKTtcblxuICAgICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IGVkaXRpbmdFbGVtZW50KSB7XG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2aWV3TW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy52aWV3TW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICBsZXQgemVuTW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy56ZW5Nb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgIGxldCBncmlkU2l6ZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LmdyaWRTaXplIHx8IG51bGw7XG4gICAgICBsZXQgdGhlbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy50aGVtZSB8fCBUSEVNRS5MSUdIVDtcbiAgICAgIGxldCBuYW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8ubmFtZSA/PyBfdGhpczEzLnN0YXRlLm5hbWU7XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmlld01vZGVFbmFibGVkID0gX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZ3JpZFNpemUgPSBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy50aGVtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGVtZSA9IF90aGlzMTMucHJvcHMudGhlbWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy5uYW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG5hbWUgPSBfdGhpczEzLnByb3BzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAvLyByZWdhcmRpbmcgdGhlIHJlc3VsdGluZyB0eXBlIGFzIG5vdCBjb250YWluaW5nIHVuZGVmaW5lZFxuICAgICAgICAvLyAod2hpY2ggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uIHdpbGwgbmV2ZXIgY29udGFpbilcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5zeW5jSGlzdG9yeSkge1xuICAgICAgICAgIF90aGlzMTMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25CbHVyID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMub25VbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5vbkJsdXIoKTtcbiAgfTtcblxuICB0aGlzLmRpc2FibGVFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdGhpcy5vbkZvbnRMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAodXJsLCB0b2tlbikge1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluY2x1ZGVzKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkpO1xuICAgICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgIyR7aGFzaC50b1N0cmluZygpfWApO1xuICAgICAgfSBlbHNlIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgcXVlcnkuZGVsZXRlKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgPyR7cXVlcnkudG9TdHJpbmcoKX1gKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHlpZWxkIGZldGNoKGRlY29kZVVSSUNvbXBvbmVudCh1cmwpKTtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIHJlcXVlc3QuYmxvYigpO1xuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZSh5aWVsZCBibG9iLnRleHQoKSk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSBfdGhpczEzLmlkIHx8IHdpbmRvdy5jb25maXJtKHQoXCJhbGVydHMuY29uZmlybUFkZExpYnJhcnlcIiwge1xuICAgICAgICAgIG51bVNoYXBlczogKGpzb24ubGlicmFyeUl0ZW1zIHx8IGpzb24ubGlicmFyeSB8fCBbXSkubGVuZ3RoXG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIHlpZWxkIF90aGlzMTMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IsIFwicHVibGlzaGVkXCIpOyAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuXG4gICAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3Blbikge1xuICAgICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgd2luZG93LmFsZXJ0KHQoXCJhbGVydHMuZXJyb3JMb2FkaW5nTGlicmFyeVwiKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX3RoaXMxMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyKSB7XG4gICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5yZXNldEhpc3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERlZmF1bHRBcHBTdGF0ZSgpKSwge30sIHtcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogX3RoaXMxMy5zdGF0ZS50aGVtZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuICB9KTtcbiAgdGhpcy5pbml0aWFsaXplU2NlbmUgPSAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgd2luZG93LmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGxhdW5jaFBhcmFtcykge1xuICAgICAgICAgIGlmICghbGF1bmNoUGFyYW1zLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoYmxvYiwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkudGhlbihmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKSk7XG4gICAgfVxuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGluaXRpYWxEYXRhID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9ICh5aWVsZCBfdGhpczEzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuXG4gICAgICBpZiAoaW5pdGlhbERhdGE/LmxpYnJhcnlJdGVtcykge1xuICAgICAgICBfdGhpczEzLmxpYnJhcnlJdGVtc0Zyb21TdG9yYWdlID0gcmVzdG9yZUxpYnJhcnlJdGVtcyhpbml0aWFsRGF0YS5saWJyYXJ5SXRlbXMsIFwidW5wdWJsaXNoZWRcIik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgaW5pdGlhbERhdGEgPSB7XG4gICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGltcG9ydGluZyBvciByZXN0b3Jpbmcgc2NlbmUgZGF0YVwiXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcbiAgICBzY2VuZS5hcHBTdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCB7fSwge1xuICAgICAgZWxlbWVudFR5cGU6IHNjZW5lLmFwcFN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIgPyBcInNlbGVjdGlvblwiIDogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKHNjZW5lLmVsZW1lbnRzLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwge30sIHtcbiAgICAgICAgd2lkdGg6IF90aGlzMTMuc3RhdGUud2lkdGgsXG4gICAgICAgIGhlaWdodDogX3RoaXMxMy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdFxuICAgICAgfSksIG51bGwpKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuXG4gICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUpLCB7fSwge1xuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgfSkpO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9IC8vIGN1cnJlbnRcbiAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoVVJMX0hBU0hfS0VZUy5hZGRMaWJyYXJ5KSB8fCAvLyBsZWdhY3ksIGtlcHQgZm9yIGNvbXBhdCByZWFzb25zXG4gICAgbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSk7XG5cbiAgICBpZiAobGlicmFyeVVybCkge1xuICAgICAgeWllbGQgX3RoaXMxMy5pbXBvcnRMaWJyYXJ5RnJvbVVybChsaWJyYXJ5VXJsKTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuICB0aGlzLm9uU2Nyb2xsID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFRvcCxcbiAgICAgIG9mZnNldExlZnRcbiAgICB9ID0gX3RoaXMxMy5nZXRDYW52YXNPZmZzZXRzKCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLm9mZnNldExlZnQgPT09IG9mZnNldExlZnQgJiYgc3RhdGUub2Zmc2V0VG9wID09PSBvZmZzZXRUb3ApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgU0NST0xMX1RJTUVPVVQpO1xuICB0aGlzLm9uQ3V0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmN1dEFsbCgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG4gIHRoaXMub25Db3B5ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmNvcHlBbGwoKTtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHRoaXMuY3V0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuY29weUFsbCgpO1xuXG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVsZXRlU2VsZWN0ZWQpO1xuICB9O1xuXG4gIHRoaXMuY29weUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb3B5VG9DbGlwYm9hcmQoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmZpbGVzKTtcbiAgfTtcblxuICB0aGlzLm9uVGFwU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoIWRpZFRhcFR3aWNlKSB7XG4gICAgICBkaWRUYXBUd2ljZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgICB0YXBwZWRUd2ljZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoQXBwLnJlc2V0VGFwVHdpY2UsIFRBUF9UV0lDRV9USU1FT1VUKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGluc2VydCB0ZXh0IG9ubHkgaWYgd2UgdGFwcGVkIHR3aWNlIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgLy8gZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgd2lsbCBhbHNvIHByZXZlbnQgaW5zZXJ0aW5nIHRleHQgd2hlbiB1c2VyJ3Mgem9vbWluZ1xuXG5cbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgIF90aGlzMTMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2soe1xuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZXG4gICAgICB9KTtcblxuICAgICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMub25UYXBFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFVuZGVyQ3Vyc29yID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjdXJzb3JYLCBjdXJzb3JZKTtcblxuICAgICAgaWYgKCAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAvLyB0aHVzIHRoZXNlIGNoZWNrcyBkb24ndCBtYWtlIHNlbnNlXG4gICAgICBldmVudCAmJiAoIShlbGVtZW50VW5kZXJDdXJzb3IgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgfHwgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBmcmFtZSAodGh1cyBiZWZvcmUgYW55IGF3YWl0cykgYXMgdGhlIHBhc3RlXG4gICAgICAvLyBldmVudCBlbHNlIHNvbWUgYnJvd3NlcnMgKEZGLi4uKSB3aWxsIGNsZWFyIHRoZSBjbGlwYm9hcmREYXRhXG4gICAgICAvLyAoc29tZXRoaW5nIHNvbWV0aGluZyBzZWN1cml0eSlcblxuXG4gICAgICBsZXQgZmlsZSA9IGV2ZW50Py5jbGlwYm9hcmREYXRhPy5maWxlc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcblxuICAgICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoXCI8c3ZnXCIpICYmIHN0cmluZy5lbmRzV2l0aChcIjwvc3ZnPlwiKSkge1xuICAgICAgICAgIC8vIGlnbm9yZSBTVkcgdmFsaWRhdGlvbi9ub3JtYWxpemF0aW9uIHdoaWNoIHdpbGwgYmUgZG9uZSBkdXJpbmcgaW1hZ2VcbiAgICAgICAgICAvLyBpbml0aWFsaXphdGlvblxuICAgICAgICAgIGZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBwcmVmZXIgc3ByZWFkc2hlZXQgZGF0YSBvdmVyIGltYWdlIGZpbGUgKE1TIE9mZmljZS9MaWJyZSBPZmZpY2UpXG5cblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpICYmICFkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiBzY2VuZVgsXG4gICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgICAgIGNsaWVudFg6IGN1cnNvclgsXG4gICAgICAgICAgY2xpZW50WTogY3Vyc29yWVxuICAgICAgICB9LCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgIHNjZW5lWVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuXG4gICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoeWllbGQgX3RoaXMxMy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmVycm9yTWVzc2FnZSkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzIHx8IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICBfdGhpczEzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZWxlY3RTaGFwZVRvb2woXCJzZWxlY3Rpb25cIik7XG5cbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQpIHtcbiAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKSk7XG5cbiAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMob3B0cy5lbGVtZW50cywgbnVsbCk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuICAgIGNvbnN0IGNsaWVudFggPSB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIiA/IG9wdHMucG9zaXRpb24uY2xpZW50WCA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCIgPyBjdXJzb3JYIDogX3RoaXMxMy5zdGF0ZS53aWR0aCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9IHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiID8gb3B0cy5wb3NpdGlvbi5jbGllbnRZIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIiA/IGN1cnNvclkgOiBfdGhpczEzLnN0YXRlLmhlaWdodCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldFRvcDtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WCxcbiAgICAgIGNsaWVudFlcbiAgICB9LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBkeCA9IHggLSBlbGVtZW50c0NlbnRlclg7XG4gICAgY29uc3QgZHkgPSB5IC0gZWxlbWVudHNDZW50ZXJZO1xuICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50LCB7XG4gICAgICAgIHg6IGVsZW1lbnQueCArIGdyaWRYIC0gbWluWCxcbiAgICAgICAgeTogZWxlbWVudC55ICsgZ3JpZFkgLSBtaW5ZXG4gICAgICB9KTtcbiAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIG5ld0VsZW1lbnQuaWQpO1xuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgfSk7XG4gICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihuZXdFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCAuLi5uZXdFbGVtZW50c107XG4gICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuXG4gICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBvcHRzLmZpbGVzKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0RWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9XG4gICAgfSksIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgfTtcblxuICB0aGlzLnNldEFwcFN0YXRlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIF90aGlzMTMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICB0aGlzLnJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBfdGhpczEzLmxhc3RQb2ludGVyVXAgPSBldmVudDsgLy8gcmVtb3ZlIHRvdWNoIGhhbmRsZXIgZm9yIGNvbnRleHQgbWVudSBvbiB0b3VjaCBkZXZpY2VzXG5cbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiAmJiB0b3VjaFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdlc3R1cmUucG9pbnRlcnMuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVMb2NrID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudExvY2tlZDogIXByZXZTdGF0ZS5lbGVtZW50TG9ja2VkLFxuICAgICAgICBlbGVtZW50VHlwZTogcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQgPyBcInNlbGVjdGlvblwiIDogcHJldlN0YXRlLmVsZW1lbnRUeXBlXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMudG9nZ2xlUGVuTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlbk1vZGU6ICFwcmV2U3RhdGUucGVuTW9kZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZVplbk1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlWmVuTW9kZSk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVTdGF0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2hvd1N0YXRzKSB7XG4gICAgICB0cmFja0V2ZW50KFwiZGlhbG9nXCIsIFwic3RhdHNcIik7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlU3RhdHMpO1xuICB9O1xuXG4gIHRoaXMuc2Nyb2xsVG9Db250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCB0YXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoX29iamVjdFNwcmVhZCh7fSwgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcykpKTtcbiAgfTtcblxuICB0aGlzLnpvb21Ub0ZpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgdGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gICAgbGV0IG1heFpvb20gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gICAgbGV0IG1hcmdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMC4wMztcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0YXJnZXQgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICAgIG1heFpvb20gPSAxO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoem9vbVRvRml0RWxlbWVudHModGFyZ2V0LCBfdGhpczEzLnN0YXRlLCBmYWxzZSwgbWF4Wm9vbSwgbWFyZ2luKS5hcHBTdGF0ZSk7XG4gIH07XG5cbiAgdGhpcy51cGRhdGVDb250YWluZXJTaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChjb250YWluZXJzKSB7XG4gICAgY29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgY29uc3QgW3gsIHldID0gcm90YXRlKGVsLnggKyBlbC53aWR0aCwgZWwueSArIGVsLmhlaWdodCwgZWwueCArIGVsLndpZHRoIC8gMiwgZWwueSArIGVsLmhlaWdodCAvIDIsIGVsLmFuZ2xlKTtcbiAgICAgIHJlc2l6ZVNpbmdsZUVsZW1lbnQoZWwsIHRydWUsIGVsLCBcInNlXCIsIHRydWUsIHgsIHkpO1xuICAgIH0pO1xuICB9KTtcblxuICB0aGlzLmNsZWFyVG9hc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICB0b2FzdE1lc3NhZ2U6IG51bGxcbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLnNldFRvYXN0TWVzc2FnZSA9IGZ1bmN0aW9uICh0b2FzdE1lc3NhZ2UpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHRvYXN0TWVzc2FnZVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMucmVzdG9yZUZpbGVGcm9tU2hhcmUgPSAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViU2hhcmVUYXJnZXRDYWNoZSA9IHlpZWxkIGNhY2hlcy5vcGVuKFwid2ViLXNoYXJlLXRhcmdldFwiKTtcbiAgICAgIGNvbnN0IGZpbGUgPSB5aWVsZCB3ZWJTaGFyZVRhcmdldENhY2hlLm1hdGNoKFwic2hhcmVkLWZpbGVcIik7XG5cbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSB5aWVsZCBmaWxlLmJsb2IoKTtcblxuICAgICAgICBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMoYmxvYik7XG5cbiAgICAgICAgeWllbGQgd2ViU2hhcmVUYXJnZXRDYWNoZS5kZWxldGUoXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIEFQUF9OQU1FLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLmFkZEZpbGVzID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChmaWxlcykge1xuICAgIGNvbnN0IGZpbGVzTWFwID0gZmlsZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGZpbGVEYXRhKSB7XG4gICAgICBhY2Muc2V0KGZpbGVEYXRhLmlkLCBmaWxlRGF0YSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIG5ldyBNYXAoKSk7XG4gICAgX3RoaXMxMy5maWxlcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5maWxlcyksIE9iamVjdC5mcm9tRW50cmllcyhmaWxlc01hcCkpOyAvLyBidW1wIHZlcnNpb25zIGZvciBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZSBhZGRlZCBmaWxlcyBzbyB0aGF0XG4gICAgLy8gd2UvaG9zdCBhcHBzIGNhbiBkZXRlY3QgdGhlIGNoYW5nZSwgYW5kIGludmFsaWRhdGUgdGhlIGltYWdlICYgc2hhcGVcbiAgICAvLyBjYWNoZVxuXG4gICAgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmIGZpbGVzTWFwLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgX3RoaXMxMy5pbWFnZUNhY2hlLmRlbGV0ZShlbGVtZW50LmZpbGVJZCk7XG5cbiAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgYnVtcFZlcnNpb24oZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG5cbiAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9KTtcblxuICB0aGlzLnNldExvY2FsRm9udCA9IGZ1bmN0aW9uIChzaG93T25QYW5lbCkge1xuICAgIHNob3dGb3VydGhGb250ID0gc2hvd09uUGFuZWw7XG4gIH07XG5cbiAgdGhpcy5zZWxlY3RFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMudXBkYXRlU2NlbmUoe1xuICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IGVsZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAobWFwLCBlbGVtZW50KSB7XG4gICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSlcbiAgICAgIH0pLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5icmluZ1RvRnJvbnQgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICBfdGhpczEzLnNlbGVjdEVsZW1lbnRzKGVsZW1lbnRzKTtcblxuICAgIF90aGlzMTMudXBkYXRlU2NlbmUoYWN0aW9uQnJpbmdUb0Zyb250LnBlcmZvcm0oX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKSk7XG4gIH07XG5cbiAgdGhpcy5icmluZ0ZvcndhcmQgPSBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICBfdGhpczEzLnNlbGVjdEVsZW1lbnRzKGVsZW1lbnRzKTtcblxuICAgIF90aGlzMTMudXBkYXRlU2NlbmUoYWN0aW9uQnJpbmdGb3J3YXJkLnBlcmZvcm0oX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKSk7XG4gIH07XG5cbiAgdGhpcy5zZW5kVG9CYWNrID0gZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgX3RoaXMxMy5zZWxlY3RFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZVNjZW5lKGFjdGlvblNlbmRUb0JhY2sucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpKTtcbiAgfTtcblxuICB0aGlzLnNlbmRCYWNrd2FyZCA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIF90aGlzMTMuc2VsZWN0RWxlbWVudHMoZWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy51cGRhdGVTY2VuZShhY3Rpb25TZW5kQmFja3dhcmQucGVyZm9ybShfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpKTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZVNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChzY2VuZURhdGEpIHtcbiAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoc2NlbmVEYXRhLmFwcFN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhzY2VuZURhdGEuZWxlbWVudHMpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbGxhYm9yYXRvcnM6IHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmxpYnJhcnlJdGVtcykge1xuICAgICAgX3RoaXMxMy5saWJyYXJ5LnNhdmVMaWJyYXJ5KHJlc3RvcmVMaWJyYXJ5SXRlbXMoc2NlbmVEYXRhLmxpYnJhcnlJdGVtcywgXCJ1bnB1Ymxpc2hlZFwiKSk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLm9uU2NlbmVVcGRhdGVkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGN1cnNvclggPSBldmVudC5jbGllbnRYO1xuICAgIGN1cnNvclkgPSBldmVudC5jbGllbnRZO1xuICB9KTtcbiAgdGhpcy5vbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuICAgIGlmIChcIlByb3h5XCIgaW4gd2luZG93ICYmICghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSB8fCBldmVudC5zaGlmdEtleSAmJiAvXlthLXpdJC8udGVzdChldmVudC5rZXkpKSkge1xuICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgZ2V0KGV2LCBwcm9wKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gZml4IGZvciBQcm94aWVzIGhpamFja2luZyBgdGhpc2BcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIiA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICBldmVudC5zaGlmdEtleSA/IGV2LmtleS50b1VwcGVyQ2FzZSgpIDogZXYua2V5LnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC5rZXkgIT09IEtFWVMuRVNDQVBFIHx8IC8vIGNhc2U6IHVzaW5nIGFycm93cyB0byBtb3ZlIGJldHdlZW4gYnV0dG9uc1xuICAgIGlzQXJyb3dLZXkoZXZlbnQua2V5KSAmJiBpc0lucHV0TGlrZShldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RVUVTVElPTl9NQVJLKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvd0hlbHBEaWFsb2c6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5aRVJPKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMaWJyYXJ5T3BlbjogIV90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3BlblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc3RlcCA9IF90aGlzMTMuc3RhdGUuZ3JpZFNpemUgJiYgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UIDogX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSkgfHwgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UIDogRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSwgdHJ1ZSk7XG4gICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19SSUdIVCkge1xuICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgIG9mZnNldFkgPSAtc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBvZmZzZXRYLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFlcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkKSB7XG4gICAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3Ioc2VsZWN0ZWRFbGVtZW50c1swXSwgX3RoaXMxMy5zY2VuZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG5cbiAgICAgICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgICBzY2VuZVg6IHNlbGVjdGVkRWxlbWVudC54ICsgc2VsZWN0ZWRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgc2hvdWxkQmluZDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmIF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG5cbiAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChzaGFwZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RKSB7XG4gICAgICAgIF90aGlzMTMudG9nZ2xlTG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UgJiYgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwKSB7XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IHRydWU7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJiAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgJiYgKGhhc0JhY2tncm91bmQoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSkgfHwgc2VsZWN0ZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSk7XG4gICAgICB9KSkpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcInN0cm9rZUNvbG9yUGlja2VyXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbktleVVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UpIHtcbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIV90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKF90aGlzMTMuc3RhdGUpID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKSA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZVN0YXJ0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge31cbiAgICB9KTtcblxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlO1xuICB9KTtcbiAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gb25HZXN0dXJlQ2hhbmdlIG9ubHkgaGFzIHpvb20gZmFjdG9yIGJ1dCBub3QgdGhlIGNlbnRlci5cbiAgICAvLyBJZiB3ZSdyZSBvbiBpUGFkIG9yIGlQaG9uZSwgdGhlbiB3ZSByZWNvZ25pemUgbXVsdGktdG91Y2ggYW5kIHdpbGxcbiAgICAvLyB6b29tIGluIGF0IHRoZSByaWdodCBsb2NhdGlvbiBvbiB0aGUgdG91Y2hNb3ZlIGhhbmRsZXIgYWxyZWFkeS5cbiAgICAvLyBPbiBNYWNib29rLCB3ZSBkb24ndCBoYXZlIHRob3NlIGV2ZW50cyBzbyB3aWxsIHpvb20gaW4gYXQgdGhlXG4gICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbnN0ZWFkLlxuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuXG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGdldFN0YXRlRm9yWm9vbSh7XG4gICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICBuZXh0Wm9vbTogZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogZXZlbnQuc2NhbGUpXG4gICAgICAgIH0sIHN0YXRlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZUVuZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHNcbiAgICB9KTtcblxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgfSk7XG5cbiAgdGhpcy5zdGFydFRleHRFZGl0aW5nID0gZnVuY3Rpb24gKF9yZWY4KSB7XG4gICAgbGV0IHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWSxcbiAgICAgIHNob3VsZEJpbmQsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlciA9IHRydWVcbiAgICB9ID0gX3JlZjg7XG5cbiAgICBsZXQgcGFyZW50Q2VudGVyUG9zaXRpb24gPSBpbnNlcnRBdFBhcmVudENlbnRlciAmJiBfdGhpczEzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oc2NlbmVYLCBzY2VuZVksIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzLCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7IC8vIGJpbmQgdG8gY29udGFpbmVyIHdoZW4gc2hvdWxkQmluZCBpcyB0cnVlIG9yXG4gICAgLy8gY2xpY2tlZCBvbiBjZW50ZXIgb2YgY29udGFpbmVyXG5cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHNob3VsZEJpbmQgfHwgcGFyZW50Q2VudGVyUG9zaXRpb24gPyBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuICFpc1RleHRFbGVtZW50KGVsZSk7XG4gICAgfSksIHNjZW5lWCwgc2NlbmVZKSA6IG51bGw7XG5cbiAgICBsZXQgZXhpc3RpbmdUZXh0RWxlbWVudCA9IF90aGlzMTMuZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZKTsgLy8gY29uc2lkZXIgYm91bmRlZCB0ZXh0IGVsZW1lbnQgaWYgY29udGFpbmVyIHByZXNlbnRcblxuXG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZXhpc3RpbmdUZXh0RWxlbWVudCAmJiBjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGZvbnRTdHJpbmcgPSB7XG4gICAgICAgIGZvbnRTaXplOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5XG4gICAgICB9O1xuICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRBcHByb3hNaW5MaW5lV2lkdGgoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVyLmhlaWdodCwgbWluSGVpZ2h0KTtcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyLndpZHRoLCBtaW5XaWR0aCk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQ6IG5ld0hlaWdodCxcbiAgICAgICAgd2lkdGg6IG5ld1dpZHRoXG4gICAgICB9KTtcbiAgICAgIHNjZW5lWCA9IGNvbnRhaW5lci54ICsgbmV3V2lkdGggLyAyO1xuICAgICAgc2NlbmVZID0gY29udGFpbmVyLnkgKyBuZXdIZWlnaHQgLyAyO1xuXG4gICAgICBpZiAocGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgcGFyZW50Q2VudGVyUG9zaXRpb24gPSBfdGhpczEzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oc2NlbmVYLCBzY2VuZVksIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzLCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGV4aXN0aW5nVGV4dEVsZW1lbnQgPyBleGlzdGluZ1RleHRFbGVtZW50IDogbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgeDogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWCA6IHNjZW5lWCxcbiAgICAgIHk6IHBhcmVudENlbnRlclBvc2l0aW9uID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclkgOiBzY2VuZVksXG4gICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHRleHQ6IFwiXCIsXG4gICAgICByYXdUZXh0OiBcIlwiLFxuICAgICAgZm9udFNpemU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IFwiY2VudGVyXCIgOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBcIm1pZGRsZVwiIDogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXI/LmlkID8/IHVuZGVmaW5lZCxcbiAgICAgIGdyb3VwSWRzOiBjb250YWluZXI/Lmdyb3VwSWRzID8/IFtdXG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgfSk7XG5cbiAgICBpZiAoZXhpc3RpbmdUZXh0RWxlbWVudCkge1xuICAgICAgLy8gaWYgdGV4dCBlbGVtZW50IGlzIG5vIGxvbmdlciBjZW50ZXJlZCB0byBhIGNvbnRhaW5lciwgcmVzZXRcbiAgICAgIC8vIHZlcnRpY2FsQWxpZ24gdG8gZGVmYXVsdCBiZWNhdXNlIGl0J3MgY3VycmVudGx5IGludGVybmFsLW9ubHlcbiAgICAgIGlmICghcGFyZW50Q2VudGVyUG9zaXRpb24gfHwgZWxlbWVudC50ZXh0QWxpZ24gIT09IFwiY2VudGVyXCIpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTsgLy8gY2FzZTogY3JlYXRpbmcgbmV3IHRleHQgbm90IGNlbnRlcmVkIHRvIHBhcmVudCBlbGVtZW5lbnQg4oaSIG9mZnNldCBZXG4gICAgICAvLyBzbyB0aGF0IHRoZSB0ZXh0IGlzIGNlbnRlcmVkIHRvIGN1cnNvciBwb3NpdGlvblxuXG5cbiAgICAgIGlmICghcGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgeTogZWxlbWVudC55IC0gZWxlbWVudC5iYXNlbGluZSAvIDJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudFxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5oYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudDogISFleGlzdGluZ1RleHRFbGVtZW50XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGNhc2U6IGRvdWJsZS1jbGlja2luZyB3aXRoIGFycm93L2xpbmUgdG9vbCBzZWxlY3RlZCB3b3VsZCBib3RoIGNyZWF0ZVxuICAgIC8vIHRleHQgYW5kIGVudGVyIG11bHRpRWxlbWVudCBtb2RlXG4gICAgaWYgKF90aGlzMTMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyB3ZSBzaG91bGQgb25seSBiZSBhYmxlIHRvIGRvdWJsZSBjbGljayB3aGVuIG1vZGUgaXMgc2VsZWN0aW9uXG5cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcblxuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgIGlmICghX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCBfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZCkge1xuICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKHNlbGVjdGVkRWxlbWVudHNbMF0sIF90aGlzMTMuc2NlbmUpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgIGxldCB7XG4gICAgICB4OiBzY2VuZVgsXG4gICAgICB5OiBzY2VuZVlcbiAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWRzID0gZ2V0U2VsZWN0ZWRHcm91cElkcyhfdGhpczEzLnN0YXRlKTtcblxuICAgIGlmIChzZWxlY3RlZEdyb3VwSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkID0gaGl0RWxlbWVudCAmJiBnZXRTZWxlY3RlZEdyb3VwSWRGb3JFbGVtZW50KGhpdEVsZW1lbnQsIF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRHcm91cElkcyk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEdyb3VwSWQpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IHNlbGVjdGVkR3JvdXBJZCxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fVxuICAgICAgICAgIH0pLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgaWYgKCFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAhX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50KTtcblxuICAgICAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgICAgICBzY2VuZVggPSBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDI7XG4gICAgICAgICAgc2NlbmVZID0gc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICBzY2VuZVgsXG4gICAgICAgIHNjZW5lWSxcbiAgICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24gPSBmdW5jdGlvbiAoc2NlbmVQb2ludGVyLCBoaXRFbGVtZW50KSB7XG4gICAgLy8gUmV2ZXJzaW5nIHNvIHdlIHRyYXZlcnNlIHRoZSBlbGVtZW50cyBpbiBkZWNyZWFzaW5nIG9yZGVyXG4gICAgLy8gb2Ygei1pbmRleFxuICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLnNsaWNlKCkucmV2ZXJzZSgpO1xuXG4gICAgbGV0IGhpdEVsZW1lbnRJbmRleCA9IEluZmluaXR5O1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgICAgaWYgKGhpdEVsZW1lbnQgJiYgZWxlbWVudC5pZCA9PT0gaGl0RWxlbWVudC5pZCkge1xuICAgICAgICBoaXRFbGVtZW50SW5kZXggPSBpbmRleDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZW1lbnQubGluayAmJiBpc1BvaW50SGl0dGluZ0xpbmtJY29uKGVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldKSAmJiBpbmRleCA8PSBoaXRFbGVtZW50SW5kZXg7XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZWRpcmVjdFRvTGluayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGxhc3RQb2ludGVyRG93bkNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhfdGhpczEzLmxhc3RQb2ludGVyRG93biwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uID0gaXNQb2ludEhpdHRpbmdMaW5rSWNvbihfdGhpczEzLmhpdExpbmtFbGVtZW50LCBfdGhpczEzLnN0YXRlLCBbbGFzdFBvaW50ZXJEb3duQ29vcmRzLngsIGxhc3RQb2ludGVyRG93bkNvb3Jkcy55XSk7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJVcENvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhfdGhpczEzLmxhc3RQb2ludGVyVXAsIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IExhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtsYXN0UG9pbnRlclVwQ29vcmRzLngsIGxhc3RQb2ludGVyVXBDb29yZHMueV0pO1xuXG4gICAgaWYgKGxhc3RQb2ludGVyRG93bkhpdHRpbmdMaW5rSWNvbiAmJiBMYXN0UG9pbnRlclVwSGl0dGluZ0xpbmtJY29uKSB7XG4gICAgICBjb25zdCB1cmwgPSBfdGhpczEzLmhpdExpbmtFbGVtZW50Py5saW5rO1xuXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGlmIChfdGhpczEzLnByb3BzLm9uTGlua09wZW4pIHtcbiAgICAgICAgICBfdGhpczEzLnByb3BzLm9uTGlua09wZW4odXJsLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNMb2NhbExpbmsodXJsKSA/IFwiX3NlbGZcIiA6IFwiX2JsYW5rXCI7XG4gICAgICAgICAgY29uc3QgbmV3V2luZG93ID0gd2luZG93Lm9wZW4odW5kZWZpbmVkLCB0YXJnZXQpOyAvLyBodHRwczovL21hdGhpYXNieW5lbnMuZ2l0aHViLmlvL3JlbC1ub29wZW5lci9cblxuICAgICAgICAgIGlmIChuZXdXaW5kb3cpIHtcbiAgICAgICAgICAgIG5ld1dpbmRvdy5vcGVuZXIgPSBudWxsO1xuICAgICAgICAgICAgbmV3V2luZG93LmxvY2F0aW9uID0gbm9ybWFsaXplTGluayh1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmF0dGFjaExpbmtMaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmNhbnZhcz8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF90aGlzMTMucmVkaXJlY3RUb0xpbmspO1xuICB9O1xuXG4gIHRoaXMuZGV0YWNoTGlua0xpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgX3RoaXMxMy5yZWRpcmVjdFRvTGluayk7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgX3RoaXMxMy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2V0KGV2ZW50LnBvaW50ZXJJZCwge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDIgJiYgZ2VzdHVyZS5sYXN0Q2VudGVyICYmIGluaXRpYWxTY2FsZSAmJiBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSkge1xuICAgICAgY29uc3QgY2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgY29uc3QgZGVsdGFYID0gY2VudGVyLnggLSBnZXN0dXJlLmxhc3RDZW50ZXIueDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGNlbnRlci55IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLnk7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBjZW50ZXI7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIgJiYgX3RoaXMxMy5zdGF0ZS5wZW5Nb2RlID8gMSA6IGRpc3RhbmNlIC8gZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2U7XG4gICAgICBjb25zdCBuZXh0Wm9vbSA9IHNjYWxlRmFjdG9yID8gZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogc2NhbGVGYWN0b3IpIDogX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICBjb25zdCB6b29tU3RhdGUgPSBnZXRTdGF0ZUZvclpvb20oe1xuICAgICAgICAgIHZpZXdwb3J0WDogY2VudGVyLngsXG4gICAgICAgICAgdmlld3BvcnRZOiBjZW50ZXIueSxcbiAgICAgICAgICBuZXh0Wm9vbVxuICAgICAgICB9LCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgem9vbTogem9vbVN0YXRlLnpvb20sXG4gICAgICAgICAgc2Nyb2xsWDogem9vbVN0YXRlLnNjcm9sbFggKyBkZWx0YVggLyBuZXh0Wm9vbSxcbiAgICAgICAgICBzY3JvbGxZOiB6b29tU3RhdGUuc2Nyb2xsWSArIGRlbHRhWSAvIG5leHRab29tLFxuICAgICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UgPSBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGlzSG9sZGluZ1NwYWNlIHx8IGlzUGFubmluZyB8fCBpc0RyYWdnaW5nU2Nyb2xsQmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNQb2ludGVyT3ZlclNjcm9sbEJhcnMgPSBpc092ZXJTY3JvbGxCYXJzKGN1cnJlbnRTY3JvbGxCYXJzLCBldmVudC5jbGllbnRYIC0gX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0LCBldmVudC5jbGllbnRZIC0gX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3ApO1xuICAgIGNvbnN0IGlzT3ZlclNjcm9sbEJhciA9IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzLmlzT3ZlckVpdGhlcjtcblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgJiYgIV90aGlzMTMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBpZiAoaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzY2VuZVBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIF90aGlzMTMuc3RhdGUpO1xuICAgIGNvbnN0IHtcbiAgICAgIHg6IHNjZW5lUG9pbnRlclgsXG4gICAgICB5OiBzY2VuZVBvaW50ZXJZXG4gICAgfSA9IHNjZW5lUG9pbnRlcjtcblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGVkaXRpbmdMaW5lYXJFbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyTW92ZShldmVudCwgc2NlbmVQb2ludGVyWCwgc2NlbmVQb2ludGVyWSwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG5cbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50Lmxhc3RVbmNvbW1pdHRlZFBvaW50ICE9IG51bGwpIHtcbiAgICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3Ioc2NlbmVQb2ludGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSkpIHtcbiAgICAgIC8vIEhvdmVyaW5nIHdpdGggYSBzZWxlY3RlZCB0b29sIG9yIGNyZWF0aW5nIG5ldyBsaW5lYXIgZWxlbWVudCB2aWEgY2xpY2tcbiAgICAgIC8vIGFuZCBwb2ludFxuICAgICAgY29uc3Qge1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuXG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZHJhZ2dpbmdFbGVtZW50LCBbc2NlbmVQb2ludGVyXSwgX3RoaXMxMy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtdWx0aUVsZW1lbnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiByeCxcbiAgICAgICAgeTogcnlcbiAgICAgIH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICB9ID0gbXVsdGlFbGVtZW50O1xuICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoZGlzdGFuY2UyZChzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeSwgbGFzdFBvaW50WzBdLCBsYXN0UG9pbnRbMV0pID49IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7IC8vIGluIHRoaXMgYnJhbmNoLCB3ZSdyZSBpbnNpZGUgdGhlIGNvbW1pdCB6b25lLCBhbmQgbm8gdW5jb21taXR0ZWRcbiAgICAgICAgICAvLyBwb2ludCBleGlzdHMuIFRodXMgZG8gbm90aGluZyAoZG9uJ3QgYWRkL3JlbW92ZSBwb2ludHMpLlxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAyICYmIGxhc3RDb21taXR0ZWRQb2ludCAmJiBkaXN0YW5jZTJkKHNjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5LCBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sIGxhc3RDb21taXR0ZWRQb2ludFsxXSkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzUGF0aEFMb29wKHBvaW50cywgX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIH0gLy8gdXBkYXRlIGxhc3QgdW5jb21taXR0ZWQgcG9pbnRcblxuXG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZXNlbGVjdGVkQnV0dG9uID0gQm9vbGVhbihldmVudC5idXR0b25zKTtcblxuICAgIGlmIChoYXNEZXNlbGVjdGVkQnV0dG9uIHx8IF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiYgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKTtcblxuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXNPdmVyU2Nyb2xsQmFyICYmICFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUsIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICYmIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS50cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEgJiYgIWlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSwgc2NlbmVQb2ludGVyWCwgc2NlbmVQb2ludGVyWSwgX3RoaXMxMy5zdGF0ZS56b29tLCBldmVudC5wb2ludGVyVHlwZSk7XG5cbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KHtcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lUG9pbnRlci54LCBzY2VuZVBvaW50ZXIueSk7XG5cbiAgICBfdGhpczEzLmhpdExpbmtFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50TGlua0F0UG9zaXRpb24oc2NlbmVQb2ludGVyLCBoaXRFbGVtZW50KTtcblxuICAgIGlmIChfdGhpczEzLmhpdExpbmtFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tfdGhpczEzLmhpdExpbmtFbGVtZW50LmlkXSkge1xuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgIHNob3dIeXBlcmxpbmtUb29sdGlwKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vbkxpbmtIb3Zlcikge1xuICAgICAgICBfdGhpczEzLnByb3BzLm9uTGlua0hvdmVyKF90aGlzMTMuaGl0TGlua0VsZW1lbnQsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5hdHRhY2hMaW5rTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlkZUh5cGVybGlua1Rvb2xpcCgpO1xuXG4gICAgICBfdGhpczEzLmRldGFjaExpbmtMaXN0ZW5lcigpO1xuXG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBoaXRFbGVtZW50LmxpbmsgJiYgX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0gJiYgIV90aGlzMTMuY29udGV4dE1lbnVPcGVuICYmICFfdGhpczEzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IFwiaW5mb1wiXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBpc1RleHRFbGVtZW50KGhpdEVsZW1lbnQpID8gQ1VSU09SX1RZUEUuVEVYVCA6IENVUlNPUl9UWVBFLkNST1NTSEFJUik7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQpO1xuXG4gICAgICAgIGlmIChlbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldKSkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICggLy8gaWYgdXNpbmcgY21kL2N0cmwsIHdlJ3JlIG5vdCBkcmFnZ2luZ1xuICAgICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIChoaXRFbGVtZW50IHx8IF90aGlzMTMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoc2NlbmVQb2ludGVyLCBzZWxlY3RlZEVsZW1lbnRzKSkpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5NT1ZFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gcmVtb3ZlIGFueSBhY3RpdmUgc2VsZWN0aW9uIHdoZW4gd2Ugc3RhcnQgdG8gaW50ZXJhY3Qgd2l0aCBjYW52YXNcbiAgICAvLyAobWFpbmx5LCB3ZSBjYXJlIGFib3V0IHJlbW92aW5nIHNlbGVjdGlvbiBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2hpY2hcbiAgICAvLyAgd291bGQgcHJldmVudCBvdXIgY29weSBoYW5kbGluZyBvdGhlcndpc2UpXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG5cbiAgICBfdGhpczEzLm1heWJlQ2xlYW51cEFmdGVyTWlzc2luZ1BvaW50ZXJVcChldmVudCk7IC8vZmlyZXMgb25seSBvbmNlLCBpZiBwZW4gaXMgZGV0ZWN0ZWQsIHBlbk1vZGUgaXMgZW5hYmxlZFxuICAgIC8vdGhlIHVzZXIgY2FuIGRpc2FibGUgdGhpcyBieSB0b2dnbGluZyB0aGUgcGVuTW9kZSBidXR0b25cblxuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLnBlbkRldGVjdGVkICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInBlblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5Nb2RlOiB0cnVlLFxuICAgICAgICAgIHBlbkRldGVjdGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy5sYXN0UG9pbnRlckRvd24gPSBldmVudDtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiXG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwiZG93blwiKTtcblxuICAgIGlmIChfdGhpczEzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG5cblxuICAgIGlmIChldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5UT1VDSCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMudXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpOyAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuXG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID4gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuXG5cbiAgICBjb25zdCBwb2ludGVyRG93blN0YXRlID0gX3RoaXMxMy5pbml0aWFsUG9pbnRlckRvd25TdGF0ZShldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgb24gcG9pbnRlciBkb3duIHNvIHNldHRpbmcgdG8gZmFsc2VcblxuXG4gICAgX3RoaXMxMy5jb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcblxuICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZShldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbG93T25Qb2ludGVyRG93biA9ICFfdGhpczEzLnN0YXRlLnBlbk1vZGUgfHwgZXZlbnQucG9pbnRlclR5cGUgIT09IFwidG91Y2hcIiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiIHx8IF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiIHx8IF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIjtcblxuICAgIGlmICghYWxsb3dPblBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBfdGhpczEzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8IF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKSB7XG4gICAgICBfdGhpczEzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgLy8gcmVzZXQgaW1hZ2UgcHJldmlldyBvbiBwb2ludGVyZG93blxuICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5DUk9TU0hBSVIpO1xuXG4gICAgICBpZiAoIV90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IF90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IF90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCxcbiAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogbnVsbCxcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICBfdGhpczEzLmhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24oZXZlbnQsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93bihfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gX3RoaXMxMy5vblBvaW50ZXJNb3ZlRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGNvbnN0IG9uUG9pbnRlclVwID0gX3RoaXMxMy5vblBvaW50ZXJVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvbktleURvd24gPSBfdGhpczEzLm9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvbktleVVwID0gX3RoaXMxMy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBkZWFsIHdpdGggb3BlbmluZyBjb250ZXh0IG1lbnUgb24gdG91Y2ggZGV2aWNlc1xuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gXCJ0b3VjaFwiKSB7XG4gICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcblxuICAgICAgaWYgKHRvdWNoVGltZW91dCkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFscmVhZHkgYSB0b3VjaFRpbWVvdXQsIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSdzIGFub3RoZXJcbiAgICAgICAgLy8gdG91Y2ggZG93biBhbmQgd2UgYXJlIGRvaW5nIGFub3RoZXIgdG91Y2gsIHNvIHdlIHNob3VsZG4ndCBvcGVuIHRoZVxuICAgICAgICAvLyBjb250ZXh0IG1lbnUuXG4gICAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvcGVuIHRoZSBjb250ZXh0IG1lbnUgd2l0aCB0aGUgZmlyc3QgdG91Y2gncyBjbGllbnRYIGFuZCBjbGllbnRZXG4gICAgICAgIC8vIGlmIHRoZSB0b3VjaCBpcyBub3QgbW92aW5nXG4gICAgICAgIHRvdWNoVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0b3VjaFRpbWVvdXQgPSAwO1xuXG4gICAgICAgICAgaWYgKCFpbnZhbGlkYXRlQ29udGV4dE1lbnUpIHtcbiAgICAgICAgICAgIF90aGlzMTMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCEoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwICYmIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLldIRUVMIHx8IGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBpc0hvbGRpbmdTcGFjZSB8fCBfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkpIHx8IGlzVGV4dEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG4gICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCQklORyk7XG4gICAgbGV0IHtcbiAgICAgIGNsaWVudFg6IGxhc3RYLFxuICAgICAgY2xpZW50WTogbGFzdFlcbiAgICB9ID0gZXZlbnQ7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIC8qXG4gICAgICAgKiBQcmV2ZW50IHBhc3RlIGV2ZW50IGlmIHdlIG1vdmUgd2hpbGUgbWlkZGxlIGNsaWNraW5nIG9uIExpbnV4LlxuICAgICAgICogU2VlIGlzc3VlICMxMzgzLlxuICAgICAgICovXG5cbiAgICAgIGlmIChpc0xpbnV4ICYmICFuZXh0UGFzdGVQcmV2ZW50ZWQgJiYgKE1hdGguYWJzKGRlbHRhWCkgPiAxIHx8IE1hdGguYWJzKGRlbHRhWSkgPiAxKSkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAvKiBQcmV2ZW50IHRoZSBuZXh0IHBhc3RlIGV2ZW50ICovXG5cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlndGggY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG5cblxuICAgICAgICBjb25zdCBlbmFibGVOZXh0UGFzdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiBfdGhpczEzLnN0YXRlLnNjcm9sbFggLSBkZWx0YVggLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICAgIHNjcm9sbFk6IF90aGlzMTMuc3RhdGUuc2Nyb2xsWSAtIGRlbHRhWSAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMobGFzdFBvaW50ZXJVcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG5cbiAgICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGVhcmRvd24pO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IHRydWVcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdGhpcy5jbGVhclNlbGVjdGlvbklmTm90VXNpbmdTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZVNlbGVjdGlvbk9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmICFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSA9IGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZShlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS56b29tLCBldmVudC5wb2ludGVyVHlwZSk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZ0VsZW1lbnQ6IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS5lbGVtZW50XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlID0gZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZTogcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZVxuICAgICAgICB9KSk7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcgPSB0cnVlO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQgPSB0dXBsZVRvQ29vcnMoZ2V0UmVzaXplT2Zmc2V0WFkocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSwgc2VsZWN0ZWRFbGVtZW50cywgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiYgc2VsZWN0ZWRFbGVtZW50c1swXS5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLCBzZWxlY3RlZEVsZW1lbnRzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCByZXQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLCBmdW5jdGlvbiAoYXBwU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKGFwcFN0YXRlKTtcbiAgICAgICAgICB9LCBfdGhpczEzLmhpc3RvcnksIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luKTtcblxuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXQuZGlkQWRkUG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBoaXRFbGVtZW50IG1heSBhbHJlYWR5IGJlIHNldCBhYm92ZSwgc28gY2hlY2sgZmlyc3RcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID8/IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24ocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSk7XG5cbiAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgcG9pbnRlciBpcyBoaXR0aW5nIGxpbmsgaWNvblxuICAgICAgICAgIGlmIChpc1BvaW50SGl0dGluZ0xpbmtJY29uKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlID0gaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3gocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCwgX3RoaXMxMy5zdGF0ZSwgW3BvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnldKTtcbiAgICAgICAgfSAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuXG5cbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMgPSBfdGhpczEzLmdldEVsZW1lbnRzQXRQb3NpdGlvbihwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KTtcbiAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMxMy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICgoaGl0RWxlbWVudCA9PT0gbnVsbCB8fCAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkKSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgX3RoaXMxMy5jbGVhclNlbGVjdGlvbihoaXRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW190aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pOyAvLyBJZiB3ZSBjbGljayBvbiBzb21ldGhpbmdcblxuICAgICAgICB9IGVsc2UgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQocHJldlN0YXRlLCBoaXRFbGVtZW50KSksIHt9LCB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7IC8vIG1hcmsgYXMgbm90IGNvbXBsZXRlbHkgaGFuZGxlZCBzbyBhcyB0byBhbGxvdyBkcmFnZ2luZyBldGMuXG5cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gLy8gZGVzZWxlY3QgaWYgaXRlbSBpcyBzZWxlY3RlZFxuICAgICAgICAgIC8vIGlmIHNoaWZ0IGlzIG5vdCBjbGlja2VkLCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCB3aWxsIHRyaWdnZXIgc2VsZWN0aW9uIGJhc2VkIG9uIGN1cnJlbnRcbiAgICAgICAgICAvLyBzdGF0ZSBvZiB0aGUgYm94XG5cblxuICAgICAgICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQgJiYgIWlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nR3JvdXBJZCkpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gLy8gQWRkIGhpdCBlbGVtZW50IHRvIHNlbGVjdGlvbi4gQXQgdGhpcyBwb2ludCBpZiB3ZSdyZSBub3QgaG9sZGluZ1xuICAgICAgICAgICAgLy8gU0hJRlQgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgZWxlbWVudChzKSB3ZXJlIGRlc2VsZWN0ZWQgYWJvdmVcbiAgICAgICAgICAgIC8vIChtYWtlIHN1cmUgeW91IHVzZSBzZXRTdGF0ZSB1cGRhdGVyIHRvIHVzZSBsYXRlc3Qgc3RhdGUpXG5cblxuICAgICAgICAgICAgaWYgKCFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogaGl0RWxlbWVudC5saW5rID8gXCJpbmZvXCIgOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogX3RoaXMxMy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlVGV4dE9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICAvLyBpZiB3ZSdyZSBjdXJyZW50bHkgc3RpbGwgZWRpdGluZyB0ZXh0LCBjbGlja2luZyBvdXRzaWRlXG4gICAgLy8gc2hvdWxkIG9ubHkgZmluYWxpemUgaXQsIG5vdCBjcmVhdGUgYW5vdGhlciAoaXJyZXNwZWN0aXZlXG4gICAgLy8gb2Ygc3RhdGUuZWxlbWVudExvY2tlZClcbiAgICBpZiAoaXNUZXh0RWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzY2VuZVggPSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54O1xuICAgIGxldCBzY2VuZVkgPSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IF90aGlzMTMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVksIHtcbiAgICAgIGluY2x1ZGVCb3VuZFRleHRFbGVtZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5CaW5kVGV4dCA9IGhhc0JvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgIHNjZW5lWCA9IGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgc2NlbmVZID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQgLyAyO1xuICAgIH1cblxuICAgIF90aGlzMTMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVksXG4gICAgICBzaG91bGRCaW5kOiBmYWxzZSxcbiAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5XG4gICAgfSk7XG5cbiAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVGcmVlRHJhd0VsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBudWxsKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RnJlZURyYXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgc2ltdWxhdGVQcmVzc3VyZTogZXZlbnQucHJlc3N1cmUgPT09IDAuNVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZXNzdXJlcyA9IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IGVsZW1lbnQucHJlc3N1cmVzIDogWy4uLmVsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBwb2ludHM6IFtbMCwgMF1dLFxuICAgICAgcHJlc3N1cmVzXG4gICAgfSk7XG4gICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLCBfdGhpczEzLnNjZW5lKTtcblxuICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50ID0gZnVuY3Rpb24gKF9yZWY5KSB7XG4gICAgbGV0IHtcbiAgICAgIHNjZW5lWCxcbiAgICAgIHNjZW5lWVxuICAgIH0gPSBfcmVmOTtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVgsIHNjZW5lWSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ltYWdlRWxlbWVudCh7XG4gICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3NcbiAgICB9KTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtdWx0aUVsZW1lbnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlOyAvLyBmaW5hbGl6ZSBpZiBjb21wbGV0aW5nIGEgbG9vcFxuXG4gICAgICBpZiAobXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IHJ4LFxuICAgICAgICB5OiByeSxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICB9ID0gbXVsdGlFbGVtZW50OyAvLyBjbGlja2luZyBpbnNpZGUgY29tbWl0IHpvbmUg4oaSIGZpbmFsaXplIGFycm93XG5cbiAgICAgIGlmIChtdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEgJiYgbGFzdENvbW1pdHRlZFBvaW50ICYmIGRpc3RhbmNlMmQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCAtIHJ4LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksIGxhc3RDb21taXR0ZWRQb2ludFswXSwgbGFzdENvbW1pdHRlZFBvaW50WzFdKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgW211bHRpRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7IC8vIGNsaWNraW5nIG91dHNpZGUgY29tbWl0IHpvbmUg4oaSIHVwZGF0ZSByZWZlcmVuY2UgZm9yIGxhc3QgY29tbWl0dGVkXG4gICAgICAvLyBwb2ludFxuXG5cbiAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbXVsdGlFbGVtZW50LnBvaW50c1ttdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdXG4gICAgICB9KTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgLyogSWYgYXJyb3cgaXMgcHJlLWFycm93aGVhZHMsIGl0IHdpbGwgaGF2ZSB1bmRlZmluZWQgZm9yIGJvdGggc3RhcnQgYW5kIGVuZCBhcnJvd2hlYWRzLlxuICAgICAgSWYgc28sIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3Igc3RhcnQgYW5kIFwiYXJyb3dcIiBmb3IgZW5kLiBJZiB0aGUgbGluZWFyIGl0ZW0gaXMgbm90XG4gICAgICBhbiBhcnJvdywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBib3RoLiBPdGhlcndpc2UsIHdlIHdhbnQgaXQgdG8gdXNlIHRoZVxuICAgICAgdmFsdWVzIGZyb20gYXBwU3RhdGUuICovXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuICAgICAgY29uc3QgW3N0YXJ0QXJyb3doZWFkLCBlbmRBcnJvd2hlYWRdID0gZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF0gOiBbbnVsbCwgbnVsbF07XG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICB4OiBncmlkWCxcbiAgICAgICAgeTogZ3JpZFksXG4gICAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgICAgIHN0YXJ0QXJyb3doZWFkLFxuICAgICAgICBlbmRBcnJvd2hlYWRcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBbLi4uZWxlbWVudC5wb2ludHMsIFswLCAwXV1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLCBfdGhpczEzLnNjZW5lKTtcblxuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3NcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5pbml0aWFsaXplSW1hZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTAgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKF9yZWYxMSkge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQ6IF9pbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZVxuICAgICAgfSA9IF9yZWYxMTtcblxuICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGltYWdlIGZpbGUsIGJ1dCB3ZSBkbyB0aGlzIGNoZWNrXG4gICAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICAgIGlmICghaXNTdXBwb3J0ZWRJbWFnZUZpbGUoaW1hZ2VGaWxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWltZVR5cGUgPSBpbWFnZUZpbGUudHlwZTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgXCJ3YWl0XCIpO1xuXG4gICAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHlpZWxkIG5vcm1hbGl6ZVNWRyh5aWVsZCBpbWFnZUZpbGUudGV4dCgpKSwgaW1hZ2VGaWxlLm5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuc3ZnSW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZ2VuZXJhdGUgaW1hZ2UgaWQgKGJ5IGRlZmF1bHQgdGhlIGZpbGUgZGlnZXN0KSBiZWZvcmUgYW55XG4gICAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcblxuXG4gICAgICBjb25zdCBmaWxlSWQgPSB5aWVsZCBfdGhpczEzLnByb3BzLmdlbmVyYXRlSWRGb3JGaWxlPy4oaW1hZ2VGaWxlKSB8fCBnZW5lcmF0ZUlkRnJvbUZpbGUoaW1hZ2VGaWxlKTtcblxuICAgICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZ2VuZXJhdGUgZmlsZSBpZCBvciB0aGUgc3VwcGxpZWQgYGdlbmVyYXRlSWRGb3JGaWxlYCBkaWRuJ3QgcmVzb2x2ZSB0byBvbmUuXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdGaWxlRGF0YSA9IF90aGlzMTMuZmlsZXNbZmlsZUlkXTtcblxuICAgICAgaWYgKCFleGlzdGluZ0ZpbGVEYXRhPy5kYXRhVVJMKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgICAgbWF4V2lkdGhPckhlaWdodDogREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hUXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIHRyeWluZyB0byByZXNpbmcgaW1hZ2UgZmlsZSBvbiBpbnNlcnRpb25cIiwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLmZpbGVUb29CaWdcIiwge1xuICAgICAgICAgICAgbWF4U2l6ZTogYCR7TWF0aC50cnVuYyhNQVhfQUxMT1dFRF9GSUxFX0JZVEVTIC8gMTAyNCAvIDEwMjQpfU1CYFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgICBjb25zdCBkYXRhVVJMID0gX3RoaXMxMy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMOyAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gZnVsbC1zaXplIGZpbGUgZm9yIGN1cnNvciBwcmV2aWV3XG4gICAgICAgIC8vIChpdCdzIG11Y2ggZmFzdGVyIHRvIGNvbnZlcnQgdGhlIHJlc2l6ZWQgZGF0YVVSTCB0byBGaWxlKVxuXG4gICAgICAgIGNvbnN0IHJlc2l6ZWRGaWxlID0gZGF0YVVSTCAmJiBkYXRhVVJMVG9GaWxlKGRhdGFVUkwpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yKHJlc2l6ZWRGaWxlIHx8IGltYWdlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFVUkwgPSBfdGhpczEzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkwgfHwgKHlpZWxkIGdldERhdGFVUkwoaW1hZ2VGaWxlKSk7XG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBtdXRhdGVFbGVtZW50KF9pbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgZmlsZUlkXG4gICAgICB9LCBmYWxzZSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmMTIgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwge30sIHtcbiAgICAgICAgICAgICAgW2ZpbGVJZF06IHtcbiAgICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY2FjaGVkSW1hZ2VEYXRhID0gX3RoaXMxMy5pbWFnZUNhY2hlLmdldChmaWxlSWQpO1xuXG4gICAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuXG4gICAgICAgICAgICAgIHlpZWxkIF90aGlzMTMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB5aWVsZCBjYWNoZWRJbWFnZURhdGEuaW1hZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQgJiYgX3RoaXMxMy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSkpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94Nykge1xuICAgICAgICAgIHJldHVybiBfcmVmMTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94NSkge1xuICAgICAgcmV0dXJuIF9yZWYxMC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmluc2VydEltYWdlRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxMyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsIHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBpbWFnZUVsZW1lbnRdKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgeWllbGQgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2Uoe1xuICAgICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgc2hvd0N1cnNvckltYWdlUHJldmlld1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgaXNEZWxldGVkOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDgsIF94OSwgX3gxMCkge1xuICAgICAgcmV0dXJuIF9yZWYxMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLnNldEltYWdlUHJldmlld0N1cnNvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNCA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VGaWxlKSB7XG4gICAgICAvLyBtdXN0bid0IGJlIGxhcmdlciB0aGFuIDEyOCBweFxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDk2O1xuICAgICAgY29uc3QgaW1hZ2VQcmV2aWV3ID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICBtYXhXaWR0aE9ySGVpZ2h0OiBjdXJzb3JJbWFnZVNpemVQeFxuICAgICAgfSk7XG4gICAgICBsZXQgcHJldmlld0RhdGFVUkwgPSB5aWVsZCBnZXREYXRhVVJMKGltYWdlUHJldmlldyk7IC8vIFNWRyBjYW5ub3QgYmUgcmVzaXplZCB2aWEgYHJlc2l6ZUltYWdlRmlsZWAgc28gd2UgcmVzaXplIGJ5IHJlbmRlcmluZyB0b1xuICAgICAgLy8gYSBzbWFsbCBjYW52YXNcblxuICAgICAgaWYgKGltYWdlRmlsZS50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICBjb25zdCBpbWcgPSB5aWVsZCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG4gICAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KTtcblxuICAgICAgICBpZiAod2lkdGggPiBjdXJzb3JJbWFnZVNpemVQeCkge1xuICAgICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoaW1nLmhlaWdodCAvIGltZy53aWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHByZXZpZXdEYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2Zyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSA0IDQsIGF1dG9gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gxMSkge1xuICAgICAgcmV0dXJuIF9yZWYxNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLm9uSW1hZ2VBY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTUgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW5zZXJ0T25DYW52YXNEaXJlY3RseVxuICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge1xuICAgICAgICBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5OiBmYWxzZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50WCA9IF90aGlzMTMuc3RhdGUud2lkdGggLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgICAgICBjb25zdCBjbGllbnRZID0gX3RoaXMxMy5zdGF0ZS5oZWlnaHQgLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICAgICAgY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZXG4gICAgICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuICAgICAgICBjb25zdCBpbWFnZUZpbGUgPSB5aWVsZCBmaWxlT3Blbih7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgICBleHRlbnNpb25zOiBbXCJqcGdcIiwgXCJwbmdcIiwgXCJzdmdcIiwgXCJnaWZcIl1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gX3RoaXMxMy5jcmVhdGVJbWFnZUVsZW1lbnQoe1xuICAgICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgICBzY2VuZVk6IHlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGltYWdlRmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogaW1hZ2VFbGVtZW50XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsXG4gICAgICAgICAgICAvKiBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ICovXG4gICAgICAgICAgICB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9yZWYxNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMgPSBmdW5jdGlvbiAoaW1hZ2VFbGVtZW50KSB7XG4gICAgbGV0IGZvcmNlTmF0dXJhbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIGNvbnN0IGltYWdlID0gaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQpICYmIF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoaW1hZ2VFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuXG4gICAgaWYgKCFpbWFnZSB8fCBpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGlmIChpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUgJiYgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclNpemUgPSAxMDAgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgeDogaW1hZ2VFbGVtZW50LnggLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHk6IGltYWdlRWxlbWVudC55IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJTaXplLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJTaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlTmF0dXJhbFNpemUgfHwgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAvLyBpbnRlbnRpb24gd2FzIHRvIGNsaWNrIGluc3RlYWQgb2YgZHJhZywgYW5kIHVzZSB0aGUgaW1hZ2Unc1xuICAgIC8vIGludHJpbnNpYyBzaXplXG4gICAgaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlICYmIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4KF90aGlzMTMuc3RhdGUuaGVpZ2h0IC0gMTIwLCAxNjApOyAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuXG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIE1hdGguZmxvb3IoX3RoaXMxMy5zdGF0ZS5oZWlnaHQgKiAwLjUpIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKGltYWdlLm5hdHVyYWxIZWlnaHQsIG1heEhlaWdodCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGhlaWdodCAqIChpbWFnZS5uYXR1cmFsV2lkdGggLyBpbWFnZS5uYXR1cmFsSGVpZ2h0KTsgLy8gYWRkIGN1cnJlbnQgaW1hZ2VFbGVtZW50IHdpZHRoL2hlaWdodCB0byBhY2NvdW50IGZvciBwcmV2aW91cyBjZW50ZXJpbmdcbiAgICAgIC8vIG9mIHRoZSBwbGFjaG9sZGVyIGltYWdlXG5cbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy51cGRhdGVJbWFnZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE2ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cykge1xuICAgICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgICAgY29uc3Qge1xuICAgICAgICB1cGRhdGVkRmlsZXMsXG4gICAgICAgIGVycm9yZWRGaWxlc1xuICAgICAgfSA9IHlpZWxkIF91cGRhdGVJbWFnZUNhY2hlKHtcbiAgICAgICAgaW1hZ2VDYWNoZTogX3RoaXMxMy5pbWFnZUNhY2hlLFxuICAgICAgICBmaWxlSWRzOiBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5maWxlSWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBmaWxlc1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSB8fCBlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIGlmIChpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmIGVycm9yZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlbWVudCwge1xuICAgICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlZEZpbGVzLFxuICAgICAgICBlcnJvcmVkRmlsZXNcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTIpIHtcbiAgICAgIHJldHVybiBfcmVmMTYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTcgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgbGV0IGltYWdlRWxlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgICAgY29uc3QgdW5jYWNoZWRJbWFnZUVsZW1lbnRzID0gaW1hZ2VFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmlzRGVsZXRlZCAmJiAhX3RoaXMxMy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHVuY2FjaGVkSW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVwZGF0ZWRGaWxlc1xuICAgICAgICB9ID0geWllbGQgX3RoaXMxMy51cGRhdGVJbWFnZUNhY2hlKHVuY2FjaGVkSW1hZ2VFbGVtZW50cywgZmlsZXMpO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSkge1xuICAgICAgICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfcmVmMTcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5zY2hlZHVsZUltYWdlUmVmcmVzaCA9IHRocm90dGxlKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9LCBJTUFHRV9SRU5ERVJfVElNRU9VVCk7XG5cbiAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBzaG91bGRFbmFibGVCaW5kaW5nID0gc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudChldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yID0gZnVuY3Rpb24gKHBvaW50ZXJDb29yZHMpIHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJDb29yZHMsIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsID8gW2hvdmVyZWRCaW5kYWJsZUVsZW1lbnRdIDogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzID0gZnVuY3Rpb24gKGxpbmVhckVsZW1lbnQsIHBvaW50ZXJDb29yZHMsIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudCkge1xuICAgIGlmICghcG9pbnRlckNvb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IHBvaW50ZXJDb29yZHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNvb3Jkcykge1xuICAgICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhjb29yZHMsIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgICBpZiAoaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsICYmICFpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQobGluZWFyRWxlbWVudCwgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCwgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCkpIHtcbiAgICAgICAgYWNjLnB1c2goaG92ZXJlZEJpbmRhYmxlRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nc1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUmVmID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIF90aGlzMTMuY2FudmFzID0gY2FudmFzO1xuICAgICAgX3RoaXMxMy5yYyA9IHJvdWdoLmNhbnZhcyhfdGhpczEzLmNhbnZhcyk7XG5cbiAgICAgIF90aGlzMTMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIF90aGlzMTMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCBfdGhpczEzLm9uVGFwU3RhcnQpO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgX3RoaXMxMy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCBfdGhpczEzLmhhbmRsZVdoZWVsKTtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCBfdGhpczEzLm9uVGFwU3RhcnQpO1xuICAgICAgX3RoaXMxMy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCBfdGhpczEzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVBcHBPbkRyb3AgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTggPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vbkRyb3ApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCh5aWVsZCBfdGhpczEzLnByb3BzLm9uRHJvcChldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xuXG4gICAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHNjZW5lIGZyb20gdGhlIGltYWdlIGlmIGl0J3MgZW1iZWRkZWRcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5wbmcgfHwgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgICBmaWxlLmhhbmRsZSA9IHlpZWxkIGl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBzY2VuZSA9IHlpZWxkIGxvYWRGcm9tQmxvYihmaWxlLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcblxuICAgICAgICAgICAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiRW5jb2RpbmdFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIGlmIG5vIHNjZW5lIGlzIGVtYmVkZGVkIG9yIHdlIGZhaWwgZm9yIHdoYXRldmVyIHJlYXNvbiwgZmFsbCBiYWNrXG4gICAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeDogc2NlbmVYLFxuICAgICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgICBzY2VuZVlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGlicmFyeVNoYXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG5cbiAgICAgIGlmIChsaWJyYXJ5U2hhcGVzICE9PSBcIlwiKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBKU09OLnBhcnNlKGxpYnJhcnlTaGFwZXMpLFxuICAgICAgICAgIHBvc2l0aW9uOiBldmVudCxcbiAgICAgICAgICBmaWxlczogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzWzBdO1xuXG4gICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliIHx8IGZpbGU/Lm5hbWU/LmVuZHNXaXRoKFwiLmV4Y2FsaWRyYXdsaWJcIikpIHtcbiAgICAgICAgX3RoaXMxMy5saWJyYXJ5LmltcG9ydExpYnJhcnkoZmlsZSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQ2xvc2UgYW5kIHRoZW4gb3BlbiB0byBnZXQgdGhlIGxpYnJhcmllcyB1cGRhdGVkXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xpYnJhcnlPcGVuOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IC8vIGRlZmF1bHQ6IGFzc3VtZSBhbiBFeGNhbGlkcmF3IGZpbGUgcmVnYXJkbGVzcyBvZiBleHRlbnNpb24vTWltZVR5cGVcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgICBmaWxlLmhhbmRsZSA9IHlpZWxkIGl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB5aWVsZCBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTMpIHtcbiAgICAgIHJldHVybiBfcmVmMTguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzID0gZnVuY3Rpb24gKGZpbGUpIHtcbiAgICBsb2FkRnJvbUJsb2IoZmlsZSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkudGhlbihmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICB9KSxcbiAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICAgIH0pKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBwcmVmZXJTZWxlY3RlZDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnQgPyBcImVsZW1lbnRcIiA6IFwiY2FudmFzXCI7XG4gICAgY29uc3QgY29udGFpbmVyID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgY29uc3Qge1xuICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBvZmZzZXRMZWZ0XG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTMuX29wZW5Db250ZXh0TWVudSh7XG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnRcbiAgICAgICAgfSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5fb3BlbkNvbnRleHRNZW51KHtcbiAgICAgICAgdG9wLFxuICAgICAgICBsZWZ0XG4gICAgICB9LCB0eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudCA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlLCBldmVudCkge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG5cbiAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgZHJhZ05ld0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSwgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgY29uc3QgaW1hZ2UgPSBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgJiYgX3RoaXMxMy5pbWFnZUNhY2hlLmdldChkcmFnZ2luZ0VsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlICYmICEoaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0IDogbnVsbDtcbiAgICAgIGRyYWdOZXdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFgsIGdyaWRZLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSwgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSwgYXNwZWN0UmF0aW8pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoW2RyYWdnaW5nRWxlbWVudF0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlSGFuZGxlUmVzaXplID0gZnVuY3Rpb24gKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVUeXBlID0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuICAgIGNvbnN0IFtyZXNpemVYLCByZXNpemVZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueCwgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgaWYgKHRyYW5zZm9ybUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUsIHRyYW5zZm9ybUhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHMsIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uLCBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLCBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0ltYWdlRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCByZXNpemVYLCByZXNpemVZLCBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCwgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnkpKSB7XG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLl9vcGVuQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoX3JlZjE5LCB0eXBlKSB7XG4gICAgbGV0IHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3BcbiAgICB9ID0gX3JlZjE5O1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5jb250ZXh0TWVudU9wZW4gPSB0cnVlO1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZVVuZ3JvdXBBY3Rpb24gPSBhY3Rpb25Vbmdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heWJlRmxpcEhvcml6b250YWwgPSBhY3Rpb25GbGlwSG9yaXpvbnRhbC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGFjdGlvbkNvcHlBc1BuZyk7XG4gICAgfVxuXG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGFjdGlvbkNvcHlBc1N2Zyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFsuLi5vcHRpb25zLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsIHR5cGVvZiBfdGhpczEzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVplbk1vZGUsIHR5cGVvZiBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVWaWV3TW9kZSwgYWN0aW9uVG9nZ2xlU3RhdHNdO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogdmlld01vZGVPcHRpb25zLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGVsZW1lbnRzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW190aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICBuYW1lOiBcInBhc3RlXCIsXG4gICAgICAgICAgICBwZXJmb3JtOiBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlcykge1xuICAgICAgICAgICAgICBfdGhpczEzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVwiXG4gICAgICAgICAgfSwgX3RoaXMxMy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNlcGFyYXRvciwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNQbmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNTdmcsIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwIHx8IHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25TZWxlY3RBbGwsIHNlcGFyYXRvciwgdHlwZW9mIF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVaZW5Nb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlVmlld01vZGUsIGFjdGlvblRvZ2dsZVN0YXRzXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBlbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBjb25zdCBlbGVtZW50c1dpdGhVbmJpbmRlZFRleHQgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlKS5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAhaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW25hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSwgLi4ub3B0aW9uc10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbX3RoaXMxMy5pc01vYmlsZSAmJiBhY3Rpb25DdXQsIF90aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCBfdGhpczEzLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgcGVyZm9ybTogZnVuY3Rpb24gKGVsZW1lbnRzLCBhcHBTdGF0ZXMpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIlxuICAgICAgICAgIH0sIF90aGlzMTMuaXNNb2JpbGUgJiYgc2VwYXJhdG9yLCAuLi5vcHRpb25zLCBzZXBhcmF0b3IsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvblBhc3RlU3R5bGVzLCBzZXBhcmF0b3IsIG1heWJlR3JvdXBBY3Rpb24gJiYgYWN0aW9uR3JvdXAsICFlbGVtZW50c1dpdGhVbmJpbmRlZFRleHQgJiYgYWN0aW9uVW5iaW5kVGV4dCwgbWF5YmVVbmdyb3VwQWN0aW9uICYmIGFjdGlvblVuZ3JvdXAsIChtYXliZUdyb3VwQWN0aW9uIHx8IG1heWJlVW5ncm91cEFjdGlvbikgJiYgc2VwYXJhdG9yLCBhY3Rpb25BZGRUb0xpYnJhcnksIHNlcGFyYXRvciwgYWN0aW9uU2VuZEJhY2t3YXJkLCBhY3Rpb25CcmluZ0ZvcndhcmQsIGFjdGlvblNlbmRUb0JhY2ssIGFjdGlvbkJyaW5nVG9Gcm9udCwgc2VwYXJhdG9yLCBtYXliZUZsaXBIb3Jpem9udGFsICYmIGFjdGlvbkZsaXBIb3Jpem9udGFsLCBtYXliZUZsaXBWZXJ0aWNhbCAmJiBhY3Rpb25GbGlwVmVydGljYWwsIChtYXliZUZsaXBIb3Jpem9udGFsIHx8IG1heWJlRmxpcFZlcnRpY2FsKSAmJiBzZXBhcmF0b3IsIGFjdGlvbkxpbmsuY29udGV4dEl0ZW1QcmVkaWNhdGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUpICYmIGFjdGlvbkxpbmssIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbiwgYWN0aW9uRGVsZXRlU2VsZWN0ZWRdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGVsZW1lbnRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZVdoZWVsID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZXG4gICAgfSA9IGV2ZW50O1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgfSA9IF90aGlzMTMuc3RhdGU7IC8vIG5vdGUgdGhhdCBldmVudC5jdHJsS2V5IGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgcGluY2ggem9vbWluZ1xuXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkge1xuICAgICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbihkZWx0YVkpO1xuICAgICAgY29uc3QgTUFYX1NURVAgPSAxMDtcbiAgICAgIGxldCBkZWx0YSA9IE1hdGguYWJzKGRlbHRhWSk7XG5cbiAgICAgIGlmIChkZWx0YSA+IE1BWF9TVEVQKSB7XG4gICAgICAgIGRlbHRhID0gTUFYX1NURVA7XG4gICAgICB9XG5cbiAgICAgIGRlbHRhICo9IHNpZ247XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld1pvb20gPSBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUgLSBkZWx0YSAvIDEwMDsgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG5cbiAgICAgIG5ld1pvb20gKz0gTWF0aC5sb2cxMChNYXRoLm1heCgxLCBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpKSAqIC1zaWduOyAvLyByb3VuZCB0byBuZWFyZXN0IHN0ZXBcblxuICAgICAgbmV3Wm9vbSA9IE1hdGgucm91bmQobmV3Wm9vbSAqIFpPT01fU1RFUCAqIDEwMCkgLyAoWk9PTV9TVEVQICogMTAwKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0U3RhdGVGb3Jab29tKHtcbiAgICAgICAgICB2aWV3cG9ydFg6IGN1cnNvclgsXG4gICAgICAgICAgdmlld3BvcnRZOiBjdXJzb3JZLFxuICAgICAgICAgIG5leHRab29tOiBnZXROb3JtYWxpemVkWm9vbShuZXdab29tKVxuICAgICAgICB9LCBzdGF0ZSkpLCB7fSwge1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IE9iamVjdC5rZXlzKHNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwID8gc2VsZWN0ZWRFbGVtZW50SWRzIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2Nyb2xsIGhvcml6b250YWxseSB3aGVuIHNoaWZ0IHByZXNzZWRcblxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChfcmVmMjApIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIHNjcm9sbFhcbiAgICAgICAgfSA9IF9yZWYyMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAvLyBvbiBNYWMsIHNoaWZ0K3doZWVsIHRlbmRzIHRvIHJlc3VsdCBpbiBkZWx0YVhcbiAgICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChfcmVmMjEpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIHpvb20sXG4gICAgICAgIHNjcm9sbFgsXG4gICAgICAgIHNjcm9sbFlcbiAgICAgIH0gPSBfcmVmMjE7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gZGVsdGFYIC8gem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWVcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuc2F2ZVBvaW50ZXIgPSBmdW5jdGlvbiAoeCwgeSwgYnV0dG9uKSB7XG4gICAgaWYgKCF4IHx8ICF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICBjbGllbnRYOiB4LFxuICAgICAgY2xpZW50WTogeVxuICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgaWYgKGlzTmFOKHBvaW50ZXIueCkgfHwgaXNOYU4ocG9pbnRlci55KSkgey8vIHNvbWV0aW1lcyB0aGUgcG9pbnRlciBnb2VzIG9mZiBzY3JlZW5cbiAgICB9XG5cbiAgICBfdGhpczEzLnByb3BzLm9uUG9pbnRlclVwZGF0ZT8uKHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBidXR0b24sXG4gICAgICBwb2ludGVyc01hcDogZ2VzdHVyZS5wb2ludGVyc1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQgPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFfdGhpczEzLnVubW91bnRlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgMzAwKTtcblxuICB0aGlzLnVwZGF0ZURPTVJlY3QgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICBpZiAoX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGxlZnQ6IG9mZnNldExlZnQsXG4gICAgICAgIHRvcDogb2Zmc2V0VG9wXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcblxuICAgICAgaWYgKHdpZHRoID09PSBjdXJyZW50V2lkdGggJiYgaGVpZ2h0ID09PSBjdXJyZW50SGVpZ2h0ICYmIG9mZnNldExlZnQgPT09IGN1cnJlbnRPZmZzZXRMZWZ0ICYmIG9mZnNldFRvcCA9PT0gY3VycmVudE9mZnNldFRvcCkge1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgb2Zmc2V0VG9wXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNiICYmIGNiKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5nZXRDYW52YXNPZmZzZXRzKCkpKTtcbiAgfTtcbn07XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVCkge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8IHt9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG5cbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICAgICAgfSxcblxuICAgICAgc2V0KGVsZW1lbnRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICAgICAgfVxuXG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../components/App.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/App.tsx?");
1921
1921
 
1922
1922
  /***/ }),
1923
1923
 
@@ -2918,7 +2918,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
2918
2918
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2919
2919
 
2920
2920
  "use strict";
2921
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getSceneVersion),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.isInvisiblySmallElement),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getNonDeletedElements),\\n/* harmony export */ \\\"defaultLang\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang),\\n/* harmony export */ \\\"languages\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.languages),\\n/* harmony export */ \\\"restore\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restore),\\n/* harmony export */ \\\"restoreAppState\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreAppState),\\n/* harmony export */ \\\"restoreElements\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreElements),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToCanvas),\\n/* harmony export */ \\\"exportToBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToBlob),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToSvg),\\n/* harmony export */ \\\"serializeAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.serializeAsJSON),\\n/* harmony export */ \\\"loadLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadLibraryFromBlob),\\n/* harmony export */ \\\"loadFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob),\\n/* harmony export */ \\\"getFreeDrawSvgPath\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getFreeDrawSvgPath),\\n/* harmony export */ \\\"getCommonBoundingBox\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getCommonBoundingBox),\\n/* harmony export */ \\\"getMaximumGroups\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getMaximumGroups),\\n/* harmony export */ \\\"intersectElementWithLine\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.intersectElementWithLine),\\n/* harmony export */ \\\"determineFocusDistance\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.determineFocusDistance),\\n/* harmony export */ \\\"isLinearElement\\\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__.isLinearElement),\\n/* harmony export */ \\\"FONT_FAMILY\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.FONT_FAMILY),\\n/* harmony export */ \\\"THEME\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.THEME),\\n/* harmony export */ \\\"mutateElement\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.mutateElement),\\n/* harmony export */ \\\"newElementWith\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.newElementWith),\\n/* harmony export */ \\\"bumpVersion\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.bumpVersion)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"./node_modules/@babel/runtime/helpers/objectWithoutProperties.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"./node_modules/@babel/runtime/helpers/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _publicPath__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./publicPath */ \\\"./publicPath.js\\\");\\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/InitializeApp */ \\\"../../components/InitializeApp.tsx\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/app.scss */ \\\"../../css/app.scss\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../css/styles.scss */ \\\"../../css/styles.scss\\\");\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_7__);\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../packages/utils */ \\\"../utils.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"initialData\\\", \\\"UIOptions\\\"], _excluded2 = [\\\"initialData\\\", \\\"UIOptions\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Excalidraw = function (props) {\\r\\n var _a, _b, _c;\\r\\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating = false, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, onBeforeTextSubmit, generateIdForFile, onThemeChange, onLinkOpen } = props;\\r\\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\\r\\n const UIOptions = {\\r\\n canvasActions: _objectSpread(_objectSpread({}, _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions)\\r\\n };\\r\\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\\r\\n UIOptions.canvasActions.export.saveFileToDisk = (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions[\\\"export\\\"].saveFileToDisk;\\r\\n }\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () {\\r\\n // Block pinch-zooming on iOS outside of the content area\\r\\n const handleTouchMove = function (event) {\\r\\n // @ts-ignore\\r\\n if (typeof event.scale === \\\"number\\\" && event.scale !== 1) {\\r\\n event.preventDefault();\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"touchmove\\\", handleTouchMove, {\\r\\n passive: false\\r\\n });\\r\\n return function () {\\r\\n document.removeEventListener(\\\"touchmove\\\", handleTouchMove);\\r\\n };\\r\\n }, []);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__.InitializeApp, {\\r\\n langCode: langCode,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_5__[\\\"default\\\"], {\\r\\n onChange: onChange,\\r\\n initialData: initialData,\\r\\n excalidrawRef: excalidrawRef,\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n isCollaborating: isCollaborating,\\r\\n onPointerUpdate: onPointerUpdate,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderFooter: renderFooter,\\r\\n langCode: langCode,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n gridModeEnabled: gridModeEnabled,\\r\\n libraryReturnUrl: libraryReturnUrl,\\r\\n theme: theme,\\r\\n name: name,\\r\\n renderCustomStats: renderCustomStats,\\r\\n UIOptions: UIOptions,\\r\\n onPaste: onPaste,\\r\\n onDrop: onDrop,\\r\\n detectScroll: detectScroll,\\r\\n handleKeyboardGlobally: handleKeyboardGlobally,\\r\\n onLibraryChange: onLibraryChange,\\r\\n autoFocus: autoFocus,\\r\\n onBeforeTextEdit: onBeforeTextEdit,\\r\\n onBeforeTextSubmit: onBeforeTextSubmit,\\r\\n generateIdForFile: generateIdForFile,\\r\\n onThemeChange: onThemeChange,\\r\\n onLinkOpen: onLinkOpen\\r\\n })\\r\\n });\\r\\n};\\r\\nconst areEqual = function (prevProps, nextProps) {\\r\\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(prevProps, _excluded);\\r\\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(nextProps, _excluded2); // comparing UIOptions\\r\\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\\r\\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\\r\\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\\r\\n return false;\\r\\n }\\r\\n const isUIOptionsSame = prevUIOptionsKeys.every(function (key) {\\r\\n if (key === \\\"canvasActions\\\") {\\r\\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\\r\\n canvasOptionKeys.every(function (key) {\\r\\n var _a, _b, _c, _d;\\r\\n if (key === \\\"export\\\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\\r\\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\\r\\n }\\r\\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\\r\\n });\\r\\n }\\r\\n return true;\\r\\n });\\r\\n const prevKeys = Object.keys(prevProps);\\r\\n const nextKeys = Object.keys(nextProps);\\r\\n return isUIOptionsSame && prevKeys.length === nextKeys.length && prevKeys.every(function (key) {\\r\\n return prev[key] === next[key];\\r\\n });\\r\\n};\\r\\nconst forwardedRefComp = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.forwardRef)(function (props, ref) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(Excalidraw, _objectSpread(_objectSpread({}, props), {}, {\\r\\n excalidrawRef: ref\\r\\n }));\\r\\n});\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().memo(forwardedRefComp, areEqual));\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QyxPQUFPLGVBQWUsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUc7UUFDM0YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLGtEQUFVLENBQUMsVUFBVSxLQUFLLEVBQUUsR0FBRztJQUNuRSxPQUFPLGFBQWEsd0RBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFO1FBQy9FLGFBQWEsRUFBRSxHQUFHO0tBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFDSCw4RUFBNEIsaURBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsRUFBQztBQUM2QjtBQUM1QztBQUMyQjtBQUNvSztBQUN4TDtBQUNOO0FBQ29DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW5kZXgudHN4P2NlNzQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuY29uc3QgX2V4Y2x1ZGVkID0gW1wiaW5pdGlhbERhdGFcIiwgXCJVSU9wdGlvbnNcIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wiaW5pdGlhbERhdGFcIiwgXCJVSU9wdGlvbnNcIl07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4vcHVibGljUGF0aFwiO1xuaW1wb3J0IHsgSW5pdGlhbGl6ZUFwcCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL0luaXRpYWxpemVBcHBcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgXCIuLi8uLi9jc3MvYXBwLnNjc3NcIjtcbmltcG9ydCBcIi4uLy4uL2Nzcy9zdHlsZXMuc2Nzc1wiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcgfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuaW1wb3J0IHsgREVGQVVMVF9VSV9PUFRJT05TIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuY29uc3QgRXhjYWxpZHJhdyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBjb25zdCB7XG4gICAgb25DaGFuZ2UsXG4gICAgaW5pdGlhbERhdGEsXG4gICAgZXhjYWxpZHJhd1JlZixcbiAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgIGlzQ29sbGFib3JhdGluZyA9IGZhbHNlLFxuICAgIG9uUG9pbnRlclVwZGF0ZSxcbiAgICByZW5kZXJUb3BSaWdodFVJLFxuICAgIHJlbmRlckZvb3RlcixcbiAgICBsYW5nQ29kZSA9IGRlZmF1bHRMYW5nLmNvZGUsXG4gICAgdmlld01vZGVFbmFibGVkLFxuICAgIHplbk1vZGVFbmFibGVkLFxuICAgIGdyaWRNb2RlRW5hYmxlZCxcbiAgICBsaWJyYXJ5UmV0dXJuVXJsLFxuICAgIHRoZW1lLFxuICAgIG5hbWUsXG4gICAgcmVuZGVyQ3VzdG9tU3RhdHMsXG4gICAgb25QYXN0ZSxcbiAgICBvbkRyb3AsXG4gICAgZGV0ZWN0U2Nyb2xsID0gdHJ1ZSxcbiAgICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5ID0gZmFsc2UsXG4gICAgb25MaWJyYXJ5Q2hhbmdlLFxuICAgIGF1dG9Gb2N1cyA9IGZhbHNlLFxuICAgIG9uQmVmb3JlVGV4dEVkaXQsXG4gICAgb25CZWZvcmVUZXh0U3VibWl0LFxuICAgIGdlbmVyYXRlSWRGb3JGaWxlLFxuICAgIG9uVGhlbWVDaGFuZ2UsXG4gICAgb25MaW5rT3BlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGNhbnZhc0FjdGlvbnMgPSBwcm9wcy5VSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM7XG4gIGNvbnN0IFVJT3B0aW9ucyA9IHtcbiAgICBjYW52YXNBY3Rpb25zOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIERFRkFVTFRfVUlfT1BUSU9OUy5jYW52YXNBY3Rpb25zKSwgY2FudmFzQWN0aW9ucylcbiAgfTtcblxuICBpZiAoY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID0gY2FudmFzQWN0aW9ucy5leHBvcnQ/LnNhdmVGaWxlVG9EaXNrID8/IERFRkFVTFRfVUlfT1BUSU9OUy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzaztcbiAgfVxuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQmxvY2sgcGluY2gtem9vbWluZyBvbiBpT1Mgb3V0c2lkZSBvZiB0aGUgY29udGVudCBhcmVhXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodHlwZW9mIGV2ZW50LnNjYWxlID09PSBcIm51bWJlclwiICYmIGV2ZW50LnNjYWxlICE9PSAxKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goSW5pdGlhbGl6ZUFwcCwge1xuICAgIGxhbmdDb2RlOiBsYW5nQ29kZSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQXBwLCB7XG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICBpbml0aWFsRGF0YTogaW5pdGlhbERhdGEsXG4gICAgICBleGNhbGlkcmF3UmVmOiBleGNhbGlkcmF3UmVmLFxuICAgICAgb25Db2xsYWJCdXR0b25DbGljazogb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIGlzQ29sbGFib3JhdGluZzogaXNDb2xsYWJvcmF0aW5nLFxuICAgICAgb25Qb2ludGVyVXBkYXRlOiBvblBvaW50ZXJVcGRhdGUsXG4gICAgICByZW5kZXJUb3BSaWdodFVJOiByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgcmVuZGVyRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICBsYW5nQ29kZTogbGFuZ0NvZGUsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQ6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkOiB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgIGdyaWRNb2RlRW5hYmxlZDogZ3JpZE1vZGVFbmFibGVkLFxuICAgICAgbGlicmFyeVJldHVyblVybDogbGlicmFyeVJldHVyblVybCxcbiAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICByZW5kZXJDdXN0b21TdGF0czogcmVuZGVyQ3VzdG9tU3RhdHMsXG4gICAgICBVSU9wdGlvbnM6IFVJT3B0aW9ucyxcbiAgICAgIG9uUGFzdGU6IG9uUGFzdGUsXG4gICAgICBvbkRyb3A6IG9uRHJvcCxcbiAgICAgIGRldGVjdFNjcm9sbDogZGV0ZWN0U2Nyb2xsLFxuICAgICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseTogaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSxcbiAgICAgIG9uTGlicmFyeUNoYW5nZTogb25MaWJyYXJ5Q2hhbmdlLFxuICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICBvbkJlZm9yZVRleHRFZGl0OiBvbkJlZm9yZVRleHRFZGl0LFxuICAgICAgb25CZWZvcmVUZXh0U3VibWl0OiBvbkJlZm9yZVRleHRTdWJtaXQsXG4gICAgICBnZW5lcmF0ZUlkRm9yRmlsZTogZ2VuZXJhdGVJZEZvckZpbGUsXG4gICAgICBvblRoZW1lQ2hhbmdlOiBvblRoZW1lQ2hhbmdlLFxuICAgICAgb25MaW5rT3Blbjogb25MaW5rT3BlblxuICAgIH0pXG4gIH0pO1xufTtcblxuY29uc3QgYXJlRXF1YWwgPSBmdW5jdGlvbiAocHJldlByb3BzLCBuZXh0UHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGluaXRpYWxEYXRhOiBwcmV2SW5pdGlhbERhdGEsXG4gICAgVUlPcHRpb25zOiBwcmV2VUlPcHRpb25zID0ge31cbiAgfSA9IHByZXZQcm9wcyxcbiAgICAgICAgcHJldiA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcmV2UHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgY29uc3Qge1xuICAgIGluaXRpYWxEYXRhOiBuZXh0SW5pdGlhbERhdGEsXG4gICAgVUlPcHRpb25zOiBuZXh0VUlPcHRpb25zID0ge31cbiAgfSA9IG5leHRQcm9wcyxcbiAgICAgICAgbmV4dCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhuZXh0UHJvcHMsIF9leGNsdWRlZDIpOyAvLyBjb21wYXJpbmcgVUlPcHRpb25zXG5cblxuICBjb25zdCBwcmV2VUlPcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKHByZXZVSU9wdGlvbnMpO1xuICBjb25zdCBuZXh0VUlPcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKG5leHRVSU9wdGlvbnMpO1xuXG4gIGlmIChwcmV2VUlPcHRpb25zS2V5cy5sZW5ndGggIT09IG5leHRVSU9wdGlvbnNLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlzVUlPcHRpb25zU2FtZSA9IHByZXZVSU9wdGlvbnNLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBcImNhbnZhc0FjdGlvbnNcIikge1xuICAgICAgY29uc3QgY2FudmFzT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHByZXZVSU9wdGlvbnMuY2FudmFzQWN0aW9ucyk7XG4gICAgICBjYW52YXNPcHRpb25LZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJleHBvcnRcIiAmJiBwcmV2VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5leHBvcnQgJiYgbmV4dFVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2sgPT09IG5leHRVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2s7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV0gPT09IG5leHRVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LltrZXldO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICBjb25zdCBwcmV2S2V5cyA9IE9iamVjdC5rZXlzKHByZXZQcm9wcyk7XG4gIGNvbnN0IG5leHRLZXlzID0gT2JqZWN0LmtleXMobmV4dFByb3BzKTtcbiAgcmV0dXJuIGlzVUlPcHRpb25zU2FtZSAmJiBwcmV2S2V5cy5sZW5ndGggPT09IG5leHRLZXlzLmxlbmd0aCAmJiBwcmV2S2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHByZXZba2V5XSA9PT0gbmV4dFtrZXldO1xuICB9KTtcbn07XG5cbmNvbnN0IGZvcndhcmRlZFJlZkNvbXAgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goRXhjYWxpZHJhdywgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgZXhjYWxpZHJhd1JlZjogcmVmXG4gIH0pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oZm9yd2FyZGVkUmVmQ29tcCwgYXJlRXF1YWwpO1xuZXhwb3J0IHsgZ2V0U2NlbmVWZXJzaW9uLCBpc0ludmlzaWJseVNtYWxsRWxlbWVudCwgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHRMYW5nLCBsYW5ndWFnZXMgfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuZXhwb3J0IHsgcmVzdG9yZSwgcmVzdG9yZUFwcFN0YXRlLCByZXN0b3JlRWxlbWVudHMgfSBmcm9tIFwiLi4vLi4vZGF0YS9yZXN0b3JlXCI7XG5leHBvcnQgeyBleHBvcnRUb0NhbnZhcywgZXhwb3J0VG9CbG9iLCBleHBvcnRUb1N2Zywgc2VyaWFsaXplQXNKU09OLCBsb2FkTGlicmFyeUZyb21CbG9iLCBsb2FkRnJvbUJsb2IsIGdldEZyZWVEcmF3U3ZnUGF0aCwgZ2V0Q29tbW9uQm91bmRpbmdCb3gsIGdldE1heGltdW1Hcm91cHMsIGludGVyc2VjdEVsZW1lbnRXaXRoTGluZSwgZGV0ZXJtaW5lRm9jdXNEaXN0YW5jZSB9IGZyb20gXCIuLi8uLi9wYWNrYWdlcy91dGlsc1wiO1xuZXhwb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuZXhwb3J0IHsgRk9OVF9GQU1JTFksIFRIRU1FIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuZXhwb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGgsIGJ1bXBWZXJzaW9uIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///./index.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/./index.tsx?");
2921
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getSceneVersion),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.isInvisiblySmallElement),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getNonDeletedElements),\\n/* harmony export */ \\\"defaultLang\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang),\\n/* harmony export */ \\\"languages\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.languages),\\n/* harmony export */ \\\"restore\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restore),\\n/* harmony export */ \\\"restoreAppState\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreAppState),\\n/* harmony export */ \\\"restoreElements\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreElements),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToCanvas),\\n/* harmony export */ \\\"exportToBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToBlob),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToSvg),\\n/* harmony export */ \\\"serializeAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.serializeAsJSON),\\n/* harmony export */ \\\"loadLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadLibraryFromBlob),\\n/* harmony export */ \\\"loadFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob),\\n/* harmony export */ \\\"getFreeDrawSvgPath\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getFreeDrawSvgPath),\\n/* harmony export */ \\\"getCommonBoundingBox\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getCommonBoundingBox),\\n/* harmony export */ \\\"getMaximumGroups\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getMaximumGroups),\\n/* harmony export */ \\\"intersectElementWithLine\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.intersectElementWithLine),\\n/* harmony export */ \\\"determineFocusDistance\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.determineFocusDistance),\\n/* harmony export */ \\\"isLinearElement\\\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__.isLinearElement),\\n/* harmony export */ \\\"FONT_FAMILY\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.FONT_FAMILY),\\n/* harmony export */ \\\"THEME\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.THEME),\\n/* harmony export */ \\\"mutateElement\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.mutateElement),\\n/* harmony export */ \\\"newElementWith\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.newElementWith),\\n/* harmony export */ \\\"bumpVersion\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.bumpVersion)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"./node_modules/@babel/runtime/helpers/objectWithoutProperties.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"./node_modules/@babel/runtime/helpers/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _publicPath__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./publicPath */ \\\"./publicPath.js\\\");\\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/InitializeApp */ \\\"../../components/InitializeApp.tsx\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/app.scss */ \\\"../../css/app.scss\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../css/styles.scss */ \\\"../../css/styles.scss\\\");\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_7__);\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../packages/utils */ \\\"../utils.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"initialData\\\", \\\"UIOptions\\\"], _excluded2 = [\\\"initialData\\\", \\\"UIOptions\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Excalidraw = function (props) {\\r\\n var _a, _b, _c;\\r\\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating = false, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, onBeforeTextSubmit, generateIdForFile, onThemeChange, onLinkOpen, onLinkHover } = props;\\r\\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\\r\\n const UIOptions = {\\r\\n canvasActions: _objectSpread(_objectSpread({}, _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions)\\r\\n };\\r\\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\\r\\n UIOptions.canvasActions.export.saveFileToDisk = (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions[\\\"export\\\"].saveFileToDisk;\\r\\n }\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () {\\r\\n // Block pinch-zooming on iOS outside of the content area\\r\\n const handleTouchMove = function (event) {\\r\\n // @ts-ignore\\r\\n if (typeof event.scale === \\\"number\\\" && event.scale !== 1) {\\r\\n event.preventDefault();\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"touchmove\\\", handleTouchMove, {\\r\\n passive: false\\r\\n });\\r\\n return function () {\\r\\n document.removeEventListener(\\\"touchmove\\\", handleTouchMove);\\r\\n };\\r\\n }, []);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__.InitializeApp, {\\r\\n langCode: langCode,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_5__[\\\"default\\\"], {\\r\\n onChange: onChange,\\r\\n initialData: initialData,\\r\\n excalidrawRef: excalidrawRef,\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n isCollaborating: isCollaborating,\\r\\n onPointerUpdate: onPointerUpdate,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderFooter: renderFooter,\\r\\n langCode: langCode,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n gridModeEnabled: gridModeEnabled,\\r\\n libraryReturnUrl: libraryReturnUrl,\\r\\n theme: theme,\\r\\n name: name,\\r\\n renderCustomStats: renderCustomStats,\\r\\n UIOptions: UIOptions,\\r\\n onPaste: onPaste,\\r\\n onDrop: onDrop,\\r\\n detectScroll: detectScroll,\\r\\n handleKeyboardGlobally: handleKeyboardGlobally,\\r\\n onLibraryChange: onLibraryChange,\\r\\n autoFocus: autoFocus,\\r\\n onBeforeTextEdit: onBeforeTextEdit,\\r\\n onBeforeTextSubmit: onBeforeTextSubmit,\\r\\n generateIdForFile: generateIdForFile,\\r\\n onThemeChange: onThemeChange,\\r\\n onLinkOpen: onLinkOpen,\\r\\n onLinkHover: onLinkHover\\r\\n })\\r\\n });\\r\\n};\\r\\nconst areEqual = function (prevProps, nextProps) {\\r\\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(prevProps, _excluded);\\r\\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(nextProps, _excluded2); // comparing UIOptions\\r\\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\\r\\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\\r\\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\\r\\n return false;\\r\\n }\\r\\n const isUIOptionsSame = prevUIOptionsKeys.every(function (key) {\\r\\n if (key === \\\"canvasActions\\\") {\\r\\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\\r\\n canvasOptionKeys.every(function (key) {\\r\\n var _a, _b, _c, _d;\\r\\n if (key === \\\"export\\\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\\r\\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\\r\\n }\\r\\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\\r\\n });\\r\\n }\\r\\n return true;\\r\\n });\\r\\n const prevKeys = Object.keys(prevProps);\\r\\n const nextKeys = Object.keys(nextProps);\\r\\n return isUIOptionsSame && prevKeys.length === nextKeys.length && prevKeys.every(function (key) {\\r\\n return prev[key] === next[key];\\r\\n });\\r\\n};\\r\\nconst forwardedRefComp = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.forwardRef)(function (props, ref) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(Excalidraw, _objectSpread(_objectSpread({}, props), {}, {\\r\\n excalidrawRef: ref\\r\\n }));\\r\\n});\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().memo(forwardedRefComp, areEqual));\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsT0FBTyxlQUFlLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO1FBQzNGLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxrREFBVSxDQUFDLFVBQVUsS0FBSyxFQUFFLEdBQUc7SUFDbkUsT0FBTyxhQUFhLHdEQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRTtRQUMvRSxhQUFhLEVBQUUsR0FBRztLQUNuQixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ0gsOEVBQTRCLGlEQUFVLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEVBQUM7QUFDNkI7QUFDNUM7QUFDMkI7QUFDb0s7QUFDeEw7QUFDTjtBQUNvQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2luZGV4LnRzeD9jZTc0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcImluaXRpYWxEYXRhXCIsIFwiVUlPcHRpb25zXCJdLFxuICAgICAgX2V4Y2x1ZGVkMiA9IFtcImluaXRpYWxEYXRhXCIsIFwiVUlPcHRpb25zXCJdO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgXCIuL3B1YmxpY1BhdGhcIjtcbmltcG9ydCB7IEluaXRpYWxpemVBcHAgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9Jbml0aWFsaXplQXBwXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IFwiLi4vLi4vY3NzL2FwcC5zY3NzXCI7XG5pbXBvcnQgXCIuLi8uLi9jc3Mvc3R5bGVzLnNjc3NcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nIH0gZnJvbSBcIi4uLy4uL2kxOG5cIjtcbmltcG9ydCB7IERFRkFVTFRfVUlfT1BUSU9OUyB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbmNvbnN0IEV4Y2FsaWRyYXcgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIG9uQ2hhbmdlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICBpc0NvbGxhYm9yYXRpbmcgPSBmYWxzZSxcbiAgICBvblBvaW50ZXJVcGRhdGUsXG4gICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICByZW5kZXJGb290ZXIsXG4gICAgbGFuZ0NvZGUgPSBkZWZhdWx0TGFuZy5jb2RlLFxuICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICBncmlkTW9kZUVuYWJsZWQsXG4gICAgbGlicmFyeVJldHVyblVybCxcbiAgICB0aGVtZSxcbiAgICBuYW1lLFxuICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIG9uUGFzdGUsXG4gICAgb25Ecm9wLFxuICAgIGRldGVjdFNjcm9sbCA9IHRydWUsXG4gICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA9IGZhbHNlLFxuICAgIG9uTGlicmFyeUNoYW5nZSxcbiAgICBhdXRvRm9jdXMgPSBmYWxzZSxcbiAgICBvbkJlZm9yZVRleHRFZGl0LFxuICAgIG9uQmVmb3JlVGV4dFN1Ym1pdCxcbiAgICBnZW5lcmF0ZUlkRm9yRmlsZSxcbiAgICBvblRoZW1lQ2hhbmdlLFxuICAgIG9uTGlua09wZW4sXG4gICAgb25MaW5rSG92ZXJcbiAgfSA9IHByb3BzO1xuICBjb25zdCBjYW52YXNBY3Rpb25zID0gcHJvcHMuVUlPcHRpb25zPy5jYW52YXNBY3Rpb25zO1xuICBjb25zdCBVSU9wdGlvbnMgPSB7XG4gICAgY2FudmFzQWN0aW9uczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucyksIGNhbnZhc0FjdGlvbnMpXG4gIH07XG5cbiAgaWYgKGNhbnZhc0FjdGlvbnM/LmV4cG9ydCkge1xuICAgIFVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzayA9IGNhbnZhc0FjdGlvbnMuZXhwb3J0Py5zYXZlRmlsZVRvRGlzayA/PyBERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2s7XG4gIH1cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEJsb2NrIHBpbmNoLXpvb21pbmcgb24gaU9TIG91dHNpZGUgb2YgdGhlIGNvbnRlbnQgYXJlYVxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKHR5cGVvZiBldmVudC5zY2FsZSA9PT0gXCJudW1iZXJcIiAmJiBldmVudC5zY2FsZSAhPT0gMSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZVRvdWNoTW92ZSwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEluaXRpYWxpemVBcHAsIHtcbiAgICBsYW5nQ29kZTogbGFuZ0NvZGUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEFwcCwge1xuICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgaW5pdGlhbERhdGE6IGluaXRpYWxEYXRhLFxuICAgICAgZXhjYWxpZHJhd1JlZjogZXhjYWxpZHJhd1JlZixcbiAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s6IG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICBpc0NvbGxhYm9yYXRpbmc6IGlzQ29sbGFib3JhdGluZyxcbiAgICAgIG9uUG9pbnRlclVwZGF0ZTogb25Qb2ludGVyVXBkYXRlLFxuICAgICAgcmVuZGVyVG9wUmlnaHRVSTogcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgbGFuZ0NvZGU6IGxhbmdDb2RlLFxuICAgICAgdmlld01vZGVFbmFibGVkOiB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZDogemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkTW9kZUVuYWJsZWQ6IGdyaWRNb2RlRW5hYmxlZCxcbiAgICAgIGxpYnJhcnlSZXR1cm5Vcmw6IGxpYnJhcnlSZXR1cm5VcmwsXG4gICAgICB0aGVtZTogdGhlbWUsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgcmVuZGVyQ3VzdG9tU3RhdHM6IHJlbmRlckN1c3RvbVN0YXRzLFxuICAgICAgVUlPcHRpb25zOiBVSU9wdGlvbnMsXG4gICAgICBvblBhc3RlOiBvblBhc3RlLFxuICAgICAgb25Ecm9wOiBvbkRyb3AsXG4gICAgICBkZXRlY3RTY3JvbGw6IGRldGVjdFNjcm9sbCxcbiAgICAgIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk6IGhhbmRsZUtleWJvYXJkR2xvYmFsbHksXG4gICAgICBvbkxpYnJhcnlDaGFuZ2U6IG9uTGlicmFyeUNoYW5nZSxcbiAgICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgICAgb25CZWZvcmVUZXh0RWRpdDogb25CZWZvcmVUZXh0RWRpdCxcbiAgICAgIG9uQmVmb3JlVGV4dFN1Ym1pdDogb25CZWZvcmVUZXh0U3VibWl0LFxuICAgICAgZ2VuZXJhdGVJZEZvckZpbGU6IGdlbmVyYXRlSWRGb3JGaWxlLFxuICAgICAgb25UaGVtZUNoYW5nZTogb25UaGVtZUNoYW5nZSxcbiAgICAgIG9uTGlua09wZW46IG9uTGlua09wZW4sXG4gICAgICBvbkxpbmtIb3Zlcjogb25MaW5rSG92ZXJcbiAgICB9KVxuICB9KTtcbn07XG5cbmNvbnN0IGFyZUVxdWFsID0gZnVuY3Rpb24gKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBpbml0aWFsRGF0YTogcHJldkluaXRpYWxEYXRhLFxuICAgIFVJT3B0aW9uczogcHJldlVJT3B0aW9ucyA9IHt9XG4gIH0gPSBwcmV2UHJvcHMsXG4gICAgICAgIHByZXYgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJldlByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IHtcbiAgICBpbml0aWFsRGF0YTogbmV4dEluaXRpYWxEYXRhLFxuICAgIFVJT3B0aW9uczogbmV4dFVJT3B0aW9ucyA9IHt9XG4gIH0gPSBuZXh0UHJvcHMsXG4gICAgICAgIG5leHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMobmV4dFByb3BzLCBfZXhjbHVkZWQyKTsgLy8gY29tcGFyaW5nIFVJT3B0aW9uc1xuXG5cbiAgY29uc3QgcHJldlVJT3B0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhwcmV2VUlPcHRpb25zKTtcbiAgY29uc3QgbmV4dFVJT3B0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhuZXh0VUlPcHRpb25zKTtcblxuICBpZiAocHJldlVJT3B0aW9uc0tleXMubGVuZ3RoICE9PSBuZXh0VUlPcHRpb25zS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpc1VJT3B0aW9uc1NhbWUgPSBwcmV2VUlPcHRpb25zS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gXCJjYW52YXNBY3Rpb25zXCIpIHtcbiAgICAgIGNvbnN0IGNhbnZhc09wdGlvbktleXMgPSBPYmplY3Qua2V5cyhwcmV2VUlPcHRpb25zLmNhbnZhc0FjdGlvbnMpO1xuICAgICAgY2FudmFzT3B0aW9uS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZXhwb3J0XCIgJiYgcHJldlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uZXhwb3J0ICYmIG5leHRVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydCkge1xuICAgICAgICAgIHJldHVybiBwcmV2VUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID09PSBuZXh0VUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LltrZXldID09PSBuZXh0VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5ba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbiAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhwcmV2UHJvcHMpO1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIHJldHVybiBpc1VJT3B0aW9uc1NhbWUgJiYgcHJldktleXMubGVuZ3RoID09PSBuZXh0S2V5cy5sZW5ndGggJiYgcHJldktleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBwcmV2W2tleV0gPT09IG5leHRba2V5XTtcbiAgfSk7XG59O1xuXG5jb25zdCBmb3J3YXJkZWRSZWZDb21wID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEV4Y2FsaWRyYXcsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIGV4Y2FsaWRyYXdSZWY6IHJlZlxuICB9KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKGZvcndhcmRlZFJlZkNvbXAsIGFyZUVxdWFsKTtcbmV4cG9ydCB7IGdldFNjZW5lVmVyc2lvbiwgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsIGdldE5vbkRlbGV0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi8uLi9lbGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0TGFuZywgbGFuZ3VhZ2VzIH0gZnJvbSBcIi4uLy4uL2kxOG5cIjtcbmV4cG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVBcHBTdGF0ZSwgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVzdG9yZVwiO1xuZXhwb3J0IHsgZXhwb3J0VG9DYW52YXMsIGV4cG9ydFRvQmxvYiwgZXhwb3J0VG9TdmcsIHNlcmlhbGl6ZUFzSlNPTiwgbG9hZExpYnJhcnlGcm9tQmxvYiwgbG9hZEZyb21CbG9iLCBnZXRGcmVlRHJhd1N2Z1BhdGgsIGdldENvbW1vbkJvdW5kaW5nQm94LCBnZXRNYXhpbXVtR3JvdXBzLCBpbnRlcnNlY3RFbGVtZW50V2l0aExpbmUsIGRldGVybWluZUZvY3VzRGlzdGFuY2UgfSBmcm9tIFwiLi4vLi4vcGFja2FnZXMvdXRpbHNcIjtcbmV4cG9ydCB7IGlzTGluZWFyRWxlbWVudCB9IGZyb20gXCIuLi8uLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmV4cG9ydCB7IEZPTlRfRkFNSUxZLCBUSEVNRSB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcbmV4cG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoLCBidW1wVmVyc2lvbiB9IGZyb20gXCIuLi8uLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///./index.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/./index.tsx?");
2922
2922
 
2923
2923
  /***/ }),
2924
2924