@mintplayer/ng-bootstrap 20.6.1 → 20.6.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-dock.mjs","sources":["../tmp-esm2022/dock/src/lib/components/dock-pane.component.js","../tmp-esm2022/dock/src/lib/web-components/mint-dock-manager.element.js","../tmp-esm2022/dock/src/lib/components/dock-manager.component.js","../tmp-esm2022/dock/src/lib/dock.module.js","../tmp-esm2022/dock/mintplayer-ng-bootstrap-dock.js"],"sourcesContent":["import { Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class BsDockPaneComponent {\n ngAfterContentInit() {\n if (!this.name) {\n throw new Error('bs-dock-pane requires a unique \"name\" input.');\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockPaneComponent, isStandalone: false, selector: \"bs-dock-pane\", inputs: { name: \"name\", title: \"title\" }, viewQueries: [{ propertyName: \"template\", first: true, predicate: TemplateRef, descendants: true, static: true }], ngImport: i0, template: `<ng-template><ng-content></ng-content></ng-template>`, isInline: true }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'bs-dock-pane',\n template: `<ng-template><ng-content></ng-content></ng-template>`,\n standalone: false,\n }]\n }], propDecorators: { name: [{\n type: Input\n }], title: [{\n type: Input\n }], template: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1wYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0YsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQzs4R0FWVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiw2SkFJbkIsV0FBVyw4REFQWixzREFBc0Q7OzJGQUdyRCxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxzREFBc0Q7b0JBQ2hFLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs4QkFFVSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVvQyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stcGFuZScsXG4gIHRlbXBsYXRlOiBgPG5nLXRlbXBsYXRlPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPmAsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tQYW5lQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpIG5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JzLWRvY2stcGFuZSByZXF1aXJlcyBhIHVuaXF1ZSBcIm5hbWVcIiBpbnB1dC4nKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","const templateHtml = `\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n contain: layout paint size style;\n box-sizing: border-box;\n font-family: inherit;\n color: inherit;\n }\n\n .dock-root,\n .dock-docked,\n .dock-split,\n .dock-split__child,\n .dock-stack,\n .dock-stack__content,\n .dock-stack__pane {\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n }\n\n .dock-root {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .dock-docked {\n position: absolute;\n inset: 0;\n display: flex;\n z-index: 0;\n }\n\n .dock-floating-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 5;\n }\n\n .dock-floating {\n position: absolute;\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n border: 1px solid rgba(0, 0, 0, 0.3);\n border-radius: 0.5rem;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 16px 32px rgba(15, 23, 42, 0.25);\n overflow: hidden;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__chrome {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n cursor: move;\n background: linear-gradient(\n to bottom,\n rgba(148, 163, 184, 0.6),\n rgba(148, 163, 184, 0.25)\n );\n border-bottom: 1px solid rgba(148, 163, 184, 0.5);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .dock-floating__title {\n flex: 1 1 auto;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(30, 41, 59, 0.95);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dock-floating > .dock-stack {\n flex: 1 1 auto;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__resizer {\n position: absolute;\n pointer-events: auto;\n z-index: 2;\n background: rgba(148, 163, 184, 0.25);\n transition: background 120ms ease;\n }\n\n .dock-floating__resizer:hover {\n background: rgba(148, 163, 184, 0.4);\n }\n\n .dock-floating__resizer--top,\n .dock-floating__resizer--bottom {\n left: 0.75rem;\n right: 0.75rem;\n height: 0.5rem;\n }\n\n .dock-floating__resizer--top {\n top: 0;\n cursor: n-resize;\n }\n\n .dock-floating__resizer--bottom {\n bottom: 0;\n cursor: s-resize;\n }\n\n .dock-floating__resizer--left,\n .dock-floating__resizer--right {\n top: 1.75rem;\n bottom: 0.75rem;\n width: 0.5rem;\n }\n\n .dock-floating__resizer--left {\n left: 0;\n cursor: w-resize;\n }\n\n .dock-floating__resizer--right {\n right: 0;\n cursor: e-resize;\n }\n\n .dock-floating__resizer--top-left,\n .dock-floating__resizer--top-right,\n .dock-floating__resizer--bottom-left,\n .dock-floating__resizer--bottom-right {\n width: 0.75rem;\n height: 0.75rem;\n }\n\n .dock-floating__resizer--top-left {\n top: 0;\n left: 0;\n cursor: nw-resize;\n }\n\n .dock-floating__resizer--top-right {\n top: 0;\n right: 0;\n cursor: ne-resize;\n }\n\n .dock-floating__resizer--bottom-left {\n bottom: 0;\n left: 0;\n cursor: sw-resize;\n }\n\n .dock-floating__resizer--bottom-right {\n right: 0;\n bottom: 0;\n cursor: se-resize;\n }\n\n .dock-split {\n display: flex;\n flex: 1 1 0;\n gap: 0.25rem;\n position: relative;\n }\n\n .dock-split[data-direction=\"vertical\"] {\n flex-direction: column;\n }\n\n .dock-split[data-direction=\"horizontal\"] {\n flex-direction: row;\n }\n\n .dock-split__child {\n display: flex;\n flex: 1 1 0;\n position: relative;\n }\n\n .dock-split__divider {\n position: relative;\n flex: 0 0 auto;\n background: rgba(0, 0, 0, 0.08);\n transition: background 120ms ease;\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider {\n width: 0.5rem;\n cursor: col-resize;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider {\n height: 0.5rem;\n cursor: row-resize;\n }\n\n .dock-split__divider::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border-radius: 999px;\n background: rgba(0, 0, 0, 0.25);\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider::after {\n width: 0.125rem;\n height: 60%;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider::after {\n width: 60%;\n height: 0.125rem;\n }\n\n .dock-split__divider:hover,\n .dock-split__divider:focus-visible,\n .dock-split__divider[data-resizing='true'] {\n background: rgba(59, 130, 246, 0.35);\n }\n\n .dock-stack {\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.25rem;\n background: rgba(255, 255, 255, 0.75);\n backdrop-filter: blur(4px);\n }\n\n .dock-stack__header {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.25rem;\n background: rgba(0, 0, 0, 0.05);\n border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n }\n\n .dock-tab {\n appearance: none;\n border: none;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: grab;\n transition: background 160ms ease;\n }\n\n .dock-tab:active {\n cursor: grabbing;\n }\n\n .dock-tab:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .dock-tab:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.8);\n outline-offset: 1px;\n }\n\n .dock-tab--active {\n background: rgba(59, 130, 246, 0.15);\n }\n\n .dock-stack__content {\n position: relative;\n flex: 1 1 auto;\n display: flex;\n overflow: hidden;\n }\n\n .dock-stack__pane {\n position: relative;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dock-stack__pane[hidden] {\n display: none !important;\n }\n\n .dock-drop-indicator {\n position: absolute;\n pointer-events: none;\n border: 2px solid rgba(59, 130, 246, 0.9);\n background: rgba(59, 130, 246, 0.2);\n border-radius: 0.25rem;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 100;\n }\n\n .dock-drop-indicator[data-visible='true'] {\n opacity: 1;\n }\n\n .dock-drop-joystick {\n position: absolute;\n display: grid;\n grid-template-columns: repeat(3, min-content);\n grid-template-rows: repeat(3, min-content);\n gap: 0.125rem;\n padding: 0.125rem;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.15);\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);\n pointer-events: none;\n transform: translate(-50%, -50%);\n z-index: 110;\n }\n\n .dock-drop-joystick__spacer {\n width: 1.75rem;\n height: 1.75rem;\n pointer-events: none;\n }\n\n .dock-drop-joystick__button {\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n border: 1px solid rgba(59, 130, 246, 0.4);\n background: rgba(255, 255, 255, 0.9);\n color: rgba(30, 64, 175, 0.9);\n font-size: 0.75rem;\n line-height: 1;\n font-weight: 600;\n pointer-events: auto;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease, border-color 120ms ease;\n }\n\n .dock-drop-joystick__button[data-active='true'],\n .dock-drop-joystick__button:hover,\n .dock-drop-joystick__button:focus-visible {\n background: rgba(59, 130, 246, 0.25);\n border-color: rgba(59, 130, 246, 0.8);\n color: rgba(30, 64, 175, 1);\n }\n\n .dock-drop-joystick__button:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.9);\n outline-offset: 1px;\n }\n\n .dock-drop-joystick__button[data-zone='center'] {\n border-radius: 0.5rem;\n }\n\n ::slotted(*) {\n flex: 1 1 auto;\n display: block;\n min-width: 0;\n min-height: 0;\n }\n </style>\n <div class=\"dock-root\">\n <div class=\"dock-docked\"></div>\n <div class=\"dock-floating-layer\"></div>\n </div>\n <div class=\"dock-drop-indicator\"></div>\n <div class=\"dock-drop-joystick\" data-visible=\"false\">\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"top\"\n aria-label=\"Dock to top\"\n >\n ↑\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"left\"\n aria-label=\"Dock to left\"\n >\n ←\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"center\"\n aria-label=\"Dock to center\"\n >\n •\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"right\"\n aria-label=\"Dock to right\"\n >\n →\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"bottom\"\n aria-label=\"Dock to bottom\"\n >\n ↓\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n </div>\n`;\nlet cachedTemplate = null;\nlet cachedTemplateDocument = null;\nfunction ensureTemplate(documentRef) {\n if (!cachedTemplate || cachedTemplateDocument !== documentRef) {\n cachedTemplate = documentRef.createElement('template');\n cachedTemplate.innerHTML = templateHtml;\n cachedTemplateDocument = documentRef;\n }\n return cachedTemplate;\n}\nexport class MintDockManagerElement extends HTMLElement {\n static { this.documentRef = typeof document !== 'undefined' ? document : null; }\n static configureDocument(documentRef) {\n if (documentRef) {\n MintDockManagerElement.documentRef = documentRef;\n }\n }\n static get observedAttributes() {\n return ['layout'];\n }\n static { this.instanceCounter = 0; }\n constructor() {\n super();\n this.dropJoystickTarget = null;\n this.rootLayout = null;\n this.floatingLayouts = [];\n this.titles = {};\n this.pendingTabDragMetrics = null;\n this.resizeState = null;\n this.dragState = null;\n this.floatingDragState = null;\n this.floatingResizeState = null;\n this.pointerTrackingActive = false;\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.pendingDragEndTimeout = null;\n const documentRef = this.resolveDocument();\n this.documentRef = documentRef;\n this.windowRef = this.resolveWindow(documentRef);\n const shadowRoot = this.attachShadow({ mode: 'open' });\n const template = ensureTemplate(documentRef);\n shadowRoot.appendChild(template.content.cloneNode(true));\n const root = shadowRoot.querySelector('.dock-root');\n if (!root) {\n throw new Error('mint-dock-manager template is missing the root element.');\n }\n const docked = shadowRoot.querySelector('.dock-docked');\n if (!docked) {\n throw new Error('mint-dock-manager template is missing the docked surface element.');\n }\n const floatingLayer = shadowRoot.querySelector('.dock-floating-layer');\n if (!floatingLayer) {\n throw new Error('mint-dock-manager template is missing the floating layer element.');\n }\n const indicator = shadowRoot.querySelector('.dock-drop-indicator');\n if (!indicator) {\n throw new Error('mint-dock-manager template is missing the drop indicator element.');\n }\n const joystick = shadowRoot.querySelector('.dock-drop-joystick');\n if (!joystick) {\n throw new Error('mint-dock-manager template is missing the drop joystick element.');\n }\n const joystickButtons = Array.from(joystick.querySelectorAll('.dock-drop-joystick__button[data-zone]'));\n if (joystickButtons.length === 0) {\n throw new Error('mint-dock-manager template is missing drop joystick buttons.');\n }\n this.rootEl = root;\n this.dockedEl = docked;\n this.floatingLayerEl = floatingLayer;\n this.dropIndicator = indicator;\n this.dropJoystick = joystick;\n this.dropJoystickButtons = joystickButtons;\n this.instanceId = `mint-dock-${++MintDockManagerElement.instanceCounter}`;\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n this.onDragOver = this.onDragOver.bind(this);\n this.onGlobalDragOver = this.onGlobalDragOver.bind(this);\n this.onGlobalDragEnd = this.onGlobalDragEnd.bind(this);\n this.onDrop = this.onDrop.bind(this);\n this.onDragLeave = this.onDragLeave.bind(this);\n this.onDrag = this.onDrag.bind(this);\n this.onDragMouseMove = this.onDragMouseMove.bind(this);\n this.onDragTouchMove = this.onDragTouchMove.bind(this);\n this.onDragMouseUp = this.onDragMouseUp.bind(this);\n this.onDragTouchEnd = this.onDragTouchEnd.bind(this);\n }\n connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'application');\n }\n // Tag the docked surface with a root path so it can act as\n // a drop target when the main layout is empty.\n this.dockedEl.dataset['path'] = this.formatPath({ type: 'docked', segments: [] });\n this.render();\n this.rootEl.addEventListener('dragover', this.onDragOver);\n this.rootEl.addEventListener('drop', this.onDrop);\n this.rootEl.addEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.addEventListener('dragover', this.onDragOver);\n this.dropJoystick.addEventListener('drop', this.onDrop);\n this.dropJoystick.addEventListener('dragleave', this.onDragLeave);\n // Strengthen zone tracking by reacting to dragenter/dragover directly on the buttons.\n // This avoids relying solely on hit-testing each frame which can be jittery during HTML5 drag.\n this.dropJoystickButtons.forEach((btn) => {\n const handler = (e) => {\n if (!this.dragState)\n return;\n const z = btn.dataset['zone'];\n if (this.isDropZone(z)) {\n this.updateDropJoystickActiveZone(z);\n e.preventDefault();\n }\n };\n btn.addEventListener('dragenter', handler);\n btn.addEventListener('dragover', handler);\n });\n const win = this.windowRef;\n win?.addEventListener('dragover', this.onGlobalDragOver);\n win?.addEventListener('drag', this.onDrag);\n win?.addEventListener('dragend', this.onGlobalDragEnd, true);\n }\n disconnectedCallback() {\n this.rootEl.removeEventListener('dragover', this.onDragOver);\n this.rootEl.removeEventListener('drop', this.onDrop);\n this.rootEl.removeEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.removeEventListener('dragover', this.onDragOver);\n this.dropJoystick.removeEventListener('drop', this.onDrop);\n this.dropJoystick.removeEventListener('dragleave', this.onDragLeave);\n const win = this.windowRef;\n win?.removeEventListener('dragover', this.onGlobalDragOver);\n win?.removeEventListener('drag', this.onDrag);\n win?.removeEventListener('dragend', this.onGlobalDragEnd, true);\n this.stopDragPointerTracking();\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n attributeChangedCallback(name, _oldValue, newValue) {\n if (name === 'layout') {\n this.layout = newValue ? this.parseLayout(newValue) : null;\n }\n }\n get layout() {\n return {\n root: this.cloneLayoutNode(this.rootLayout),\n floating: this.cloneFloatingArray(this.floatingLayouts),\n titles: { ...this.titles },\n };\n }\n set layout(value) {\n const snapshot = this.ensureSnapshot(value);\n this.rootLayout = this.cloneLayoutNode(snapshot.root);\n this.floatingLayouts = this.cloneFloatingArray(snapshot.floating);\n this.titles = snapshot.titles ? { ...snapshot.titles } : {};\n this.render();\n }\n get snapshot() {\n return this.layout;\n }\n toJSON() {\n return this.snapshot;\n }\n resolveDocument() {\n const staticDocument = MintDockManagerElement.documentRef;\n const ownerDocument = this.ownerDocument ?? null;\n const globalDocument = typeof document !== 'undefined' ? document : null;\n const resolvedDocument = staticDocument ?? ownerDocument ?? globalDocument;\n if (!resolvedDocument) {\n throw new Error('mint-dock-manager requires a Document to initialize.');\n }\n if (!MintDockManagerElement.documentRef) {\n MintDockManagerElement.documentRef = resolvedDocument;\n }\n return resolvedDocument;\n }\n resolveWindow(documentRef) {\n if (typeof window !== 'undefined') {\n return window;\n }\n return documentRef.defaultView ?? null;\n }\n parseLayout(value) {\n try {\n const parsed = JSON.parse(value);\n return this.ensureSnapshot(parsed);\n }\n catch (err) {\n console.warn('mint-dock-manager: failed to parse layout attribute', err);\n return null;\n }\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if (value.kind) {\n return { root: value, floating: [], titles: {} };\n }\n const layout = value;\n return {\n root: layout.root ?? null,\n floating: Array.isArray(layout.floating)\n ? layout.floating.map((floating) => this.normalizeFloatingLayout(floating))\n : [],\n titles: layout.titles ? { ...layout.titles } : {},\n };\n }\n render() {\n this.dockedEl.innerHTML = '';\n this.floatingLayerEl.innerHTML = '';\n this.hideDropIndicator();\n if (this.rootLayout) {\n const fragment = this.renderNode(this.rootLayout, []);\n this.dockedEl.appendChild(fragment);\n }\n this.renderFloatingPanes();\n }\n renderNode(node, path, floatingIndex) {\n if (node.kind === 'split') {\n return this.renderSplit(node, path, floatingIndex);\n }\n return this.renderStack(node, path, floatingIndex);\n }\n renderFloatingPanes() {\n this.floatingLayerEl.innerHTML = '';\n this.floatingLayouts.forEach((floating, index) => {\n const wrapper = this.documentRef.createElement('div');\n wrapper.classList.add('dock-floating');\n wrapper.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const { left, top, width, height } = floating.bounds;\n wrapper.style.left = `${left}px`;\n wrapper.style.top = `${top}px`;\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n const zIndex = this.getFloatingPaneZIndex(index);\n wrapper.style.zIndex = String(zIndex);\n const chrome = this.documentRef.createElement('div');\n chrome.classList.add('dock-floating__chrome');\n chrome.addEventListener('pointerdown', (event) => this.beginFloatingDrag(event, index, wrapper, chrome));\n const title = this.documentRef.createElement('div');\n title.classList.add('dock-floating__title');\n title.textContent = this.getFloatingWindowTitle(floating);\n chrome.appendChild(title);\n wrapper.appendChild(chrome);\n if (floating.root) {\n const content = this.renderNode(floating.root, [], index);\n content.classList.add('dock-floating__stack');\n wrapper.appendChild(content);\n }\n else {\n const placeholder = this.documentRef.createElement('div');\n placeholder.classList.add('dock-stack');\n placeholder.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n placeholder.appendChild(empty);\n wrapper.appendChild(placeholder);\n }\n const resizerConfigs = [\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-left'],\n edges: { horizontal: 'left', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top'],\n edges: { horizontal: 'none', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-right'],\n edges: { horizontal: 'right', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--right'],\n edges: { horizontal: 'right', vertical: 'none' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-right'],\n edges: { horizontal: 'right', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom'],\n edges: { horizontal: 'none', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-left'],\n edges: { horizontal: 'left', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--left'],\n edges: { horizontal: 'left', vertical: 'none' },\n },\n ];\n resizerConfigs.forEach(({ classes, edges }) => {\n const resizer = this.documentRef.createElement('div');\n resizer.classList.add(...classes);\n resizer.addEventListener('pointerdown', (event) => this.beginFloatingResize(event, index, wrapper, resizer, edges));\n wrapper.appendChild(resizer);\n });\n this.floatingLayerEl.appendChild(wrapper);\n });\n }\n beginFloatingDrag(event, index, wrapper, handle) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const { left, top } = floating.bounds;\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* no-op: pointer capture may not be supported in all environments */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingDragState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startLeft: left,\n startTop: top,\n wrapper,\n handle,\n };\n this.startPointerTracking();\n }\n beginFloatingResize(event, index, wrapper, handle, edges) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* pointer capture may not be supported */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingResizeState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startWidth: floating.bounds.width,\n startHeight: floating.bounds.height,\n startLeft: floating.bounds.left,\n startTop: floating.bounds.top,\n wrapper,\n handle,\n edges,\n };\n this.startPointerTracking();\n }\n handleFloatingDragMove(event) {\n const state = this.floatingDragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const newLeft = state.startLeft + deltaX;\n const newTop = state.startTop + deltaY;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n this.updateFloatingDragDropTarget(event);\n }\n endFloatingDrag(pointerId) {\n const state = this.floatingDragState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n const dropHandled = state.dropTarget\n ? this.handleFloatingStackDrop(state.index, state.dropTarget.path, state.dropTarget.zone)\n : false;\n this.floatingDragState = null;\n this.hideDropIndicator();\n if (!dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n updateFloatingDragDropTarget(event) {\n const state = this.floatingDragState;\n if (!state) {\n return;\n }\n const stack = this.findStackAtPoint(event.clientX, event.clientY);\n if (!stack) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n if (!path || (path.type === 'floating' && path.index === state.index)) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n // Reset sticky zone when moving to another stack while dragging the\n // floating window so the side doesn't carry over.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const zone = this.computeDropZone(stack, event, this.extractDropZoneFromEvent(event));\n if (zone) {\n state.dropTarget = { path, zone };\n }\n else if (state.dropTarget) {\n delete state.dropTarget;\n }\n this.showDropIndicator(stack, zone);\n }\n handleFloatingResizeMove(event) {\n const state = this.floatingResizeState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const minWidth = 192;\n const minHeight = 128;\n let newWidth = state.startWidth;\n let newHeight = state.startHeight;\n let newLeft = state.startLeft;\n let newTop = state.startTop;\n if (state.edges.horizontal === 'right') {\n newWidth = Math.max(minWidth, state.startWidth + deltaX);\n }\n else if (state.edges.horizontal === 'left') {\n newWidth = Math.max(minWidth, state.startWidth - deltaX);\n newLeft = state.startLeft + (state.startWidth - newWidth);\n }\n if (state.edges.vertical === 'bottom') {\n newHeight = Math.max(minHeight, state.startHeight + deltaY);\n }\n else if (state.edges.vertical === 'top') {\n newHeight = Math.max(minHeight, state.startHeight - deltaY);\n newTop = state.startTop + (state.startHeight - newHeight);\n }\n state.wrapper.style.width = `${newWidth}px`;\n state.wrapper.style.height = `${newHeight}px`;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.width = newWidth;\n floating.bounds.height = newHeight;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n }\n endFloatingResize(pointerId) {\n const state = this.floatingResizeState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n this.floatingResizeState = null;\n this.dispatchLayoutChanged();\n }\n getFloatingPaneZIndex(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return 10 + index;\n }\n const base = typeof floating.zIndex === 'number' && Number.isFinite(floating.zIndex)\n ? floating.zIndex\n : 10 + index;\n return base;\n }\n promoteFloatingPane(index, wrapper) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const maxExisting = this.floatingLayouts.reduce((max, layout, idx) => {\n if (!layout) {\n return max;\n }\n const z = idx === index ? Number.NEGATIVE_INFINITY : this.getFloatingPaneZIndex(idx);\n return Math.max(max, z);\n }, 0);\n const nextZ = Math.max(maxExisting + 2, 12);\n floating.zIndex = nextZ;\n wrapper.style.zIndex = String(nextZ);\n }\n getFloatingWrapper(index) {\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n return this.floatingLayerEl.querySelector(selector);\n }\n startPointerTracking() {\n if (this.pointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.addEventListener('pointermove', this.onPointerMove);\n win?.addEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = true;\n }\n stopPointerTrackingIfIdle() {\n if (this.pointerTrackingActive &&\n !this.resizeState &&\n !this.floatingDragState &&\n !this.floatingResizeState) {\n const win = this.windowRef;\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n }\n getFloatingWindowTitle(floating) {\n const fallback = 'Floating Pane';\n if (!floating || !floating.root) {\n return fallback;\n }\n const preferred = floating.activePane ?? this.findFirstPaneName(floating.root);\n if (!preferred) {\n return fallback;\n }\n return this.titles[preferred] ?? preferred ?? fallback;\n }\n updateFloatingWindowTitle(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n const wrapper = this.floatingLayerEl.querySelector(selector);\n if (!wrapper) {\n return;\n }\n const titleEl = wrapper.querySelector('.dock-floating__title');\n if (!titleEl) {\n return;\n }\n titleEl.textContent = this.getFloatingWindowTitle(floating);\n }\n renderSplit(node, path, floatingIndex) {\n const container = this.documentRef.createElement('div');\n container.classList.add('dock-split');\n container.dataset['direction'] = node.direction;\n container.dataset['path'] = path.join('/');\n const sizes = Array.isArray(node.sizes) ? node.sizes : [];\n node.children.forEach((child, index) => {\n const childWrapper = this.documentRef.createElement('div');\n childWrapper.classList.add('dock-split__child');\n childWrapper.dataset['index'] = String(index);\n const size = sizes[index];\n if (typeof size === 'number' && Number.isFinite(size)) {\n childWrapper.style.flex = `${Math.max(size, 0)} 1 0`;\n }\n else {\n childWrapper.style.flex = '1 1 0';\n }\n childWrapper.appendChild(this.renderNode(child, [...path, index], floatingIndex));\n container.appendChild(childWrapper);\n if (index < node.children.length - 1) {\n const divider = this.documentRef.createElement('div');\n divider.classList.add('dock-split__divider');\n divider.setAttribute('role', 'separator');\n divider.tabIndex = 0;\n divider.addEventListener('pointerdown', (event) => this.beginResize(event, container, floatingIndex !== undefined\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] }, index));\n container.appendChild(divider);\n }\n });\n return container;\n }\n renderStack(node, path, floatingIndex) {\n const stack = this.documentRef.createElement('div');\n stack.classList.add('dock-stack');\n const location = typeof floatingIndex === 'number'\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] };\n stack.dataset['path'] = this.formatPath(location);\n const header = this.documentRef.createElement('div');\n header.classList.add('dock-stack__header');\n header.setAttribute('role', 'tablist');\n const content = this.documentRef.createElement('div');\n content.classList.add('dock-stack__content');\n const panes = Array.from(new Set(node.panes));\n if (panes.length === 0) {\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n content.appendChild(empty);\n stack.append(header, content);\n return stack;\n }\n const activePane = panes.includes(node.activePane ?? '')\n ? node.activePane\n : panes[0];\n const baseSlug = path.length ? path.join('-') : 'root';\n const pathSlug = typeof floatingIndex === 'number' ? `f${floatingIndex}-${baseSlug}` : baseSlug;\n panes.forEach((paneName) => {\n const paneSlugRaw = paneName.replace(/[^a-zA-Z0-9_-]/g, '-');\n const paneSlug = paneSlugRaw.length > 0 ? paneSlugRaw : 'pane';\n const tabId = `${this.instanceId}-tab-${pathSlug}-${paneSlug}`;\n const panelId = `${this.instanceId}-panel-${pathSlug}-${paneSlug}`;\n const button = this.documentRef.createElement('button');\n button.type = 'button';\n button.classList.add('dock-tab');\n button.dataset['pane'] = paneName;\n button.id = tabId;\n button.textContent = this.titles[paneName] ?? paneName;\n button.setAttribute('role', 'tab');\n button.setAttribute('aria-controls', panelId);\n if (paneName === activePane) {\n button.classList.add('dock-tab--active');\n }\n button.setAttribute('aria-selected', String(paneName === activePane));\n button.draggable = true;\n button.addEventListener('pointerdown', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.captureTabDragMetrics(event, stackEl ?? null);\n event.stopPropagation();\n });\n button.addEventListener('pointerup', () => this.clearPendingTabDragMetrics());\n button.addEventListener('pointercancel', () => this.clearPendingTabDragMetrics());\n button.addEventListener('dragstart', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.beginPaneDrag(event, this.clonePath(location), paneName, stackEl ?? null);\n });\n button.addEventListener('dragend', () => {\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n });\n button.addEventListener('click', () => {\n this.activatePane(stack, paneName, this.clonePath(location));\n this.dispatchEvent(new CustomEvent('dock-pane-activated', {\n detail: { pane: paneName },\n bubbles: true,\n composed: true,\n }));\n });\n header.appendChild(button);\n const paneHost = this.documentRef.createElement('div');\n paneHost.classList.add('dock-stack__pane');\n paneHost.dataset['pane'] = paneName;\n paneHost.id = panelId;\n paneHost.setAttribute('role', 'tabpanel');\n paneHost.setAttribute('aria-labelledby', tabId);\n if (paneName !== activePane) {\n paneHost.setAttribute('hidden', '');\n }\n const slotEl = this.documentRef.createElement('slot');\n slotEl.name = paneName;\n paneHost.appendChild(slotEl);\n content.appendChild(paneHost);\n });\n stack.dataset['activePane'] = activePane;\n stack.append(header, content);\n return stack;\n }\n beginResize(event, container, path, index) {\n event.preventDefault();\n const divider = event.currentTarget;\n if (!divider) {\n return;\n }\n const orientation = container.dataset['direction'] ?? 'horizontal';\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n const initialSizes = children.map((child) => {\n const rect = child.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n const beforeSize = initialSizes[index];\n const afterSize = initialSizes[index + 1];\n const startPos = orientation === 'horizontal' ? event.clientX : event.clientY;\n divider.setPointerCapture(event.pointerId);\n divider.dataset['resizing'] = 'true';\n this.resizeState = {\n path: this.clonePath(path),\n index,\n pointerId: event.pointerId,\n orientation,\n container,\n divider,\n startPos,\n initialSizes,\n beforeSize,\n afterSize,\n };\n this.startPointerTracking();\n }\n onPointerMove(event) {\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const state = this.resizeState;\n const splitNode = this.resolveSplitNode(state.path);\n if (!splitNode) {\n return;\n }\n const currentPos = state.orientation === 'horizontal' ? event.clientX : event.clientY;\n const delta = currentPos - state.startPos;\n const minSize = 48;\n const pairTotal = state.beforeSize + state.afterSize;\n let newBefore = Math.min(Math.max(state.beforeSize + delta, minSize), pairTotal - minSize);\n let newAfter = pairTotal - newBefore;\n if (!Number.isFinite(newBefore) || !Number.isFinite(newAfter)) {\n return;\n }\n if (newAfter < minSize) {\n newAfter = minSize;\n newBefore = pairTotal - minSize;\n }\n const newSizesPixels = [...state.initialSizes];\n newSizesPixels[state.index] = newBefore;\n newSizesPixels[state.index + 1] = newAfter;\n const total = newSizesPixels.reduce((acc, size) => acc + size, 0);\n const normalized = total > 0 ? newSizesPixels.map((size) => size / total) : [];\n splitNode.sizes = normalized;\n const children = Array.from(state.container.querySelectorAll(':scope > .dock-split__child'));\n normalized.forEach((size, idx) => {\n if (children[idx]) {\n children[idx].style.flex = `${Math.max(size, 0)} 1 0`;\n }\n });\n this.dispatchLayoutChanged();\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.handleFloatingResizeMove(event);\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.handleFloatingDragMove(event);\n }\n }\n onPointerUp(event) {\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const divider = this.resizeState.divider;\n divider.dataset['resizing'] = 'false';\n divider.releasePointerCapture(this.resizeState.pointerId);\n this.resizeState = null;\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.endFloatingDrag(event.pointerId);\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.endFloatingResize(event.pointerId);\n }\n this.stopPointerTrackingIfIdle();\n }\n captureTabDragMetrics(event, stackEl) {\n if (!stackEl) {\n this.pendingTabDragMetrics = null;\n return;\n }\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n this.pendingTabDragMetrics = null;\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl.getBoundingClientRect();\n const pointerOffsetX = event.clientX - stackRect.left;\n const pointerOffsetY = event.clientY - stackRect.top;\n const left = stackRect.left - hostRect.left;\n const top = stackRect.top - hostRect.top;\n const width = Number.isFinite(stackRect.width) ? stackRect.width : 0;\n const height = Number.isFinite(stackRect.height) ? stackRect.height : 0;\n this.pendingTabDragMetrics = {\n pointerOffsetX,\n pointerOffsetY,\n left,\n top,\n width,\n height,\n startClientX: event.clientX,\n startClientY: event.clientY,\n };\n }\n clearPendingTabDragMetrics() {\n this.pendingTabDragMetrics = null;\n }\n beginPaneDrag(event, path, pane, stackEl) {\n if (!event.dataTransfer) {\n return;\n }\n // Create a ghost element for the drag image. This prevents the browser from cancelling\n // the drag operation when the original element is removed from the DOM during re-render.\n const ghost = event.currentTarget.cloneNode(true);\n ghost.style.position = 'absolute';\n ghost.style.left = '-9999px';\n ghost.style.top = '-9999px';\n ghost.style.width = `${event.currentTarget.offsetWidth}px`;\n ghost.style.height = `${event.currentTarget.offsetHeight}px`;\n this.shadowRoot?.appendChild(ghost);\n // Use the ghost element as the drag image.\n // The offset is set to where the user's cursor is on the original element.\n const dragImgOffsetX = Number.isFinite(event.offsetX) ? event.offsetX : 0;\n const dragImgOffsetY = Number.isFinite(event.offsetY) ? event.offsetY : 0;\n event.dataTransfer.setDragImage(ghost, dragImgOffsetX, dragImgOffsetY);\n // The ghost element is no longer needed after the drag image is set.\n // We defer its removal to ensure the browser has captured it.\n setTimeout(() => ghost.remove(), 0);\n const { path: sourcePath, floatingIndex, pointerOffsetX, pointerOffsetY, } = this.preparePaneDragSource(path, pane, stackEl, event);\n // Capture header bounds for detecting when to convert to floating\n const headerEl = stackEl?.querySelector('.dock-stack__header') ?? null;\n const headerRect = headerEl ? headerEl.getBoundingClientRect() : null;\n const headerBounds = headerRect\n ? { left: headerRect.left, top: headerRect.top, right: headerRect.right, bottom: headerRect.bottom }\n : null;\n const metrics = this.pendingTabDragMetrics;\n this.dragState = {\n pane,\n sourcePath: this.clonePath(sourcePath),\n floatingIndex,\n pointerOffsetX,\n pointerOffsetY,\n dropHandled: false,\n sourceStackEl: stackEl,\n sourceHeaderBounds: headerBounds,\n startClientX: metrics && Number.isFinite(metrics.startClientX)\n ? metrics.startClientX\n : Number.isFinite(event.clientX)\n ? event.clientX\n : undefined,\n startClientY: metrics && Number.isFinite(metrics.startClientY)\n ? metrics.startClientY\n : Number.isFinite(event.clientY)\n ? event.clientY\n : undefined,\n };\n // Seed last known pointer position from pointerdown metrics to avoid (0,0) glitches in Firefox\n if (this.dragState.startClientX !== undefined &&\n this.dragState.startClientY !== undefined &&\n Number.isFinite(this.dragState.startClientX) &&\n Number.isFinite(this.dragState.startClientY)) {\n this.lastDragPointerPosition = {\n x: this.dragState.startClientX,\n y: this.dragState.startClientY,\n };\n }\n // Prefer the pointer offset relative to the dragged tab to avoid jumps on conversion\n if (Number.isFinite(event.offsetX)) {\n this.dragState.pointerOffsetX = event.offsetX;\n }\n if (Number.isFinite(event.offsetY)) {\n this.dragState.pointerOffsetY = event.offsetY;\n }\n this.updateDraggedFloatingPosition(event);\n this.startDragPointerTracking();\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', pane);\n // Preferred UX: if the dragged tab is the only one in its stack,\n // immediately convert to a floating window unless it is already the\n // only pane in a floating window (this case is handled by reuse logic).\n if (this.dragState && this.dragState.floatingIndex !== null && this.dragState.floatingIndex < 0) {\n const loc = this.resolveStackLocation(this.dragState.sourcePath);\n if (loc && Array.isArray(loc.node.panes) && loc.node.panes.length === 1) {\n let shouldConvert = false;\n if (loc.context === \"docked\") {\n shouldConvert = true;\n }\n else if (loc.context === \"floating\") {\n const floating = this.floatingLayouts[loc.index];\n const totalPanes = floating && floating.root ? this.countPanesInTree(floating.root) : 0;\n shouldConvert = totalPanes > 1; // not the only pane in this floating window\n }\n if (shouldConvert) {\n const startX = Number.isFinite(event.clientX) ? event.clientX : (this.dragState.startClientX ?? 0);\n const startY = Number.isFinite(event.clientY) ? event.clientY : (this.dragState.startClientY ?? 0);\n this.convertPendingTabDragToFloating(startX, startY);\n }\n }\n }\n }\n preparePaneDragSource(path, pane, stackEl, event) {\n const location = this.resolveStackLocation(path);\n if (!location || !location.node.panes.includes(pane)) {\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n const metrics = this.pendingTabDragMetrics;\n const domHasSibling = !!stackEl &&\n Array.from(stackEl.querySelectorAll('.dock-tab')).some((button) => button.dataset['pane'] && button.dataset['pane'] !== pane);\n const hasSiblingInStack = location.node.panes.some((existing) => existing !== pane);\n const floating = location.context === 'floating' ? this.floatingLayouts[location.index] : null;\n const floatingPaneCount = floating && floating.root ? this.countPanesInTree(floating.root) : hasSiblingInStack ? 2 : 1;\n const shouldReuseExistingWindow = location.context === 'floating' &&\n !!floating &&\n !hasSiblingInStack &&\n !domHasSibling &&\n floatingPaneCount <= 1;\n if (shouldReuseExistingWindow) {\n if (floating) {\n floating.activePane = pane;\n this.updateFloatingWindowTitle(location.index);\n const wrapper = this.getFloatingWrapper(location.index);\n if (wrapper) {\n this.promoteFloatingPane(location.index, wrapper);\n }\n const hostRect = this.getBoundingClientRect();\n const pointerOffsetX = metrics &&\n Number.isFinite(metrics.pointerOffsetX) &&\n Number.isFinite(metrics.left) &&\n Number.isFinite(floating.bounds.left)\n ? metrics.pointerOffsetX + (metrics.left - floating.bounds.left)\n : Number.isFinite(event.clientX) && Number.isFinite(floating.bounds.left)\n ? event.clientX - hostRect.left - floating.bounds.left\n : floating.bounds.width / 2;\n const pointerOffsetY = metrics &&\n Number.isFinite(metrics.pointerOffsetY) &&\n Number.isFinite(metrics.top) &&\n Number.isFinite(floating.bounds.top)\n ? metrics.pointerOffsetY + (metrics.top - floating.bounds.top)\n : Number.isFinite(event.clientY) && Number.isFinite(floating.bounds.top)\n ? event.clientY - hostRect.top - floating.bounds.top\n : floating.bounds.height / 2;\n return {\n path,\n floatingIndex: location.index,\n pointerOffsetX,\n pointerOffsetY,\n };\n }\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n // Do not convert to floating yet; allow in-header reordering first.\n // We return placeholder values and will convert once the pointer leaves the tab header.\n const pointerOffsetXVal = metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : 0;\n const pointerOffsetYVal = metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : 0;\n return {\n path,\n floatingIndex: -1,\n pointerOffsetX: pointerOffsetXVal,\n pointerOffsetY: pointerOffsetYVal,\n };\n }\n endPaneDrag() {\n this.clearPendingDragEndTimeout();\n const state = this.dragState;\n this.dragState = null;\n this.hideDropIndicator();\n this.clearHeaderDragPlaceholder();\n this.stopDragPointerTracking();\n this.lastDragPointerPosition = null;\n if (state && state.floatingIndex !== null && !state.dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n onDragOver(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n // Keep internal pointer tracking up-to-date.\n this.updateDraggedFloatingPosition(event);\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n // Some browsers intermittently report (0,0) for dragover coordinates.\n // Mirror the robust logic used in onDrop: prefer actual event coordinates\n // when valid, otherwise fall back to the last tracked pointer position.\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? { clientX: this.lastDragPointerPosition.x, clientY: this.lastDragPointerPosition.y }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n if (!stack) {\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n // While reordering within the same header, suppress the joystick/indicator entirely\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const px = (point ? point.clientX : event.clientX);\n const py = (point ? point.clientY : event.clientY);\n if (Number.isFinite(px) && Number.isFinite(py) && this.isPointerOverSourceHeader(px, py)) {\n // Drive live reorder using the unified path so we update instantly.\n this.updatePaneDragDropTargetFromPoint(px, py);\n this.hideDropIndicator();\n return;\n }\n }\n // If the hovered stack changed, clear any sticky zone from the previous\n // target before computing the new zone.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint);\n this.showDropIndicator(stack, zone);\n }\n updateDraggedFloatingPosition(event) {\n if (!this.dragState) {\n return;\n }\n const { clientX, clientY } = event;\n const hasValidCoordinates = Number.isFinite(clientX) &&\n Number.isFinite(clientY) &&\n !(clientX === 0 && clientY === 0);\n if (hasValidCoordinates) {\n this.lastDragPointerPosition = { x: clientX, y: clientY };\n this.updateDraggedFloatingPositionFromPoint(clientX, clientY);\n return;\n }\n if (this.lastDragPointerPosition) {\n const { x, y } = this.lastDragPointerPosition;\n this.updateDraggedFloatingPositionFromPoint(x, y);\n }\n }\n onGlobalDragOver(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onDrag(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onGlobalDragEnd() {\n // Attempt to finalize a drop even if the drop event doesn't reach us (Firefox/edge cases)\n const state = this.dragState;\n const pos = this.lastDragPointerPosition;\n if (state && pos) {\n const stack = this.findStackAtPoint(pos.x, pos.y);\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n const path = stack ? this.parsePath(stack.dataset['path']) : (joystickPath ?? joystickTargetPath);\n const joystickZone = this.dropJoystick.dataset['zone'];\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : (stack ? this.computeDropZone(stack, { clientX: pos.x, clientY: pos.y }, null) : null);\n if (path && this.isDropZone(zone)) {\n this.handleDrop(path, zone);\n this.hideDropIndicator();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n }\n else {\n this.hideDropIndicator();\n }\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n }\n updateDraggedFloatingPositionFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) {\n return;\n }\n // Ignore obviously bogus coordinates sometimes seen during HTML5 drag\n if (clientX === 0 && clientY === 0) {\n return;\n }\n // If still dragging a tab inside its header, only convert to floating once we leave the header.\n if (this.dragState.floatingIndex !== null && this.dragState.floatingIndex < 0) {\n const b = this.dragState.sourceHeaderBounds;\n const sx = this.dragState.startClientX ?? clientX;\n const sy = this.dragState.startClientY ?? clientY;\n const dist = Math.hypot(clientX - sx, clientY - sy);\n const threshold = 8; // pixels to move before converting (tuned up)\n // Default to inside while bounds are unknown to avoid premature floating\n let insideHeader = true;\n const insideByBounds = b ? this.isPointWithinBounds(b, clientX, clientY) : true;\n const insideByHitTest = this.isPointerOverSourceHeader(clientX, clientY);\n insideHeader = insideByBounds || insideByHitTest;\n if (!insideHeader && dist > threshold) {\n // Convert to floating now using current pointer position\n this.convertPendingTabDragToFloating(clientX, clientY);\n }\n }\n this.updatePaneDragDropTargetFromPoint(clientX, clientY);\n const { floatingIndex, pointerOffsetX, pointerOffsetY } = this.dragState;\n if (floatingIndex === null || floatingIndex < 0) {\n return;\n }\n const floating = this.floatingLayouts[floatingIndex];\n if (!floating) {\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const newLeft = clientX - hostRect.left - pointerOffsetX;\n const newTop = clientY - hostRect.top - pointerOffsetY;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n const wrapper = this.getFloatingWrapper(floatingIndex);\n if (wrapper) {\n wrapper.style.left = `${newLeft}px`;\n wrapper.style.top = `${newTop}px`;\n }\n }\n updatePaneDragDropTargetFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const path = stack ? this.parsePath(stack.dataset['path']) : null;\n if (!stack || !path) {\n // While actively dragging, avoid hiding the indicator if it is visible.\n // Transient misses from hit-testing are common near the joystick.\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n // Also ensure any in-header placeholder is cleared when not over a stack\n this.clearHeaderDragPlaceholder();\n return;\n }\n // If we moved to a different target stack, reset any sticky zone so\n // the new drop area doesn't inherit the previous side selection.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n // Previous behavior hid the indicator and returned early here; instead,\n // allow the live-reorder branch below to handle in-header drags.\n // While dragging within the same header, show a placeholder and suppress joystick/indicator\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const inHeaderByBounds = !!this.dragState.sourceHeaderBounds && this.isPointWithinBounds(this.dragState.sourceHeaderBounds, clientX, clientY);\n const inHeaderByHitTest = this.isPointerOverSourceHeader(clientX, clientY);\n if (inHeaderByBounds || inHeaderByHitTest) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n // Ensure placeholder exists and move it as the pointer moves\n this.ensureHeaderDragPlaceholder(header, this.dragState.pane);\n const idx = this.computeHeaderInsertIndex(header, clientX);\n if (this.dragState.liveReorderIndex !== idx) {\n this.updateHeaderDragPlaceholderPosition(header, idx);\n // Keep model reordering until drop; only move the placeholder now\n this.dragState.liveReorderIndex = idx;\n }\n }\n this.hideDropIndicator();\n return;\n }\n }\n // Leaving the header: ensure any placeholder is removed immediately\n this.clearHeaderDragPlaceholder();\n const zoneHint = this.findDropZoneByPoint(clientX, clientY);\n const zone = this.computeDropZone(stack, { clientX, clientY }, zoneHint);\n this.showDropIndicator(stack, zone);\n }\n // Returns true when the pointer is currently over the source stack's header (tab strip)\n isPointerOverSourceHeader(clientX, clientY) {\n const state = this.dragState;\n if (!state) {\n return false;\n }\n const stackEl = state.sourceStackEl ?? null;\n const header = stackEl?.querySelector('.dock-stack__header');\n if (!header) {\n // Be conservative: if we cannot resolve the header, treat as inside\n return true;\n }\n const sr = this.shadowRoot;\n const elements = sr ? sr.elementsFromPoint(clientX, clientY) : [];\n for (const el of elements) {\n if (el instanceof HTMLElement && header.contains(el)) {\n return true;\n }\n }\n return false;\n }\n isPointWithinBounds(bounds, x, y) {\n return x >= bounds.left && x <= bounds.right && y >= bounds.top && y <= bounds.bottom;\n }\n // Ensure a placeholder tab exists during in-header drag and hide the real dragged tab visually\n ensureHeaderDragPlaceholder(header, pane) {\n if (this.dragState?.placeholderHeader === header && this.dragState.placeholderEl) {\n return;\n }\n const dragged = Array.from(header.querySelectorAll('.dock-tab')).find((t) => t.dataset['pane'] === pane) ?? null;\n if (!dragged) {\n return;\n }\n // Create placeholder\n const placeholder = this.documentRef.createElement('button');\n placeholder.type = 'button';\n placeholder.classList.add('dock-tab');\n placeholder.dataset['placeholder'] = 'true';\n // Keep the placeholder visually empty but reserving the same width\n placeholder.textContent = '';\n placeholder.setAttribute('aria-hidden', 'true');\n placeholder.style.width = `${dragged.offsetWidth}px`;\n // Hide the original dragged tab so it doesn't duplicate visually and free up its slot\n dragged.style.display = 'none';\n // Insert placeholder in the original position of the dragged tab\n header.insertBefore(placeholder, dragged);\n if (this.dragState) {\n this.dragState.placeholderHeader = header;\n this.dragState.placeholderEl = placeholder;\n }\n }\n // Move the placeholder to the computed target index within the header\n updateHeaderDragPlaceholderPosition(header, targetIndex) {\n const placeholder = this.dragState?.placeholderEl ?? null;\n if (!placeholder) {\n return;\n }\n const draggedPane = this.dragState?.pane ?? null;\n const tabs = Array.from(header.querySelectorAll('.dock-tab'))\n .filter((t) => t !== placeholder && (!draggedPane || t.dataset['pane'] !== draggedPane));\n const clampedTarget = Math.max(0, Math.min(targetIndex, tabs.length));\n const ref = tabs[clampedTarget] ?? null;\n header.insertBefore(placeholder, ref);\n }\n // Remove placeholder and restore original tab visibility\n clearHeaderDragPlaceholder() {\n const ph = this.dragState?.placeholderEl ?? null;\n const header = this.dragState?.placeholderHeader ?? null;\n if (header) {\n const dragged = this.dragState?.pane\n ? (Array.from(header.querySelectorAll('.dock-tab')).find((t) => t.dataset['pane'] === this.dragState?.pane) ?? null)\n : null;\n if (dragged) {\n dragged.style.display = '';\n }\n }\n if (ph && ph.parentElement) {\n ph.parentElement.removeChild(ph);\n }\n if (this.dragState) {\n this.dragState.placeholderEl = null;\n this.dragState.placeholderHeader = null;\n }\n }\n startDragPointerTracking() {\n if (this.dragPointerTrackingActive) {\n return;\n }\n this.lastDragPointerPosition = null;\n const win = this.windowRef;\n win?.addEventListener('mousemove', this.onDragMouseMove, true);\n win?.addEventListener('touchmove', this.onDragTouchMove, { passive: false });\n win?.addEventListener('mouseup', this.onDragMouseUp, true);\n win?.addEventListener('touchend', this.onDragTouchEnd, true);\n win?.addEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = true;\n }\n stopDragPointerTracking() {\n if (!this.dragPointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.removeEventListener('mousemove', this.onDragMouseMove, true);\n win?.removeEventListener('touchmove', this.onDragTouchMove);\n win?.removeEventListener('mouseup', this.onDragMouseUp, true);\n win?.removeEventListener('touchend', this.onDragTouchEnd, true);\n win?.removeEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.clearPendingDragEndTimeout();\n }\n onDragMouseMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n if (event.buttons === 0) {\n this.scheduleDeferredDragEnd();\n return;\n }\n this.lastDragPointerPosition = { x: event.clientX, y: event.clientY };\n this.updateDraggedFloatingPositionFromPoint(event.clientX, event.clientY);\n }\n onDragTouchMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n const touch = event.touches[0];\n if (!touch) {\n this.scheduleDeferredDragEnd();\n return;\n }\n event.preventDefault();\n this.lastDragPointerPosition = { x: touch.clientX, y: touch.clientY };\n this.updateDraggedFloatingPositionFromPoint(touch.clientX, touch.clientY);\n }\n onDragMouseUp() {\n // Prefer committing a drop from pointer-up since some browsers suppress drop events\n if (this.dragState) {\n const pos = this.lastDragPointerPosition;\n if (pos) {\n this.finalizeDropFromPoint(pos.x, pos.y);\n }\n }\n this.handleDragPointerUpCommon();\n }\n // Convert a currently in-header tab drag into a floating window\n convertPendingTabDragToFloating(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const state = this.dragState;\n if (state.floatingIndex !== null && state.floatingIndex >= 0) {\n return; // already floating\n }\n // Clean up any placeholder before converting\n this.clearHeaderDragPlaceholder();\n const location = this.resolveStackLocation(state.sourcePath);\n if (!location) {\n return;\n }\n const pane = state.pane;\n const stackEl = state.sourceStackEl ?? null;\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl?.getBoundingClientRect() ?? null;\n const metrics = this.pendingTabDragMetrics;\n const fallbackWidth = 320;\n const fallbackHeight = 240;\n const width = metrics && Number.isFinite(metrics.width) && metrics.width > 0\n ? metrics.width\n : stackRect && Number.isFinite(stackRect.width)\n ? stackRect.width\n : fallbackWidth;\n const height = metrics && Number.isFinite(metrics.height) && metrics.height > 0\n ? metrics.height\n : stackRect && Number.isFinite(stackRect.height)\n ? stackRect.height\n : fallbackHeight;\n const pointerOffsetX = Number.isFinite(this.dragState?.pointerOffsetX)\n ? this.dragState.pointerOffsetX\n : metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : width / 2;\n const pointerOffsetY = Number.isFinite(this.dragState?.pointerOffsetY)\n ? this.dragState.pointerOffsetY\n : metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : height / 2;\n const pointerLeft = Number.isFinite(clientX)\n ? clientX - hostRect.left - pointerOffsetX\n : 0;\n const pointerTop = Number.isFinite(clientY)\n ? clientY - hostRect.top - pointerOffsetY\n : 0;\n // Remove pane from its current stack and create a new floating entry\n this.removePaneFromLocation(location, pane);\n const floatingStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n const floatingLayout = {\n bounds: {\n left: pointerLeft,\n top: pointerTop,\n width,\n height,\n },\n root: floatingStack,\n activePane: pane,\n };\n this.floatingLayouts.push(floatingLayout);\n const newIndex = this.floatingLayouts.length - 1;\n this.render();\n const wrapper = this.getFloatingWrapper(newIndex);\n if (wrapper) {\n this.promoteFloatingPane(newIndex, wrapper);\n }\n // Update drag state so subsequent moves reposition the floating window\n state.sourcePath = { type: 'floating', index: newIndex, segments: [] };\n state.floatingIndex = newIndex;\n state.pointerOffsetX = pointerOffsetX;\n state.pointerOffsetY = pointerOffsetY;\n this.dispatchLayoutChanged();\n }\n // Compute the intended tab insert index within a header based on pointer X\n // Adds a slight rightward bias and uses the placeholder rect (if present)\n // to ensure offsets are correct even when the dragged tab is display:none.\n computeHeaderInsertIndex(header, clientX) {\n const allTabs = Array.from(header.querySelectorAll('.dock-tab'));\n if (allTabs.length === 0) {\n return 0;\n }\n const draggedPane = this.dragState?.pane ?? null;\n const draggedEl = draggedPane\n ? (allTabs.find((t) => t.dataset['pane'] === draggedPane) ?? null)\n : null;\n const placeholderEl = header.querySelector('.dock-tab[data-placeholder=\"true\"]');\n const targets = allTabs.filter((t) => t !== draggedEl && t !== placeholderEl);\n if (targets.length === 0) {\n return 0;\n }\n const rightBias = 12;\n const leftBias = 0;\n const baseRect = placeholderEl\n ? placeholderEl.getBoundingClientRect()\n : draggedEl\n ? draggedEl.getBoundingClientRect()\n : null;\n const rectValid = !!baseRect && Number.isFinite(baseRect.width) && baseRect.width > 0;\n const draggedCenter = rectValid && baseRect ? baseRect.left + baseRect.width / 2 : null;\n for (let i = 0; i < targets.length; i += 1) {\n const rect = targets[i].getBoundingClientRect();\n const baseMid = rect.left + rect.width / 2;\n const isRightOfDragged = draggedCenter !== null ? baseMid >= draggedCenter : false;\n const mid = isRightOfDragged ? baseMid + rightBias : baseMid - leftBias;\n if (clientX < mid) {\n return i;\n }\n }\n return targets.length;\n }\n reorderPaneInLocationAtIndex(location, pane, targetIndex) {\n const panes = location.node.panes;\n const currentIndex = panes.indexOf(pane);\n if (currentIndex === -1) {\n return;\n }\n const clampedTarget = Math.max(0, Math.min(targetIndex, panes.length - 1));\n if (clampedTarget === currentIndex) {\n return;\n }\n panes.splice(currentIndex, 1);\n panes.splice(clampedTarget, 0, pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n onDragTouchEnd() {\n this.handleDragPointerUpCommon();\n }\n // Commit a drop using current pointer coordinates and joystick state\n finalizeDropFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const stackPath = stack ? this.parsePath(stack.dataset['path']) : null;\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickStoredPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n const path = (joystickVisible ? (joystickStoredPath ?? joystickTargetPath) : null) ?? stackPath;\n const joystickZone = this.dropJoystick.dataset['zone'];\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : (stack ? this.computeDropZone(stack, { clientX, clientY }, null) : null);\n // Same-header reorder case when no side zone is chosen\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n stack &&\n path &&\n stackPath &&\n this.pathsEqual(stackPath, this.dragState.sourcePath) &&\n (!zone || zone === 'center')) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, clientX);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n return;\n }\n }\n }\n if (path && this.isDropZone(zone)) {\n this.handleDrop(path, zone);\n this.dragState.dropHandled = true;\n }\n }\n clearPendingDragEndTimeout() {\n if (this.pendingDragEndTimeout !== null) {\n const win = this.windowRef;\n if (win && typeof this.pendingDragEndTimeout === 'number') {\n win.clearTimeout(this.pendingDragEndTimeout);\n }\n else {\n globalThis.clearTimeout(this.pendingDragEndTimeout);\n }\n this.pendingDragEndTimeout = null;\n }\n }\n scheduleDeferredDragEnd() {\n if (this.pendingDragEndTimeout !== null) {\n return;\n }\n const completeDrag = () => {\n this.pendingDragEndTimeout = null;\n this.hideDropIndicator();\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n };\n const win = this.windowRef;\n this.pendingDragEndTimeout = win\n ? win.setTimeout(completeDrag, 0)\n : setTimeout(completeDrag, 0);\n }\n onDrop(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? {\n clientX: this.lastDragPointerPosition.x,\n clientY: this.lastDragPointerPosition.y,\n }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n // Prefer joystick's stored target path when the joystick is visible (drop over buttons)\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n let path = stack\n ? this.parsePath(stack.dataset['path'])\n : (joystickPath ?? joystickTargetPath);\n if (!path && joystickVisible) {\n // As a last resort, target the main dock surface only when empty\n const dockPath = this.parsePath(this.dockedEl.dataset['path']);\n path = (!this.rootLayout ? dockPath : null);\n }\n // Defer same-header reorder decision until after zone resolution below\n // Prefer joystick's active zone if available, else infer from event/point\n const joystickZone = this.dropJoystick.dataset['zone'];\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : stack\n ? this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint)\n : (this.isDropZone(pointZoneHint ?? eventZoneHint) ? (pointZoneHint ?? eventZoneHint) : null);\n // If still in same header and no side zone chosen, treat as in-header reorder\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n stack &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath) &&\n (!zone || zone === 'center')) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const x = (point ? point.clientX : event.clientX);\n if (Number.isFinite(x)) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, x);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n this.endPaneDrag();\n return;\n }\n }\n }\n }\n // If joystick is visible and both path and zone are resolved, force using joystick as authoritative\n if (joystickVisible && path && this.isDropZone(joystickZone)) {\n this.handleDrop(path, joystickZone);\n this.endPaneDrag();\n return;\n }\n if (!zone) {\n this.hideDropIndicator();\n this.endPaneDrag();\n return;\n }\n this.handleDrop(path, zone);\n this.endPaneDrag();\n }\n onDragLeave(event) {\n const related = event.relatedTarget;\n // During active drags, browsers can emit spurious dragleave with null\n // relatedTarget while the pointer is still over the joystick/buttons.\n // Be conservative: if we can resolve a stack/joystick at the last known\n // pointer position, don’t hide (prevents flicker of active state).\n if (this.dragState) {\n const pos = (Number.isFinite(event.clientX) && Number.isFinite(event.clientY))\n ? { x: event.clientX, y: event.clientY }\n : this.lastDragPointerPosition;\n if (pos) {\n const stackAtPoint = this.findStackAtPoint(pos.x, pos.y);\n if (stackAtPoint) {\n return; // still inside our drop area; ignore this dragleave\n }\n }\n }\n if (!related) {\n this.hideDropIndicator();\n return;\n }\n const rootContains = this.rootEl.contains(related);\n const joystickContains = this.dropJoystick.contains(related);\n if (!rootContains && !joystickContains) {\n this.hideDropIndicator();\n }\n }\n handleDrop(targetPath, zone) {\n if (!this.dragState || !targetPath) {\n return;\n }\n const { pane, sourcePath } = this.dragState;\n const source = this.resolveStackLocation(sourcePath);\n const target = this.resolveStackLocation(targetPath);\n // Special case: allow dropping onto an empty main dock area (no root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n if (!source) {\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n const newRoot = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n this.rootLayout = newRoot;\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n if (!source || !target) {\n return;\n }\n if (zone === 'center' && this.pathsEqual(sourcePath, targetPath)) {\n if (!source.node.panes.includes(pane)) {\n return;\n }\n this.reorderPaneInLocation(source, pane);\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n if (zone === 'center') {\n this.addPaneToLocation(target, pane);\n this.setActivePaneForLocation(target, pane);\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const newStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n if (target.context === 'docked') {\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, newStack, zone);\n }\n else {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n return;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, newStack, zone);\n floating.activePane = pane;\n }\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n handleFloatingStackDrop(sourceIndex, targetPath, zone) {\n const source = this.floatingLayouts[sourceIndex];\n if (!source || !source.root) {\n return false;\n }\n const target = this.resolveStackLocation(targetPath);\n // Allow dropping an entire floating stack onto an empty main dock area\n // (no existing root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n this.rootLayout = this.cloneLayoutNode(source.root);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (!target) {\n return false;\n }\n if (target.context === 'floating' && target.index === sourceIndex) {\n return false;\n }\n if (zone === 'center') {\n const panes = this.collectPaneNames(source.root);\n if (panes.length === 0) {\n return false;\n }\n panes.forEach((pane) => {\n this.addPaneToLocation(target, pane);\n });\n const activePane = source.activePane && panes.includes(source.activePane)\n ? source.activePane\n : this.findFirstPaneName(source.root) ?? panes[0];\n if (activePane) {\n this.setActivePaneForLocation(target, activePane);\n }\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (target.context === 'floating') {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n return false;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, source.root, zone);\n floating.activePane = source.activePane ?? this.findFirstPaneName(source.root) ?? undefined;\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, source.root, zone);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n insertWeight(sizes, index, totalChildren) {\n const existingCount = totalChildren - 1;\n const normalized = this.normalizeSizesArray(sizes, existingCount);\n const newWeight = 1 / totalChildren;\n const remaining = 1 - newWeight;\n const result = [];\n for (let i = 0; i < totalChildren; i += 1) {\n if (i === index) {\n result.push(newWeight);\n }\n else {\n const sourceIndex = i < index ? i : i - 1;\n result.push(normalized[sourceIndex] * remaining);\n }\n }\n return result;\n }\n removePaneFromStack(stack, pane, skipCleanup = false) {\n stack.panes = stack.panes.filter((p) => p !== pane);\n if (!stack.panes.includes(stack.activePane ?? '')) {\n if (stack.panes.length > 0) {\n stack.activePane = stack.panes[0];\n }\n else {\n delete stack.activePane;\n }\n }\n if (stack.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, stack);\n return true;\n }\n findParentSplit(node, child) {\n if (!node || node === child) {\n return null;\n }\n if (node.kind !== 'split') {\n return null;\n }\n const index = node.children.indexOf(child);\n if (index !== -1) {\n return { parent: node, index };\n }\n for (let i = 0; i < node.children.length; i += 1) {\n const result = this.findParentSplit(node.children[i], child);\n if (result) {\n return result;\n }\n }\n return null;\n }\n computeDropZone(stack, point, zoneHint) {\n // Do not force a zone: even when the main area is empty we only\n // activate a zone when the pointer is actually over a joystick button.\n const hintedZone = this.isDropZone(zoneHint) ? zoneHint : null;\n if (hintedZone) {\n this.updateDropJoystickActiveZone(hintedZone);\n return hintedZone;\n }\n const pointZone = point &&\n Number.isFinite(point.clientX) &&\n Number.isFinite(point.clientY)\n ? this.findDropZoneByPoint(point.clientX, point.clientY)\n : null;\n if (pointZone) {\n this.updateDropJoystickActiveZone(pointZone);\n return pointZone;\n }\n if (this.dropJoystickTarget === stack) {\n // Be sticky while hovering the joystick: if we recently had a zone\n // selected, prefer keeping it instead of briefly clearing to null\n // when the browser reports transient coordinates/targets during drag.\n const sticky = this.dropJoystick.dataset['zone'];\n if (this.isDropZone(sticky)) {\n this.updateDropJoystickActiveZone(sticky);\n return sticky;\n }\n this.updateDropJoystickActiveZone(null);\n }\n return null;\n }\n extractDropZoneFromEvent(event) {\n if (!event) {\n return null;\n }\n if (typeof event.composedPath === 'function') {\n const path = event.composedPath();\n const zone = this.findDropZoneInTargets(path);\n if (zone) {\n return zone;\n }\n }\n if ('clientX' in event && 'clientY' in event) {\n const pointEvent = event;\n const zoneFromPoint = this.findDropZoneByPoint(pointEvent.clientX, pointEvent.clientY);\n if (zoneFromPoint) {\n return zoneFromPoint;\n }\n }\n return null;\n }\n handleDragPointerUpCommon() {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n this.scheduleDeferredDragEnd();\n }\n findDropZoneInTargets(targets) {\n for (const target of targets) {\n if (target instanceof HTMLElement &&\n target.classList.contains('dock-drop-joystick__button')) {\n const zone = target.dataset?.['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n findDropZoneByPoint(clientX, clientY) {\n if (!this.dropJoystickButtons ||\n this.dropJoystick.dataset['visible'] !== 'true' ||\n !this.dropJoystickTarget) {\n return null;\n }\n for (const button of this.dropJoystickButtons) {\n // Skip hidden/inactive buttons (used in center-only mode)\n if ((button.dataset['hidden'] === 'true') || button.style.visibility === 'hidden' || button.style.display === 'none') {\n continue;\n }\n const rect = button.getBoundingClientRect();\n if (clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom) {\n const zone = button.dataset['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n updateDropJoystickActiveZone(zone) {\n // If no zone is computed but the joystick is visible, keep the last\n // known active zone to avoid visual jitter while dragging across\n // small gaps where hit‑testing momentarily fails.\n const visible = this.dropJoystick.dataset['visible'] === 'true';\n const sticky = visible ? this.dropJoystick.dataset['zone'] : undefined;\n const effectiveZone = zone ?? (this.isDropZone(sticky) ? sticky : null);\n this.dropJoystickButtons.forEach((button) => {\n const isActive = effectiveZone !== null && button.dataset['zone'] === effectiveZone;\n if (isActive) {\n button.dataset['active'] = 'true';\n }\n else {\n delete button.dataset['active'];\n }\n });\n if (effectiveZone) {\n this.dropJoystick.dataset['zone'] = effectiveZone;\n }\n else {\n delete this.dropJoystick.dataset['zone'];\n }\n }\n isDropZone(value) {\n return value === 'left' || value === 'right' || value === 'top' || value === 'bottom' || value === 'center';\n }\n showDropIndicator(stack, zone) {\n const targetPath = this.parsePath(stack.dataset['path']);\n const sourcePath = this.dragState?.sourcePath ?? null;\n if (targetPath && sourcePath && this.isOrIsAncestorOf(targetPath, sourcePath)) {\n // Don't show any drop indicators on the pane being dragged.\n return;\n }\n const rect = stack.getBoundingClientRect();\n const hostRect = this.getBoundingClientRect();\n const indicator = this.dropIndicator;\n const joystick = this.dropJoystick;\n joystick.hidden = false;\n const path = this.parsePath(stack.dataset['path']);\n let overlayZ = 100;\n if (path && path.type === 'floating') {\n overlayZ = this.getFloatingPaneZIndex(path.index) + 100;\n }\n indicator.style.zIndex = String(overlayZ);\n joystick.style.zIndex = String(overlayZ + 1);\n let left = rect.left - hostRect.left;\n let top = rect.top - hostRect.top;\n let width = rect.width;\n let height = rect.height;\n const portion = 0.5;\n if (zone) {\n switch (zone) {\n case 'left':\n width = rect.width * portion;\n break;\n case 'right':\n width = rect.width * portion;\n left += rect.width * (1 - portion);\n break;\n case 'top':\n height = rect.height * portion;\n break;\n case 'bottom':\n height = rect.height * portion;\n top += rect.height * (1 - portion);\n break;\n default:\n break;\n }\n indicator.style.left = `${left}px`;\n indicator.style.top = `${top}px`;\n indicator.style.width = `${width}px`;\n indicator.style.height = `${height}px`;\n indicator.dataset['visible'] = 'true';\n }\n else {\n indicator.dataset['visible'] = 'false';\n }\n joystick.style.left = `${rect.left - hostRect.left + rect.width / 2}px`;\n joystick.style.top = `${rect.top - hostRect.top + rect.height / 2}px`;\n joystick.dataset['visible'] = 'true';\n this.dropJoystick.style.display = 'grid';\n joystick.dataset['path'] = stack.dataset['path'] ?? '';\n const changedTarget = this.dropJoystickTarget && this.dropJoystickTarget !== stack;\n this.dropJoystickTarget = stack;\n if (changedTarget) {\n // New target stack: forget any previously sticky zone.\n delete this.dropJoystick.dataset['zone'];\n }\n // If main dock area is empty, show only the center button and collapse the grid\n const isEmptyMainArea = !this.rootLayout && (stack === this.dockedEl || (targetPath && targetPath.type === 'docked' && targetPath.segments.length === 0));\n const spacers = Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer'));\n if (isEmptyMainArea) {\n // Keep spacers visible so the joystick keeps its circular footprint.\n spacers.forEach((s) => {\n s.style.display = '';\n });\n this.dropJoystickButtons.forEach((btn) => {\n const isCenter = btn.dataset['zone'] === 'center';\n if (isCenter) {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n }\n else {\n // Hide visually but keep layout space; also prevent interaction.\n btn.style.visibility = 'hidden';\n btn.style.pointerEvents = 'none';\n btn.dataset['hidden'] = 'true';\n btn.style.display = '';\n }\n });\n // Keep default 3x3 grid so the circular background size stays the same.\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n // Do not set an active zone automatically; users must hover the button.\n }\n else {\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n });\n spacers.forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n this.updateDropJoystickActiveZone(zone);\n }\n hideDropIndicator() {\n this.dropIndicator.dataset['visible'] = 'false';\n this.dropJoystick.dataset['visible'] = 'false';\n this.dropJoystick.style.display = 'none';\n delete this.dropJoystick.dataset['path'];\n this.dropJoystickTarget = null;\n this.updateDropJoystickActiveZone(null);\n // Restore joystick structure to default.\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.display = '';\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n });\n Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer')).forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n findStackAtPoint(clientX, clientY) {\n const shadow = this.shadowRoot;\n if (!shadow) {\n return null;\n }\n const elements = shadow.elementsFromPoint(clientX, clientY);\n const stack = this.findStackInTargets(elements);\n if (stack) {\n return stack;\n }\n // If there are no docked stacks (all panes are floating), allow the\n // docked surface itself to serve as a drop target for the main zone.\n if (!this.rootLayout) {\n const dockRect = this.dockedEl.getBoundingClientRect();\n if (clientX >= dockRect.left &&\n clientX <= dockRect.right &&\n clientY >= dockRect.top &&\n clientY <= dockRect.bottom) {\n return this.dockedEl;\n }\n }\n return null;\n }\n findStackElement(event) {\n const path = event.composedPath();\n const stack = this.findStackInTargets(path);\n if (stack) {\n return stack;\n }\n // If the root dock area is empty, treat the docked surface as a valid\n // target when it appears in the composed path.\n if (!this.rootLayout) {\n for (const target of path) {\n if (target instanceof HTMLElement &&\n (target === this.dockedEl || target.classList.contains('dock-docked'))) {\n return this.dockedEl;\n }\n }\n }\n return null;\n }\n findStackInTargets(targets) {\n for (const element of targets) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.classList.contains('dock-stack')) {\n return element;\n }\n if (this.dropJoystickTarget &&\n (element.classList.contains('dock-drop-joystick') ||\n element.classList.contains('dock-drop-joystick__button') ||\n element.classList.contains('dock-drop-joystick__spacer'))) {\n return this.dropJoystickTarget;\n }\n }\n return null;\n }\n activatePane(stack, paneName, path) {\n stack.dataset['activePane'] = paneName;\n const headerButtons = stack.querySelectorAll('.dock-tab');\n headerButtons.forEach((button) => {\n const isSelected = button.dataset['pane'] === paneName;\n button.classList.toggle('dock-tab--active', isSelected);\n button.setAttribute('aria-selected', String(isSelected));\n });\n const panes = stack.querySelectorAll('.dock-stack__pane');\n panes.forEach((pane) => {\n if (pane.dataset['pane'] === paneName) {\n pane.removeAttribute('hidden');\n }\n else {\n pane.setAttribute('hidden', '');\n }\n });\n const location = this.resolveStackLocation(path);\n if (!location) {\n return;\n }\n location.node.activePane = paneName;\n if (path.type === 'floating') {\n const floating = this.floatingLayouts[path.index];\n if (floating) {\n floating.activePane = paneName;\n }\n this.updateFloatingWindowTitle(path.index);\n }\n this.dispatchLayoutChanged();\n }\n getNodeAtPath(root, path) {\n if (!root) {\n return null;\n }\n let current = root;\n if (path.length === 0) {\n return current;\n }\n for (const segment of path) {\n if (!current || current.kind !== 'split') {\n return null;\n }\n current = current.children[segment] ?? null;\n }\n return current;\n }\n resolveSplitNode(path) {\n if (path.type === 'docked') {\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n const floating = this.floatingLayouts[path.index];\n if (!floating || !floating.root) {\n return null;\n }\n const node = this.getNodeAtPath(floating.root, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n replaceNodeInTree(root, target, replacement) {\n if (!root) {\n return replacement;\n }\n if (root === target) {\n return replacement;\n }\n const parentInfo = this.findParentSplit(root, target);\n if (!parentInfo) {\n return root;\n }\n parentInfo.parent.children[parentInfo.index] = replacement;\n this.normalizeSplitNode(parentInfo.parent);\n return root;\n }\n cleanupEmptyStackInTree(root, stack) {\n if (!root || stack.panes.length > 0) {\n return root;\n }\n const parentInfo = this.findParentSplit(root, stack);\n if (!parentInfo) {\n return root === stack ? null : root;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(stack);\n if (index === -1) {\n return root;\n }\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n cleanupSplitIfNecessary(root, split) {\n if (split.children.length === 1) {\n return this.replaceNodeInTree(root, split, split.children[0]);\n }\n if (split.children.length === 0) {\n const parentInfo = this.findParentSplit(root, split);\n if (!parentInfo) {\n return null;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(split);\n if (index !== -1) {\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n }\n return root;\n }\n dockNodeBeside(root, targetNode, newNode, zone) {\n const orientation = zone === 'left' || zone === 'right' ? 'horizontal' : 'vertical';\n const placeBefore = zone === 'left' || zone === 'top';\n const parentInfo = this.findParentSplit(root, targetNode);\n if (parentInfo && parentInfo.parent.direction === orientation) {\n const insertIndex = placeBefore ? parentInfo.index : parentInfo.index + 1;\n parentInfo.parent.children.splice(insertIndex, 0, newNode);\n parentInfo.parent.sizes = this.insertWeight(parentInfo.parent.sizes, insertIndex, parentInfo.parent.children.length);\n return root ?? newNode;\n }\n const split = {\n kind: 'split',\n direction: orientation,\n children: placeBefore ? [newNode, targetNode] : [targetNode, newNode],\n sizes: [0.5, 0.5],\n };\n return this.replaceNodeInTree(root, targetNode, split);\n }\n forEachStack(node, visitor, path = []) {\n if (!node) {\n return;\n }\n if (node.kind === 'stack') {\n visitor(node, path);\n return;\n }\n node.children.forEach((child, index) => this.forEachStack(child, visitor, [...path, index]));\n }\n findStackContainingPane(node, pane) {\n let result = null;\n this.forEachStack(node, (stack) => {\n if (!result && stack.panes.includes(pane)) {\n result = stack;\n }\n });\n return result;\n }\n findFirstPaneName(node) {\n let found = null;\n this.forEachStack(node, (stack) => {\n if (found || stack.panes.length === 0) {\n return;\n }\n if (stack.activePane && stack.panes.includes(stack.activePane)) {\n found = stack.activePane;\n }\n else {\n found = stack.panes[0];\n }\n });\n return found;\n }\n collectFloatingPaneMetadata(node) {\n // Deprecated method retained temporarily for signature compatibility.\n // Use collectPaneNames instead.\n const panes = this.collectPaneNames(node);\n const titles = {};\n panes.forEach((p) => {\n const t = this.titles[p];\n if (t) {\n titles[p] = t;\n }\n });\n return { panes, titles };\n }\n collectPaneNames(node) {\n const panes = [];\n this.forEachStack(node, (stack) => {\n stack.panes.forEach((pane) => panes.push(pane));\n });\n return panes;\n }\n normalizeFloatingLayout(layout) {\n const bounds = layout.bounds ?? { left: 0, top: 0, width: 320, height: 200 };\n const normalizedBounds = {\n left: Number.isFinite(bounds.left) ? bounds.left : 0,\n top: Number.isFinite(bounds.top) ? bounds.top : 0,\n width: Number.isFinite(bounds.width) ? Math.max(bounds.width, 160) : 320,\n height: Number.isFinite(bounds.height) ? Math.max(bounds.height, 120) : 200,\n };\n const root = layout.root ? this.cloneLayoutNode(layout.root) : null;\n return {\n id: layout.id,\n bounds: normalizedBounds,\n zIndex: layout.zIndex,\n root,\n activePane: layout.activePane,\n };\n }\n formatPath(path) {\n if (path.type === 'floating') {\n const suffix = path.segments.length > 0\n ? `/${path.segments.map((segment) => segment.toString()).join('/')}`\n : '';\n return `f:${path.index}${suffix}`;\n }\n const suffix = path.segments.join('/');\n return suffix.length > 0 ? `d:${suffix}` : 'd:';\n }\n clonePath(path) {\n if (path.type === 'floating') {\n return { type: 'floating', index: path.index, segments: [...path.segments] };\n }\n return { type: 'docked', segments: [...path.segments] };\n }\n parsePath(path) {\n if (!path) {\n return null;\n }\n if (path.startsWith('f:')) {\n const remainder = path.slice(2);\n const [indexPart, ...segmentParts] = remainder.split('/');\n const index = Number.parseInt(indexPart, 10);\n if (!Number.isFinite(index)) {\n return null;\n }\n const segments = segmentParts\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'floating', index, segments };\n }\n const normalized = path.startsWith('d:') ? path.slice(2) : path;\n if (normalized.length === 0) {\n return { type: 'docked', segments: [] };\n }\n const segments = normalized\n .split('/')\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'docked', segments };\n }\n pathsEqual(a, b) {\n if (a.type !== b.type) {\n return false;\n }\n if (a.type === 'floating') {\n const other = b;\n if (a.index !== other.index) {\n return false;\n }\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n const other = b;\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n isOrIsAncestorOf(ancestor, descendant) {\n if (ancestor.type !== descendant.type) {\n return false;\n }\n if (ancestor.type === 'floating') {\n if (descendant.index !== ancestor.index) {\n return false;\n }\n }\n if (ancestor.segments.length > descendant.segments.length) {\n return false;\n }\n return ancestor.segments.every((segment, i) => segment === descendant.segments[i]);\n }\n countPanesInTree(node) {\n if (!node) {\n return 0;\n }\n if (node.kind === 'stack') {\n return node.panes.length;\n }\n return node.children.reduce((total, child) => total + this.countPanesInTree(child), 0);\n }\n resolveStackLocation(path) {\n if (path.type === 'floating') {\n const layout = this.floatingLayouts[path.index];\n if (!layout || !layout.root) {\n return null;\n }\n const node = this.getNodeAtPath(layout.root, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'floating', index: path.index, path: [...path.segments], node };\n }\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'docked', path: [...path.segments], node };\n }\n removePaneFromLocation(location, pane, skipCleanup = false) {\n if (location.context === 'docked') {\n return this.removePaneFromStack(location.node, pane, skipCleanup);\n }\n return this.removePaneFromFloating(location.index, location.path, pane, skipCleanup);\n }\n addPaneToLocation(location, pane) {\n const panes = location.node.panes;\n const existingIndex = panes.indexOf(pane);\n if (existingIndex !== -1) {\n panes.splice(existingIndex, 1);\n }\n panes.push(pane);\n }\n setActivePaneForLocation(location, pane) {\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n cleanupLocation(location) {\n if (location.context === 'docked') {\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, location.node);\n }\n else {\n const floating = this.floatingLayouts[location.index];\n if (!floating) {\n return;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, location.node);\n if (!floating.root) {\n this.removeFloatingAt(location.index);\n }\n }\n }\n reorderPaneInLocation(location, pane) {\n const panes = location.node.panes;\n const index = panes.indexOf(pane);\n if (index === -1) {\n return;\n }\n panes.splice(index, 1);\n panes.push(pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n removeFloatingAt(index) {\n if (index < 0 || index >= this.floatingLayouts.length) {\n return;\n }\n this.floatingLayouts.splice(index, 1);\n }\n removePaneFromFloating(index, path, pane, skipCleanup = false) {\n const floating = this.floatingLayouts[index];\n if (!floating || !floating.root) {\n return false;\n }\n const node = this.getNodeAtPath(floating.root, path);\n if (!node || node.kind !== 'stack') {\n return false;\n }\n node.panes = node.panes.filter((p) => p !== pane);\n if (!node.panes.includes(node.activePane ?? '')) {\n if (node.panes.length > 0) {\n node.activePane = node.panes[0];\n }\n else {\n delete node.activePane;\n }\n }\n if (floating.activePane === pane) {\n const fallback = this.findFirstPaneName(floating.root);\n if (fallback) {\n floating.activePane = fallback;\n }\n else {\n delete floating.activePane;\n }\n }\n if (node.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, node);\n if (!floating.root) {\n this.removeFloatingAt(index);\n }\n return true;\n }\n normalizeSizesArray(sizes, count) {\n if (count <= 0) {\n return [];\n }\n if (!Array.isArray(sizes) || sizes.length !== count) {\n return Array.from({ length: count }, () => 1 / count);\n }\n const normalized = sizes.map((value) => (Number.isFinite(value) ? Math.max(value, 0) : 0));\n const total = normalized.reduce((acc, value) => acc + value, 0);\n if (total <= 0) {\n return Array.from({ length: count }, () => 1 / count);\n }\n return normalized.map((value) => value / total);\n }\n normalizeSplitNode(split) {\n split.sizes = this.normalizeSizesArray(split.sizes, split.children.length);\n }\n dispatchLayoutChanged() {\n this.dispatchEvent(new CustomEvent('dock-layout-changed', {\n detail: this.snapshot,\n bubbles: true,\n composed: true,\n }));\n }\n cloneLayoutNode(layout) {\n if (!layout) {\n return null;\n }\n return JSON.parse(JSON.stringify(layout));\n }\n cloneFloatingArray(layouts) {\n return JSON.parse(JSON.stringify(layouts));\n }\n}\nconst tagName = 'mint-dock-manager';\nif (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, MintDockManagerElement);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludC1kb2NrLW1hbmFnZXIuZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL3dlYi1jb21wb25lbnRzL21pbnQtZG9jay1tYW5hZ2VyLmVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2YXBCLENBQUM7QUFFRixJQUFJLGNBQWMsR0FBK0IsSUFBSSxDQUFDO0FBQ3RELElBQUksc0JBQXNCLEdBQW9CLElBQUksQ0FBQztBQUVuRCxTQUFTLGNBQWMsQ0FBQyxXQUFxQjtJQUMzQyxJQUFJLENBQUMsY0FBYyxJQUFJLHNCQUFzQixLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzlELGNBQWMsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELGNBQWMsQ0FBQyxTQUFTLEdBQUcsWUFB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LENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQ2hCLElBQUksV0FBVyxDQUFDLHFCQUFxQixFQUFFO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNyQixPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBSU8sZUFBZSxDQUFDLE1BQTZCO1FBQ25ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFtQixDQUFDO0lBQzlELENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsT0FBa0M7UUFFbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQThCLENBQUM7SUFDMUUsQ0FBQzs7QUFHSCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQztBQUVwQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMxRSxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7XG4gIERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0LFxuICBEb2NrTGF5b3V0LFxuICBEb2NrTGF5b3V0Tm9kZSxcbiAgRG9ja0xheW91dFNuYXBzaG90LFxuICBEb2NrU3BsaXROb2RlLFxuICBEb2NrU3RhY2tOb2RlLFxufSBmcm9tICcuLi90eXBlcy9kb2NrLWxheW91dCc7XG5cbnR5cGUgRG9ja1BhdGggPVxuICB8IHsgdHlwZTogJ2RvY2tlZCc7IHNlZ21lbnRzOiBudW1iZXJbXSB9XG4gIHwgeyB0eXBlOiAnZmxvYXRpbmcnOyBpbmRleDogbnVtYmVyOyBzZWdtZW50czogbnVtYmVyW10gfTtcblxudHlwZSBEb2NrZWRMb2NhdGlvbiA9IHsgY29udGV4dDogJ2RvY2tlZCc7IHBhdGg6IG51bWJlcltdOyBub2RlOiBEb2NrU3RhY2tOb2RlIH07XG50eXBlIEZsb2F0aW5nTG9jYXRpb24gPSB7XG4gIGNvbnRleHQ6ICdmbG9hdGluZyc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHBhdGg6IG51bWJlcltdO1xuICBub2RlOiBEb2NrU3RhY2tOb2RlO1xufTtcblxudHlwZSBSZXNvbHZlZExvY2F0aW9uID0gRG9ja2VkTG9jYXRpb24gfCBGbG9hdGluZ0xvY2F0aW9uO1xuXG50eXBlIERyb3Bab25lID0gJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJztcblxudHlwZSBGbG9hdGluZ1Jlc2l6ZUVkZ2VzID0ge1xuICBob3Jpem9udGFsOiAnbGVmdCcgfCAncmlnaHQnIHwgJ25vbmUnO1xuICB2ZXJ0aWNhbDogJ3RvcCcgfCAnYm90dG9tJyB8ICdub25lJztcbn07XG5cbmNvbnN0IHRlbXBsYXRlSHRtbCA9IGBcbiAgPHN0eWxlPlxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBjb250YWluOiBsYXlvdXQgcGFpbnQgc2l6ZSBzdHlsZTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIH1cblxuICAgIC5kb2NrLXJvb3QsXG4gICAgLmRvY2stZG9ja2VkLFxuICAgIC5kb2NrLXNwbGl0LFxuICAgIC5kb2NrLXNwbGl0X19jaGlsZCxcbiAgICAuZG9jay1zdGFjayxcbiAgICAuZG9jay1zdGFja19fY29udGVudCxcbiAgICAuZG9jay1zdGFja19fcGFuZSB7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICB9XG5cbiAgICAuZG9jay1yb290IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cblxuICAgIC5kb2NrLWRvY2tlZCB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB6LWluZGV4OiAwO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nLWxheWVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB6LWluZGV4OiA1O1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpO1xuICAgICAgYm94LXNoYWRvdzogMCAxNnB4IDMycHggcmdiYSgxNSwgMjMsIDQyLCAwLjI1KTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBtaW4td2lkdGg6IDEycmVtO1xuICAgICAgbWluLWhlaWdodDogOHJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fY2hyb21lIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICBwYWRkaW5nOiAwLjM1cmVtIDAuNzVyZW07XG4gICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgICAgIHRvIGJvdHRvbSxcbiAgICAgICAgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjYpLFxuICAgICAgICByZ2JhKDE0OCwgMTYzLCAxODQsIDAuMjUpXG4gICAgICApO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC41KTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fdGl0bGUge1xuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiByZ2JhKDMwLCA0MSwgNTksIDAuOTUpO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZyA+IC5kb2NrLXN0YWNrIHtcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgbWluLXdpZHRoOiAxMnJlbTtcbiAgICAgIG1pbi1oZWlnaHQ6IDhyZW07XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXIge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICB6LWluZGV4OiAyO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNDgsIDE2MywgMTg0LCAwLjI1KTtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTIwbXMgZWFzZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplcjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0OCwgMTYzLCAxODQsIDAuNCk7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tIHtcbiAgICAgIGxlZnQ6IDAuNzVyZW07XG4gICAgICByaWdodDogMC43NXJlbTtcbiAgICAgIGhlaWdodDogMC41cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3Age1xuICAgICAgdG9wOiAwO1xuICAgICAgY3Vyc29yOiBuLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tIHtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGN1cnNvcjogcy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWxlZnQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXJpZ2h0IHtcbiAgICAgIHRvcDogMS43NXJlbTtcbiAgICAgIGJvdHRvbTogMC43NXJlbTtcbiAgICAgIHdpZHRoOiAwLjVyZW07XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWxlZnQge1xuICAgICAgbGVmdDogMDtcbiAgICAgIGN1cnNvcjogdy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXJpZ2h0IHtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgY3Vyc29yOiBlLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLWxlZnQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1yaWdodCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLWxlZnQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1yaWdodCB7XG4gICAgICB3aWR0aDogMC43NXJlbTtcbiAgICAgIGhlaWdodDogMC43NXJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLWxlZnQge1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGN1cnNvcjogbnctcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtcmlnaHQge1xuICAgICAgdG9wOiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBjdXJzb3I6IG5lLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLWxlZnQge1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGN1cnNvcjogc3ctcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tcmlnaHQge1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBib3R0b206IDA7XG4gICAgICBjdXJzb3I6IHNlLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMSAxIDA7XG4gICAgICBnYXA6IDAuMjVyZW07XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiXSB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiXSB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0X19jaGlsZCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMSAxIDA7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRfX2RpdmlkZXIge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZmxleDogMCAwIGF1dG87XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiXSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyIHtcbiAgICAgIHdpZHRoOiAwLjVyZW07XG4gICAgICBjdXJzb3I6IGNvbC1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiXSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyIHtcbiAgICAgIGhlaWdodDogMC41cmVtO1xuICAgICAgY3Vyc29yOiByb3ctcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnJztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJob3Jpem9udGFsXCJdID4gLmRvY2stc3BsaXRfX2RpdmlkZXI6OmFmdGVyIHtcbiAgICAgIHdpZHRoOiAwLjEyNXJlbTtcbiAgICAgIGhlaWdodDogNjAlO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwidmVydGljYWxcIl0gPiAuZG9jay1zcGxpdF9fZGl2aWRlcjo6YWZ0ZXIge1xuICAgICAgd2lkdGg6IDYwJTtcbiAgICAgIGhlaWdodDogMC4xMjVyZW07XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRfX2RpdmlkZXI6aG92ZXIsXG4gICAgLmRvY2stc3BsaXRfX2RpdmlkZXI6Zm9jdXMtdmlzaWJsZSxcbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlcltkYXRhLXJlc2l6aW5nPSd0cnVlJ10ge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMzUpO1xuICAgIH1cblxuICAgIC5kb2NrLXN0YWNrIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZmxleDogMSAxIDA7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTtcbiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgIH1cblxuICAgIC5kb2NrLXN0YWNrX19oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIGdhcDogMC4yNXJlbTtcbiAgICAgIHBhZGRpbmc6IDAuMjVyZW07XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiIHtcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgICAgZm9udDogaW5oZXJpdDtcbiAgICAgIGN1cnNvcjogZ3JhYjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTYwbXMgZWFzZTtcbiAgICB9XG5cbiAgICAuZG9jay10YWI6YWN0aXZlIHtcbiAgICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiOmZvY3VzLXZpc2libGUge1xuICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjgpO1xuICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICB9XG5cbiAgICAuZG9jay10YWItLWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4xNSk7XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2tfX2NvbnRlbnQge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFja19fcGFuZSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBmbGV4OiAxIDEgMTAwJTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFja19fcGFuZVtoaWRkZW5dIHtcbiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWluZGljYXRvciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjkpO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMik7XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcbiAgICAgIHotaW5kZXg6IDEwMDtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWluZGljYXRvcltkYXRhLXZpc2libGU9J3RydWUnXSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2sge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbi1jb250ZW50KTtcbiAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KDMsIG1pbi1jb250ZW50KTtcbiAgICAgIGdhcDogMC4xMjVyZW07XG4gICAgICBwYWRkaW5nOiAwLjEyNXJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMjMsIDQyLCAwLjE1KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgxNSwgMjMsIDQyLCAwLjI1KTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB6LWluZGV4OiAxMTA7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyIHtcbiAgICAgIHdpZHRoOiAxLjc1cmVtO1xuICAgICAgaGVpZ2h0OiAxLjc1cmVtO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uIHtcbiAgICAgIHdpZHRoOiAxLjc1cmVtO1xuICAgICAgaGVpZ2h0OiAxLjc1cmVtO1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjM3NXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjQpO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xuICAgICAgY29sb3I6IHJnYmEoMzAsIDY0LCAxNzUsIDAuOSk7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTIwbXMgZWFzZSwgY29sb3IgMTIwbXMgZWFzZSwgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uW2RhdGEtYWN0aXZlPSd0cnVlJ10sXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uOmhvdmVyLFxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjI1KTtcbiAgICAgIGJvcmRlci1jb2xvcjogcmdiYSg1OSwgMTMwLCAyNDYsIDAuOCk7XG4gICAgICBjb2xvcjogcmdiYSgzMCwgNjQsIDE3NSwgMSk7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uOmZvY3VzLXZpc2libGUge1xuICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjkpO1xuICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25bZGF0YS16b25lPSdjZW50ZXInXSB7XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG4gICAgfVxuXG4gICAgOjpzbG90dGVkKCopIHtcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cbiAgPC9zdHlsZT5cbiAgPGRpdiBjbGFzcz1cImRvY2stcm9vdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWRvY2tlZFwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWZsb2F0aW5nLWxheWVyXCI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWluZGljYXRvclwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrXCIgZGF0YS12aXNpYmxlPVwiZmFsc2VcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXJcIj48L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwidG9wXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIHRvcFwiXG4gICAgPlxuICAgICAg4oaRXG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyXCI+PC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvblwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtem9uZT1cImxlZnRcIlxuICAgICAgYXJpYS1sYWJlbD1cIkRvY2sgdG8gbGVmdFwiXG4gICAgPlxuICAgICAg4oaQXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvblwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtem9uZT1cImNlbnRlclwiXG4gICAgICBhcmlhLWxhYmVsPVwiRG9jayB0byBjZW50ZXJcIlxuICAgID5cbiAgICAgIOKAolxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLXpvbmU9XCJyaWdodFwiXG4gICAgICBhcmlhLWxhYmVsPVwiRG9jayB0byByaWdodFwiXG4gICAgPlxuICAgICAg4oaSXG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyXCI+PC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvblwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtem9uZT1cImJvdHRvbVwiXG4gICAgICBhcmlhLWxhYmVsPVwiRG9jayB0byBib3R0b21cIlxuICAgID5cbiAgICAgIOKGk1xuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlclwiPjwvZGl2PlxuICA8L2Rpdj5cbmA7XG5cbmxldCBjYWNoZWRUZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCB8IG51bGwgPSBudWxsO1xubGV0IGNhY2hlZFRlbXBsYXRlRG9jdW1lbnQ6IERvY3VtZW50IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGVuc3VyZVRlbXBsYXRlKGRvY3VtZW50UmVmOiBEb2N1bWVudCk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQge1xuICBpZiAoIWNhY2hlZFRlbXBsYXRlIHx8IGNhY2hlZFRlbXBsYXRlRG9jdW1lbnQgIT09IGRvY3VtZW50UmVmKSB7XG4gICAgY2FjaGVkVGVtcGxhdGUgPSBkb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIGNhY2hlZFRlbXBsYXRlLmlubmVySFRNTCA9IHRlbXBsYXRlSHRtbDtcbiAgICBjYWNoZWRUZW1wbGF0ZURvY3VtZW50ID0gZG9jdW1lbnRSZWY7XG4gIH1cblxuICByZXR1cm4gY2FjaGVkVGVtcGxhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBNaW50RG9ja01hbmFnZXJFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICBwcml2YXRlIHN0YXRpYyBkb2N1bWVudFJlZjogRG9jdW1lbnQgfCBudWxsID1cbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiBudWxsO1xuXG4gIHN0YXRpYyBjb25maWd1cmVEb2N1bWVudChkb2N1bWVudFJlZjogRG9jdW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKGRvY3VtZW50UmVmKSB7XG4gICAgICBNaW50RG9ja01hbmFnZXJFbGVtZW50LmRvY3VtZW50UmVmID0gZG9jdW1lbnRSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2xheW91dCddO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VDb3VudGVyID0gMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50UmVmOiBEb2N1bWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dSZWY6IChXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcykgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RFbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9ja2VkRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGZsb2F0aW5nTGF5ZXJFbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcEluZGljYXRvcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcEpveXN0aWNrOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wSm95c3RpY2tCdXR0b25zOiBIVE1MQnV0dG9uRWxlbWVudFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBkcm9wSm95c3RpY2tUYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm9vdExheW91dDogRG9ja0xheW91dE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmbG9hdGluZ0xheW91dHM6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0W10gPSBbXTtcbiAgcHJpdmF0ZSB0aXRsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBwZW5kaW5nVGFiRHJhZ01ldHJpY3M6XG4gICAgfCB7XG4gICAgICAgIHBvaW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJPZmZzZXRZOiBudW1iZXI7XG4gICAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgICAgdG9wOiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBzdGFydENsaWVudFg6IG51bWJlcjtcbiAgICAgICAgc3RhcnRDbGllbnRZOiBudW1iZXI7XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNpemVTdGF0ZTpcbiAgICB8IHtcbiAgICAgICAgcGF0aDogRG9ja1BhdGg7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJJZDogbnVtYmVyO1xuICAgICAgICBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgZGl2aWRlcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHN0YXJ0UG9zOiBudW1iZXI7XG4gICAgICAgIGluaXRpYWxTaXplczogbnVtYmVyW107XG4gICAgICAgIGJlZm9yZVNpemU6IG51bWJlcjtcbiAgICAgICAgYWZ0ZXJTaXplOiBudW1iZXI7XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnU3RhdGU6IHtcbiAgICBwYW5lOiBzdHJpbmc7XG4gICAgc291cmNlUGF0aDogRG9ja1BhdGg7XG4gICAgZmxvYXRpbmdJbmRleDogbnVtYmVyIHwgbnVsbDtcbiAgICBwb2ludGVyT2Zmc2V0WDogbnVtYmVyO1xuICAgIHBvaW50ZXJPZmZzZXRZOiBudW1iZXI7XG4gICAgZHJvcEhhbmRsZWQ6IGJvb2xlYW47XG4gICAgLy8gRm9yIHRhYiByZW9yZGVyaW5nIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGZsb2F0aW5nXG4gICAgc291cmNlU3RhY2tFbD86IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBzb3VyY2VIZWFkZXJCb3VuZHM/OiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHJpZ2h0OiBudW1iZXI7IGJvdHRvbTogbnVtYmVyIH0gfCBudWxsO1xuICAgIHN0YXJ0Q2xpZW50WD86IG51bWJlcjtcbiAgICBzdGFydENsaWVudFk/OiBudW1iZXI7XG4gICAgbGl2ZVJlb3JkZXJJbmRleD86IG51bWJlcjtcbiAgICBwbGFjZWhvbGRlckhlYWRlcj86IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBwbGFjZWhvbGRlckVsPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmxvYXRpbmdEcmFnU3RhdGU6XG4gICAgfCB7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJJZDogbnVtYmVyO1xuICAgICAgICBzdGFydFg6IG51bWJlcjtcbiAgICAgICAgc3RhcnRZOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0TGVmdDogbnVtYmVyO1xuICAgICAgICBzdGFydFRvcDogbnVtYmVyO1xuICAgICAgICB3cmFwcGVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgaGFuZGxlOiBIVE1MRWxlbWVudDtcbiAgICAgICAgZHJvcFRhcmdldD86IHsgcGF0aDogRG9ja1BhdGg7IHpvbmU6IERyb3Bab25lIH07XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmbG9hdGluZ1Jlc2l6ZVN0YXRlOlxuICAgIHwge1xuICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICBwb2ludGVySWQ6IG51bWJlcjtcbiAgICAgICAgc3RhcnRYOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0WTogbnVtYmVyO1xuICAgICAgICBzdGFydFdpZHRoOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0SGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIHN0YXJ0TGVmdDogbnVtYmVyO1xuICAgICAgICBzdGFydFRvcDogbnVtYmVyO1xuICAgICAgICB3cmFwcGVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgaGFuZGxlOiBIVE1MRWxlbWVudDtcbiAgICAgICAgZWRnZXM6IEZsb2F0aW5nUmVzaXplRWRnZXM7XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdERyYWdQb2ludGVyUG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdEcmFnRW5kVGltZW91dDogbnVtYmVyIHwgTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IGRvY3VtZW50UmVmID0gdGhpcy5yZXNvbHZlRG9jdW1lbnQoKTtcbiAgICB0aGlzLmRvY3VtZW50UmVmID0gZG9jdW1lbnRSZWY7XG4gICAgdGhpcy53aW5kb3dSZWYgPSB0aGlzLnJlc29sdmVXaW5kb3coZG9jdW1lbnRSZWYpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGVuc3VyZVRlbXBsYXRlKGRvY3VtZW50UmVmKTtcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICBjb25zdCByb290ID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stcm9vdCcpO1xuICAgIGlmICghcm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSByb290IGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9ja2VkID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stZG9ja2VkJyk7XG4gICAgaWYgKCFkb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgZG9ja2VkIHN1cmZhY2UgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmbG9hdGluZ0xheWVyID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICcuZG9jay1mbG9hdGluZy1sYXllcicsXG4gICAgKTtcbiAgICBpZiAoIWZsb2F0aW5nTGF5ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgZmxvYXRpbmcgbGF5ZXIgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRpY2F0b3IgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1kcm9wLWluZGljYXRvcicpO1xuICAgIGlmICghaW5kaWNhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgdGhlIGRyb3AgaW5kaWNhdG9yIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgam95c3RpY2sgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1kcm9wLWpveXN0aWNrJyk7XG4gICAgaWYgKCFqb3lzdGljaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSBkcm9wIGpveXN0aWNrIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgam95c3RpY2tCdXR0b25zID0gQXJyYXkuZnJvbShcbiAgICAgIGpveXN0aWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25bZGF0YS16b25lXScpLFxuICAgICk7XG4gICAgaWYgKGpveXN0aWNrQnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyBkcm9wIGpveXN0aWNrIGJ1dHRvbnMuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5yb290RWwgPSByb290O1xuICAgIHRoaXMuZG9ja2VkRWwgPSBkb2NrZWQ7XG4gICAgdGhpcy5mbG9hdGluZ0xheWVyRWwgPSBmbG9hdGluZ0xheWVyO1xuICAgIHRoaXMuZHJvcEluZGljYXRvciA9IGluZGljYXRvcjtcbiAgICB0aGlzLmRyb3BKb3lzdGljayA9IGpveXN0aWNrO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucyA9IGpveXN0aWNrQnV0dG9ucztcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBgbWludC1kb2NrLSR7KytNaW50RG9ja01hbmFnZXJFbGVtZW50Lmluc3RhbmNlQ291bnRlcn1gO1xuICAgIHRoaXMub25Qb2ludGVyTW92ZSA9IHRoaXMub25Qb2ludGVyTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25Qb2ludGVyVXAgPSB0aGlzLm9uUG9pbnRlclVwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdPdmVyID0gdGhpcy5vbkRyYWdPdmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkdsb2JhbERyYWdPdmVyID0gdGhpcy5vbkdsb2JhbERyYWdPdmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkdsb2JhbERyYWdFbmQgPSB0aGlzLm9uR2xvYmFsRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25Ecm9wID0gdGhpcy5vbkRyb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ0xlYXZlID0gdGhpcy5vbkRyYWdMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnID0gdGhpcy5vbkRyYWcuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ01vdXNlTW92ZSA9IHRoaXMub25EcmFnTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdUb3VjaE1vdmUgPSB0aGlzLm9uRHJhZ1RvdWNoTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnTW91c2VVcCA9IHRoaXMub25EcmFnTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnVG91Y2hFbmQgPSB0aGlzLm9uRHJhZ1RvdWNoRW5kLmJpbmQodGhpcyk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdyb2xlJykpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FwcGxpY2F0aW9uJyk7XG4gICAgfVxuICAgIC8vIFRhZyB0aGUgZG9ja2VkIHN1cmZhY2Ugd2l0aCBhIHJvb3QgcGF0aCBzbyBpdCBjYW4gYWN0IGFzXG4gICAgLy8gYSBkcm9wIHRhcmdldCB3aGVuIHRoZSBtYWluIGxheW91dCBpcyBlbXB0eS5cbiAgICB0aGlzLmRvY2tlZEVsLmRhdGFzZXRbJ3BhdGgnXSA9IHRoaXMuZm9ybWF0UGF0aCh7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50czogW10gfSk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLnJvb3RFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnT3Zlcik7XG4gICAgdGhpcy5yb290RWwuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICB0aGlzLnJvb3RFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLm9uRHJhZ0xlYXZlKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnT3Zlcik7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLm9uRHJhZ0xlYXZlKTtcbiAgICAvLyBTdHJlbmd0aGVuIHpvbmUgdHJhY2tpbmcgYnkgcmVhY3RpbmcgdG8gZHJhZ2VudGVyL2RyYWdvdmVyIGRpcmVjdGx5IG9uIHRoZSBidXR0b25zLlxuICAgIC8vIFRoaXMgYXZvaWRzIHJlbHlpbmcgc29sZWx5IG9uIGhpdC10ZXN0aW5nIGVhY2ggZnJhbWUgd2hpY2ggY2FuIGJlIGppdHRlcnkgZHVyaW5nIEhUTUw1IGRyYWcuXG4gICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IChlOiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB6ID0gYnRuLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZSh6KSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZSh6KTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgaGFuZGxlcik7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVyKTtcbiAgICB9KTtcbiAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkdsb2JhbERyYWdPdmVyKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLm9uRHJhZyk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5vbkdsb2JhbERyYWdFbmQsIHRydWUpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5yb290RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uRHJhZ092ZXIpO1xuICAgIHRoaXMucm9vdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRHJvcCk7XG4gICAgdGhpcy5yb290RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5vbkRyYWdMZWF2ZSk7XG4gICAgdGhpcy5kcm9wSm95c3RpY2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uRHJhZ092ZXIpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRHJvcCk7XG4gICAgdGhpcy5kcm9wSm95c3RpY2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5vbkRyYWdMZWF2ZSk7XG4gICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25HbG9iYWxEcmFnT3Zlcik7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5vbkRyYWcpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMub25HbG9iYWxEcmFnRW5kLCB0cnVlKTtcbiAgICB0aGlzLnN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMub25Qb2ludGVyTW92ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICB0aGlzLnBvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWU6IHN0cmluZywgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLCBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChuYW1lID09PSAnbGF5b3V0Jykge1xuICAgICAgdGhpcy5sYXlvdXQgPSBuZXdWYWx1ZSA/IHRoaXMucGFyc2VMYXlvdXQobmV3VmFsdWUpIDogbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgbGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHRoaXMuY2xvbmVMYXlvdXROb2RlKHRoaXMucm9vdExheW91dCksXG4gICAgICBmbG9hdGluZzogdGhpcy5jbG9uZUZsb2F0aW5nQXJyYXkodGhpcy5mbG9hdGluZ0xheW91dHMpLFxuICAgICAgdGl0bGVzOiB7IC4uLnRoaXMudGl0bGVzIH0sXG4gICAgfTtcbiAgfVxuXG4gIHNldCBsYXlvdXQodmFsdWU6IERvY2tMYXlvdXRTbmFwc2hvdCB8IERvY2tMYXlvdXQgfCBEb2NrTGF5b3V0Tm9kZSB8IG51bGwpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuZW5zdXJlU25hcHNob3QodmFsdWUpO1xuICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuY2xvbmVMYXlvdXROb2RlKHNuYXBzaG90LnJvb3QpO1xuICAgIHRoaXMuZmxvYXRpbmdMYXlvdXRzID0gdGhpcy5jbG9uZUZsb2F0aW5nQXJyYXkoc25hcHNob3QuZmxvYXRpbmcpO1xuICAgIHRoaXMudGl0bGVzID0gc25hcHNob3QudGl0bGVzID8geyAuLi5zbmFwc2hvdC50aXRsZXMgfSA6IHt9O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBnZXQgc25hcHNob3QoKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQ7XG4gIH1cblxuICB0b0pTT04oKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICByZXR1cm4gdGhpcy5zbmFwc2hvdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZURvY3VtZW50KCk6IERvY3VtZW50IHtcbiAgICBjb25zdCBzdGF0aWNEb2N1bWVudCA9IE1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWY7XG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCA/PyBudWxsO1xuICAgIGNvbnN0IGdsb2JhbERvY3VtZW50ID1cbiAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IG51bGw7XG4gICAgY29uc3QgcmVzb2x2ZWREb2N1bWVudCA9IHN0YXRpY0RvY3VtZW50ID8/IG93bmVyRG9jdW1lbnQgPz8gZ2xvYmFsRG9jdW1lbnQ7XG5cbiAgICBpZiAoIXJlc29sdmVkRG9jdW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgcmVxdWlyZXMgYSBEb2N1bWVudCB0byBpbml0aWFsaXplLicpO1xuICAgIH1cblxuICAgIGlmICghTWludERvY2tNYW5hZ2VyRWxlbWVudC5kb2N1bWVudFJlZikge1xuICAgICAgTWludERvY2tNYW5hZ2VyRWxlbWVudC5kb2N1bWVudFJlZiA9IHJlc29sdmVkRG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkRG9jdW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVXaW5kb3coXG4gICAgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICApOiAoV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMpIHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cblxuICAgIHJldHVybiAoZG9jdW1lbnRSZWYuZGVmYXVsdFZpZXcgYXMgKFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzKSB8IG51bGwpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTGF5b3V0KHZhbHVlOiBzdHJpbmcpOiBEb2NrTGF5b3V0U25hcHNob3QgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSkgYXNcbiAgICAgICAgfCBEb2NrTGF5b3V0U25hcHNob3RcbiAgICAgICAgfCBEb2NrTGF5b3V0XG4gICAgICAgIHwgRG9ja0xheW91dE5vZGVcbiAgICAgICAgfCBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlU25hcHNob3QocGFyc2VkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignbWludC1kb2NrLW1hbmFnZXI6IGZhaWxlZCB0byBwYXJzZSBsYXlvdXQgYXR0cmlidXRlJywgZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlU25hcHNob3QoXG4gICAgdmFsdWU6IERvY2tMYXlvdXRTbmFwc2hvdCB8IERvY2tMYXlvdXQgfCBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgcm9vdDogbnVsbCwgZmxvYXRpbmc6IFtdLCB0aXRsZXM6IHt9IH07XG4gICAgfVxuXG4gICAgaWYgKCh2YWx1ZSBhcyBEb2NrTGF5b3V0Tm9kZSkua2luZCkge1xuICAgICAgcmV0dXJuIHsgcm9vdDogdmFsdWUgYXMgRG9ja0xheW91dE5vZGUsIGZsb2F0aW5nOiBbXSwgdGl0bGVzOiB7fSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHZhbHVlIGFzIERvY2tMYXlvdXQgfCBEb2NrTGF5b3V0U25hcHNob3Q7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IGxheW91dC5yb290ID8/IG51bGwsXG4gICAgICBmbG9hdGluZzogQXJyYXkuaXNBcnJheShsYXlvdXQuZmxvYXRpbmcpXG4gICAgICAgID8gbGF5b3V0LmZsb2F0aW5nLm1hcCgoZmxvYXRpbmcpID0+IHRoaXMubm9ybWFsaXplRmxvYXRpbmdMYXlvdXQoZmxvYXRpbmcpKVxuICAgICAgICA6IFtdLFxuICAgICAgdGl0bGVzOiBsYXlvdXQudGl0bGVzID8geyAuLi5sYXlvdXQudGl0bGVzIH0gOiB7fSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXIoKTogdm9pZCB7XG4gICAgdGhpcy5kb2NrZWRFbC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG5cbiAgICBpZiAodGhpcy5yb290TGF5b3V0KSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMucmVuZGVyTm9kZSh0aGlzLnJvb3RMYXlvdXQsIFtdKTtcbiAgICAgIHRoaXMuZG9ja2VkRWwuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyRmxvYXRpbmdQYW5lcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJOb2RlKFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIGZsb2F0aW5nSW5kZXg/OiBudW1iZXIsXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAobm9kZS5raW5kID09PSAnc3BsaXQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJTcGxpdChub2RlLCBwYXRoLCBmbG9hdGluZ0luZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJTdGFjayhub2RlLCBwYXRoLCBmbG9hdGluZ0luZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRmxvYXRpbmdQYW5lcygpOiB2b2lkIHtcbiAgICB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cy5mb3JFYWNoKChmbG9hdGluZywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nJyk7XG4gICAgICB3cmFwcGVyLmRhdGFzZXRbJ3BhdGgnXSA9IHRoaXMuZm9ybWF0UGF0aCh7XG4gICAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBzZWdtZW50czogW10sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGZsb2F0aW5nLmJvdW5kcztcbiAgICAgIHdyYXBwZXIuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcblxuICAgICAgY29uc3QgekluZGV4ID0gdGhpcy5nZXRGbG9hdGluZ1BhbmVaSW5kZXgoaW5kZXgpO1xuICAgICAgd3JhcHBlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoekluZGV4KTtcblxuICAgICAgY29uc3QgY2hyb21lID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNocm9tZS5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nX19jaHJvbWUnKTtcbiAgICAgIGNocm9tZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldmVudCkgPT5cbiAgICAgICAgdGhpcy5iZWdpbkZsb2F0aW5nRHJhZyhldmVudCwgaW5kZXgsIHdyYXBwZXIsIGNocm9tZSksXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nX190aXRsZScpO1xuICAgICAgdGl0bGUudGV4dENvbnRlbnQgPSB0aGlzLmdldEZsb2F0aW5nV2luZG93VGl0bGUoZmxvYXRpbmcpO1xuICAgICAgY2hyb21lLmFwcGVuZENoaWxkKHRpdGxlKTtcblxuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChjaHJvbWUpO1xuXG4gICAgICBpZiAoZmxvYXRpbmcucm9vdCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJOb2RlKGZsb2F0aW5nLnJvb3QsIFtdLCBpbmRleCk7XG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnZG9jay1mbG9hdGluZ19fc3RhY2snKTtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFjaycpO1xuICAgICAgICBwbGFjZWhvbGRlci5kYXRhc2V0WydwYXRoJ10gPSB0aGlzLmZvcm1hdFBhdGgoe1xuICAgICAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgc2VnbWVudHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW1wdHkgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbXB0eS5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19wYW5lJyk7XG4gICAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gJ05vIHBhbmVzIGNvbmZpZ3VyZWQnO1xuICAgICAgICBwbGFjZWhvbGRlci5hcHBlbmRDaGlsZChlbXB0eSk7XG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNpemVyQ29uZmlnczogeyBjbGFzc2VzOiBzdHJpbmdbXTsgZWRnZXM6IEZsb2F0aW5nUmVzaXplRWRnZXMgfVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1sZWZ0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ3RvcCcgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbm9uZScsIHZlcnRpY2FsOiAndG9wJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1yaWdodCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAndG9wJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXJpZ2h0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdub25lJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1yaWdodCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnYm90dG9tJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbSddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdub25lJywgdmVydGljYWw6ICdib3R0b20nIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLWxlZnQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnYm90dG9tJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWxlZnQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbm9uZScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlc2l6ZXJDb25maWdzLmZvckVhY2goKHsgY2xhc3NlcywgZWRnZXMgfSkgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVzaXplci5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xuICAgICAgICByZXNpemVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PlxuICAgICAgICAgIHRoaXMuYmVnaW5GbG9hdGluZ1Jlc2l6ZShldmVudCwgaW5kZXgsIHdyYXBwZXIsIHJlc2l6ZXIsIGVkZ2VzKSxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChyZXNpemVyKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mbG9hdGluZ0xheWVyRWwuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJlZ2luRmxvYXRpbmdEcmFnKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICB3cmFwcGVyOiBIVE1MRWxlbWVudCxcbiAgICBoYW5kbGU6IEhUTUxFbGVtZW50LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBmbG9hdGluZy5ib3VuZHM7XG5cbiAgICB0cnkge1xuICAgICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBuby1vcDogcG9pbnRlciBjYXB0dXJlIG1heSBub3QgYmUgc3VwcG9ydGVkIGluIGFsbCBlbnZpcm9ubWVudHMgKi9cbiAgICB9XG5cbiAgICB0aGlzLnByb21vdGVGbG9hdGluZ1BhbmUoaW5kZXgsIHdyYXBwZXIpO1xuXG4gICAgdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZSA9IHtcbiAgICAgIGluZGV4LFxuICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICBzdGFydFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydFk6IGV2ZW50LmNsaWVudFksXG4gICAgICBzdGFydExlZnQ6IGxlZnQsXG4gICAgICBzdGFydFRvcDogdG9wLFxuICAgICAgd3JhcHBlcixcbiAgICAgIGhhbmRsZSxcbiAgICB9O1xuXG4gICAgdGhpcy5zdGFydFBvaW50ZXJUcmFja2luZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWdpbkZsb2F0aW5nUmVzaXplKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICB3cmFwcGVyOiBIVE1MRWxlbWVudCxcbiAgICBoYW5kbGU6IEhUTUxFbGVtZW50LFxuICAgIGVkZ2VzOiBGbG9hdGluZ1Jlc2l6ZUVkZ2VzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRyeSB7XG4gICAgICBoYW5kbGUuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIHBvaW50ZXIgY2FwdHVyZSBtYXkgbm90IGJlIHN1cHBvcnRlZCAqL1xuICAgIH1cblxuICAgIHRoaXMucHJvbW90ZUZsb2F0aW5nUGFuZShpbmRleCwgd3JhcHBlcik7XG5cbiAgICB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgPSB7XG4gICAgICBpbmRleCxcbiAgICAgIHBvaW50ZXJJZDogZXZlbnQucG9pbnRlcklkLFxuICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgc3RhcnRXaWR0aDogZmxvYXRpbmcuYm91bmRzLndpZHRoLFxuICAgICAgc3RhcnRIZWlnaHQ6IGZsb2F0aW5nLmJvdW5kcy5oZWlnaHQsXG4gICAgICBzdGFydExlZnQ6IGZsb2F0aW5nLmJvdW5kcy5sZWZ0LFxuICAgICAgc3RhcnRUb3A6IGZsb2F0aW5nLmJvdW5kcy50b3AsXG4gICAgICB3cmFwcGVyLFxuICAgICAgaGFuZGxlLFxuICAgICAgZWRnZXMsXG4gICAgfTtcblxuICAgIHRoaXMuc3RhcnRQb2ludGVyVHJhY2tpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmxvYXRpbmdEcmFnTW92ZShldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgZXZlbnQucG9pbnRlcklkICE9PSBzdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gc3RhdGUuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSBzdGF0ZS5zdGFydFk7XG4gICAgY29uc3QgbmV3TGVmdCA9IHN0YXRlLnN0YXJ0TGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBzdGF0ZS5zdGFydFRvcCArIGRlbHRhWTtcblxuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUubGVmdCA9IGAke25ld0xlZnR9cHhgO1xuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUudG9wID0gYCR7bmV3VG9wfXB4YDtcblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbc3RhdGUuaW5kZXhdO1xuICAgIGlmIChmbG9hdGluZykge1xuICAgICAgZmxvYXRpbmcuYm91bmRzLmxlZnQgPSBuZXdMZWZ0O1xuICAgICAgZmxvYXRpbmcuYm91bmRzLnRvcCA9IG5ld1RvcDtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUZsb2F0aW5nRHJhZ0Ryb3BUYXJnZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRGbG9hdGluZ0RyYWcocG9pbnRlcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdEcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSB8fCBwb2ludGVySWQgIT09IHN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBzdGF0ZS5oYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHN0YXRlLnBvaW50ZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBuby1vcCAqL1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3BIYW5kbGVkID0gc3RhdGUuZHJvcFRhcmdldFxuICAgICAgPyB0aGlzLmhhbmRsZUZsb2F0aW5nU3RhY2tEcm9wKHN0YXRlLmluZGV4LCBzdGF0ZS5kcm9wVGFyZ2V0LnBhdGgsIHN0YXRlLmRyb3BUYXJnZXQuem9uZSlcbiAgICAgIDogZmFsc2U7XG5cbiAgICB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlID0gbnVsbDtcbiAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgaWYgKCFkcm9wSGFuZGxlZCkge1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZsb2F0aW5nRHJhZ0Ryb3BUYXJnZXQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZTtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgaWYgKHN0YXRlLmRyb3BUYXJnZXQpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmRyb3BUYXJnZXQ7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICBpZiAoIXBhdGggfHwgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJyAmJiBwYXRoLmluZGV4ID09PSBzdGF0ZS5pbmRleCkpIHtcbiAgICAgIGlmIChzdGF0ZS5kcm9wVGFyZ2V0KSB7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5kcm9wVGFyZ2V0O1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RpY2t5IHpvbmUgd2hlbiBtb3ZpbmcgdG8gYW5vdGhlciBzdGFjayB3aGlsZSBkcmFnZ2luZyB0aGVcbiAgICAvLyBmbG9hdGluZyB3aW5kb3cgc28gdGhlIHNpZGUgZG9lc24ndCBjYXJyeSBvdmVyLlxuICAgIGlmICh0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJiB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAhPT0gc3RhY2spIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9uZSA9IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBldmVudCwgdGhpcy5leHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQpKTtcblxuICAgIGlmICh6b25lKSB7XG4gICAgICBzdGF0ZS5kcm9wVGFyZ2V0ID0geyBwYXRoLCB6b25lIH07XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5kcm9wVGFyZ2V0KSB7XG4gICAgICBkZWxldGUgc3RhdGUuZHJvcFRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dEcm9wSW5kaWNhdG9yKHN0YWNrLCB6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmxvYXRpbmdSZXNpemVNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8IGV2ZW50LnBvaW50ZXJJZCAhPT0gc3RhdGUucG9pbnRlcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gc3RhdGUuc3RhcnRZO1xuICAgIGNvbnN0IG1pbldpZHRoID0gMTkyO1xuICAgIGNvbnN0IG1pbkhlaWdodCA9IDEyODtcbiAgICBsZXQgbmV3V2lkdGggPSBzdGF0ZS5zdGFydFdpZHRoO1xuICAgIGxldCBuZXdIZWlnaHQgPSBzdGF0ZS5zdGFydEhlaWdodDtcbiAgICBsZXQgbmV3TGVmdCA9IHN0YXRlLnN0YXJ0TGVmdDtcbiAgICBsZXQgbmV3VG9wID0gc3RhdGUuc3RhcnRUb3A7XG5cbiAgICBpZiAoc3RhdGUuZWRnZXMuaG9yaXpvbnRhbCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgbmV3V2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgc3RhdGUuc3RhcnRXaWR0aCArIGRlbHRhWCk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lZGdlcy5ob3Jpem9udGFsID09PSAnbGVmdCcpIHtcbiAgICAgIG5ld1dpZHRoID0gTWF0aC5tYXgobWluV2lkdGgsIHN0YXRlLnN0YXJ0V2lkdGggLSBkZWx0YVgpO1xuICAgICAgbmV3TGVmdCA9IHN0YXRlLnN0YXJ0TGVmdCArIChzdGF0ZS5zdGFydFdpZHRoIC0gbmV3V2lkdGgpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5lZGdlcy52ZXJ0aWNhbCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgc3RhdGUuc3RhcnRIZWlnaHQgKyBkZWx0YVkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZWRnZXMudmVydGljYWwgPT09ICd0b3AnKSB7XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIHN0YXRlLnN0YXJ0SGVpZ2h0IC0gZGVsdGFZKTtcbiAgICAgIG5ld1RvcCA9IHN0YXRlLnN0YXJ0VG9wICsgKHN0YXRlLnN0YXJ0SGVpZ2h0IC0gbmV3SGVpZ2h0KTtcbiAgICB9XG5cbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLmxlZnQgPSBgJHtuZXdMZWZ0fXB4YDtcbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLnRvcCA9IGAke25ld1RvcH1weGA7XG5cbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3N0YXRlLmluZGV4XTtcbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgZmxvYXRpbmcuYm91bmRzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy5sZWZ0ID0gbmV3TGVmdDtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy50b3AgPSBuZXdUb3A7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbmRGbG9hdGluZ1Jlc2l6ZShwb2ludGVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgcG9pbnRlcklkICE9PSBzdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgc3RhdGUuaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzdGF0ZS5wb2ludGVySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogbm8tb3AgKi9cbiAgICB9XG5cbiAgICB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZsb2F0aW5nUGFuZVpJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm4gMTAgKyBpbmRleDtcbiAgICB9XG4gICAgY29uc3QgYmFzZSA9XG4gICAgICB0eXBlb2YgZmxvYXRpbmcuekluZGV4ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuekluZGV4KVxuICAgICAgICA/IGZsb2F0aW5nLnpJbmRleFxuICAgICAgICA6IDEwICsgaW5kZXg7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHByb21vdGVGbG9hdGluZ1BhbmUoaW5kZXg6IG51bWJlciwgd3JhcHBlcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4RXhpc3RpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0cy5yZWR1Y2UoKG1heCwgbGF5b3V0LCBpZHgpID0+IHtcbiAgICAgIGlmICghbGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgICB9XG4gICAgICBjb25zdCB6ID0gaWR4ID09PSBpbmRleCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6IHRoaXMuZ2V0RmxvYXRpbmdQYW5lWkluZGV4KGlkeCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCB6KTtcbiAgICB9LCAwKTtcblxuICAgIGNvbnN0IG5leHRaID0gTWF0aC5tYXgobWF4RXhpc3RpbmcgKyAyLCAxMik7XG4gICAgZmxvYXRpbmcuekluZGV4ID0gbmV4dFo7XG4gICAgd3JhcHBlci5zdHlsZS56SW5kZXggPSBTdHJpbmcobmV4dFopO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbG9hdGluZ1dyYXBwZXIoaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgLmRvY2stZmxvYXRpbmdbZGF0YS1wYXRoPVwiJHt0aGlzLmZvcm1hdFBhdGgoe1xuICAgICAgdHlwZTogJ2Zsb2F0aW5nJyxcbiAgICAgIGluZGV4LFxuICAgICAgc2VnbWVudHM6IFtdLFxuICAgIH0pfVwiXWA7XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRpbmdMYXllckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQb2ludGVyVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9pbnRlclRyYWNraW5nSWZJZGxlKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlICYmXG4gICAgICAhdGhpcy5yZXNpemVTdGF0ZSAmJlxuICAgICAgIXRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgJiZcbiAgICAgICF0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMub25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgICAgdGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZsb2F0aW5nV2luZG93VGl0bGUoZmxvYXRpbmc6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0KTogc3RyaW5nIHtcbiAgICBjb25zdCBmYWxsYmFjayA9ICdGbG9hdGluZyBQYW5lJztcbiAgICBpZiAoIWZsb2F0aW5nIHx8ICFmbG9hdGluZy5yb290KSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmVycmVkID0gZmxvYXRpbmcuYWN0aXZlUGFuZSA/PyB0aGlzLmZpbmRGaXJzdFBhbmVOYW1lKGZsb2F0aW5nLnJvb3QpO1xuICAgIGlmICghcHJlZmVycmVkKSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGl0bGVzW3ByZWZlcnJlZF0gPz8gcHJlZmVycmVkID8/IGZhbGxiYWNrO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGbG9hdGluZ1dpbmRvd1RpdGxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgLmRvY2stZmxvYXRpbmdbZGF0YS1wYXRoPVwiJHt0aGlzLmZvcm1hdFBhdGgoe1xuICAgICAgdHlwZTogJ2Zsb2F0aW5nJyxcbiAgICAgIGluZGV4LFxuICAgICAgc2VnbWVudHM6IFtdLFxuICAgIH0pfVwiXWA7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZmxvYXRpbmdMYXllckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKTtcbiAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZUVsID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stZmxvYXRpbmdfX3RpdGxlJyk7XG4gICAgaWYgKCF0aXRsZUVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RmxvYXRpbmdXaW5kb3dUaXRsZShmbG9hdGluZyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclNwbGl0KFxuICAgIG5vZGU6IERvY2tTcGxpdE5vZGUsXG4gICAgcGF0aDogbnVtYmVyW10sXG4gICAgZmxvYXRpbmdJbmRleD86IG51bWJlcixcbiAgKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3BsaXQnKTtcbiAgICBjb250YWluZXIuZGF0YXNldFsnZGlyZWN0aW9uJ10gPSBub2RlLmRpcmVjdGlvbjtcbiAgICBjb250YWluZXIuZGF0YXNldFsncGF0aCddID0gcGF0aC5qb2luKCcvJyk7XG5cbiAgICBjb25zdCBzaXplcyA9IEFycmF5LmlzQXJyYXkobm9kZS5zaXplcykgPyBub2RlLnNpemVzIDogW107XG4gICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkV3JhcHBlciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjaGlsZFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1zcGxpdF9fY2hpbGQnKTtcbiAgICAgIGNoaWxkV3JhcHBlci5kYXRhc2V0WydpbmRleCddID0gU3RyaW5nKGluZGV4KTtcblxuICAgICAgY29uc3Qgc2l6ZSA9IHNpemVzW2luZGV4XTtcbiAgICAgIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHNpemUpKSB7XG4gICAgICAgIGNoaWxkV3JhcHBlci5zdHlsZS5mbGV4ID0gYCR7TWF0aC5tYXgoc2l6ZSwgMCl9IDEgMGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZFdyYXBwZXIuc3R5bGUuZmxleCA9ICcxIDEgMCc7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkV3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlck5vZGUoY2hpbGQsIFsuLi5wYXRoLCBpbmRleF0sIGZsb2F0aW5nSW5kZXgpKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGlsZFdyYXBwZXIpO1xuXG4gICAgICBpZiAoaW5kZXggPCBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc3QgZGl2aWRlciA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdmlkZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1zcGxpdF9fZGl2aWRlcicpO1xuICAgICAgICBkaXZpZGVyLnNldEF0dHJpYnV0ZSgncm9sZScsICdzZXBhcmF0b3InKTtcbiAgICAgICAgZGl2aWRlci50YWJJbmRleCA9IDA7XG4gICAgICAgIGRpdmlkZXIuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5iZWdpblJlc2l6ZShcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZmxvYXRpbmdJbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleDogZmxvYXRpbmdJbmRleCwgc2VnbWVudHM6IFsuLi5wYXRoXSB9XG4gICAgICAgICAgICAgIDogeyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFsuLi5wYXRoXSB9LFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU3RhY2soXG4gICAgbm9kZTogRG9ja1N0YWNrTm9kZSxcbiAgICBwYXRoOiBudW1iZXJbXSxcbiAgICBmbG9hdGluZ0luZGV4PzogbnVtYmVyLFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0YWNrLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2snKTtcbiAgICBjb25zdCBsb2NhdGlvbjogRG9ja1BhdGggPVxuICAgICAgdHlwZW9mIGZsb2F0aW5nSW5kZXggPT09ICdudW1iZXInXG4gICAgICAgID8geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleDogZmxvYXRpbmdJbmRleCwgc2VnbWVudHM6IFsuLi5wYXRoXSB9XG4gICAgICAgIDogeyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFsuLi5wYXRoXSB9O1xuICAgIHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSA9IHRoaXMuZm9ybWF0UGF0aChsb2NhdGlvbik7XG5cbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19oZWFkZXInKTtcbiAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2tfX2NvbnRlbnQnKTtcblxuICAgIGNvbnN0IHBhbmVzID0gQXJyYXkuZnJvbShuZXcgU2V0KG5vZGUucGFuZXMpKTtcbiAgICBpZiAocGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBlbXB0eSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlbXB0eS5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19wYW5lJyk7XG4gICAgICBlbXB0eS50ZXh0Q29udGVudCA9ICdObyBwYW5lcyBjb25maWd1cmVkJztcbiAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuICAgICAgc3RhY2suYXBwZW5kKGhlYWRlciwgY29udGVudCk7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlUGFuZSA9IHBhbmVzLmluY2x1ZGVzKG5vZGUuYWN0aXZlUGFuZSA/PyAnJylcbiAgICAgID8gbm9kZS5hY3RpdmVQYW5lIVxuICAgICAgOiBwYW5lc1swXTtcblxuICAgIGNvbnN0IGJhc2VTbHVnID0gcGF0aC5sZW5ndGggPyBwYXRoLmpvaW4oJy0nKSA6ICdyb290JztcbiAgICBjb25zdCBwYXRoU2x1ZyA9XG4gICAgICB0eXBlb2YgZmxvYXRpbmdJbmRleCA9PT0gJ251bWJlcicgPyBgZiR7ZmxvYXRpbmdJbmRleH0tJHtiYXNlU2x1Z31gIDogYmFzZVNsdWc7XG4gICAgcGFuZXMuZm9yRWFjaCgocGFuZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHBhbmVTbHVnUmF3ID0gcGFuZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJy0nKTtcbiAgICAgIGNvbnN0IHBhbmVTbHVnID0gcGFuZVNsdWdSYXcubGVuZ3RoID4gMCA/IHBhbmVTbHVnUmF3IDogJ3BhbmUnO1xuICAgICAgY29uc3QgdGFiSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LXRhYi0ke3BhdGhTbHVnfS0ke3BhbmVTbHVnfWA7XG4gICAgICBjb25zdCBwYW5lbElkID0gYCR7dGhpcy5pbnN0YW5jZUlkfS1wYW5lbC0ke3BhdGhTbHVnfS0ke3BhbmVTbHVnfWA7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2RvY2stdGFiJyk7XG4gICAgICBidXR0b24uZGF0YXNldFsncGFuZSddID0gcGFuZU5hbWU7XG4gICAgICBidXR0b24uaWQgPSB0YWJJZDtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IHRoaXMudGl0bGVzW3BhbmVOYW1lXSA/PyBwYW5lTmFtZTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFiJyk7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgcGFuZWxJZCk7XG4gICAgICBpZiAocGFuZU5hbWUgPT09IGFjdGl2ZVBhbmUpIHtcbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2RvY2stdGFiLS1hY3RpdmUnKTtcbiAgICAgIH1cbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBTdHJpbmcocGFuZU5hbWUgPT09IGFjdGl2ZVBhbmUpKTtcbiAgICAgIGJ1dHRvbi5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YWNrRWwgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrJyk7XG4gICAgICAgIHRoaXMuY2FwdHVyZVRhYkRyYWdNZXRyaWNzKGV2ZW50LCBzdGFja0VsID8/IG51bGwpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsICgpID0+IHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsICgpID0+IHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YWNrRWwgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrJyk7XG4gICAgICAgIHRoaXMuYmVnaW5QYW5lRHJhZyhldmVudCwgdGhpcy5jbG9uZVBhdGgobG9jYXRpb24pLCBwYW5lTmFtZSwgc3RhY2tFbCA/PyBudWxsKTtcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVQYW5lKHN0YWNrLCBwYW5lTmFtZSwgdGhpcy5jbG9uZVBhdGgobG9jYXRpb24pKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnZG9jay1wYW5lLWFjdGl2YXRlZCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBwYW5lOiBwYW5lTmFtZSB9LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgY29uc3QgcGFuZUhvc3QgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcGFuZUhvc3QuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFja19fcGFuZScpO1xuICAgICAgcGFuZUhvc3QuZGF0YXNldFsncGFuZSddID0gcGFuZU5hbWU7XG4gICAgICBwYW5lSG9zdC5pZCA9IHBhbmVsSWQ7XG4gICAgICBwYW5lSG9zdC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFicGFuZWwnKTtcbiAgICAgIHBhbmVIb3N0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGFiSWQpO1xuICAgICAgaWYgKHBhbmVOYW1lICE9PSBhY3RpdmVQYW5lKSB7XG4gICAgICAgIHBhbmVIb3N0LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzbG90RWwgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKTtcbiAgICAgIHNsb3RFbC5uYW1lID0gcGFuZU5hbWU7XG4gICAgICBwYW5lSG9zdC5hcHBlbmRDaGlsZChzbG90RWwpO1xuICAgICAgY29udGVudC5hcHBlbmRDaGlsZChwYW5lSG9zdCk7XG4gICAgfSk7XG5cbiAgICBzdGFjay5kYXRhc2V0WydhY3RpdmVQYW5lJ10gPSBhY3RpdmVQYW5lO1xuICAgIHN0YWNrLmFwcGVuZChoZWFkZXIsIGNvbnRlbnQpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5SZXNpemUoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHBhdGg6IERvY2tQYXRoLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZGl2aWRlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZGl2aWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gKGNvbnRhaW5lci5kYXRhc2V0WydkaXJlY3Rpb24nXSBhcyAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnKSA/PyAnaG9yaXpvbnRhbCc7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgIGNvbnN0IGluaXRpYWxTaXplcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcmVjdC53aWR0aCA6IHJlY3QuaGVpZ2h0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgYmVmb3JlU2l6ZSA9IGluaXRpYWxTaXplc1tpbmRleF07XG4gICAgY29uc3QgYWZ0ZXJTaXplID0gaW5pdGlhbFNpemVzW2luZGV4ICsgMV07XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkaXZpZGVyLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgZGl2aWRlci5kYXRhc2V0WydyZXNpemluZyddID0gJ3RydWUnO1xuICAgIHRoaXMucmVzaXplU3RhdGUgPSB7XG4gICAgICBwYXRoOiB0aGlzLmNsb25lUGF0aChwYXRoKSxcbiAgICAgIGluZGV4LFxuICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRpdmlkZXIsXG4gICAgICBzdGFydFBvcyxcbiAgICAgIGluaXRpYWxTaXplcyxcbiAgICAgIGJlZm9yZVNpemUsXG4gICAgICBhZnRlclNpemUsXG4gICAgfTtcblxuICAgIHRoaXMuc3RhcnRQb2ludGVyVHJhY2tpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyTW92ZShldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzaXplU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLnJlc2l6ZVN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc2l6ZVN0YXRlO1xuICAgICAgY29uc3Qgc3BsaXROb2RlID0gdGhpcy5yZXNvbHZlU3BsaXROb2RlKHN0YXRlLnBhdGgpO1xuICAgICAgaWYgKCFzcGxpdE5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50UG9zID0gc3RhdGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgICAgY29uc3QgZGVsdGEgPSBjdXJyZW50UG9zIC0gc3RhdGUuc3RhcnRQb3M7XG4gICAgICBjb25zdCBtaW5TaXplID0gNDg7XG4gICAgICBjb25zdCBwYWlyVG90YWwgPSBzdGF0ZS5iZWZvcmVTaXplICsgc3RhdGUuYWZ0ZXJTaXplO1xuXG4gICAgICBsZXQgbmV3QmVmb3JlID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KHN0YXRlLmJlZm9yZVNpemUgKyBkZWx0YSwgbWluU2l6ZSksXG4gICAgICAgIHBhaXJUb3RhbCAtIG1pblNpemUsXG4gICAgICApO1xuICAgICAgbGV0IG5ld0FmdGVyID0gcGFpclRvdGFsIC0gbmV3QmVmb3JlO1xuXG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuZXdCZWZvcmUpIHx8ICFOdW1iZXIuaXNGaW5pdGUobmV3QWZ0ZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0FmdGVyIDwgbWluU2l6ZSkge1xuICAgICAgICBuZXdBZnRlciA9IG1pblNpemU7XG4gICAgICAgIG5ld0JlZm9yZSA9IHBhaXJUb3RhbCAtIG1pblNpemU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1NpemVzUGl4ZWxzID0gWy4uLnN0YXRlLmluaXRpYWxTaXplc107XG4gICAgICBuZXdTaXplc1BpeGVsc1tzdGF0ZS5pbmRleF0gPSBuZXdCZWZvcmU7XG4gICAgICBuZXdTaXplc1BpeGVsc1tzdGF0ZS5pbmRleCArIDFdID0gbmV3QWZ0ZXI7XG5cbiAgICAgIGNvbnN0IHRvdGFsID0gbmV3U2l6ZXNQaXhlbHMucmVkdWNlKChhY2MsIHNpemUpID0+IGFjYyArIHNpemUsIDApO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRvdGFsID4gMCA/IG5ld1NpemVzUGl4ZWxzLm1hcCgoc2l6ZSkgPT4gc2l6ZSAvIHRvdGFsKSA6IFtdO1xuXG4gICAgICBzcGxpdE5vZGUuc2l6ZXMgPSBub3JtYWxpemVkO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKHN0YXRlLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgICAgbm9ybWFsaXplZC5mb3JFYWNoKChzaXplLCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2lkeF0pIHtcbiAgICAgICAgICBjaGlsZHJlbltpZHhdLnN0eWxlLmZsZXggPSBgJHtNYXRoLm1heChzaXplLCAwKX0gMSAwYDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmhhbmRsZUZsb2F0aW5nUmVzaXplTW92ZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgdGhpcy5oYW5kbGVGbG9hdGluZ0RyYWdNb3ZlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlclVwKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMucmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICBjb25zdCBkaXZpZGVyID0gdGhpcy5yZXNpemVTdGF0ZS5kaXZpZGVyO1xuICAgICAgZGl2aWRlci5kYXRhc2V0WydyZXNpemluZyddID0gJ2ZhbHNlJztcbiAgICAgIGRpdmlkZXIucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHRoaXMucmVzaXplU3RhdGUucG9pbnRlcklkKTtcbiAgICAgIHRoaXMucmVzaXplU3RhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHRoaXMuZW5kRmxvYXRpbmdEcmFnKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHRoaXMuZW5kRmxvYXRpbmdSZXNpemUoZXZlbnQucG9pbnRlcklkKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BQb2ludGVyVHJhY2tpbmdJZklkbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FwdHVyZVRhYkRyYWdNZXRyaWNzKGV2ZW50OiBQb2ludGVyRXZlbnQsIHN0YWNrRWw6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghc3RhY2tFbCkge1xuICAgICAgdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3MgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WSkpIHtcbiAgICAgIHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgc3RhY2tSZWN0ID0gc3RhY2tFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHN0YWNrUmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHN0YWNrUmVjdC50b3A7XG4gICAgY29uc3QgbGVmdCA9IHN0YWNrUmVjdC5sZWZ0IC0gaG9zdFJlY3QubGVmdDtcbiAgICBjb25zdCB0b3AgPSBzdGFja1JlY3QudG9wIC0gaG9zdFJlY3QudG9wO1xuICAgIGNvbnN0IHdpZHRoID0gTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC53aWR0aCkgPyBzdGFja1JlY3Qud2lkdGggOiAwO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3QuaGVpZ2h0KSA/IHN0YWNrUmVjdC5oZWlnaHQgOiAwO1xuXG4gICAgdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3MgPSB7XG4gICAgICBwb2ludGVyT2Zmc2V0WCxcbiAgICAgIHBvaW50ZXJPZmZzZXRZLFxuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgc3RhcnRDbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRDbGllbnRZOiBldmVudC5jbGllbnRZLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk6IHZvaWQge1xuICAgIHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5QYW5lRHJhZyhcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICAgIHBhdGg6IERvY2tQYXRoLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBzdGFja0VsOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICk6IHZvaWQge1xuICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgZ2hvc3QgZWxlbWVudCBmb3IgdGhlIGRyYWcgaW1hZ2UuIFRoaXMgcHJldmVudHMgdGhlIGJyb3dzZXIgZnJvbSBjYW5jZWxsaW5nXG4gICAgLy8gdGhlIGRyYWcgb3BlcmF0aW9uIHdoZW4gdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gZHVyaW5nIHJlLXJlbmRlci5cbiAgICBjb25zdCBnaG9zdCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZ2hvc3Quc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGdob3N0LnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZ2hvc3Quc3R5bGUudG9wID0gJy05OTk5cHgnO1xuICAgIGdob3N0LnN0eWxlLndpZHRoID0gYCR7KGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRofXB4YDtcbiAgICBnaG9zdC5zdHlsZS5oZWlnaHQgPSBgJHsoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFwcGVuZENoaWxkKGdob3N0KTtcblxuICAgIC8vIFVzZSB0aGUgZ2hvc3QgZWxlbWVudCBhcyB0aGUgZHJhZyBpbWFnZS5cbiAgICAvLyBUaGUgb2Zmc2V0IGlzIHNldCB0byB3aGVyZSB0aGUgdXNlcidzIGN1cnNvciBpcyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudC5cbiAgICBjb25zdCBkcmFnSW1nT2Zmc2V0WCA9IE51bWJlci5pc0Zpbml0ZSgoZXZlbnQgYXMgYW55KS5vZmZzZXRYKSA/IChldmVudCBhcyBhbnkpLm9mZnNldFggOiAwO1xuICAgIGNvbnN0IGRyYWdJbWdPZmZzZXRZID0gTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFkpID8gKGV2ZW50IGFzIGFueSkub2Zmc2V0WSA6IDA7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShnaG9zdCwgZHJhZ0ltZ09mZnNldFgsIGRyYWdJbWdPZmZzZXRZKTtcblxuICAgIC8vIFRoZSBnaG9zdCBlbGVtZW50IGlzIG5vIGxvbmdlciBuZWVkZWQgYWZ0ZXIgdGhlIGRyYWcgaW1hZ2UgaXMgc2V0LlxuICAgIC8vIFdlIGRlZmVyIGl0cyByZW1vdmFsIHRvIGVuc3VyZSB0aGUgYnJvd3NlciBoYXMgY2FwdHVyZWQgaXQuXG4gICAgc2V0VGltZW91dCgoKSA9PiBnaG9zdC5yZW1vdmUoKSwgMCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBwYXRoOiBzb3VyY2VQYXRoLFxuICAgICAgZmxvYXRpbmdJbmRleCxcbiAgICAgIHBvaW50ZXJPZmZzZXRYLFxuICAgICAgcG9pbnRlck9mZnNldFksXG4gICAgfSA9IHRoaXMucHJlcGFyZVBhbmVEcmFnU291cmNlKHBhdGgsIHBhbmUsIHN0YWNrRWwsIGV2ZW50KTtcblxuICAgIC8vIENhcHR1cmUgaGVhZGVyIGJvdW5kcyBmb3IgZGV0ZWN0aW5nIHdoZW4gdG8gY29udmVydCB0byBmbG9hdGluZ1xuICAgIGNvbnN0IGhlYWRlckVsID0gc3RhY2tFbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrX19oZWFkZXInKSA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlclJlY3QgPSBoZWFkZXJFbCA/IGhlYWRlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICBjb25zdCBoZWFkZXJCb3VuZHMgPSBoZWFkZXJSZWN0XG4gICAgICA/IHsgbGVmdDogaGVhZGVyUmVjdC5sZWZ0LCB0b3A6IGhlYWRlclJlY3QudG9wLCByaWdodDogaGVhZGVyUmVjdC5yaWdodCwgYm90dG9tOiBoZWFkZXJSZWN0LmJvdHRvbSB9XG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzO1xuXG4gICAgdGhpcy5kcmFnU3RhdGUgPSB7XG4gICAgICBwYW5lLFxuICAgICAgc291cmNlUGF0aDogdGhpcy5jbG9uZVBhdGgoc291cmNlUGF0aCksXG4gICAgICBmbG9hdGluZ0luZGV4LFxuICAgICAgcG9pbnRlck9mZnNldFgsXG4gICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICAgIGRyb3BIYW5kbGVkOiBmYWxzZSxcbiAgICAgIHNvdXJjZVN0YWNrRWw6IHN0YWNrRWwsXG4gICAgICBzb3VyY2VIZWFkZXJCb3VuZHM6IGhlYWRlckJvdW5kcyxcbiAgICAgIHN0YXJ0Q2xpZW50WDpcbiAgICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5zdGFydENsaWVudFgpXG4gICAgICAgICAgPyBtZXRyaWNzLnN0YXJ0Q2xpZW50WFxuICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpXG4gICAgICAgICAgPyBldmVudC5jbGllbnRYXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzdGFydENsaWVudFk6XG4gICAgICAgIG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3Muc3RhcnRDbGllbnRZKVxuICAgICAgICAgID8gbWV0cmljcy5zdGFydENsaWVudFlcbiAgICAgICAgICA6IE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKVxuICAgICAgICAgID8gZXZlbnQuY2xpZW50WVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgLy8gU2VlZCBsYXN0IGtub3duIHBvaW50ZXIgcG9zaXRpb24gZnJvbSBwb2ludGVyZG93biBtZXRyaWNzIHRvIGF2b2lkICgwLDApIGdsaXRjaGVzIGluIEZpcmVmb3hcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE51bWJlci5pc0Zpbml0ZSh0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUodGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZKVxuICAgICkge1xuICAgICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRYIGFzIG51bWJlcixcbiAgICAgICAgeTogdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZIGFzIG51bWJlcixcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIFByZWZlciB0aGUgcG9pbnRlciBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGRyYWdnZWQgdGFiIHRvIGF2b2lkIGp1bXBzIG9uIGNvbnZlcnNpb25cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFgpKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wb2ludGVyT2Zmc2V0WCA9IChldmVudCBhcyBhbnkpLm9mZnNldFggYXMgbnVtYmVyO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFkpKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wb2ludGVyT2Zmc2V0WSA9IChldmVudCBhcyBhbnkpLm9mZnNldFkgYXMgbnVtYmVyO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnN0YXJ0RHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJywgcGFuZSk7XG5cbiAgICAvLyBQcmVmZXJyZWQgVVg6IGlmIHRoZSBkcmFnZ2VkIHRhYiBpcyB0aGUgb25seSBvbmUgaW4gaXRzIHN0YWNrLFxuICAgIC8vIGltbWVkaWF0ZWx5IGNvbnZlcnQgdG8gYSBmbG9hdGluZyB3aW5kb3cgdW5sZXNzIGl0IGlzIGFscmVhZHkgdGhlXG4gICAgLy8gb25seSBwYW5lIGluIGEgZmxvYXRpbmcgd2luZG93ICh0aGlzIGNhc2UgaXMgaGFuZGxlZCBieSByZXVzZSBsb2dpYykuXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlICYmIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDApIHtcbiAgICAgIGNvbnN0IGxvYyA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24odGhpcy5kcmFnU3RhdGUuc291cmNlUGF0aCk7XG4gICAgICBpZiAobG9jICYmIEFycmF5LmlzQXJyYXkobG9jLm5vZGUucGFuZXMpICYmIGxvYy5ub2RlLnBhbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBsZXQgc2hvdWxkQ29udmVydCA9IGZhbHNlO1xuICAgICAgICBpZiAobG9jLmNvbnRleHQgPT09IFwiZG9ja2VkXCIpIHtcbiAgICAgICAgICBzaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2MuY29udGV4dCA9PT0gXCJmbG9hdGluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2MuaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHRvdGFsUGFuZXMgPSBmbG9hdGluZyAmJiBmbG9hdGluZy5yb290ID8gdGhpcy5jb3VudFBhbmVzSW5UcmVlKGZsb2F0aW5nLnJvb3QpIDogMDtcbiAgICAgICAgICBzaG91bGRDb252ZXJ0ID0gdG90YWxQYW5lcyA+IDE7IC8vIG5vdCB0aGUgb25seSBwYW5lIGluIHRoaXMgZmxvYXRpbmcgd2luZG93XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZENvbnZlcnQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydFggPSBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgPyBldmVudC5jbGllbnRYIDogKHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WCA/PyAwKTtcbiAgICAgICAgICBjb25zdCBzdGFydFkgPSBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WSkgPyBldmVudC5jbGllbnRZIDogKHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNvbnZlcnRQZW5kaW5nVGFiRHJhZ1RvRmxvYXRpbmcoc3RhcnRYLCBzdGFydFkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUGFuZURyYWdTb3VyY2UoXG4gICAgcGF0aDogRG9ja1BhdGgsXG4gICAgcGFuZTogc3RyaW5nLFxuICAgIHN0YWNrRWw6IEhUTUxFbGVtZW50IHwgbnVsbCxcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICApOiB7IHBhdGg6IERvY2tQYXRoOyBmbG9hdGluZ0luZGV4OiBudW1iZXIgfCBudWxsOyBwb2ludGVyT2Zmc2V0WDogbnVtYmVyOyBwb2ludGVyT2Zmc2V0WTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICBpZiAoIWxvY2F0aW9uIHx8ICFsb2NhdGlvbi5ub2RlLnBhbmVzLmluY2x1ZGVzKHBhbmUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoLFxuICAgICAgICBmbG9hdGluZ0luZGV4OiBudWxsLFxuICAgICAgICBwb2ludGVyT2Zmc2V0WDogMCxcbiAgICAgICAgcG9pbnRlck9mZnNldFk6IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3M7XG5cbiAgICBjb25zdCBkb21IYXNTaWJsaW5nID1cbiAgICAgICEhc3RhY2tFbCAmJlxuICAgICAgQXJyYXkuZnJvbShzdGFja0VsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWInKSkuc29tZShcbiAgICAgICAgKGJ1dHRvbikgPT4gYnV0dG9uLmRhdGFzZXRbJ3BhbmUnXSAmJiBidXR0b24uZGF0YXNldFsncGFuZSddICE9PSBwYW5lLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGhhc1NpYmxpbmdJblN0YWNrID0gbG9jYXRpb24ubm9kZS5wYW5lcy5zb21lKChleGlzdGluZykgPT4gZXhpc3RpbmcgIT09IHBhbmUpO1xuICAgIGNvbnN0IGZsb2F0aW5nID0gbG9jYXRpb24uY29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XSA6IG51bGw7XG4gICAgY29uc3QgZmxvYXRpbmdQYW5lQ291bnQgPVxuICAgICAgZmxvYXRpbmcgJiYgZmxvYXRpbmcucm9vdCA/IHRoaXMuY291bnRQYW5lc0luVHJlZShmbG9hdGluZy5yb290KSA6IGhhc1NpYmxpbmdJblN0YWNrID8gMiA6IDE7XG4gICAgY29uc3Qgc2hvdWxkUmV1c2VFeGlzdGluZ1dpbmRvdyA9XG4gICAgICBsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnICYmXG4gICAgICAhIWZsb2F0aW5nICYmXG4gICAgICAhaGFzU2libGluZ0luU3RhY2sgJiZcbiAgICAgICFkb21IYXNTaWJsaW5nICYmXG4gICAgICBmbG9hdGluZ1BhbmVDb3VudCA8PSAxO1xuXG4gICAgaWYgKHNob3VsZFJldXNlRXhpc3RpbmdXaW5kb3cpIHtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgICAgdGhpcy51cGRhdGVGbG9hdGluZ1dpbmRvd1RpdGxlKGxvY2F0aW9uLmluZGV4KTtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZ2V0RmxvYXRpbmdXcmFwcGVyKGxvY2F0aW9uLmluZGV4KTtcbiAgICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgICB0aGlzLnByb21vdGVGbG9hdGluZ1BhbmUobG9jYXRpb24uaW5kZXgsIHdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgcG9pbnRlck9mZnNldFggPVxuICAgICAgICAgIG1ldHJpY3MgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WCkgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5sZWZ0KSAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy5ib3VuZHMubGVmdClcbiAgICAgICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WCArIChtZXRyaWNzLmxlZnQgLSBmbG9hdGluZy5ib3VuZHMubGVmdClcbiAgICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy5ib3VuZHMubGVmdClcbiAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WCAtIGhvc3RSZWN0LmxlZnQgLSBmbG9hdGluZy5ib3VuZHMubGVmdFxuICAgICAgICAgICAgOiBmbG9hdGluZy5ib3VuZHMud2lkdGggLyAyO1xuICAgICAgICBjb25zdCBwb2ludGVyT2Zmc2V0WSA9XG4gICAgICAgICAgbWV0cmljcyAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRZKSAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnRvcCkgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuYm91bmRzLnRvcClcbiAgICAgICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WSArIChtZXRyaWNzLnRvcCAtIGZsb2F0aW5nLmJvdW5kcy50b3ApXG4gICAgICAgICAgICA6IE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKSAmJiBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuYm91bmRzLnRvcClcbiAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WSAtIGhvc3RSZWN0LnRvcCAtIGZsb2F0aW5nLmJvdW5kcy50b3BcbiAgICAgICAgICAgIDogZmxvYXRpbmcuYm91bmRzLmhlaWdodCAvIDI7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBmbG9hdGluZ0luZGV4OiBsb2NhdGlvbi5pbmRleCxcbiAgICAgICAgICBwb2ludGVyT2Zmc2V0WCxcbiAgICAgICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZsb2F0aW5nSW5kZXg6IG51bGwsXG4gICAgICAgIHBvaW50ZXJPZmZzZXRYOiAwLFxuICAgICAgICBwb2ludGVyT2Zmc2V0WTogMCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIERvIG5vdCBjb252ZXJ0IHRvIGZsb2F0aW5nIHlldDsgYWxsb3cgaW4taGVhZGVyIHJlb3JkZXJpbmcgZmlyc3QuXG4gICAgLy8gV2UgcmV0dXJuIHBsYWNlaG9sZGVyIHZhbHVlcyBhbmQgd2lsbCBjb252ZXJ0IG9uY2UgdGhlIHBvaW50ZXIgbGVhdmVzIHRoZSB0YWIgaGVhZGVyLlxuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYVmFsID1cbiAgICAgIG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFgpXG4gICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WFxuICAgICAgICA6IDA7XG4gICAgY29uc3QgcG9pbnRlck9mZnNldFlWYWwgPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WSlcbiAgICAgICAgPyBtZXRyaWNzLnBvaW50ZXJPZmZzZXRZXG4gICAgICAgIDogMDtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZmxvYXRpbmdJbmRleDogLTEsXG4gICAgICBwb2ludGVyT2Zmc2V0WDogcG9pbnRlck9mZnNldFhWYWwsXG4gICAgICBwb2ludGVyT2Zmc2V0WTogcG9pbnRlck9mZnNldFlWYWwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kUGFuZURyYWcoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclBlbmRpbmdEcmFnRW5kVGltZW91dCgpO1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgdGhpcy5kcmFnU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG4gICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSBudWxsO1xuICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmICFzdGF0ZS5kcm9wSGFuZGxlZCkge1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBLZWVwIGludGVybmFsIHBvaW50ZXIgdHJhY2tpbmcgdXAtdG8tZGF0ZS5cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgICB9XG5cbiAgICAvLyBTb21lIGJyb3dzZXJzIGludGVybWl0dGVudGx5IHJlcG9ydCAoMCwwKSBmb3IgZHJhZ292ZXIgY29vcmRpbmF0ZXMuXG4gICAgLy8gTWlycm9yIHRoZSByb2J1c3QgbG9naWMgdXNlZCBpbiBvbkRyb3A6IHByZWZlciBhY3R1YWwgZXZlbnQgY29vcmRpbmF0ZXNcbiAgICAvLyB3aGVuIHZhbGlkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBsYXN0IHRyYWNrZWQgcG9pbnRlciBwb3NpdGlvbi5cbiAgICBjb25zdCBwb2ludEZyb21FdmVudCA9XG4gICAgICBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpXG4gICAgICAgID8geyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgcG9pbnQgPVxuICAgICAgcG9pbnRGcm9tRXZlbnQgPz9cbiAgICAgICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uXG4gICAgICAgID8geyBjbGllbnRYOiB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uLngsIGNsaWVudFk6IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24ueSB9XG4gICAgICAgIDogbnVsbCk7XG5cbiAgICBjb25zdCBzdGFjayA9XG4gICAgICB0aGlzLmZpbmRTdGFja0VsZW1lbnQoZXZlbnQpID8/XG4gICAgICAocG9pbnQgPyB0aGlzLmZpbmRTdGFja0F0UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSkgOiBudWxsKTtcbiAgICBpZiAoIXN0YWNrKSB7XG4gICAgICBpZiAodGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddICE9PSAndHJ1ZScpIHtcbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIC8vIFdoaWxlIHJlb3JkZXJpbmcgd2l0aGluIHRoZSBzYW1lIGhlYWRlciwgc3VwcHJlc3MgdGhlIGpveXN0aWNrL2luZGljYXRvciBlbnRpcmVseVxuICAgIGlmIChcbiAgICAgIHRoaXMuZHJhZ1N0YXRlICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4IDwgMCAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgdGhpcy5wYXRoc0VxdWFsKHBhdGgsIHRoaXMuZHJhZ1N0YXRlLnNvdXJjZVBhdGgpXG4gICAgKSB7XG4gICAgICBjb25zdCBweCA9IChwb2ludCA/IHBvaW50LmNsaWVudFggOiBldmVudC5jbGllbnRYKSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBweSA9IChwb2ludCA/IHBvaW50LmNsaWVudFkgOiBldmVudC5jbGllbnRZKSBhcyBudW1iZXI7XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHB4KSAmJiBOdW1iZXIuaXNGaW5pdGUocHkpICYmIHRoaXMuaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihweCwgcHkpKSB7XG4gICAgICAgIC8vIERyaXZlIGxpdmUgcmVvcmRlciB1c2luZyB0aGUgdW5pZmllZCBwYXRoIHNvIHdlIHVwZGF0ZSBpbnN0YW50bHkuXG4gICAgICAgIHRoaXMudXBkYXRlUGFuZURyYWdEcm9wVGFyZ2V0RnJvbVBvaW50KHB4LCBweSk7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGUgaG92ZXJlZCBzdGFjayBjaGFuZ2VkLCBjbGVhciBhbnkgc3RpY2t5IHpvbmUgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyB0YXJnZXQgYmVmb3JlIGNvbXB1dGluZyB0aGUgbmV3IHpvbmUuXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFpvbmVIaW50ID0gdGhpcy5leHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IHBvaW50Wm9uZUhpbnQgPSBwb2ludCA/IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGw7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBwb2ludCA/PyBldmVudCwgcG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KTtcbiAgICB0aGlzLnNob3dEcm9wSW5kaWNhdG9yKHN0YWNrLCB6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb24oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IGhhc1ZhbGlkQ29vcmRpbmF0ZXMgPVxuICAgICAgTnVtYmVyLmlzRmluaXRlKGNsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WSkgJiZcbiAgICAgICEoY2xpZW50WCA9PT0gMCAmJiBjbGllbnRZID09PSAwKTtcblxuICAgIGlmIChoYXNWYWxpZENvb3JkaW5hdGVzKSB7XG4gICAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0geyB4OiBjbGllbnRYLCB5OiBjbGllbnRZIH07XG4gICAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb247XG4gICAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25HbG9iYWxEcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb24oZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkdsb2JhbERyYWdFbmQoKTogdm9pZCB7XG4gICAgLy8gQXR0ZW1wdCB0byBmaW5hbGl6ZSBhIGRyb3AgZXZlbiBpZiB0aGUgZHJvcCBldmVudCBkb2Vzbid0IHJlYWNoIHVzIChGaXJlZm94L2VkZ2UgY2FzZXMpXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBjb25zdCBwb3MgPSB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgIGlmIChzdGF0ZSAmJiBwb3MpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tBdFBvaW50KHBvcy54LCBwb3MueSk7XG4gICAgICBjb25zdCBqb3lzdGlja1Zpc2libGUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPT09ICd0cnVlJztcbiAgICAgIGNvbnN0IGpveXN0aWNrUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgICBjb25zdCBqb3lzdGlja1RhcmdldCA9IHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0O1xuICAgICAgY29uc3Qgam95c3RpY2tUYXJnZXRQYXRoID0gam95c3RpY2tUYXJnZXQgPyB0aGlzLnBhcnNlUGF0aChqb3lzdGlja1RhcmdldC5kYXRhc2V0WydwYXRoJ10pIDogbnVsbDtcbiAgICAgIGNvbnN0IHBhdGggPSBzdGFjayA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSkgOiAoam95c3RpY2tQYXRoID8/IGpveXN0aWNrVGFyZ2V0UGF0aCk7XG4gICAgICBjb25zdCBqb3lzdGlja1pvbmUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gYXMgRHJvcFpvbmUgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB6b25lID0gdGhpcy5pc0Ryb3Bab25lKGpveXN0aWNrWm9uZSlcbiAgICAgICAgPyBqb3lzdGlja1pvbmVcbiAgICAgICAgOiAoc3RhY2sgPyB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgeyBjbGllbnRYOiBwb3MueCwgY2xpZW50WTogcG9zLnkgfSwgbnVsbCkgOiBudWxsKTtcbiAgICAgIFxuICAgICAgaWYgKHBhdGggJiYgdGhpcy5pc0Ryb3Bab25lKHpvbmUpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRHJvcChwYXRoLCB6b25lISk7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KFxuICAgIGNsaWVudFg6IG51bWJlcixcbiAgICBjbGllbnRZOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjbGllbnRYKSB8fCAhTnVtYmVyLmlzRmluaXRlKGNsaWVudFkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElnbm9yZSBvYnZpb3VzbHkgYm9ndXMgY29vcmRpbmF0ZXMgc29tZXRpbWVzIHNlZW4gZHVyaW5nIEhUTUw1IGRyYWdcbiAgICBpZiAoY2xpZW50WCA9PT0gMCAmJiBjbGllbnRZID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc3RpbGwgZHJhZ2dpbmcgYSB0YWIgaW5zaWRlIGl0cyBoZWFkZXIsIG9ubHkgY29udmVydCB0byBmbG9hdGluZyBvbmNlIHdlIGxlYXZlIHRoZSBoZWFkZXIuXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDApIHtcbiAgICAgIGNvbnN0IGIgPSB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VIZWFkZXJCb3VuZHM7XG4gICAgICBjb25zdCBzeCA9IHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WCA/PyBjbGllbnRYO1xuICAgICAgY29uc3Qgc3kgPSB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFkgPz8gY2xpZW50WTtcbiAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLmh5cG90KGNsaWVudFggLSBzeCwgY2xpZW50WSAtIHN5KTtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDg7IC8vIHBpeGVscyB0byBtb3ZlIGJlZm9yZSBjb252ZXJ0aW5nICh0dW5lZCB1cClcbiAgICAgIC8vIERlZmF1bHQgdG8gaW5zaWRlIHdoaWxlIGJvdW5kcyBhcmUgdW5rbm93biB0byBhdm9pZCBwcmVtYXR1cmUgZmxvYXRpbmdcbiAgICAgIGxldCBpbnNpZGVIZWFkZXIgPSB0cnVlO1xuICAgICAgY29uc3QgaW5zaWRlQnlCb3VuZHMgPSBiID8gdGhpcy5pc1BvaW50V2l0aGluQm91bmRzKGIsIGNsaWVudFgsIGNsaWVudFkpIDogdHJ1ZTtcbiAgICAgIGNvbnN0IGluc2lkZUJ5SGl0VGVzdCA9IHRoaXMuaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIGluc2lkZUhlYWRlciA9IGluc2lkZUJ5Qm91bmRzIHx8IGluc2lkZUJ5SGl0VGVzdDtcbiAgICAgIGlmICghaW5zaWRlSGVhZGVyICYmIGRpc3QgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ29udmVydCB0byBmbG9hdGluZyBub3cgdXNpbmcgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uXG4gICAgICAgIHRoaXMuY29udmVydFBlbmRpbmdUYWJEcmFnVG9GbG9hdGluZyhjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBhbmVEcmFnRHJvcFRhcmdldEZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcblxuICAgIGNvbnN0IHsgZmxvYXRpbmdJbmRleCwgcG9pbnRlck9mZnNldFgsIHBvaW50ZXJPZmZzZXRZIH0gPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBpZiAoZmxvYXRpbmdJbmRleCA9PT0gbnVsbCB8fCBmbG9hdGluZ0luZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbZmxvYXRpbmdJbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBuZXdMZWZ0ID0gY2xpZW50WCAtIGhvc3RSZWN0LmxlZnQgLSBwb2ludGVyT2Zmc2V0WDtcbiAgICBjb25zdCBuZXdUb3AgPSBjbGllbnRZIC0gaG9zdFJlY3QudG9wIC0gcG9pbnRlck9mZnNldFk7XG5cbiAgICBmbG9hdGluZy5ib3VuZHMubGVmdCA9IG5ld0xlZnQ7XG4gICAgZmxvYXRpbmcuYm91bmRzLnRvcCA9IG5ld1RvcDtcblxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldEZsb2F0aW5nV3JhcHBlcihmbG9hdGluZ0luZGV4KTtcbiAgICBpZiAod3JhcHBlcikge1xuICAgICAgd3JhcHBlci5zdHlsZS5sZWZ0ID0gYCR7bmV3TGVmdH1weGA7XG4gICAgICB3cmFwcGVyLnN0eWxlLnRvcCA9IGAke25ld1RvcH1weGA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYW5lRHJhZ0Ryb3BUYXJnZXRGcm9tUG9pbnQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3QgcGF0aCA9IHN0YWNrID8gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKSA6IG51bGw7XG4gICAgaWYgKCFzdGFjayB8fCAhcGF0aCkge1xuICAgICAgLy8gV2hpbGUgYWN0aXZlbHkgZHJhZ2dpbmcsIGF2b2lkIGhpZGluZyB0aGUgaW5kaWNhdG9yIGlmIGl0IGlzIHZpc2libGUuXG4gICAgICAvLyBUcmFuc2llbnQgbWlzc2VzIGZyb20gaGl0LXRlc3RpbmcgYXJlIGNvbW1vbiBuZWFyIHRoZSBqb3lzdGljay5cbiAgICAgIGlmICh0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gIT09ICd0cnVlJykge1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGVuc3VyZSBhbnkgaW4taGVhZGVyIHBsYWNlaG9sZGVyIGlzIGNsZWFyZWQgd2hlbiBub3Qgb3ZlciBhIHN0YWNrXG4gICAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHN0YWNrLCByZXNldCBhbnkgc3RpY2t5IHpvbmUgc29cbiAgICAgIC8vIHRoZSBuZXcgZHJvcCBhcmVhIGRvZXNuJ3QgaW5oZXJpdCB0aGUgcHJldmlvdXMgc2lkZSBzZWxlY3Rpb24uXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2aW91cyBiZWhhdmlvciBoaWQgdGhlIGluZGljYXRvciBhbmQgcmV0dXJuZWQgZWFybHkgaGVyZTsgaW5zdGVhZCxcbiAgICAvLyBhbGxvdyB0aGUgbGl2ZS1yZW9yZGVyIGJyYW5jaCBiZWxvdyB0byBoYW5kbGUgaW4taGVhZGVyIGRyYWdzLlxuXG4gICAgLy8gV2hpbGUgZHJhZ2dpbmcgd2l0aGluIHRoZSBzYW1lIGhlYWRlciwgc2hvdyBhIHBsYWNlaG9sZGVyIGFuZCBzdXBwcmVzcyBqb3lzdGljay9pbmRpY2F0b3JcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZSAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDAgJiZcbiAgICAgIHBhdGggJiZcbiAgICAgIHRoaXMucGF0aHNFcXVhbChwYXRoLCB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VQYXRoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5IZWFkZXJCeUJvdW5kcyA9ICEhdGhpcy5kcmFnU3RhdGUuc291cmNlSGVhZGVyQm91bmRzICYmIHRoaXMuaXNQb2ludFdpdGhpbkJvdW5kcyh0aGlzLmRyYWdTdGF0ZS5zb3VyY2VIZWFkZXJCb3VuZHMsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgICAgY29uc3QgaW5IZWFkZXJCeUhpdFRlc3QgPSB0aGlzLmlzUG9pbnRlck92ZXJTb3VyY2VIZWFkZXIoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpZiAoaW5IZWFkZXJCeUJvdW5kcyB8fCBpbkhlYWRlckJ5SGl0VGVzdCkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBzdGFjay5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX2hlYWRlcicpO1xuICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgLy8gRW5zdXJlIHBsYWNlaG9sZGVyIGV4aXN0cyBhbmQgbW92ZSBpdCBhcyB0aGUgcG9pbnRlciBtb3Zlc1xuICAgICAgICAgIHRoaXMuZW5zdXJlSGVhZGVyRHJhZ1BsYWNlaG9sZGVyKGhlYWRlciwgdGhpcy5kcmFnU3RhdGUucGFuZSk7XG4gICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyLCBjbGllbnRYKTtcbiAgICAgICAgICBpZiAodGhpcy5kcmFnU3RhdGUubGl2ZVJlb3JkZXJJbmRleCAhPT0gaWR4KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlckRyYWdQbGFjZWhvbGRlclBvc2l0aW9uKGhlYWRlciwgaWR4KTtcbiAgICAgICAgICAgIC8vIEtlZXAgbW9kZWwgcmVvcmRlcmluZyB1bnRpbCBkcm9wOyBvbmx5IG1vdmUgdGhlIHBsYWNlaG9sZGVyIG5vd1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhdGUubGl2ZVJlb3JkZXJJbmRleCA9IGlkeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGVhdmluZyB0aGUgaGVhZGVyOiBlbnN1cmUgYW55IHBsYWNlaG9sZGVyIGlzIHJlbW92ZWQgaW1tZWRpYXRlbHlcbiAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG5cbiAgICBjb25zdCB6b25lSGludCA9IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICBjb25zdCB6b25lID0gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHsgY2xpZW50WCwgY2xpZW50WSB9LCB6b25lSGludCk7XG4gICAgdGhpcy5zaG93RHJvcEluZGljYXRvcihzdGFjaywgem9uZSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgb3ZlciB0aGUgc291cmNlIHN0YWNrJ3MgaGVhZGVyICh0YWIgc3RyaXApXG4gIHByaXZhdGUgaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGFja0VsID0gc3RhdGUuc291cmNlU3RhY2tFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrRWw/LnF1ZXJ5U2VsZWN0b3IoJy5kb2NrLXN0YWNrX19oZWFkZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgIC8vIEJlIGNvbnNlcnZhdGl2ZTogaWYgd2UgY2Fubm90IHJlc29sdmUgdGhlIGhlYWRlciwgdHJlYXQgYXMgaW5zaWRlXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc3IgPSB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgY29uc3QgZWxlbWVudHMgPSBzciA/IHNyLmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpIDogW107XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaGVhZGVyLmNvbnRhaW5zKGVsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BvaW50V2l0aGluQm91bmRzKFxuICAgIGJvdW5kczogeyBsZWZ0OiBudW1iZXI7IHJpZ2h0OiBudW1iZXI7IHRvcDogbnVtYmVyOyBib3R0b206IG51bWJlciB9LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB4ID49IGJvdW5kcy5sZWZ0ICYmIHggPD0gYm91bmRzLnJpZ2h0ICYmIHkgPj0gYm91bmRzLnRvcCAmJiB5IDw9IGJvdW5kcy5ib3R0b207XG4gIH1cblxuICAvLyBFbnN1cmUgYSBwbGFjZWhvbGRlciB0YWIgZXhpc3RzIGR1cmluZyBpbi1oZWFkZXIgZHJhZyBhbmQgaGlkZSB0aGUgcmVhbCBkcmFnZ2VkIHRhYiB2aXN1YWxseVxuICBwcml2YXRlIGVuc3VyZUhlYWRlckRyYWdQbGFjZWhvbGRlcihoZWFkZXI6IEhUTUxFbGVtZW50LCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnU3RhdGU/LnBsYWNlaG9sZGVySGVhZGVyID09PSBoZWFkZXIgJiYgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkcmFnZ2VkID0gQXJyYXkuZnJvbShoZWFkZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXRhYicpKS5maW5kKCh0KSA9PiB0LmRhdGFzZXRbJ3BhbmUnXSA9PT0gcGFuZSkgPz8gbnVsbDtcbiAgICBpZiAoIWRyYWdnZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIHBsYWNlaG9sZGVyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHBsYWNlaG9sZGVyLnR5cGUgPSAnYnV0dG9uJztcbiAgICBwbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXRhYicpO1xuICAgIHBsYWNlaG9sZGVyLmRhdGFzZXRbJ3BsYWNlaG9sZGVyJ10gPSAndHJ1ZSc7XG4gICAgLy8gS2VlcCB0aGUgcGxhY2Vob2xkZXIgdmlzdWFsbHkgZW1wdHkgYnV0IHJlc2VydmluZyB0aGUgc2FtZSB3aWR0aFxuICAgIHBsYWNlaG9sZGVyLnRleHRDb250ZW50ID0gJyc7XG4gICAgcGxhY2Vob2xkZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgcGxhY2Vob2xkZXIuc3R5bGUud2lkdGggPSBgJHtkcmFnZ2VkLm9mZnNldFdpZHRofXB4YDtcbiAgICAvLyBIaWRlIHRoZSBvcmlnaW5hbCBkcmFnZ2VkIHRhYiBzbyBpdCBkb2Vzbid0IGR1cGxpY2F0ZSB2aXN1YWxseSBhbmQgZnJlZSB1cCBpdHMgc2xvdFxuICAgIGRyYWdnZWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBJbnNlcnQgcGxhY2Vob2xkZXIgaW4gdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2VkIHRhYlxuICAgIGhlYWRlci5pbnNlcnRCZWZvcmUocGxhY2Vob2xkZXIsIGRyYWdnZWQpO1xuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJIZWFkZXIgPSBoZWFkZXI7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wbGFjZWhvbGRlckVsID0gcGxhY2Vob2xkZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gTW92ZSB0aGUgcGxhY2Vob2xkZXIgdG8gdGhlIGNvbXB1dGVkIHRhcmdldCBpbmRleCB3aXRoaW4gdGhlIGhlYWRlclxuICBwcml2YXRlIHVwZGF0ZUhlYWRlckRyYWdQbGFjZWhvbGRlclBvc2l0aW9uKGhlYWRlcjogSFRNTEVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZHJhZ1N0YXRlPy5wbGFjZWhvbGRlckVsID8/IG51bGw7XG4gICAgaWYgKCFwbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkcmFnZ2VkUGFuZSA9IHRoaXMuZHJhZ1N0YXRlPy5wYW5lID8/IG51bGw7XG4gICAgY29uc3QgdGFicyA9IEFycmF5LmZyb20oaGVhZGVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWInKSlcbiAgICAgIC5maWx0ZXIoKHQpID0+IHQgIT09IHBsYWNlaG9sZGVyICYmICghZHJhZ2dlZFBhbmUgfHwgdC5kYXRhc2V0WydwYW5lJ10gIT09IGRyYWdnZWRQYW5lKSk7XG4gICAgY29uc3QgY2xhbXBlZFRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRhcmdldEluZGV4LCB0YWJzLmxlbmd0aCkpO1xuICAgIGNvbnN0IHJlZiA9IHRhYnNbY2xhbXBlZFRhcmdldF0gPz8gbnVsbDtcbiAgICBoZWFkZXIuaW5zZXJ0QmVmb3JlKHBsYWNlaG9sZGVyLCByZWYpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGFuZCByZXN0b3JlIG9yaWdpbmFsIHRhYiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgY2xlYXJIZWFkZXJEcmFnUGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgY29uc3QgcGggPSB0aGlzLmRyYWdTdGF0ZT8ucGxhY2Vob2xkZXJFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZHJhZ1N0YXRlPy5wbGFjZWhvbGRlckhlYWRlciA/PyBudWxsO1xuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGRyYWdnZWQgPSB0aGlzLmRyYWdTdGF0ZT8ucGFuZVxuICAgICAgICA/IChBcnJheS5mcm9tKGhlYWRlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stdGFiJykpLmZpbmQoKHQpID0+IHQuZGF0YXNldFsncGFuZSddID09PSB0aGlzLmRyYWdTdGF0ZT8ucGFuZSkgPz8gbnVsbClcbiAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKGRyYWdnZWQpIHtcbiAgICAgICAgZHJhZ2dlZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwaCAmJiBwaC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBwaC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHBoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wbGFjZWhvbGRlckVsID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnBsYWNlaG9sZGVySGVhZGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhZ1BvaW50ZXJUcmFja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSBudWxsO1xuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbkRyYWdNb3VzZU1vdmUsIHRydWUpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdUb3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdNb3VzZVVwLCB0cnVlKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdUb3VjaEVuZCwgdHJ1ZSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25EcmFnVG91Y2hFbmQsIHRydWUpO1xuICAgIHRoaXMuZHJhZ1BvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbkRyYWdNb3VzZU1vdmUsIHRydWUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdUb3VjaE1vdmUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25EcmFnTW91c2VVcCwgdHJ1ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25EcmFnVG91Y2hFbmQsIHRydWUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uRHJhZ1RvdWNoRW5kLCB0cnVlKTtcbiAgICB0aGlzLmRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0gbnVsbDtcbiAgICB0aGlzLmNsZWFyUGVuZGluZ0RyYWdFbmRUaW1lb3V0KCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PT0gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdUb3VjaE1vdmUoZXZlbnQ6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLnN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzWzBdO1xuICAgIGlmICghdG91Y2gpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVEZWZlcnJlZERyYWdFbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSB7IHg6IHRvdWNoLmNsaWVudFgsIHk6IHRvdWNoLmNsaWVudFkgfTtcbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdNb3VzZVVwKCk6IHZvaWQge1xuICAgIC8vIFByZWZlciBjb21taXR0aW5nIGEgZHJvcCBmcm9tIHBvaW50ZXItdXAgc2luY2Ugc29tZSBicm93c2VycyBzdXBwcmVzcyBkcm9wIGV2ZW50c1xuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbjtcbiAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZURyb3BGcm9tUG9pbnQocG9zLngsIHBvcy55KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oYW5kbGVEcmFnUG9pbnRlclVwQ29tbW9uKCk7XG4gIH1cblxuICAvLyBDb252ZXJ0IGEgY3VycmVudGx5IGluLWhlYWRlciB0YWIgZHJhZyBpbnRvIGEgZmxvYXRpbmcgd2luZG93XG4gIHByaXZhdGUgY29udmVydFBlbmRpbmdUYWJEcmFnVG9GbG9hdGluZyhjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBpZiAoc3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJiBzdGF0ZS5mbG9hdGluZ0luZGV4ID49IDApIHtcbiAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBmbG9hdGluZ1xuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBhbnkgcGxhY2Vob2xkZXIgYmVmb3JlIGNvbnZlcnRpbmdcbiAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHN0YXRlLnNvdXJjZVBhdGgpO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYW5lID0gc3RhdGUucGFuZTtcbiAgICBjb25zdCBzdGFja0VsID0gc3RhdGUuc291cmNlU3RhY2tFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzdGFja1JlY3QgPSBzdGFja0VsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsO1xuICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcztcblxuICAgIGNvbnN0IGZhbGxiYWNrV2lkdGggPSAzMjA7XG4gICAgY29uc3QgZmFsbGJhY2tIZWlnaHQgPSAyNDA7XG4gICAgY29uc3Qgd2lkdGggPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy53aWR0aCkgJiYgbWV0cmljcy53aWR0aCA+IDBcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoXG4gICAgICAgIDogc3RhY2tSZWN0ICYmIE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3Qud2lkdGgpXG4gICAgICAgID8gc3RhY2tSZWN0LndpZHRoXG4gICAgICAgIDogZmFsbGJhY2tXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5oZWlnaHQpICYmIG1ldHJpY3MuaGVpZ2h0ID4gMFxuICAgICAgICA/IG1ldHJpY3MuaGVpZ2h0XG4gICAgICAgIDogc3RhY2tSZWN0ICYmIE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3QuaGVpZ2h0KVxuICAgICAgICA/IHN0YWNrUmVjdC5oZWlnaHRcbiAgICAgICAgOiBmYWxsYmFja0hlaWdodDtcblxuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYID0gTnVtYmVyLmlzRmluaXRlKHRoaXMuZHJhZ1N0YXRlPy5wb2ludGVyT2Zmc2V0WCBhcyBudW1iZXIpXG4gICAgICA/ICh0aGlzLmRyYWdTdGF0ZSEucG9pbnRlck9mZnNldFggYXMgbnVtYmVyKVxuICAgICAgOiBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRYKVxuICAgICAgPyAobWV0cmljcy5wb2ludGVyT2Zmc2V0WCBhcyBudW1iZXIpXG4gICAgICA6IHdpZHRoIC8gMjtcbiAgICBjb25zdCBwb2ludGVyT2Zmc2V0WSA9IE51bWJlci5pc0Zpbml0ZSh0aGlzLmRyYWdTdGF0ZT8ucG9pbnRlck9mZnNldFkgYXMgbnVtYmVyKVxuICAgICAgPyAodGhpcy5kcmFnU3RhdGUhLnBvaW50ZXJPZmZzZXRZIGFzIG51bWJlcilcbiAgICAgIDogbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WSlcbiAgICAgID8gKG1ldHJpY3MucG9pbnRlck9mZnNldFkgYXMgbnVtYmVyKVxuICAgICAgOiBoZWlnaHQgLyAyO1xuXG4gICAgY29uc3QgcG9pbnRlckxlZnQgPSBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WClcbiAgICAgID8gY2xpZW50WCAtIGhvc3RSZWN0LmxlZnQgLSBwb2ludGVyT2Zmc2V0WFxuICAgICAgOiAwO1xuICAgIGNvbnN0IHBvaW50ZXJUb3AgPSBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WSlcbiAgICAgID8gY2xpZW50WSAtIGhvc3RSZWN0LnRvcCAtIHBvaW50ZXJPZmZzZXRZXG4gICAgICA6IDA7XG5cbiAgICAvLyBSZW1vdmUgcGFuZSBmcm9tIGl0cyBjdXJyZW50IHN0YWNrIGFuZCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgZW50cnlcbiAgICB0aGlzLnJlbW92ZVBhbmVGcm9tTG9jYXRpb24obG9jYXRpb24sIHBhbmUpO1xuICAgIGNvbnN0IGZsb2F0aW5nU3RhY2s6IERvY2tTdGFja05vZGUgPSB7XG4gICAgICBraW5kOiAnc3RhY2snLFxuICAgICAgcGFuZXM6IFtwYW5lXSxcbiAgICAgIGFjdGl2ZVBhbmU6IHBhbmUsXG4gICAgfTtcblxuICAgIGNvbnN0IGZsb2F0aW5nTGF5b3V0OiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCA9IHtcbiAgICAgIGJvdW5kczoge1xuICAgICAgICBsZWZ0OiBwb2ludGVyTGVmdCxcbiAgICAgICAgdG9wOiBwb2ludGVyVG9wLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgfSxcbiAgICAgIHJvb3Q6IGZsb2F0aW5nU3RhY2ssXG4gICAgICBhY3RpdmVQYW5lOiBwYW5lLFxuICAgIH07XG5cbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cy5wdXNoKGZsb2F0aW5nTGF5b3V0KTtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRGbG9hdGluZ1dyYXBwZXIobmV3SW5kZXgpO1xuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICB0aGlzLnByb21vdGVGbG9hdGluZ1BhbmUobmV3SW5kZXgsIHdyYXBwZXIpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgZHJhZyBzdGF0ZSBzbyBzdWJzZXF1ZW50IG1vdmVzIHJlcG9zaXRpb24gdGhlIGZsb2F0aW5nIHdpbmRvd1xuICAgIHN0YXRlLnNvdXJjZVBhdGggPSB7IHR5cGU6ICdmbG9hdGluZycsIGluZGV4OiBuZXdJbmRleCwgc2VnbWVudHM6IFtdIH07XG4gICAgc3RhdGUuZmxvYXRpbmdJbmRleCA9IG5ld0luZGV4O1xuICAgIHN0YXRlLnBvaW50ZXJPZmZzZXRYID0gcG9pbnRlck9mZnNldFg7XG4gICAgc3RhdGUucG9pbnRlck9mZnNldFkgPSBwb2ludGVyT2Zmc2V0WTtcbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgaW50ZW5kZWQgdGFiIGluc2VydCBpbmRleCB3aXRoaW4gYSBoZWFkZXIgYmFzZWQgb24gcG9pbnRlciBYXG4gIC8vIEFkZHMgYSBzbGlnaHQgcmlnaHR3YXJkIGJpYXMgYW5kIHVzZXMgdGhlIHBsYWNlaG9sZGVyIHJlY3QgKGlmIHByZXNlbnQpXG4gIC8vIHRvIGVuc3VyZSBvZmZzZXRzIGFyZSBjb3JyZWN0IGV2ZW4gd2hlbiB0aGUgZHJhZ2dlZCB0YWIgaXMgZGlzcGxheTpub25lLlxuICBwcml2YXRlIGNvbXB1dGVIZWFkZXJJbnNlcnRJbmRleChoZWFkZXI6IEhUTUxFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGFsbFRhYnMgPSBBcnJheS5mcm9tKGhlYWRlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stdGFiJykpO1xuICAgIGlmIChhbGxUYWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhZ2dlZFBhbmUgPSB0aGlzLmRyYWdTdGF0ZT8ucGFuZSA/PyBudWxsO1xuICAgIGNvbnN0IGRyYWdnZWRFbCA9IGRyYWdnZWRQYW5lXG4gICAgICA/IChhbGxUYWJzLmZpbmQoKHQpID0+IHQuZGF0YXNldFsncGFuZSddID09PSBkcmFnZ2VkUGFuZSkgPz8gbnVsbClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBwbGFjZWhvbGRlckVsID0gaGVhZGVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWJbZGF0YS1wbGFjZWhvbGRlcj1cInRydWVcIl0nKTtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhbGxUYWJzLmZpbHRlcigodCkgPT4gdCAhPT0gZHJhZ2dlZEVsICYmIHQgIT09IHBsYWNlaG9sZGVyRWwpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmlnaHRCaWFzID0gMTI7XG4gICAgY29uc3QgbGVmdEJpYXMgPSAwO1xuXG4gICAgY29uc3QgYmFzZVJlY3QgPSBwbGFjZWhvbGRlckVsXG4gICAgICA/IHBsYWNlaG9sZGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIDogZHJhZ2dlZEVsXG4gICAgICA/IGRyYWdnZWRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHJlY3RWYWxpZCA9ICEhYmFzZVJlY3QgJiYgTnVtYmVyLmlzRmluaXRlKGJhc2VSZWN0LndpZHRoKSAmJiAoYmFzZVJlY3QgYXMgRE9NUmVjdCkud2lkdGggPiAwO1xuICAgIGNvbnN0IGRyYWdnZWRDZW50ZXIgPSByZWN0VmFsaWQgJiYgYmFzZVJlY3QgPyBiYXNlUmVjdC5sZWZ0ICsgYmFzZVJlY3Qud2lkdGggLyAyIDogbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRhcmdldHNbaV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBiYXNlTWlkID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBpc1JpZ2h0T2ZEcmFnZ2VkID0gZHJhZ2dlZENlbnRlciAhPT0gbnVsbCA/IGJhc2VNaWQgPj0gZHJhZ2dlZENlbnRlciA6IGZhbHNlO1xuICAgICAgY29uc3QgbWlkID0gaXNSaWdodE9mRHJhZ2dlZCA/IGJhc2VNaWQgKyByaWdodEJpYXMgOiBiYXNlTWlkIC0gbGVmdEJpYXM7XG4gICAgICBpZiAoY2xpZW50WCA8IG1pZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSByZW9yZGVyUGFuZUluTG9jYXRpb25BdEluZGV4KGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcsIHRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lcyA9IGxvY2F0aW9uLm5vZGUucGFuZXM7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gcGFuZXMuaW5kZXhPZihwYW5lKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjbGFtcGVkVGFyZ2V0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0SW5kZXgsIHBhbmVzLmxlbmd0aCAtIDEpKTtcbiAgICBpZiAoY2xhbXBlZFRhcmdldCA9PT0gY3VycmVudEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhbmVzLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIHBhbmVzLnNwbGljZShjbGFtcGVkVGFyZ2V0LCAwLCBwYW5lKTtcbiAgICBsb2NhdGlvbi5ub2RlLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ1RvdWNoRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlRHJhZ1BvaW50ZXJVcENvbW1vbigpO1xuICB9XG5cbiAgLy8gQ29tbWl0IGEgZHJvcCB1c2luZyBjdXJyZW50IHBvaW50ZXIgY29vcmRpbmF0ZXMgYW5kIGpveXN0aWNrIHN0YXRlXG4gIHByaXZhdGUgZmluYWxpemVEcm9wRnJvbVBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IHRoaXMuZmluZFN0YWNrQXRQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICBjb25zdCBzdGFja1BhdGggPSBzdGFjayA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGNvbnN0IGpveXN0aWNrVmlzaWJsZSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9PT0gJ3RydWUnO1xuICAgIGNvbnN0IGpveXN0aWNrU3RvcmVkUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgY29uc3Qgam95c3RpY2tUYXJnZXQgPSB0aGlzLmRyb3BKb3lzdGlja1RhcmdldDtcbiAgICBjb25zdCBqb3lzdGlja1RhcmdldFBhdGggPSBqb3lzdGlja1RhcmdldCA/IHRoaXMucGFyc2VQYXRoKGpveXN0aWNrVGFyZ2V0LmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGNvbnN0IHBhdGggPSAoam95c3RpY2tWaXNpYmxlID8gKGpveXN0aWNrU3RvcmVkUGF0aCA/PyBqb3lzdGlja1RhcmdldFBhdGgpIDogbnVsbCkgPz8gc3RhY2tQYXRoO1xuXG4gICAgY29uc3Qgam95c3RpY2tab25lID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddIGFzIERyb3Bab25lIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvbmU6IERyb3Bab25lIHwgbnVsbCA9IHRoaXMuaXNEcm9wWm9uZShqb3lzdGlja1pvbmUpXG4gICAgICA/IGpveXN0aWNrWm9uZVxuICAgICAgOiAoc3RhY2sgPyB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgeyBjbGllbnRYLCBjbGllbnRZIH0sIG51bGwpIDogbnVsbCk7XG5cbiAgICAvLyBTYW1lLWhlYWRlciByZW9yZGVyIGNhc2Ugd2hlbiBubyBzaWRlIHpvbmUgaXMgY2hvc2VuXG4gICAgaWYgKFxuICAgICAgdGhpcy5kcmFnU3RhdGUgJiZcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggPCAwICYmXG4gICAgICBzdGFjayAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgc3RhY2tQYXRoICYmXG4gICAgICB0aGlzLnBhdGhzRXF1YWwoc3RhY2tQYXRoLCB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VQYXRoKSAmJlxuICAgICAgKCF6b25lIHx8IHpvbmUgPT09ICdjZW50ZXInKVxuICAgICkge1xuICAgICAgY29uc3QgaGVhZGVyID0gc3RhY2sucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrX19oZWFkZXInKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGgpO1xuICAgICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLmNvbXB1dGVIZWFkZXJJbnNlcnRJbmRleChoZWFkZXIsIGNsaWVudFgpO1xuICAgICAgICAgIHRoaXMucmVvcmRlclBhbmVJbkxvY2F0aW9uQXRJbmRleChsb2NhdGlvbiwgdGhpcy5kcmFnU3RhdGUucGFuZSwgaWR4KTtcbiAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmIHRoaXMuaXNEcm9wWm9uZSh6b25lKSkge1xuICAgICAgdGhpcy5oYW5kbGVEcm9wKHBhdGgsIHpvbmUhKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZ0RyYWdFbmRUaW1lb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgICBpZiAod2luICYmIHR5cGVvZiB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgd2luLmNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbG9iYWxUaGlzLmNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZURyYWcgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IHdpblxuICAgICAgPyB3aW4uc2V0VGltZW91dChjb21wbGV0ZURyYWcsIDApXG4gICAgICA6IHNldFRpbWVvdXQoY29tcGxldGVEcmFnLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBwb2ludEZyb21FdmVudCA9XG4gICAgICBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpXG4gICAgICAgID8geyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgcG9pbnQgPVxuICAgICAgcG9pbnRGcm9tRXZlbnQgPz9cbiAgICAgICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgY2xpZW50WDogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi54LFxuICAgICAgICAgICAgY2xpZW50WTogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi55LFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsKTtcblxuICAgIGNvbnN0IHN0YWNrID1cbiAgICAgIHRoaXMuZmluZFN0YWNrRWxlbWVudChldmVudCkgPz9cbiAgICAgIChwb2ludCA/IHRoaXMuZmluZFN0YWNrQXRQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGwpO1xuXG4gICAgLy8gUHJlZmVyIGpveXN0aWNrJ3Mgc3RvcmVkIHRhcmdldCBwYXRoIHdoZW4gdGhlIGpveXN0aWNrIGlzIHZpc2libGUgKGRyb3Agb3ZlciBidXR0b25zKVxuICAgIGNvbnN0IGpveXN0aWNrVmlzaWJsZSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9PT0gJ3RydWUnO1xuICAgIGNvbnN0IGpveXN0aWNrUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgY29uc3Qgam95c3RpY2tUYXJnZXQgPSB0aGlzLmRyb3BKb3lzdGlja1RhcmdldDtcbiAgICBjb25zdCBqb3lzdGlja1RhcmdldFBhdGggPSBqb3lzdGlja1RhcmdldCA/IHRoaXMucGFyc2VQYXRoKGpveXN0aWNrVGFyZ2V0LmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGxldCBwYXRoID0gc3RhY2tcbiAgICAgID8gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKVxuICAgICAgOiAoam95c3RpY2tQYXRoID8/IGpveXN0aWNrVGFyZ2V0UGF0aCk7XG4gICAgaWYgKCFwYXRoICYmIGpveXN0aWNrVmlzaWJsZSkge1xuICAgICAgLy8gQXMgYSBsYXN0IHJlc29ydCwgdGFyZ2V0IHRoZSBtYWluIGRvY2sgc3VyZmFjZSBvbmx5IHdoZW4gZW1wdHlcbiAgICAgIGNvbnN0IGRvY2tQYXRoID0gdGhpcy5wYXJzZVBhdGgodGhpcy5kb2NrZWRFbC5kYXRhc2V0WydwYXRoJ10pO1xuICAgICAgcGF0aCA9ICghdGhpcy5yb290TGF5b3V0ID8gZG9ja1BhdGggOiBudWxsKTtcbiAgICB9XG5cbiAgICAvLyBEZWZlciBzYW1lLWhlYWRlciByZW9yZGVyIGRlY2lzaW9uIHVudGlsIGFmdGVyIHpvbmUgcmVzb2x1dGlvbiBiZWxvd1xuXG4gICAgLy8gUHJlZmVyIGpveXN0aWNrJ3MgYWN0aXZlIHpvbmUgaWYgYXZhaWxhYmxlLCBlbHNlIGluZmVyIGZyb20gZXZlbnQvcG9pbnRcbiAgICBjb25zdCBqb3lzdGlja1pvbmUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gYXMgRHJvcFpvbmUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXZlbnRab25lSGludCA9IHRoaXMuZXh0cmFjdERyb3Bab25lRnJvbUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBwb2ludFpvbmVIaW50ID0gcG9pbnQgPyB0aGlzLmZpbmREcm9wWm9uZUJ5UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSkgOiBudWxsO1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmlzRHJvcFpvbmUoam95c3RpY2tab25lKVxuICAgICAgPyBqb3lzdGlja1pvbmVcbiAgICAgIDogc3RhY2tcbiAgICAgID8gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHBvaW50ID8/IGV2ZW50LCBwb2ludFpvbmVIaW50ID8/IGV2ZW50Wm9uZUhpbnQpXG4gICAgICA6ICh0aGlzLmlzRHJvcFpvbmUocG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KSA/IChwb2ludFpvbmVIaW50ID8/IGV2ZW50Wm9uZUhpbnQpIDogbnVsbCk7XG5cbiAgICBcbiAgICAvLyBJZiBzdGlsbCBpbiBzYW1lIGhlYWRlciBhbmQgbm8gc2lkZSB6b25lIGNob3NlbiwgdHJlYXQgYXMgaW4taGVhZGVyIHJlb3JkZXJcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZSAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDAgJiZcbiAgICAgIHN0YWNrICYmXG4gICAgICBwYXRoICYmXG4gICAgICB0aGlzLnBhdGhzRXF1YWwocGF0aCwgdGhpcy5kcmFnU3RhdGUuc291cmNlUGF0aCkgJiZcbiAgICAgICghem9uZSB8fCB6b25lID09PSAnY2VudGVyJylcbiAgICApIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFja19faGVhZGVyJyk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IHggPSAocG9pbnQgPyBwb2ludC5jbGllbnRYIDogZXZlbnQuY2xpZW50WCkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHgpKSB7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGgpO1xuICAgICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyLCB4KTtcbiAgICAgICAgICAgIHRoaXMucmVvcmRlclBhbmVJbkxvY2F0aW9uQXRJbmRleChsb2NhdGlvbiwgdGhpcy5kcmFnU3RhdGUucGFuZSwgaWR4KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBqb3lzdGljayBpcyB2aXNpYmxlIGFuZCBib3RoIHBhdGggYW5kIHpvbmUgYXJlIHJlc29sdmVkLCBmb3JjZSB1c2luZyBqb3lzdGljayBhcyBhdXRob3JpdGF0aXZlXG4gICAgaWYgKGpveXN0aWNrVmlzaWJsZSAmJiBwYXRoICYmIHRoaXMuaXNEcm9wWm9uZShqb3lzdGlja1pvbmUpKSB7XG4gICAgICB0aGlzLmhhbmRsZURyb3AocGF0aCwgam95c3RpY2tab25lKTtcbiAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF6b25lKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlRHJvcChwYXRoLCB6b25lKTtcbiAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBOb2RlIHwgbnVsbDtcblxuICAgIC8vIER1cmluZyBhY3RpdmUgZHJhZ3MsIGJyb3dzZXJzIGNhbiBlbWl0IHNwdXJpb3VzIGRyYWdsZWF2ZSB3aXRoIG51bGxcbiAgICAvLyByZWxhdGVkVGFyZ2V0IHdoaWxlIHRoZSBwb2ludGVyIGlzIHN0aWxsIG92ZXIgdGhlIGpveXN0aWNrL2J1dHRvbnMuXG4gICAgLy8gQmUgY29uc2VydmF0aXZlOiBpZiB3ZSBjYW4gcmVzb2x2ZSBhIHN0YWNrL2pveXN0aWNrIGF0IHRoZSBsYXN0IGtub3duXG4gICAgLy8gcG9pbnRlciBwb3NpdGlvbiwgZG9u4oCZdCBoaWRlIChwcmV2ZW50cyBmbGlja2VyIG9mIGFjdGl2ZSBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICBjb25zdCBwb3MgPVxuICAgICAgICAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBEcmFnRXZlbnQpLmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZSgoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jbGllbnRZKSlcbiAgICAgICAgICA/IHsgeDogKGV2ZW50IGFzIERyYWdFdmVudCkuY2xpZW50WCwgeTogKGV2ZW50IGFzIERyYWdFdmVudCkuY2xpZW50WSB9XG4gICAgICAgICAgOiB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgICAgaWYgKHBvcykge1xuICAgICAgICBjb25zdCBzdGFja0F0UG9pbnQgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQocG9zLngsIHBvcy55KTtcbiAgICAgICAgaWYgKHN0YWNrQXRQb2ludCkge1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgaW5zaWRlIG91ciBkcm9wIGFyZWE7IGlnbm9yZSB0aGlzIGRyYWdsZWF2ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZWxhdGVkKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdENvbnRhaW5zID0gdGhpcy5yb290RWwuY29udGFpbnMocmVsYXRlZCk7XG4gICAgY29uc3Qgam95c3RpY2tDb250YWlucyA9IHRoaXMuZHJvcEpveXN0aWNrLmNvbnRhaW5zKHJlbGF0ZWQpO1xuICAgIGlmICghcm9vdENvbnRhaW5zICYmICFqb3lzdGlja0NvbnRhaW5zKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEcm9wKHRhcmdldFBhdGg6IERvY2tQYXRoIHwgbnVsbCwgem9uZTogRHJvcFpvbmUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlIHx8ICF0YXJnZXRQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYW5lLCBzb3VyY2VQYXRoIH0gPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHNvdXJjZVBhdGgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24odGFyZ2V0UGF0aCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IGFsbG93IGRyb3BwaW5nIG9udG8gYW4gZW1wdHkgbWFpbiBkb2NrIGFyZWEgKG5vIHJvb3QpLlxuICAgIGlmICghdGFyZ2V0ICYmIHRhcmdldFBhdGgudHlwZSA9PT0gJ2RvY2tlZCcgJiYgIXRoaXMucm9vdExheW91dCkge1xuICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhY2tFbXB0aWVkID0gdGhpcy5yZW1vdmVQYW5lRnJvbUxvY2F0aW9uKHNvdXJjZSwgcGFuZSwgdHJ1ZSk7XG4gICAgICBjb25zdCBuZXdSb290OiBEb2NrU3RhY2tOb2RlID0ge1xuICAgICAgICBraW5kOiAnc3RhY2snLFxuICAgICAgICBwYW5lczogW3BhbmVdLFxuICAgICAgICBhY3RpdmVQYW5lOiBwYW5lLFxuICAgICAgfTtcbiAgICAgIHRoaXMucm9vdExheW91dCA9IG5ld1Jvb3Q7XG4gICAgICBpZiAoc3RhY2tFbXB0aWVkKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2UgfHwgIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh6b25lID09PSAnY2VudGVyJyAmJiB0aGlzLnBhdGhzRXF1YWwoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkpIHtcbiAgICAgIGlmICghc291cmNlLm5vZGUucGFuZXMuaW5jbHVkZXMocGFuZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW9yZGVyUGFuZUluTG9jYXRpb24oc291cmNlLCBwYW5lKTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja0VtcHRpZWQgPSB0aGlzLnJlbW92ZVBhbmVGcm9tTG9jYXRpb24oc291cmNlLCBwYW5lLCB0cnVlKTtcblxuICAgIGlmICh6b25lID09PSAnY2VudGVyJykge1xuICAgICAgdGhpcy5hZGRQYW5lVG9Mb2NhdGlvbih0YXJnZXQsIHBhbmUpO1xuICAgICAgdGhpcy5zZXRBY3RpdmVQYW5lRm9yTG9jYXRpb24odGFyZ2V0LCBwYW5lKTtcbiAgICAgIGlmIChzdGFja0VtcHRpZWQpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwTG9jYXRpb24oc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGFjazogRG9ja1N0YWNrTm9kZSA9IHtcbiAgICAgIGtpbmQ6ICdzdGFjaycsXG4gICAgICBwYW5lczogW3BhbmVdLFxuICAgICAgYWN0aXZlUGFuZTogcGFuZSxcbiAgICB9O1xuXG4gICAgaWYgKHRhcmdldC5jb250ZXh0ID09PSAnZG9ja2VkJykge1xuICAgICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5kb2NrTm9kZUJlc2lkZSh0aGlzLnJvb3RMYXlvdXQsIHRhcmdldC5ub2RlLCBuZXdTdGFjaywgem9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbdGFyZ2V0LmluZGV4XTtcbiAgICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgICAgaWYgKHN0YWNrRW1wdGllZCkge1xuICAgICAgICAgIHRoaXMuY2xlYW51cExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmbG9hdGluZy5yb290ID0gdGhpcy5kb2NrTm9kZUJlc2lkZShmbG9hdGluZy5yb290LCB0YXJnZXQubm9kZSwgbmV3U3RhY2ssIHpvbmUpO1xuICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrRW1wdGllZCkge1xuICAgICAgdGhpcy5jbGVhbnVwTG9jYXRpb24oc291cmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICAgIFxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGbG9hdGluZ1N0YWNrRHJvcChzb3VyY2VJbmRleDogbnVtYmVyLCB0YXJnZXRQYXRoOiBEb2NrUGF0aCwgem9uZTogRHJvcFpvbmUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tzb3VyY2VJbmRleF07XG4gICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS5yb290KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbih0YXJnZXRQYXRoKTtcbiAgICAvLyBBbGxvdyBkcm9wcGluZyBhbiBlbnRpcmUgZmxvYXRpbmcgc3RhY2sgb250byBhbiBlbXB0eSBtYWluIGRvY2sgYXJlYVxuICAgIC8vIChubyBleGlzdGluZyByb290KS5cbiAgICBpZiAoIXRhcmdldCAmJiB0YXJnZXRQYXRoLnR5cGUgPT09ICdkb2NrZWQnICYmICF0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuY2xvbmVMYXlvdXROb2RlKHNvdXJjZS5yb290KTtcbiAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXQuY29udGV4dCA9PT0gJ2Zsb2F0aW5nJyAmJiB0YXJnZXQuaW5kZXggPT09IHNvdXJjZUluZGV4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHpvbmUgPT09ICdjZW50ZXInKSB7XG4gICAgICBjb25zdCBwYW5lcyA9IHRoaXMuY29sbGVjdFBhbmVOYW1lcyhzb3VyY2Uucm9vdCk7XG4gICAgICBpZiAocGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcGFuZXMuZm9yRWFjaCgocGFuZSkgPT4ge1xuICAgICAgICB0aGlzLmFkZFBhbmVUb0xvY2F0aW9uKHRhcmdldCwgcGFuZSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWN0aXZlUGFuZSA9XG4gICAgICAgIHNvdXJjZS5hY3RpdmVQYW5lICYmIHBhbmVzLmluY2x1ZGVzKHNvdXJjZS5hY3RpdmVQYW5lKVxuICAgICAgICAgID8gc291cmNlLmFjdGl2ZVBhbmVcbiAgICAgICAgICA6IHRoaXMuZmluZEZpcnN0UGFuZU5hbWUoc291cmNlLnJvb3QpID8/IHBhbmVzWzBdO1xuXG4gICAgICBpZiAoYWN0aXZlUGFuZSkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVBhbmVGb3JMb2NhdGlvbih0YXJnZXQsIGFjdGl2ZVBhbmUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQoc291cmNlSW5kZXgpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0LmNvbnRleHQgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbdGFyZ2V0LmluZGV4XTtcbiAgICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmbG9hdGluZy5yb290ID0gdGhpcy5kb2NrTm9kZUJlc2lkZShmbG9hdGluZy5yb290LCB0YXJnZXQubm9kZSwgc291cmNlLnJvb3QsIHpvbmUpO1xuICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHNvdXJjZS5hY3RpdmVQYW5lID8/IHRoaXMuZmluZEZpcnN0UGFuZU5hbWUoc291cmNlLnJvb3QpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuZG9ja05vZGVCZXNpZGUodGhpcy5yb290TGF5b3V0LCB0YXJnZXQubm9kZSwgc291cmNlLnJvb3QsIHpvbmUpO1xuICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRXZWlnaHQoc2l6ZXM6IG51bWJlcltdIHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyLCB0b3RhbENoaWxkcmVuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZXhpc3RpbmdDb3VudCA9IHRvdGFsQ2hpbGRyZW4gLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVNpemVzQXJyYXkoc2l6ZXMsIGV4aXN0aW5nQ291bnQpO1xuICAgIGNvbnN0IG5ld1dlaWdodCA9IDEgLyB0b3RhbENoaWxkcmVuO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IDEgLSBuZXdXZWlnaHQ7XG4gICAgY29uc3QgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxDaGlsZHJlbjsgaSArPSAxKSB7XG4gICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3V2VpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gaSA8IGluZGV4ID8gaSA6IGkgLSAxO1xuICAgICAgICByZXN1bHQucHVzaChub3JtYWxpemVkW3NvdXJjZUluZGV4XSAqIHJlbWFpbmluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBhbmVGcm9tU3RhY2soc3RhY2s6IERvY2tTdGFja05vZGUsIHBhbmU6IHN0cmluZywgc2tpcENsZWFudXAgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIHN0YWNrLnBhbmVzID0gc3RhY2sucGFuZXMuZmlsdGVyKChwKSA9PiBwICE9PSBwYW5lKTtcbiAgICBpZiAoIXN0YWNrLnBhbmVzLmluY2x1ZGVzKHN0YWNrLmFjdGl2ZVBhbmUgPz8gJycpKSB7XG4gICAgICBpZiAoc3RhY2sucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGFjay5hY3RpdmVQYW5lID0gc3RhY2sucGFuZXNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgc3RhY2suYWN0aXZlUGFuZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhY2sucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChza2lwQ2xlYW51cCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZSh0aGlzLnJvb3RMYXlvdXQsIHN0YWNrKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmVudFNwbGl0KFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICBjaGlsZDogRG9ja0xheW91dE5vZGUsXG4gICk6IHsgcGFyZW50OiBEb2NrU3BsaXROb2RlOyBpbmRleDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PT0gY2hpbGQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLmtpbmQgIT09ICdzcGxpdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gbm9kZS5jaGlsZHJlbi5pbmRleE9mKGNoaWxkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4geyBwYXJlbnQ6IG5vZGUsIGluZGV4IH07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChub2RlLmNoaWxkcmVuW2ldLCBjaGlsZCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVEcm9wWm9uZShcbiAgICBzdGFjazogSFRNTEVsZW1lbnQsXG4gICAgcG9pbnQ6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IG51bGwsXG4gICAgem9uZUhpbnQ/OiBEcm9wWm9uZSB8IG51bGwsXG4gICk6IERyb3Bab25lIHwgbnVsbCB7XG4gICAgLy8gRG8gbm90IGZvcmNlIGEgem9uZTogZXZlbiB3aGVuIHRoZSBtYWluIGFyZWEgaXMgZW1wdHkgd2Ugb25seVxuICAgIC8vIGFjdGl2YXRlIGEgem9uZSB3aGVuIHRoZSBwb2ludGVyIGlzIGFjdHVhbGx5IG92ZXIgYSBqb3lzdGljayBidXR0b24uXG4gICAgY29uc3QgaGludGVkWm9uZSA9IHRoaXMuaXNEcm9wWm9uZSh6b25lSGludCkgPyB6b25lSGludCA6IG51bGw7XG4gICAgaWYgKGhpbnRlZFpvbmUpIHtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShoaW50ZWRab25lKTtcbiAgICAgIHJldHVybiBoaW50ZWRab25lO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaW50Wm9uZSA9XG4gICAgICBwb2ludCAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKHBvaW50LmNsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUocG9pbnQuY2xpZW50WSlcbiAgICAgICAgPyB0aGlzLmZpbmREcm9wWm9uZUJ5UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSlcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKHBvaW50Wm9uZSkge1xuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHBvaW50Wm9uZSk7XG4gICAgICByZXR1cm4gcG9pbnRab25lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyb3BKb3lzdGlja1RhcmdldCA9PT0gc3RhY2spIHtcbiAgICAgIC8vIEJlIHN0aWNreSB3aGlsZSBob3ZlcmluZyB0aGUgam95c3RpY2s6IGlmIHdlIHJlY2VudGx5IGhhZCBhIHpvbmVcbiAgICAgIC8vIHNlbGVjdGVkLCBwcmVmZXIga2VlcGluZyBpdCBpbnN0ZWFkIG9mIGJyaWVmbHkgY2xlYXJpbmcgdG8gbnVsbFxuICAgICAgLy8gd2hlbiB0aGUgYnJvd3NlciByZXBvcnRzIHRyYW5zaWVudCBjb29yZGluYXRlcy90YXJnZXRzIGR1cmluZyBkcmFnLlxuICAgICAgY29uc3Qgc3RpY2t5ID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZShzdGlja3kpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShzdGlja3kpO1xuICAgICAgICByZXR1cm4gc3RpY2t5O1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQ6IEV2ZW50KTogRHJvcFpvbmUgfCBudWxsIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIChldmVudCBhcyBEcmFnRXZlbnQpLmNvbXBvc2VkUGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcGF0aCA9IChldmVudCBhcyBEcmFnRXZlbnQpLmNvbXBvc2VkUGF0aCgpO1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuZmluZERyb3Bab25lSW5UYXJnZXRzKHBhdGgpO1xuICAgICAgaWYgKHpvbmUpIHtcbiAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdjbGllbnRYJyBpbiBldmVudCAmJiAnY2xpZW50WScgaW4gZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50RXZlbnQgPSBldmVudCBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3Qgem9uZUZyb21Qb2ludCA9IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludEV2ZW50LmNsaWVudFgsIHBvaW50RXZlbnQuY2xpZW50WSk7XG4gICAgICBpZiAoem9uZUZyb21Qb2ludCkge1xuICAgICAgICByZXR1cm4gem9uZUZyb21Qb2ludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ1BvaW50ZXJVcENvbW1vbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLnN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVEZWZlcnJlZERyYWdFbmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3Bab25lSW5UYXJnZXRzKHRhcmdldHM6IEl0ZXJhYmxlPEV2ZW50VGFyZ2V0Pik6IERyb3Bab25lIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbicpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgem9uZSA9IHRhcmdldC5kYXRhc2V0Py5bJ3pvbmUnXTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZSh6b25lKSkge1xuICAgICAgICAgIHJldHVybiB6b25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFpvbmVCeVBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogRHJvcFpvbmUgfCBudWxsIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zIHx8XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gIT09ICd0cnVlJyB8fFxuICAgICAgIXRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0XG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMpIHtcbiAgICAgIC8vIFNraXAgaGlkZGVuL2luYWN0aXZlIGJ1dHRvbnMgKHVzZWQgaW4gY2VudGVyLW9ubHkgbW9kZSlcbiAgICAgIGlmICgoYnV0dG9uLmRhdGFzZXRbJ2hpZGRlbiddID09PSAndHJ1ZScpIHx8IGJ1dHRvbi5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCBidXR0b24uc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjdCA9IGJ1dHRvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmXG4gICAgICAgIGNsaWVudFkgPj0gcmVjdC50b3AgJiZcbiAgICAgICAgY2xpZW50WSA8PSByZWN0LmJvdHRvbVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHpvbmUgPSBidXR0b24uZGF0YXNldFsnem9uZSddO1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bab25lKHpvbmUpKSB7XG4gICAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZSh6b25lOiBEcm9wWm9uZSB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBJZiBubyB6b25lIGlzIGNvbXB1dGVkIGJ1dCB0aGUgam95c3RpY2sgaXMgdmlzaWJsZSwga2VlcCB0aGUgbGFzdFxuICAgIC8vIGtub3duIGFjdGl2ZSB6b25lIHRvIGF2b2lkIHZpc3VhbCBqaXR0ZXIgd2hpbGUgZHJhZ2dpbmcgYWNyb3NzXG4gICAgLy8gc21hbGwgZ2FwcyB3aGVyZSBoaXTigJF0ZXN0aW5nIG1vbWVudGFyaWx5IGZhaWxzLlxuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPT09ICd0cnVlJztcbiAgICBjb25zdCBzdGlja3kgPSB2aXNpYmxlID8gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVpvbmU6IERyb3Bab25lIHwgbnVsbCA9IHpvbmUgPz8gKHRoaXMuaXNEcm9wWm9uZShzdGlja3kpID8gc3RpY2t5IDogbnVsbCk7XG5cbiAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGVmZmVjdGl2ZVpvbmUgIT09IG51bGwgJiYgYnV0dG9uLmRhdGFzZXRbJ3pvbmUnXSA9PT0gZWZmZWN0aXZlWm9uZTtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBidXR0b24uZGF0YXNldFsnYWN0aXZlJ10gPSAndHJ1ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgYnV0dG9uLmRhdGFzZXRbJ2FjdGl2ZSddO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChlZmZlY3RpdmVab25lKSB7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gPSBlZmZlY3RpdmVab25lO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEcm9wWm9uZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIERyb3Bab25lIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICdsZWZ0JyB8fCB2YWx1ZSA9PT0gJ3JpZ2h0JyB8fCB2YWx1ZSA9PT0gJ3RvcCcgfHwgdmFsdWUgPT09ICdib3R0b20nIHx8IHZhbHVlID09PSAnY2VudGVyJztcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Ryb3BJbmRpY2F0b3Ioc3RhY2s6IEhUTUxFbGVtZW50LCB6b25lOiBEcm9wWm9uZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gdGhpcy5kcmFnU3RhdGU/LnNvdXJjZVBhdGggPz8gbnVsbDtcbiAgICBpZiAodGFyZ2V0UGF0aCAmJiBzb3VyY2VQYXRoICYmIHRoaXMuaXNPcklzQW5jZXN0b3JPZih0YXJnZXRQYXRoLCBzb3VyY2VQYXRoKSkge1xuICAgICAgLy8gRG9uJ3Qgc2hvdyBhbnkgZHJvcCBpbmRpY2F0b3JzIG9uIHRoZSBwYW5lIGJlaW5nIGRyYWdnZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHN0YWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpbmRpY2F0b3IgPSB0aGlzLmRyb3BJbmRpY2F0b3I7XG4gICAgY29uc3Qgam95c3RpY2sgPSB0aGlzLmRyb3BKb3lzdGljaztcblxuICAgIGpveXN0aWNrLmhpZGRlbiA9IGZhbHNlO1xuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgbGV0IG92ZXJsYXlaID0gMTAwO1xuICAgIGlmIChwYXRoICYmIHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgb3ZlcmxheVogPSB0aGlzLmdldEZsb2F0aW5nUGFuZVpJbmRleChwYXRoLmluZGV4KSArIDEwMDtcbiAgICB9XG4gICAgaW5kaWNhdG9yLnN0eWxlLnpJbmRleCA9IFN0cmluZyhvdmVybGF5Wik7XG4gICAgam95c3RpY2suc3R5bGUuekluZGV4ID0gU3RyaW5nKG92ZXJsYXlaICsgMSk7XG5cbiAgICBsZXQgbGVmdCA9IHJlY3QubGVmdCAtIGhvc3RSZWN0LmxlZnQ7XG4gICAgbGV0IHRvcCA9IHJlY3QudG9wIC0gaG9zdFJlY3QudG9wO1xuICAgIGxldCB3aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgbGV0IGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuXG4gICAgY29uc3QgcG9ydGlvbiA9IDAuNTtcblxuICAgIGlmICh6b25lKSB7XG4gICAgICBzd2l0Y2ggKHpvbmUpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgd2lkdGggPSByZWN0LndpZHRoICogcG9ydGlvbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCAqIHBvcnRpb247XG4gICAgICAgICAgbGVmdCArPSByZWN0LndpZHRoICogKDEgLSBwb3J0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCAqIHBvcnRpb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiBwb3J0aW9uO1xuICAgICAgICAgIHRvcCArPSByZWN0LmhlaWdodCAqICgxIC0gcG9ydGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGluZGljYXRvci5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICBpbmRpY2F0b3Iuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgIGluZGljYXRvci5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIGluZGljYXRvci5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgaW5kaWNhdG9yLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICd0cnVlJztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNhdG9yLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgam95c3RpY2suc3R5bGUubGVmdCA9IGAke3JlY3QubGVmdCAtIGhvc3RSZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMn1weGA7XG4gICAgam95c3RpY2suc3R5bGUudG9wID0gYCR7cmVjdC50b3AgLSBob3N0UmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJ9cHhgO1xuICAgIGpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICd0cnVlJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgIGpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSA9IHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSA/PyAnJztcbiAgICBjb25zdCBjaGFuZ2VkVGFyZ2V0ID0gdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgJiYgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgIT09IHN0YWNrO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ID0gc3RhY2s7XG4gICAgaWYgKGNoYW5nZWRUYXJnZXQpIHtcbiAgICAgIC8vIE5ldyB0YXJnZXQgc3RhY2s6IGZvcmdldCBhbnkgcHJldmlvdXNseSBzdGlja3kgem9uZS5cbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgfVxuXG4gICAgLy8gSWYgbWFpbiBkb2NrIGFyZWEgaXMgZW1wdHksIHNob3cgb25seSB0aGUgY2VudGVyIGJ1dHRvbiBhbmQgY29sbGFwc2UgdGhlIGdyaWRcbiAgICBjb25zdCBpc0VtcHR5TWFpbkFyZWEgPSAhdGhpcy5yb290TGF5b3V0ICYmIChzdGFjayA9PT0gdGhpcy5kb2NrZWRFbCB8fCAodGFyZ2V0UGF0aCAmJiB0YXJnZXRQYXRoLnR5cGUgPT09ICdkb2NrZWQnICYmIHRhcmdldFBhdGguc2VnbWVudHMubGVuZ3RoID09PSAwKSk7XG4gICAgY29uc3Qgc3BhY2VycyA9IEFycmF5LmZyb20odGhpcy5kcm9wSm95c3RpY2sucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlcicpKTtcbiAgICBpZiAoaXNFbXB0eU1haW5BcmVhKSB7XG4gICAgICAvLyBLZWVwIHNwYWNlcnMgdmlzaWJsZSBzbyB0aGUgam95c3RpY2sga2VlcHMgaXRzIGNpcmN1bGFyIGZvb3RwcmludC5cbiAgICAgIHNwYWNlcnMuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICBjb25zdCBpc0NlbnRlciA9IGJ0bi5kYXRhc2V0Wyd6b25lJ10gPT09ICdjZW50ZXInO1xuICAgICAgICBpZiAoaXNDZW50ZXIpIHtcbiAgICAgICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgICAgZGVsZXRlIGJ0bi5kYXRhc2V0WydoaWRkZW4nXTtcbiAgICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhpZGUgdmlzdWFsbHkgYnV0IGtlZXAgbGF5b3V0IHNwYWNlOyBhbHNvIHByZXZlbnQgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgYnRuLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICBidG4uZGF0YXNldFsnaGlkZGVuJ10gPSAndHJ1ZSc7XG4gICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBLZWVwIGRlZmF1bHQgM3gzIGdyaWQgc28gdGhlIGNpcmN1bGFyIGJhY2tncm91bmQgc2l6ZSBzdGF5cyB0aGUgc2FtZS5cbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSAnJztcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZVJvd3MgPSAnJztcbiAgICAgIC8vIERvIG5vdCBzZXQgYW4gYWN0aXZlIHpvbmUgYXV0b21hdGljYWxseTsgdXNlcnMgbXVzdCBob3ZlciB0aGUgYnV0dG9uLlxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIGRlbGV0ZSBidG4uZGF0YXNldFsnaGlkZGVuJ107XG4gICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9KTtcbiAgICAgIHNwYWNlcnMuZm9yRWFjaCgocykgPT4gKHMuc3R5bGUuZGlzcGxheSA9ICcnKSk7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJyc7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gJyc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZSh6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZURyb3BJbmRpY2F0b3IoKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wSW5kaWNhdG9yLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICdmYWxzZSc7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddID0gJ2ZhbHNlJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0WydwYXRoJ107XG4gICAgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICAvLyBSZXN0b3JlIGpveXN0aWNrIHN0cnVjdHVyZSB0byBkZWZhdWx0LlxuICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgIGRlbGV0ZSBidG4uZGF0YXNldFsnaGlkZGVuJ107XG4gICAgfSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLmRyb3BKb3lzdGljay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyJykpLmZvckVhY2goKHMpID0+IChzLnN0eWxlLmRpc3BsYXkgPSAnJykpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSAnJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFja0F0UG9pbnQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuc2hhZG93Um9vdDtcbiAgICBpZiAoIXNoYWRvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBzaGFkb3cuZWxlbWVudHNGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0luVGFyZ2V0cyhlbGVtZW50cyk7XG4gICAgaWYgKHN0YWNrKSB7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfVxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBkb2NrZWQgc3RhY2tzIChhbGwgcGFuZXMgYXJlIGZsb2F0aW5nKSwgYWxsb3cgdGhlXG4gICAgLy8gZG9ja2VkIHN1cmZhY2UgaXRzZWxmIHRvIHNlcnZlIGFzIGEgZHJvcCB0YXJnZXQgZm9yIHRoZSBtYWluIHpvbmUuXG4gICAgaWYgKCF0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIGNvbnN0IGRvY2tSZWN0ID0gdGhpcy5kb2NrZWRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2xpZW50WCA+PSBkb2NrUmVjdC5sZWZ0ICYmXG4gICAgICAgIGNsaWVudFggPD0gZG9ja1JlY3QucmlnaHQgJiZcbiAgICAgICAgY2xpZW50WSA+PSBkb2NrUmVjdC50b3AgJiZcbiAgICAgICAgY2xpZW50WSA8PSBkb2NrUmVjdC5ib3R0b21cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NrZWRFbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWNrRWxlbWVudChldmVudDogRHJhZ0V2ZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0luVGFyZ2V0cyhwYXRoKTtcbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcm9vdCBkb2NrIGFyZWEgaXMgZW1wdHksIHRyZWF0IHRoZSBkb2NrZWQgc3VyZmFjZSBhcyBhIHZhbGlkXG4gICAgLy8gdGFyZ2V0IHdoZW4gaXQgYXBwZWFycyBpbiB0aGUgY29tcG9zZWQgcGF0aC5cbiAgICBpZiAoIXRoaXMucm9vdExheW91dCkge1xuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgcGF0aCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgICAodGFyZ2V0ID09PSB0aGlzLmRvY2tlZEVsIHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZG9ja2VkJykpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRvY2tlZEVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhY2tJblRhcmdldHModGFyZ2V0czogSXRlcmFibGU8RXZlbnRUYXJnZXQ+KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGFyZ2V0cykge1xuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1zdGFjaycpKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJlxuICAgICAgICAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZHJvcC1qb3lzdGljaycpIHx8XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uJykgfHxcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXInKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZVBhbmUoc3RhY2s6IEhUTUxFbGVtZW50LCBwYW5lTmFtZTogc3RyaW5nLCBwYXRoOiBEb2NrUGF0aCk6IHZvaWQge1xuICAgIHN0YWNrLmRhdGFzZXRbJ2FjdGl2ZVBhbmUnXSA9IHBhbmVOYW1lO1xuXG4gICAgY29uc3QgaGVhZGVyQnV0dG9ucyA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuZG9jay10YWInKTtcbiAgICBoZWFkZXJCdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1dHRvbi5kYXRhc2V0WydwYW5lJ10gPT09IHBhbmVOYW1lO1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ2RvY2stdGFiLS1hY3RpdmUnLCBpc1NlbGVjdGVkKTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBTdHJpbmcoaXNTZWxlY3RlZCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGFuZXMgPSBzdGFjay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX3BhbmUnKTtcbiAgICBwYW5lcy5mb3JFYWNoKChwYW5lKSA9PiB7XG4gICAgICBpZiAocGFuZS5kYXRhc2V0WydwYW5lJ10gPT09IHBhbmVOYW1lKSB7XG4gICAgICAgIHBhbmUucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbmUuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24ocGF0aCk7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvY2F0aW9uLm5vZGUuYWN0aXZlUGFuZSA9IHBhbmVOYW1lO1xuICAgIGlmIChwYXRoLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbcGF0aC5pbmRleF07XG4gICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmVOYW1lO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGbG9hdGluZ1dpbmRvd1RpdGxlKHBhdGguaW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlQXRQYXRoKHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCwgcGF0aDogbnVtYmVyW10pOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnQ6IERvY2tMYXlvdXROb2RlIHwgbnVsbCA9IHJvb3Q7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQua2luZCAhPT0gJ3NwbGl0Jykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW3NlZ21lbnRdID8/IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTcGxpdE5vZGUocGF0aDogRG9ja1BhdGgpOiBEb2NrU3BsaXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2RvY2tlZCcpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgodGhpcy5yb290TGF5b3V0LCBwYXRoLnNlZ21lbnRzKTtcbiAgICAgIHJldHVybiBub2RlICYmIG5vZGUua2luZCA9PT0gJ3NwbGl0JyA/IG5vZGUgOiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbcGF0aC5pbmRleF07XG4gICAgaWYgKCFmbG9hdGluZyB8fCAhZmxvYXRpbmcucm9vdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aChmbG9hdGluZy5yb290LCBwYXRoLnNlZ21lbnRzKTtcbiAgICByZXR1cm4gbm9kZSAmJiBub2RlLmtpbmQgPT09ICdzcGxpdCcgPyBub2RlIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU5vZGVJblRyZWUoXG4gICAgcm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHRhcmdldDogRG9ja0xheW91dE5vZGUsXG4gICAgcmVwbGFjZW1lbnQ6IERvY2tMYXlvdXROb2RlLFxuICApOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH1cblxuICAgIGlmIChyb290ID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRJbmZvID0gdGhpcy5maW5kUGFyZW50U3BsaXQocm9vdCwgdGFyZ2V0KTtcbiAgICBpZiAoIXBhcmVudEluZm8pIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIHBhcmVudEluZm8ucGFyZW50LmNoaWxkcmVuW3BhcmVudEluZm8uaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG4gICAgdGhpcy5ub3JtYWxpemVTcGxpdE5vZGUocGFyZW50SW5mby5wYXJlbnQpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRW1wdHlTdGFja0luVHJlZShcbiAgICByb290OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgc3RhY2s6IERvY2tTdGFja05vZGUsXG4gICk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKCFyb290IHx8IHN0YWNrLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEluZm8gPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChyb290LCBzdGFjayk7XG4gICAgaWYgKCFwYXJlbnRJbmZvKSB7XG4gICAgICByZXR1cm4gcm9vdCA9PT0gc3RhY2sgPyBudWxsIDogcm9vdDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRJbmZvLnBhcmVudDtcbiAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHN0YWNrKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnQuc2l6ZXMpKSB7XG4gICAgICBwYXJlbnQuc2l6ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5ub3JtYWxpemVTcGxpdE5vZGUocGFyZW50KTtcblxuICAgIHJldHVybiB0aGlzLmNsZWFudXBTcGxpdElmTmVjZXNzYXJ5KHJvb3QsIHBhcmVudCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBTcGxpdElmTmVjZXNzYXJ5KFxuICAgIHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICBzcGxpdDogRG9ja1NwbGl0Tm9kZSxcbiAgKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBpZiAoc3BsaXQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTm9kZUluVHJlZShyb290LCBzcGxpdCwgc3BsaXQuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIGlmIChzcGxpdC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHBhcmVudEluZm8gPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChyb290LCBzcGxpdCk7XG4gICAgICBpZiAoIXBhcmVudEluZm8pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudEluZm8ucGFyZW50O1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzcGxpdCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnQuc2l6ZXMpKSB7XG4gICAgICAgICAgcGFyZW50LnNpemVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3JtYWxpemVTcGxpdE5vZGUocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cFNwbGl0SWZOZWNlc3Nhcnkocm9vdCwgcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgZG9ja05vZGVCZXNpZGUoXG4gICAgcm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHRhcmdldE5vZGU6IERvY2tTdGFja05vZGUsXG4gICAgbmV3Tm9kZTogRG9ja0xheW91dE5vZGUsXG4gICAgem9uZTogRHJvcFpvbmUsXG4gICk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB6b25lID09PSAnbGVmdCcgfHwgem9uZSA9PT0gJ3JpZ2h0JyA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgY29uc3QgcGxhY2VCZWZvcmUgPSB6b25lID09PSAnbGVmdCcgfHwgem9uZSA9PT0gJ3RvcCc7XG4gICAgY29uc3QgcGFyZW50SW5mbyA9IHRoaXMuZmluZFBhcmVudFNwbGl0KHJvb3QsIHRhcmdldE5vZGUpO1xuXG4gICAgaWYgKHBhcmVudEluZm8gJiYgcGFyZW50SW5mby5wYXJlbnQuZGlyZWN0aW9uID09PSBvcmllbnRhdGlvbikge1xuICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBwbGFjZUJlZm9yZSA/IHBhcmVudEluZm8uaW5kZXggOiBwYXJlbnRJbmZvLmluZGV4ICsgMTtcbiAgICAgIHBhcmVudEluZm8ucGFyZW50LmNoaWxkcmVuLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3Tm9kZSk7XG4gICAgICBwYXJlbnRJbmZvLnBhcmVudC5zaXplcyA9IHRoaXMuaW5zZXJ0V2VpZ2h0KFxuICAgICAgICBwYXJlbnRJbmZvLnBhcmVudC5zaXplcyxcbiAgICAgICAgaW5zZXJ0SW5kZXgsXG4gICAgICAgIHBhcmVudEluZm8ucGFyZW50LmNoaWxkcmVuLmxlbmd0aCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gcm9vdCA/PyBuZXdOb2RlO1xuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0OiBEb2NrU3BsaXROb2RlID0ge1xuICAgICAga2luZDogJ3NwbGl0JyxcbiAgICAgIGRpcmVjdGlvbjogb3JpZW50YXRpb24sXG4gICAgICBjaGlsZHJlbjogcGxhY2VCZWZvcmUgPyBbbmV3Tm9kZSwgdGFyZ2V0Tm9kZV0gOiBbdGFyZ2V0Tm9kZSwgbmV3Tm9kZV0sXG4gICAgICBzaXplczogWzAuNSwgMC41XSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZU5vZGVJblRyZWUocm9vdCwgdGFyZ2V0Tm9kZSwgc3BsaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JFYWNoU3RhY2soXG4gICAgbm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHZpc2l0b3I6IChzdGFjazogRG9ja1N0YWNrTm9kZSwgcGF0aDogbnVtYmVyW10pID0+IHZvaWQsXG4gICAgcGF0aDogbnVtYmVyW10gPSBbXSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUua2luZCA9PT0gJ3N0YWNrJykge1xuICAgICAgdmlzaXRvcihub2RlLCBwYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT5cbiAgICAgIHRoaXMuZm9yRWFjaFN0YWNrKGNoaWxkLCB2aXNpdG9yLCBbLi4ucGF0aCwgaW5kZXhdKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhY2tDb250YWluaW5nUGFuZShcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgcGFuZTogc3RyaW5nLFxuICApOiBEb2NrU3RhY2tOb2RlIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogRG9ja1N0YWNrTm9kZSB8IG51bGwgPSBudWxsO1xuICAgIHRoaXMuZm9yRWFjaFN0YWNrKG5vZGUsIChzdGFjaykgPT4ge1xuICAgICAgaWYgKCFyZXN1bHQgJiYgc3RhY2sucGFuZXMuaW5jbHVkZXMocGFuZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gc3RhY2s7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEZpcnN0UGFuZU5hbWUobm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGZvdW5kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0aGlzLmZvckVhY2hTdGFjayhub2RlLCAoc3RhY2spID0+IHtcbiAgICAgIGlmIChmb3VuZCB8fCBzdGFjay5wYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHN0YWNrLmFjdGl2ZVBhbmUgJiYgc3RhY2sucGFuZXMuaW5jbHVkZXMoc3RhY2suYWN0aXZlUGFuZSkpIHtcbiAgICAgICAgZm91bmQgPSBzdGFjay5hY3RpdmVQYW5lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmQgPSBzdGFjay5wYW5lc1swXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RGbG9hdGluZ1BhbmVNZXRhZGF0YShcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICk6IHsgcGFuZXM6IHN0cmluZ1tdOyB0aXRsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gICAgLy8gRGVwcmVjYXRlZCBtZXRob2QgcmV0YWluZWQgdGVtcG9yYXJpbHkgZm9yIHNpZ25hdHVyZSBjb21wYXRpYmlsaXR5LlxuICAgIC8vIFVzZSBjb2xsZWN0UGFuZU5hbWVzIGluc3RlYWQuXG4gICAgY29uc3QgcGFuZXMgPSB0aGlzLmNvbGxlY3RQYW5lTmFtZXMobm9kZSk7XG4gICAgY29uc3QgdGl0bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgcGFuZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgY29uc3QgdCA9IHRoaXMudGl0bGVzW3BdO1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgdGl0bGVzW3BdID0gdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBwYW5lcywgdGl0bGVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RQYW5lTmFtZXMobm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaFN0YWNrKG5vZGUsIChzdGFjaykgPT4ge1xuICAgICAgc3RhY2sucGFuZXMuZm9yRWFjaCgocGFuZSkgPT4gcGFuZXMucHVzaChwYW5lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVGbG9hdGluZ0xheW91dChcbiAgICBsYXlvdXQ6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0LFxuICApOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCB7XG4gICAgY29uc3QgYm91bmRzID0gbGF5b3V0LmJvdW5kcyA/PyB7IGxlZnQ6IDAsIHRvcDogMCwgd2lkdGg6IDMyMCwgaGVpZ2h0OiAyMDAgfTtcbiAgICBjb25zdCBub3JtYWxpemVkQm91bmRzID0ge1xuICAgICAgbGVmdDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy5sZWZ0KSA/IGJvdW5kcy5sZWZ0IDogMCxcbiAgICAgIHRvcDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy50b3ApID8gYm91bmRzLnRvcCA6IDAsXG4gICAgICB3aWR0aDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy53aWR0aCkgPyBNYXRoLm1heChib3VuZHMud2lkdGgsIDE2MCkgOiAzMjAsXG4gICAgICBoZWlnaHQ6IE51bWJlci5pc0Zpbml0ZShib3VuZHMuaGVpZ2h0KSA/IE1hdGgubWF4KGJvdW5kcy5oZWlnaHQsIDEyMCkgOiAyMDAsXG4gICAgfTtcblxuICAgIGNvbnN0IHJvb3QgPSBsYXlvdXQucm9vdCA/IHRoaXMuY2xvbmVMYXlvdXROb2RlKGxheW91dC5yb290KSA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGxheW91dC5pZCxcbiAgICAgIGJvdW5kczogbm9ybWFsaXplZEJvdW5kcyxcbiAgICAgIHpJbmRleDogbGF5b3V0LnpJbmRleCxcbiAgICAgIHJvb3QsXG4gICAgICBhY3RpdmVQYW5lOiBsYXlvdXQuYWN0aXZlUGFuZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXRoKHBhdGg6IERvY2tQYXRoKTogc3RyaW5nIHtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBzdWZmaXggPVxuICAgICAgICBwYXRoLnNlZ21lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAvJHtwYXRoLnNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50b1N0cmluZygpKS5qb2luKCcvJyl9YFxuICAgICAgICAgIDogJyc7XG4gICAgICByZXR1cm4gYGY6JHtwYXRoLmluZGV4fSR7c3VmZml4fWA7XG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeCA9IHBhdGguc2VnbWVudHMuam9pbignLycpO1xuICAgIHJldHVybiBzdWZmaXgubGVuZ3RoID4gMCA/IGBkOiR7c3VmZml4fWAgOiAnZDonO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZVBhdGgocGF0aDogRG9ja1BhdGgpOiBEb2NrUGF0aCB7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IHBhdGguaW5kZXgsIHNlZ21lbnRzOiBbLi4ucGF0aC5zZWdtZW50c10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbLi4ucGF0aC5zZWdtZW50c10gfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQYXRoKHBhdGg6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBEb2NrUGF0aCB8IG51bGwge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnZjonKSkge1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gcGF0aC5zbGljZSgyKTtcbiAgICAgIGNvbnN0IFtpbmRleFBhcnQsIC4uLnNlZ21lbnRQYXJ0c10gPSByZW1haW5kZXIuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4UGFydCwgMTApO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VnbWVudHMgPSBzZWdtZW50UGFydHNcbiAgICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwKVxuICAgICAgICAubWFwKChzZWdtZW50KSA9PiBOdW1iZXIucGFyc2VJbnQoc2VnbWVudCwgMTApKVxuICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleCwgc2VnbWVudHMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gcGF0aC5zdGFydHNXaXRoKCdkOicpID8gcGF0aC5zbGljZSgyKSA6IHBhdGg7XG4gICAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkXG4gICAgICAuc3BsaXQoJy8nKVxuICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gTnVtYmVyLnBhcnNlSW50KHNlZ21lbnQsIDEwKSlcbiAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXRoc0VxdWFsKGE6IERvY2tQYXRoLCBiOiBEb2NrUGF0aCk6IGJvb2xlYW4ge1xuICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChhLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IG90aGVyID0gYiBhcyBFeHRyYWN0PERvY2tQYXRoLCB7IHR5cGU6ICdmbG9hdGluZycgfT47XG4gICAgICBpZiAoYS5pbmRleCAhPT0gb3RoZXIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGEuc2VnbWVudHMubGVuZ3RoICE9PSBvdGhlci5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGEuc2VnbWVudHMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IG90aGVyLnNlZ21lbnRzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3RoZXIgPSBiIGFzIEV4dHJhY3Q8RG9ja1BhdGgsIHsgdHlwZTogJ2RvY2tlZCcgfT47XG4gICAgaWYgKGEuc2VnbWVudHMubGVuZ3RoICE9PSBvdGhlci5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYS5zZWdtZW50cy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gb3RoZXIuc2VnbWVudHNbaW5kZXhdKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPcklzQW5jZXN0b3JPZihhbmNlc3RvcjogRG9ja1BhdGgsIGRlc2NlbmRhbnQ6IERvY2tQYXRoKTogYm9vbGVhbiB7XG4gICAgaWYgKGFuY2VzdG9yLnR5cGUgIT09IGRlc2NlbmRhbnQudHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChhbmNlc3Rvci50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBpZiAoKGRlc2NlbmRhbnQgYXMgYW55KS5pbmRleCAhPT0gYW5jZXN0b3IuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhbmNlc3Rvci5zZWdtZW50cy5sZW5ndGggPiBkZXNjZW5kYW50LnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3Rvci5zZWdtZW50cy5ldmVyeSgoc2VnbWVudCwgaSkgPT4gc2VnbWVudCA9PT0gZGVzY2VuZGFudC5zZWdtZW50c1tpXSk7XG4gIH1cblxuICBwcml2YXRlIGNvdW50UGFuZXNJblRyZWUobm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsKTogbnVtYmVyIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAobm9kZS5raW5kID09PSAnc3RhY2snKSB7XG4gICAgICByZXR1cm4gbm9kZS5wYW5lcy5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLnJlZHVjZSgodG90YWwsIGNoaWxkKSA9PiB0b3RhbCArIHRoaXMuY291bnRQYW5lc0luVHJlZShjaGlsZCksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoOiBEb2NrUGF0aCk6IFJlc29sdmVkTG9jYXRpb24gfCBudWxsIHtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1twYXRoLmluZGV4XTtcbiAgICAgIGlmICghbGF5b3V0IHx8ICFsYXlvdXQucm9vdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgobGF5b3V0LnJvb3QsIHBhdGguc2VnbWVudHMpO1xuICAgICAgaWYgKCFub2RlIHx8IG5vZGUua2luZCAhPT0gJ3N0YWNrJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvbnRleHQ6ICdmbG9hdGluZycsIGluZGV4OiBwYXRoLmluZGV4LCBwYXRoOiBbLi4ucGF0aC5zZWdtZW50c10sIG5vZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQXRQYXRoKHRoaXMucm9vdExheW91dCwgcGF0aC5zZWdtZW50cyk7XG4gICAgaWYgKCFub2RlIHx8IG5vZGUua2luZCAhPT0gJ3N0YWNrJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGV4dDogJ2RvY2tlZCcsIHBhdGg6IFsuLi5wYXRoLnNlZ21lbnRzXSwgbm9kZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQYW5lRnJvbUxvY2F0aW9uKFxuICAgIGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBza2lwQ2xlYW51cCA9IGZhbHNlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobG9jYXRpb24uY29udGV4dCA9PT0gJ2RvY2tlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZVBhbmVGcm9tU3RhY2sobG9jYXRpb24ubm9kZSwgcGFuZSwgc2tpcENsZWFudXApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbW92ZVBhbmVGcm9tRmxvYXRpbmcobG9jYXRpb24uaW5kZXgsIGxvY2F0aW9uLnBhdGgsIHBhbmUsIHNraXBDbGVhbnVwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGFuZVRvTG9jYXRpb24obG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24sIHBhbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhbmVzID0gbG9jYXRpb24ubm9kZS5wYW5lcztcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gcGFuZXMuaW5kZXhPZihwYW5lKTtcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIHBhbmVzLnNwbGljZShleGlzdGluZ0luZGV4LCAxKTtcbiAgICB9XG4gICAgcGFuZXMucHVzaChwYW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlUGFuZUZvckxvY2F0aW9uKGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhdGlvbi5ub2RlLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBMb2NhdGlvbihsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbik6IHZvaWQge1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZG9ja2VkJykge1xuICAgICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZSh0aGlzLnJvb3RMYXlvdXQsIGxvY2F0aW9uLm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmbG9hdGluZy5yb290ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZShmbG9hdGluZy5yb290LCBsb2NhdGlvbi5ub2RlKTtcbiAgICAgIGlmICghZmxvYXRpbmcucm9vdCkge1xuICAgICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQobG9jYXRpb24uaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVvcmRlclBhbmVJbkxvY2F0aW9uKGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lcyA9IGxvY2F0aW9uLm5vZGUucGFuZXM7XG4gICAgY29uc3QgaW5kZXggPSBwYW5lcy5pbmRleE9mKHBhbmUpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFuZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBwYW5lcy5wdXNoKHBhbmUpO1xuICAgIGxvY2F0aW9uLm5vZGUuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgaWYgKGxvY2F0aW9uLmNvbnRleHQgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbbG9jYXRpb24uaW5kZXhdO1xuICAgICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRmxvYXRpbmdBdChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsb2F0aW5nTGF5b3V0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mbG9hdGluZ0xheW91dHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGFuZUZyb21GbG9hdGluZyhcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBza2lwQ2xlYW51cCA9IGZhbHNlLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nIHx8ICFmbG9hdGluZy5yb290KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aChmbG9hdGluZy5yb290LCBwYXRoKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnc3RhY2snKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbm9kZS5wYW5lcyA9IG5vZGUucGFuZXMuZmlsdGVyKChwKSA9PiBwICE9PSBwYW5lKTtcbiAgICBpZiAoIW5vZGUucGFuZXMuaW5jbHVkZXMobm9kZS5hY3RpdmVQYW5lID8/ICcnKSkge1xuICAgICAgaWYgKG5vZGUucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBub2RlLmFjdGl2ZVBhbmUgPSBub2RlLnBhbmVzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5vZGUuYWN0aXZlUGFuZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmxvYXRpbmcuYWN0aXZlUGFuZSA9PT0gcGFuZSkge1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLmZpbmRGaXJzdFBhbmVOYW1lKGZsb2F0aW5nLnJvb3QpO1xuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBmYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBmbG9hdGluZy5hY3RpdmVQYW5lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub2RlLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2tpcENsZWFudXApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZsb2F0aW5nLnJvb3QgPSB0aGlzLmNsZWFudXBFbXB0eVN0YWNrSW5UcmVlKGZsb2F0aW5nLnJvb3QsIG5vZGUpO1xuICAgIGlmICghZmxvYXRpbmcucm9vdCkge1xuICAgICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplU2l6ZXNBcnJheShzaXplczogbnVtYmVyW10gfCB1bmRlZmluZWQsIGNvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2l6ZXMpIHx8IHNpemVzLmxlbmd0aCAhPT0gY291bnQpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAxIC8gY291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBzaXplcy5tYXAoKHZhbHVlKSA9PiAoTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IE1hdGgubWF4KHZhbHVlLCAwKSA6IDApKTtcbiAgICBjb25zdCB0b3RhbCA9IG5vcm1hbGl6ZWQucmVkdWNlKChhY2MsIHZhbHVlKSA9PiBhY2MgKyB2YWx1ZSwgMCk7XG4gICAgaWYgKHRvdGFsIDw9IDApIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAxIC8gY291bnQpO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkLm1hcCgodmFsdWUpID0+IHZhbHVlIC8gdG90YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTcGxpdE5vZGUoc3BsaXQ6IERvY2tTcGxpdE5vZGUpOiB2b2lkIHtcbiAgICBzcGxpdC5zaXplcyA9IHRoaXMubm9ybWFsaXplU2l6ZXNBcnJheShzcGxpdC5zaXplcywgc3BsaXQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZG9jay1sYXlvdXQtY2hhbmdlZCcsIHtcbiAgICAgICAgZGV0YWlsOiB0aGlzLnNuYXBzaG90LFxuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lTGF5b3V0Tm9kZShsYXlvdXQ6IERvY2tMYXlvdXROb2RlKTogRG9ja0xheW91dE5vZGU7XG4gIHByaXZhdGUgY2xvbmVMYXlvdXROb2RlKGxheW91dDogRG9ja0xheW91dE5vZGUgfCBudWxsKTogRG9ja0xheW91dE5vZGUgfCBudWxsO1xuICBwcml2YXRlIGNsb25lTGF5b3V0Tm9kZShsYXlvdXQ6IERvY2tMYXlvdXROb2RlIHwgbnVsbCk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxheW91dCkpIGFzIERvY2tMYXlvdXROb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUZsb2F0aW5nQXJyYXkoXG4gICAgbGF5b3V0czogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXRbXSxcbiAgKTogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXRbXSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0cykpIGFzIERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0W107XG4gIH1cbn1cblxuY29uc3QgdGFnTmFtZSA9ICdtaW50LWRvY2stbWFuYWdlcic7XG5cbmlmICh0eXBlb2YgY3VzdG9tRWxlbWVudHMgIT09ICd1bmRlZmluZWQnICYmICFjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpIHtcbiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIE1pbnREb2NrTWFuYWdlckVsZW1lbnQpO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdtaW50LWRvY2stbWFuYWdlcic6IE1pbnREb2NrTWFuYWdlckVsZW1lbnQ7XG4gIH1cbn1cbiJdfQ==","import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, Output, QueryList, ViewChild, } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { BsDockPaneComponent } from './dock-pane.component';\nimport { MintDockManagerElement } from '../web-components/mint-dock-manager.element';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class BsDockManagerComponent {\n set layout(value) {\n const snapshot = this.cloneLayout(this.ensureSnapshot(value));\n this._layout = snapshot;\n this.layoutString = this.stringifyLayout(snapshot);\n this.applyLayout();\n }\n get layout() {\n if (!this._layout.root && this._layout.floating.length === 0) {\n return null;\n }\n return this.cloneLayout(this._layout);\n }\n constructor(changeDetector, documentRef) {\n this.changeDetector = changeDetector;\n this.layoutChange = new EventEmitter();\n this.layoutSnapshotChange = new EventEmitter();\n this.layoutString = null;\n this.panes = new QueryList();\n this.trackByPane = (_, pane) => pane.name;\n this._layout = { root: null, floating: [] };\n if (documentRef) {\n MintDockManagerElement.configureDocument(documentRef);\n }\n }\n ngAfterViewInit() {\n this.applyLayout();\n }\n captureLayout() {\n const element = this.managerRef?.nativeElement;\n return element?.snapshot ?? { root: null, floating: [] };\n }\n onLayoutChanged(event) {\n const snapshot = event.detail ?? {\n root: null,\n floating: [],\n };\n this._layout = this.cloneLayout(snapshot);\n this.layoutString = this.stringifyLayout(this._layout);\n this.layoutChange.emit(this.layout);\n this.layoutSnapshotChange.emit(this.cloneLayout(snapshot));\n this.changeDetector.markForCheck();\n }\n applyLayout() {\n if (!this.managerRef) {\n return;\n }\n const element = this.managerRef.nativeElement;\n const layout = this.layout;\n element.layout = layout ?? null;\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if ('kind' in value) {\n return { root: value, floating: [], titles: {} };\n }\n return {\n root: value.root ?? null,\n floating: Array.isArray(value.floating) ? [...value.floating] : [],\n titles: value.titles ? { ...value.titles } : {},\n };\n }\n stringifyLayout(layout) {\n if (!layout.root && layout.floating.length === 0) {\n return null;\n }\n return JSON.stringify(layout);\n }\n cloneLayout(layout) {\n return JSON.parse(JSON.stringify(layout));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockManagerComponent, isStandalone: false, selector: \"bs-dock-manager\", inputs: { layout: \"layout\" }, outputs: { layoutChange: \"layoutChange\", layoutSnapshotChange: \"layoutSnapshotChange\" }, queries: [{ propertyName: \"panes\", predicate: BsDockPaneComponent }], viewQueries: [{ propertyName: \"managerRef\", first: true, predicate: [\"manager\"], descendants: true, static: true }], ngImport: i0, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i1.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, decorators: [{\n type: Component,\n args: [{ selector: 'bs-dock-manager', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }], propDecorators: { layout: [{\n type: Input\n }], layoutChange: [{\n type: Output\n }], layoutSnapshotChange: [{\n type: Output\n }], panes: [{\n type: ContentChildren,\n args: [BsDockPaneComponent]\n }], managerRef: [{\n type: ViewChild,\n args: ['manager', { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQVNyRixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLElBQ0ksTUFBTSxDQUFDLEtBQXlDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJ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dGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRG9ja0xheW91dCxcbiAgRG9ja0xheW91dE5vZGUsXG4gIERvY2tMYXlvdXRTbmFwc2hvdCxcbn0gZnJvbSAnLi4vdHlwZXMvZG9jay1sYXlvdXQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vZG9jay1wYW5lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNaW50RG9ja01hbmFnZXJFbGVtZW50IH0gZnJvbSAnLi4vd2ViLWNvbXBvbmVudHMvbWludC1kb2NrLW1hbmFnZXIuZWxlbWVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHNldCBsYXlvdXQodmFsdWU6IERvY2tMYXlvdXROb2RlIHwgRG9ja0xheW91dCB8IG51bGwpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuY2xvbmVMYXlvdXQodGhpcy5lbnN1cmVTbmFwc2hvdCh2YWx1ZSkpO1xuICAgIHRoaXMuX2xheW91dCA9IHNuYXBzaG90O1xuICAgIHRoaXMubGF5b3V0U3RyaW5nID0gdGhpcy5zdHJpbmdpZnlMYXlvdXQoc25hcHNob3QpO1xuICAgIHRoaXMuYXBwbHlMYXlvdXQoKTtcbiAgfVxuICBnZXQgbGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5fbGF5b3V0LnJvb3QgJiYgdGhpcy5fbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lTGF5b3V0KHRoaXMuX2xheW91dCk7XG4gIH1cblxuICBAT3V0cHV0KCkgbGF5b3V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEb2NrTGF5b3V0U25hcHNob3QgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgbGF5b3V0U25hcHNob3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERvY2tMYXlvdXRTbmFwc2hvdD4oKTtcblxuICBsYXlvdXRTdHJpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnNEb2NrUGFuZUNvbXBvbmVudCkgcGFuZXM6IFF1ZXJ5TGlzdDxCc0RvY2tQYW5lQ29tcG9uZW50PiA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgQFZpZXdDaGlsZCgnbWFuYWdlcicsIHsgc3RhdGljOiB0cnVlIH0pIG1hbmFnZXJSZWYhOiBFbGVtZW50UmVmPE1pbnREb2NrTWFuYWdlckVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5UGFuZSA9IChfOiBudW1iZXIsIHBhbmU6IEJzRG9ja1BhbmVDb21wb25lbnQpID0+IHBhbmUubmFtZTtcblxuICBwcml2YXRlIF9sYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCA9IHsgcm9vdDogbnVsbCwgZmxvYXRpbmc6IFtdIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICApIHtcbiAgICBpZiAoZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuY29uZmlndXJlRG9jdW1lbnQoZG9jdW1lbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5TGF5b3V0KCk7XG4gIH1cblxuICBjYXB0dXJlTGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMubWFuYWdlclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWxlbWVudD8uc25hcHNob3QgPz8geyByb290OiBudWxsLCBmbG9hdGluZzogW10gfTtcbiAgfVxuXG4gIG9uTGF5b3V0Q2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9XG4gICAgICAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8RG9ja0xheW91dFNuYXBzaG90PikuZGV0YWlsID8/IHtcbiAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgZmxvYXRpbmc6IFtdLFxuICAgICAgfTtcbiAgICB0aGlzLl9sYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0KHNuYXBzaG90KTtcbiAgICB0aGlzLmxheW91dFN0cmluZyA9IHRoaXMuc3RyaW5naWZ5TGF5b3V0KHRoaXMuX2xheW91dCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2UuZW1pdCh0aGlzLmxheW91dCk7XG4gICAgdGhpcy5sYXlvdXRTbmFwc2hvdENoYW5nZS5lbWl0KHRoaXMuY2xvbmVMYXlvdXQoc25hcHNob3QpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFuYWdlclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm1hbmFnZXJSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dDtcbiAgICBlbGVtZW50LmxheW91dCA9IGxheW91dCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTbmFwc2hvdChcbiAgICB2YWx1ZTogRG9ja0xheW91dE5vZGUgfCBEb2NrTGF5b3V0IHwgbnVsbCxcbiAgKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiBudWxsLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBpZiAoJ2tpbmQnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiB2YWx1ZSwgZmxvYXRpbmc6IFtdLCB0aXRsZXM6IHt9IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHZhbHVlLnJvb3QgPz8gbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBBcnJheS5pc0FycmF5KHZhbHVlLmZsb2F0aW5nKSA/IFsuLi52YWx1ZS5mbG9hdGluZ10gOiBbXSxcbiAgICAgIHRpdGxlczogdmFsdWUudGl0bGVzID8geyAuLi52YWx1ZS50aXRsZXMgfSA6IHt9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghbGF5b3V0LnJvb3QgJiYgbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShsYXlvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0KSkgYXMgRG9ja0xheW91dFNuYXBzaG90O1xuICB9XG59XG4iLCI8bWludC1kb2NrLW1hbmFnZXJcbiAgI21hbmFnZXJcbiAgY2xhc3M9XCJicy1kb2NrLW1hbmFnZXJcIlxuICBbYXR0ci5sYXlvdXRdPVwibGF5b3V0U3RyaW5nXCJcbiAgKGRvY2stbGF5b3V0LWNoYW5nZWQpPVwib25MYXlvdXRDaGFuZ2VkKCRldmVudClcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lIG9mIHBhbmVzOyB0cmFja0J5OiB0cmFja0J5UGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJicy1kb2NrLXBhbmVcIiBbYXR0ci5zbG90XT1cInBhbmUubmFtZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhbmUudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L21pbnQtZG9jay1tYW5hZ2VyPlxuIl19","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BsDockManagerComponent } from './components/dock-manager.component';\nimport { BsDockPaneComponent } from './components/dock-pane.component';\nimport * as i0 from \"@angular/core\";\nexport class BsDockModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, declarations: [BsDockManagerComponent, BsDockPaneComponent], imports: [CommonModule], exports: [BsDockManagerComponent, BsDockPaneComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, imports: [CommonModule] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [BsDockManagerComponent, BsDockPaneComponent],\n imports: [CommonModule],\n exports: [BsDockManagerComponent, BsDockPaneComponent],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL2RvY2svc3JjL2xpYi9kb2NrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFRdkUsTUFBTSxPQUFPLFlBQVk7OEdBQVosWUFBWTsrR0FBWixZQUFZLGlCQUxSLHNCQUFzQixFQUFFLG1CQUFtQixhQUNoRCxZQUFZLGFBQ1osc0JBQXNCLEVBQUUsbUJBQW1COytHQUcxQyxZQUFZLFlBSmIsWUFBWTs7MkZBSVgsWUFBWTtrQkFOeEIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDM0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDdEQsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2RvY2stbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kb2NrLXBhbmUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNEb2NrTW9kdWxlIHt9XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludHBsYXllci1uZy1ib290c3RyYXAtZG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9taW50cGxheWVyLW5nLWJvb3RzdHJhcC1kb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":";;;;;AAEO,MAAM,mBAAmB,CAAC;AACjC,IAAI,kBAAkB,GAAG;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACxB,YAAY,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;AAC3E;AACA;AACA,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AACrL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,oDAAoD,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACra;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,cAAc;AAC5C,oBAAoB,QAAQ,EAAE,CAAC,oDAAoD,CAAC;AACpF,oBAAoB,UAAU,EAAE,KAAK;AACrC,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;AACrC,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;AACxB,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC3B,gBAAgB,IAAI,EAAE,SAAS;AAC/B,gBAAgB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;AACpD,aAAa,CAAC,EAAE,EAAE,CAAC;;ACzBnB,MAAM,YAAY,GAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,IAAI,cAAc,GAAG,IAAI;AACzB,IAAI,sBAAsB,GAAG,IAAI;AACjC,SAAS,cAAc,CAAC,WAAW,EAAE;AACrC,IAAI,IAAI,CAAC,cAAc,IAAI,sBAAsB,KAAK,WAAW,EAAE;AACnE,QAAQ,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9D,QAAQ,cAAc,CAAC,SAAS,GAAG,YAAY;AAC/C,QAAQ,sBAAsB,GAAG,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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-dock.mjs","sources":["../tmp-esm2022/dock/src/lib/components/dock-pane.component.js","../tmp-esm2022/dock/src/lib/web-components/mint-dock-manager.element.js","../tmp-esm2022/dock/src/lib/components/dock-manager.component.js","../tmp-esm2022/dock/src/lib/dock.module.js","../tmp-esm2022/dock/mintplayer-ng-bootstrap-dock.js"],"sourcesContent":["import { Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class BsDockPaneComponent {\n ngAfterContentInit() {\n if (!this.name) {\n throw new Error('bs-dock-pane requires a unique \"name\" input.');\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockPaneComponent, isStandalone: false, selector: \"bs-dock-pane\", inputs: { name: \"name\", title: \"title\" }, viewQueries: [{ propertyName: \"template\", first: true, predicate: TemplateRef, descendants: true, static: true }], ngImport: i0, template: `<ng-template><ng-content></ng-content></ng-template>`, isInline: true }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockPaneComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'bs-dock-pane',\n template: `<ng-template><ng-content></ng-content></ng-template>`,\n standalone: false,\n }]\n }], propDecorators: { name: [{\n type: Input\n }], title: [{\n type: Input\n }], template: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1wYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0YsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQzs4R0FWVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiw2SkFJbkIsV0FBVyw4REFQWixzREFBc0Q7OzJGQUdyRCxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxzREFBc0Q7b0JBQ2hFLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs4QkFFVSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVvQyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stcGFuZScsXG4gIHRlbXBsYXRlOiBgPG5nLXRlbXBsYXRlPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPmAsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tQYW5lQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpIG5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JzLWRvY2stcGFuZSByZXF1aXJlcyBhIHVuaXF1ZSBcIm5hbWVcIiBpbnB1dC4nKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","const templateHtml = `\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n contain: layout paint size style;\n box-sizing: border-box;\n font-family: inherit;\n color: inherit;\n --dock-split-gap: 0.25rem;\n }\n\n .dock-root,\n .dock-docked,\n .dock-split,\n .dock-split__child,\n .dock-stack,\n .dock-stack__content,\n .dock-stack__pane {\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n }\n\n .dock-root {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .dock-docked {\n position: absolute;\n inset: 0;\n display: flex;\n z-index: 0;\n }\n\n .dock-floating-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 5;\n }\n\n .dock-intersections-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 120;\n }\n\n .dock-floating {\n position: absolute;\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n border: 1px solid rgba(0, 0, 0, 0.3);\n border-radius: 0.5rem;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 16px 32px rgba(15, 23, 42, 0.25);\n overflow: hidden;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__chrome {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n cursor: move;\n background: linear-gradient(\n to bottom,\n rgba(148, 163, 184, 0.6),\n rgba(148, 163, 184, 0.25)\n );\n border-bottom: 1px solid rgba(148, 163, 184, 0.5);\n user-select: none;\n -webkit-user-select: none;\n }\n\n .dock-floating__title {\n flex: 1 1 auto;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(30, 41, 59, 0.95);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dock-floating > .dock-stack {\n flex: 1 1 auto;\n min-width: 12rem;\n min-height: 8rem;\n }\n\n .dock-floating__resizer {\n position: absolute;\n pointer-events: auto;\n z-index: 2;\n background: rgba(148, 163, 184, 0.25);\n transition: background 120ms ease;\n }\n\n .dock-floating__resizer:hover,\n .dock-floating__resizer[data-resizing='true'] {\n background: rgba(148, 163, 184, 0.4);\n }\n\n .dock-floating__resizer--top,\n .dock-floating__resizer--bottom {\n left: 0.75rem;\n right: 0.75rem;\n height: 0.5rem;\n }\n\n .dock-floating__resizer--top {\n top: 0;\n cursor: n-resize;\n }\n\n .dock-floating__resizer--bottom {\n bottom: 0;\n cursor: s-resize;\n }\n\n .dock-floating__resizer--left,\n .dock-floating__resizer--right {\n top: 1.75rem;\n bottom: 0.75rem;\n width: 0.5rem;\n }\n\n .dock-floating__resizer--left {\n left: 0;\n cursor: w-resize;\n }\n\n .dock-floating__resizer--right {\n right: 0;\n cursor: e-resize;\n }\n\n .dock-floating__resizer--top-left,\n .dock-floating__resizer--top-right,\n .dock-floating__resizer--bottom-left,\n .dock-floating__resizer--bottom-right {\n width: 0.75rem;\n height: 0.75rem;\n }\n\n .dock-floating__resizer--top-left {\n top: 0;\n left: 0;\n cursor: nw-resize;\n }\n\n .dock-floating__resizer--top-right {\n top: 0;\n right: 0;\n cursor: ne-resize;\n }\n\n .dock-floating__resizer--bottom-left {\n bottom: 0;\n left: 0;\n cursor: sw-resize;\n }\n\n .dock-floating__resizer--bottom-right {\n right: 0;\n bottom: 0;\n cursor: se-resize;\n }\n\n .dock-split {\n display: flex;\n flex: 1 1 0;\n gap: var(--dock-split-gap);\n position: relative;\n }\n\n .dock-split[data-direction=\"vertical\"] {\n flex-direction: column;\n }\n\n .dock-split[data-direction=\"horizontal\"] {\n flex-direction: row;\n }\n\n .dock-split__child {\n display: flex;\n flex: 1 1 0;\n position: relative;\n }\n\n .dock-split__divider {\n position: relative;\n flex: 0 0 auto;\n background: rgba(0, 0, 0, 0.08);\n transition: background 120ms ease;\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider {\n width: 0.5rem;\n cursor: col-resize;\n /* Extend through perpendicular gaps for visual continuity */\n margin-top: calc(var(--dock-split-gap) * -1);\n margin-bottom: calc(var(--dock-split-gap) * -1);\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider {\n height: 0.5rem;\n cursor: row-resize;\n /* Extend through perpendicular gaps for visual continuity */\n margin-left: calc(var(--dock-split-gap) * -1);\n margin-right: calc(var(--dock-split-gap) * -1);\n }\n\n .dock-split__divider::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border-radius: 999px;\n background: rgba(0, 0, 0, 0.25);\n }\n\n .dock-split[data-direction=\"horizontal\"] > .dock-split__divider::after {\n width: 0.125rem;\n height: 60%;\n }\n\n .dock-split[data-direction=\"vertical\"] > .dock-split__divider::after {\n width: 60%;\n height: 0.125rem;\n }\n\n .dock-split__divider:hover,\n .dock-split__divider:focus-visible,\n .dock-split__divider[data-resizing='true'] {\n background: rgba(59, 130, 246, 0.35);\n }\n\n .dock-intersection-handle {\n position: absolute;\n width: 1rem;\n height: 1rem;\n margin-left: -0.5rem;\n margin-top: -0.5rem;\n border-radius: 0.375rem;\n background: rgba(59, 130, 246, 0.2);\n border: 1px solid rgba(59, 130, 246, 0.6);\n box-shadow: 0 2px 6px rgba(15, 23, 42, 0.2);\n cursor: all-scroll;\n pointer-events: auto;\n opacity: 0;\n transition: background 120ms ease, border-color 120ms ease, opacity 120ms ease;\n }\n\n .dock-intersection-handle:hover,\n .dock-intersection-handle:focus-visible,\n .dock-intersection-handle[data-visible='true'],\n .dock-intersection-handle[data-resizing='true'] {\n background: rgba(59, 130, 246, 0.35);\n border-color: rgba(59, 130, 246, 0.9);\n opacity: 1;\n outline: none;\n }\n\n .dock-snap-marker {\n position: absolute;\n width: 6px;\n height: 6px;\n margin-left: -3px;\n margin-top: -3px;\n border-radius: 50%;\n background: rgba(59, 130, 246, 0.7);\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);\n pointer-events: none;\n z-index: 130;\n }\n\n .dock-stack {\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.25rem;\n background: rgba(255, 255, 255, 0.75);\n backdrop-filter: blur(4px);\n }\n\n .dock-stack__header {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.25rem;\n background: rgba(0, 0, 0, 0.05);\n border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n }\n\n .dock-tab {\n appearance: none;\n border: none;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: grab;\n transition: background 160ms ease;\n }\n\n .dock-tab:active {\n cursor: grabbing;\n }\n\n .dock-tab:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .dock-tab:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.8);\n outline-offset: 1px;\n }\n\n .dock-tab--active {\n background: rgba(59, 130, 246, 0.15);\n }\n\n .dock-stack__content {\n position: relative;\n flex: 1 1 auto;\n display: flex;\n overflow: hidden;\n }\n\n .dock-stack__pane {\n position: relative;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dock-stack__pane[hidden] {\n display: none !important;\n }\n\n .dock-drop-indicator {\n position: absolute;\n pointer-events: none;\n border: 2px solid rgba(59, 130, 246, 0.9);\n background: rgba(59, 130, 246, 0.2);\n border-radius: 0.25rem;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 100;\n }\n\n .dock-drop-indicator[data-visible='true'] {\n opacity: 1;\n }\n\n .dock-drop-joystick {\n position: absolute;\n display: grid;\n grid-template-columns: repeat(3, min-content);\n grid-template-rows: repeat(3, min-content);\n gap: 0.125rem;\n padding: 0.125rem;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.15);\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);\n pointer-events: none;\n transform: translate(-50%, -50%);\n z-index: 110;\n }\n\n .dock-drop-joystick__spacer {\n width: 1.75rem;\n height: 1.75rem;\n pointer-events: none;\n }\n\n .dock-drop-joystick__button {\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n border: 1px solid rgba(59, 130, 246, 0.4);\n background: rgba(255, 255, 255, 0.9);\n color: rgba(30, 64, 175, 0.9);\n font-size: 0.75rem;\n line-height: 1;\n font-weight: 600;\n pointer-events: auto;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease, border-color 120ms ease;\n }\n\n .dock-drop-joystick__button[data-active='true'],\n .dock-drop-joystick__button:hover,\n .dock-drop-joystick__button:focus-visible {\n background: rgba(59, 130, 246, 0.25);\n border-color: rgba(59, 130, 246, 0.8);\n color: rgba(30, 64, 175, 1);\n }\n\n .dock-drop-joystick__button:focus-visible {\n outline: 2px solid rgba(59, 130, 246, 0.9);\n outline-offset: 1px;\n }\n\n .dock-drop-joystick__button[data-zone='center'] {\n border-radius: 0.5rem;\n }\n\n ::slotted(*) {\n flex: 1 1 auto;\n display: block;\n min-width: 0;\n min-height: 0;\n }\n </style>\n <div class=\"dock-root\">\n <div class=\"dock-docked\"></div>\n <div class=\"dock-floating-layer\"></div>\n <div class=\"dock-intersections-layer dock-intersection-layer\"></div>\n </div>\n <div class=\"dock-drop-indicator\"></div>\n <div class=\"dock-drop-joystick\" data-visible=\"false\">\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"top\"\n aria-label=\"Dock to top\"\n >\n ↑\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"left\"\n aria-label=\"Dock to left\"\n >\n ←\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"center\"\n aria-label=\"Dock to center\"\n >\n •\n </button>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"right\"\n aria-label=\"Dock to right\"\n >\n →\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n <button\n class=\"dock-drop-joystick__button\"\n type=\"button\"\n data-zone=\"bottom\"\n aria-label=\"Dock to bottom\"\n >\n ↓\n </button>\n <div class=\"dock-drop-joystick__spacer\"></div>\n </div>\n`;\nlet cachedTemplate = null;\nlet cachedTemplateDocument = null;\nfunction ensureTemplate(documentRef) {\n if (!cachedTemplate || cachedTemplateDocument !== documentRef) {\n cachedTemplate = documentRef.createElement('template');\n cachedTemplate.innerHTML = templateHtml;\n cachedTemplateDocument = documentRef;\n }\n return cachedTemplate;\n}\nexport class MintDockManagerElement extends HTMLElement {\n static { this.documentRef = typeof document !== 'undefined' ? document : null; }\n static configureDocument(documentRef) {\n if (documentRef) {\n MintDockManagerElement.documentRef = documentRef;\n }\n }\n static get observedAttributes() {\n return ['layout'];\n // return ['layout', 'debug-snap-markers'];\n }\n static { this.instanceCounter = 0; }\n renderSnapMarkersForDivider() {\n if (!this.showSnapMarkers)\n return;\n const layer = this.shadowRoot?.querySelector('.dock-intersections-layer, .dock-intersection-layer');\n if (!layer)\n return;\n // Clear previous\n Array.from(layer.querySelectorAll('.dock-snap-marker')).forEach((el) => el.remove());\n if (!this.resizeState || !this.activeSnapAxis || this.activeSnapTargets.length === 0)\n return;\n const rootRect = this.rootEl.getBoundingClientRect();\n const dRect = this.resizeState.divider.getBoundingClientRect();\n if (this.activeSnapAxis === 'x') {\n const y = dRect.top + dRect.height / 2 - rootRect.top;\n this.activeSnapTargets.forEach((sx) => {\n const dot = this.documentRef.createElement('div');\n dot.className = 'dock-snap-marker';\n dot.style.left = `${rootRect.left + sx - rootRect.left}px`;\n dot.style.top = `${y}px`;\n layer.appendChild(dot);\n });\n }\n else if (this.activeSnapAxis === 'y') {\n const x = dRect.left + dRect.width / 2 - rootRect.left;\n this.activeSnapTargets.forEach((sy) => {\n const dot = this.documentRef.createElement('div');\n dot.className = 'dock-snap-marker';\n dot.style.left = `${x}px`;\n dot.style.top = `${rootRect.top + sy - rootRect.top}px`;\n layer.appendChild(dot);\n });\n }\n }\n renderSnapMarkersForCorner() {\n if (!this.showSnapMarkers)\n return;\n const layer = this.shadowRoot?.querySelector('.dock-intersections-layer, .dock-intersection-layer');\n if (!layer)\n return;\n Array.from(layer.querySelectorAll('.dock-snap-marker')).forEach((el) => el.remove());\n if (!this.cornerResizeState)\n return;\n const rootRect = this.rootEl.getBoundingClientRect();\n // Compute representative center lines from first entries\n let centerX = null;\n let centerY = null;\n const st = this.cornerResizeState;\n if (st.vs.length > 0) {\n const vRect = st.vs[0].container.querySelector(':scope > .dock-split__divider')?.getBoundingClientRect();\n if (vRect)\n centerX = vRect.left + vRect.width / 2 - rootRect.left;\n }\n if (st.hs.length > 0) {\n const hRect = st.hs[0].container.querySelector(':scope > .dock-split__divider')?.getBoundingClientRect();\n if (hRect)\n centerY = hRect.top + hRect.height / 2 - rootRect.top;\n }\n if (centerY != null) {\n this.cornerSnapXTargets.forEach((sx) => {\n const dot = this.documentRef.createElement('div');\n dot.className = 'dock-snap-marker';\n dot.style.left = `${sx}px`;\n dot.style.top = `${centerY}px`;\n layer.appendChild(dot);\n });\n }\n if (centerX != null) {\n this.cornerSnapYTargets.forEach((sy) => {\n const dot = this.documentRef.createElement('div');\n dot.className = 'dock-snap-marker';\n dot.style.left = `${centerX}px`;\n dot.style.top = `${sy}px`;\n layer.appendChild(dot);\n });\n }\n }\n clearSnapMarkers() {\n if (!this.showSnapMarkers)\n return;\n const layer = this.shadowRoot?.querySelector('.dock-intersections-layer, .dock-intersection-layer');\n if (!layer)\n return;\n Array.from(layer.querySelectorAll('.dock-snap-marker')).forEach((el) => el.remove());\n }\n constructor() {\n super();\n this.dropJoystickTarget = null;\n this.rootLayout = null;\n this.floatingLayouts = [];\n this.titles = {};\n this.pendingTabDragMetrics = null;\n this.resizeState = null;\n this.dragState = null;\n this.floatingDragState = null;\n this.floatingResizeState = null;\n this.intersectionRaf = null;\n this.intersectionHandles = new Map();\n this.cornerResizeState = null;\n this.pointerTrackingActive = false;\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n // Localized snapping while dragging a divider\n this.activeSnapAxis = null;\n this.activeSnapTargets = [];\n // Localized snapping while dragging an intersection handle\n this.cornerSnapXTargets = [];\n this.cornerSnapYTargets = [];\n // Debug: render snap markers while dragging\n this.showSnapMarkers = false;\n this.pendingDragEndTimeout = null;\n this.previousSplitSizes = new Map();\n const documentRef = this.resolveDocument();\n this.documentRef = documentRef;\n this.windowRef = this.resolveWindow(documentRef);\n const shadowRoot = this.attachShadow({ mode: 'open' });\n const template = ensureTemplate(documentRef);\n shadowRoot.appendChild(template.content.cloneNode(true));\n const root = shadowRoot.querySelector('.dock-root');\n if (!root) {\n throw new Error('mint-dock-manager template is missing the root element.');\n }\n const docked = shadowRoot.querySelector('.dock-docked');\n if (!docked) {\n throw new Error('mint-dock-manager template is missing the docked surface element.');\n }\n const floatingLayer = shadowRoot.querySelector('.dock-floating-layer');\n if (!floatingLayer) {\n throw new Error('mint-dock-manager template is missing the floating layer element.');\n }\n const indicator = shadowRoot.querySelector('.dock-drop-indicator');\n if (!indicator) {\n throw new Error('mint-dock-manager template is missing the drop indicator element.');\n }\n const joystick = shadowRoot.querySelector('.dock-drop-joystick');\n if (!joystick) {\n throw new Error('mint-dock-manager template is missing the drop joystick element.');\n }\n const joystickButtons = Array.from(joystick.querySelectorAll('.dock-drop-joystick__button[data-zone]'));\n if (joystickButtons.length === 0) {\n throw new Error('mint-dock-manager template is missing drop joystick buttons.');\n }\n this.rootEl = root;\n this.dockedEl = docked;\n this.floatingLayerEl = floatingLayer;\n this.dropIndicator = indicator;\n this.dropJoystick = joystick;\n this.dropJoystickButtons = joystickButtons;\n this.instanceId = `mint-dock-${++MintDockManagerElement.instanceCounter}`;\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n this.onDragOver = this.onDragOver.bind(this);\n this.onGlobalDragOver = this.onGlobalDragOver.bind(this);\n this.onGlobalDragEnd = this.onGlobalDragEnd.bind(this);\n this.onDrop = this.onDrop.bind(this);\n this.onDragLeave = this.onDragLeave.bind(this);\n this.onDrag = this.onDrag.bind(this);\n this.onDragMouseMove = this.onDragMouseMove.bind(this);\n this.onDragTouchMove = this.onDragTouchMove.bind(this);\n this.onDragMouseUp = this.onDragMouseUp.bind(this);\n this.onDragTouchEnd = this.onDragTouchEnd.bind(this);\n this.onWindowResize = this.onWindowResize.bind(this);\n }\n connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'application');\n }\n // Tag the docked surface with a root path so it can act as\n // a drop target when the main layout is empty.\n this.dockedEl.dataset['path'] = this.formatPath({ type: 'docked', segments: [] });\n this.render();\n this.rootEl.addEventListener('dragover', this.onDragOver);\n this.rootEl.addEventListener('drop', this.onDrop);\n this.rootEl.addEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.addEventListener('dragover', this.onDragOver);\n this.dropJoystick.addEventListener('drop', this.onDrop);\n this.dropJoystick.addEventListener('dragleave', this.onDragLeave);\n // Strengthen zone tracking by reacting to dragenter/dragover directly on the buttons.\n // This avoids relying solely on hit-testing each frame which can be jittery during HTML5 drag.\n this.dropJoystickButtons.forEach((btn) => {\n const handler = (e) => {\n if (!this.dragState)\n return;\n const z = btn.dataset['zone'];\n if (this.isDropZone(z)) {\n this.updateDropJoystickActiveZone(z);\n e.preventDefault();\n }\n };\n btn.addEventListener('dragenter', handler);\n btn.addEventListener('dragover', handler);\n });\n const win = this.windowRef;\n win?.addEventListener('dragover', this.onGlobalDragOver);\n win?.addEventListener('drag', this.onDrag);\n win?.addEventListener('dragend', this.onGlobalDragEnd, true);\n win?.addEventListener('resize', this.onWindowResize);\n }\n disconnectedCallback() {\n this.rootEl.removeEventListener('dragover', this.onDragOver);\n this.rootEl.removeEventListener('drop', this.onDrop);\n this.rootEl.removeEventListener('dragleave', this.onDragLeave);\n this.dropJoystick.removeEventListener('dragover', this.onDragOver);\n this.dropJoystick.removeEventListener('drop', this.onDrop);\n this.dropJoystick.removeEventListener('dragleave', this.onDragLeave);\n const win = this.windowRef;\n win?.removeEventListener('dragover', this.onGlobalDragOver);\n win?.removeEventListener('drag', this.onDrag);\n win?.removeEventListener('dragend', this.onGlobalDragEnd, true);\n this.stopDragPointerTracking();\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n const win2 = this.windowRef;\n win2?.removeEventListener('resize', this.onWindowResize);\n }\n attributeChangedCallback(name, _oldValue, newValue) {\n if (name === 'layout') {\n this.layout = newValue ? this.parseLayout(newValue) : null;\n }\n else if (name === 'debug-snap-markers') {\n this.showSnapMarkers = !(newValue === null || newValue === 'false' || newValue === '0');\n if (!this.showSnapMarkers) {\n this.clearSnapMarkers();\n }\n }\n }\n get layout() {\n return {\n root: this.cloneLayoutNode(this.rootLayout),\n floating: this.cloneFloatingArray(this.floatingLayouts),\n titles: { ...this.titles },\n };\n }\n set layout(value) {\n const snapshot = this.ensureSnapshot(value);\n this.rootLayout = this.cloneLayoutNode(snapshot.root);\n this.floatingLayouts = this.cloneFloatingArray(snapshot.floating);\n this.titles = snapshot.titles ? { ...snapshot.titles } : {};\n this.render();\n }\n get snapshot() {\n return this.layout;\n }\n toJSON() {\n return this.snapshot;\n }\n resolveDocument() {\n const staticDocument = MintDockManagerElement.documentRef;\n const ownerDocument = this.ownerDocument ?? null;\n const globalDocument = typeof document !== 'undefined' ? document : null;\n const resolvedDocument = staticDocument ?? ownerDocument ?? globalDocument;\n if (!resolvedDocument) {\n throw new Error('mint-dock-manager requires a Document to initialize.');\n }\n if (!MintDockManagerElement.documentRef) {\n MintDockManagerElement.documentRef = resolvedDocument;\n }\n return resolvedDocument;\n }\n resolveWindow(documentRef) {\n if (typeof window !== 'undefined') {\n return window;\n }\n return documentRef.defaultView ?? null;\n }\n parseLayout(value) {\n try {\n const parsed = JSON.parse(value);\n return this.ensureSnapshot(parsed);\n }\n catch (err) {\n console.warn('mint-dock-manager: failed to parse layout attribute', err);\n return null;\n }\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if (value.kind) {\n return { root: value, floating: [], titles: {} };\n }\n const layout = value;\n return {\n root: layout.root ?? null,\n floating: Array.isArray(layout.floating)\n ? layout.floating.map((floating) => this.normalizeFloatingLayout(floating))\n : [],\n titles: layout.titles ? { ...layout.titles } : {},\n };\n }\n render() {\n this.dockedEl.innerHTML = '';\n this.floatingLayerEl.innerHTML = '';\n this.hideDropIndicator();\n if (this.rootLayout) {\n const fragment = this.renderNode(this.rootLayout, []);\n this.dockedEl.appendChild(fragment);\n }\n this.renderFloatingPanes();\n this.scheduleRenderIntersectionHandles();\n }\n renderNode(node, path, floatingIndex) {\n if (node.kind === 'split') {\n return this.renderSplit(node, path, floatingIndex);\n }\n return this.renderStack(node, path, floatingIndex);\n }\n renderFloatingPanes() {\n this.floatingLayerEl.innerHTML = '';\n this.floatingLayouts.forEach((floating, index) => {\n const wrapper = this.documentRef.createElement('div');\n wrapper.classList.add('dock-floating');\n wrapper.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const { left, top, width, height } = floating.bounds;\n wrapper.style.left = `${left}px`;\n wrapper.style.top = `${top}px`;\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n const zIndex = this.getFloatingPaneZIndex(index);\n wrapper.style.zIndex = String(zIndex);\n const chrome = this.documentRef.createElement('div');\n chrome.classList.add('dock-floating__chrome');\n chrome.addEventListener('pointerdown', (event) => this.beginFloatingDrag(event, index, wrapper, chrome));\n const title = this.documentRef.createElement('div');\n title.classList.add('dock-floating__title');\n title.textContent = this.getFloatingWindowTitle(floating);\n chrome.appendChild(title);\n wrapper.appendChild(chrome);\n if (floating.root) {\n const content = this.renderNode(floating.root, [], index);\n content.classList.add('dock-floating__stack');\n wrapper.appendChild(content);\n }\n else {\n const placeholder = this.documentRef.createElement('div');\n placeholder.classList.add('dock-stack');\n placeholder.dataset['path'] = this.formatPath({\n type: 'floating',\n index,\n segments: [],\n });\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n placeholder.appendChild(empty);\n wrapper.appendChild(placeholder);\n }\n const resizerConfigs = [\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-left'],\n edges: { horizontal: 'left', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top'],\n edges: { horizontal: 'none', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--top-right'],\n edges: { horizontal: 'right', vertical: 'top' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--right'],\n edges: { horizontal: 'right', vertical: 'none' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-right'],\n edges: { horizontal: 'right', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom'],\n edges: { horizontal: 'none', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--bottom-left'],\n edges: { horizontal: 'left', vertical: 'bottom' },\n },\n {\n classes: ['dock-floating__resizer', 'dock-floating__resizer--left'],\n edges: { horizontal: 'left', vertical: 'none' },\n },\n ];\n resizerConfigs.forEach(({ classes, edges }) => {\n const resizer = this.documentRef.createElement('div');\n resizer.classList.add(...classes);\n resizer.addEventListener('pointerdown', (event) => this.beginFloatingResize(event, index, wrapper, resizer, edges));\n wrapper.appendChild(resizer);\n });\n this.floatingLayerEl.appendChild(wrapper);\n });\n }\n onWindowResize() {\n // Recompute intersection handles on window resize\n this.scheduleRenderIntersectionHandles();\n }\n scheduleRenderIntersectionHandles() {\n this.intersectionRaf = null;\n this.renderIntersectionHandles();\n }\n renderIntersectionHandles() {\n const layer = this.shadowRoot?.querySelector('.dock-intersections-layer, .dock-intersection-layer');\n if (!layer)\n return;\n // Keep existing handles; we will diff and update positions\n // 1) Clean up legacy handles (created before keying) that lack a data-key\n Array.from(layer.querySelectorAll('.dock-intersection-handle'))\n .filter((el) => !el.dataset['key'])\n .forEach((el) => el.remove());\n // 2) Rebuild the internal map from DOM to avoid drifting state and dedupe duplicates\n const domByKey = new Map();\n Array.from(layer.querySelectorAll('.dock-intersection-handle[data-key]')).forEach((el) => {\n const key = el.dataset['key'] ?? '';\n if (!key)\n return;\n if (domByKey.has(key)) {\n // Remove duplicates with the same key, keep the first one\n el.remove();\n return;\n }\n domByKey.set(key, el);\n // Ensure listener is attached only once\n if (!el.dataset['listener']) {\n el.dataset['listener'] = '1';\n // Listener will be (re)assigned later when we know the current h/v pair\n }\n });\n // Sync internal map with DOM\n this.intersectionHandles = domByKey;\n const rootRect = this.rootEl.getBoundingClientRect();\n // If a corner resize is active, only update that handle's position and avoid creating new ones\n if (this.cornerResizeState) {\n const st = this.cornerResizeState;\n const h0 = st.hs[0];\n const v0 = st.vs[0];\n const hPathStr = this.formatPath(h0.path);\n const vPathStr = this.formatPath(v0.path);\n const key = `${hPathStr}:${h0.index}|${vPathStr}:${v0.index}`;\n // Find divider elements corresponding to active paths\n const hDiv = this.shadowRoot?.querySelector(`.dock-split__divider[data-path=\"${hPathStr}\"][data-index=\"${h0.index}\"]`);\n const vDiv = this.shadowRoot?.querySelector(`.dock-split__divider[data-path=\"${vPathStr}\"][data-index=\"${v0.index}\"]`);\n if (hDiv && vDiv) {\n const hr = hDiv.getBoundingClientRect();\n const vr = vDiv.getBoundingClientRect();\n const x = vr.left + vr.width / 2 - rootRect.left;\n const y = hr.top + hr.height / 2 - rootRect.top;\n const handle = st.handle;\n if (!handle.dataset['key']) {\n handle.dataset['key'] = key;\n }\n this.intersectionHandles.set(key, handle);\n handle.style.left = `${x}px`;\n handle.style.top = `${y}px`;\n // Remove any other handles that don't match the active key\n Array.from(layer.querySelectorAll('.dock-intersection-handle')).forEach((el) => {\n if ((el.dataset['key'] ?? '') !== key) {\n el.remove();\n }\n });\n // Normalize internal map as well\n this.intersectionHandles = new Map([[key, handle]]);\n }\n return;\n }\n const allDividers = Array.from(this.shadowRoot?.querySelectorAll('.dock-split__divider') ?? []);\n const hDividers = [];\n const vDividers = [];\n allDividers.forEach((el) => {\n const orientation = el.dataset['orientation'] ?? undefined;\n const rect = el.getBoundingClientRect();\n const container = el.closest('.dock-split');\n const path = this.parsePath(el.dataset['path']);\n const pathStr = el.dataset['path'] ?? '';\n const index = Number.parseInt(el.dataset['index'] ?? '', 10);\n if (!container || !Number.isFinite(index))\n return;\n const info = { el, rect, path, pathStr, index, container };\n // Note: node.direction === 'horizontal' means the split lays out children left-to-right,\n // which yields a VERTICAL divider bar. So mapping is inverted here.\n if (orientation === 'horizontal') {\n vDividers.push(info);\n }\n else if (orientation === 'vertical') {\n hDividers.push(info);\n }\n });\n const desiredKeys = new Set();\n const tol = 24; // px tolerance to account for gaps and subpixel layout\n const groupMap = new Map();\n const groupPairs = new Map();\n hDividers.forEach((h) => {\n const hCenterY = h.rect.top + h.rect.height / 2;\n vDividers.forEach((v) => {\n const vCenterX = v.rect.left + v.rect.width / 2;\n const dx = vCenterX < h.rect.left ? h.rect.left - vCenterX : vCenterX > h.rect.right ? vCenterX - h.rect.right : 0;\n const dy = hCenterY < v.rect.top ? v.rect.top - hCenterY : hCenterY > v.rect.bottom ? hCenterY - v.rect.bottom : 0;\n if (dx > tol || dy > tol)\n return;\n const x = vCenterX - rootRect.left;\n const y = hCenterY - rootRect.top;\n const key = `${h.pathStr}:${h.index}|${v.pathStr}:${v.index}`;\n const gk = `${Math.round(x)}:${Math.round(y)}`;\n let handle = groupMap.get(gk);\n if (!handle) {\n // Try reuse via existing pair mapping\n handle = this.intersectionHandles.get(key) ?? null;\n if (!handle) {\n handle = this.documentRef.createElement('div');\n handle.classList.add('dock-intersection-handle', 'glyph');\n handle.setAttribute('role', 'separator');\n handle.setAttribute('aria-label', 'Resize split intersection');\n handle.dataset['key'] = key;\n handle.dataset['listener'] = '1';\n handle.addEventListener('pointerdown', (ev) => this.beginCornerResize(ev, h, v, handle));\n handle.addEventListener('dblclick', (ev) => this.onIntersectionDoubleClick(ev, handle));\n layer.appendChild(handle);\n }\n groupMap.set(gk, handle);\n }\n // Track pairs for this group and map all pair keys to the same handle\n const arr = groupPairs.get(gk) ?? [];\n arr.push({ h: { pathStr: h.pathStr ?? '', index: h.index }, v: { pathStr: v.pathStr ?? '', index: v.index } });\n groupPairs.set(gk, arr);\n this.intersectionHandles.set(key, handle);\n // Update position for the grouped handle\n handle.style.left = `${x}px`;\n handle.style.top = `${y}px`;\n });\n });\n // Attach grouped pairs data to each handle and prune stale ones\n const keep = new Set(groupMap.values());\n groupMap.forEach((handle, gk) => {\n const pairs = groupPairs.get(gk) ?? [];\n handle.dataset['pairs'] = JSON.stringify(pairs);\n });\n Array.from(layer.querySelectorAll('.dock-intersection-handle')).forEach((el) => {\n if (!keep.has(el)) {\n el.remove();\n }\n });\n // Reset intersectionHandles to only currently mapped keys\n const newMap = new Map();\n groupPairs.forEach((pairs, gk) => {\n const handle = groupMap.get(gk);\n pairs.forEach((p) => newMap.set(`${p.h.pathStr}:${p.h.index}|${p.v.pathStr}:${p.v.index}`, handle));\n });\n this.intersectionHandles = newMap;\n }\n beginCornerResize(event, h, v, handle) {\n event.preventDefault();\n // Build pairs from dataset if available (grouped intersections), otherwise from the provided pair\n const pairsRaw = handle.dataset['pairs'];\n const parsed = pairsRaw ? JSON.parse(pairsRaw) : [];\n const hs = [];\n const vs = [];\n const ensureHV = (pathStr, index, axis) => {\n const path = this.parsePath(pathStr);\n if (!path)\n return;\n const div = this.shadowRoot?.querySelector(`.dock-split__divider[data-path=\"${pathStr}\"][data-index=\"${index}\"]`) ?? null;\n const container = div?.closest('.dock-split');\n if (!container)\n return;\n if (axis === 'h') {\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n const initial = children.map((c) => c.getBoundingClientRect().height);\n hs.push({ path, index, container, initialSizes: initial, before: initial[index], after: initial[index + 1] });\n }\n else {\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n const initial = children.map((c) => c.getBoundingClientRect().width);\n vs.push({ path, index, container, initialSizes: initial, before: initial[index], after: initial[index + 1] });\n }\n };\n if (parsed.length > 0) {\n parsed.forEach((p) => { ensureHV(p.h.pathStr, p.h.index, 'h'); ensureHV(p.v.pathStr, p.v.index, 'v'); });\n }\n else if (h.path && v.path) {\n ensureHV(this.formatPath(h.path), h.index, 'h');\n ensureHV(this.formatPath(v.path), v.index, 'v');\n }\n if (hs.length === 0 && vs.length === 0)\n return;\n try {\n handle.setPointerCapture(event.pointerId);\n handle.dataset['resizing'] = 'true';\n handle.classList.add('hovering');\n }\n catch { }\n this.cornerResizeState = {\n pointerId: event.pointerId,\n handle,\n hs: hs.map((e) => ({ path: this.clonePath(e.path), index: e.index, container: e.container, beforeSize: e.before, afterSize: e.after, initialSizes: e.initialSizes, startY: event.clientY })),\n vs: vs.map((e) => ({ path: this.clonePath(e.path), index: e.index, container: e.container, beforeSize: e.before, afterSize: e.after, initialSizes: e.initialSizes, startX: event.clientX })),\n };\n this.startPointerTracking();\n // Ensure handle has a stable key (use group if present)\n if (!handle.dataset['key']) {\n handle.dataset['key'] = handle.dataset['group'] ?? '';\n }\n this.renderSnapMarkersForCorner();\n // Compute localized snap targets for this intersection\n try {\n const rootRect = this.rootEl.getBoundingClientRect();\n // Use first pair to define the crossing lines\n let centerX = null;\n let centerY = null;\n // Resolve one vertical bar (from vs) and one horizontal bar (from hs)\n if (vs.length > 0) {\n const vPair = vs[0];\n const vPathStr = this.formatPath(vPair.path);\n const vDiv = this.shadowRoot?.querySelector(`.dock-split__divider[data-path=\"${vPathStr}\"][data-index=\"${vPair.index}\"]`) ?? null;\n const vr = vDiv?.getBoundingClientRect();\n if (vr)\n centerX = vr.left + vr.width / 2;\n }\n if (hs.length > 0) {\n const hPair = hs[0];\n const hPathStr = this.formatPath(hPair.path);\n const hDiv = this.shadowRoot?.querySelector(`.dock-split__divider[data-path=\"${hPathStr}\"][data-index=\"${hPair.index}\"]`) ?? null;\n const hr = hDiv?.getBoundingClientRect();\n if (hr)\n centerY = hr.top + hr.height / 2;\n }\n const xTargets = [];\n const yTargets = [];\n const allDividers = Array.from(this.shadowRoot?.querySelectorAll('.dock-split__divider') ?? []);\n allDividers.forEach((el) => {\n const o = el.dataset['orientation'] ?? undefined;\n const r = el.getBoundingClientRect();\n if (o === 'horizontal' && centerY != null) {\n // vertical bar → contributes X if it crosses centerY\n if (centerY >= r.top && centerY <= r.bottom) {\n xTargets.push(r.left + r.width / 2 - rootRect.left);\n }\n }\n else if (o === 'vertical' && centerX != null) {\n // horizontal bar → contributes Y if it crosses centerX\n if (centerX >= r.left && centerX <= r.right) {\n yTargets.push(r.top + r.height / 2 - rootRect.top);\n }\n }\n });\n this.cornerSnapXTargets = xTargets;\n this.cornerSnapYTargets = yTargets;\n }\n catch {\n this.cornerSnapXTargets = [];\n this.cornerSnapYTargets = [];\n }\n }\n handleCornerResizeMove(event) {\n const state = this.cornerResizeState;\n if (!state || state.pointerId !== event.pointerId)\n return;\n const snapValue = (val, total, active) => {\n if (!active || total <= 0)\n return val;\n const ratios = [1 / 3, 1 / 2, 2 / 3];\n const r = val / total;\n let best = ratios[0];\n let d = Math.abs(r - best);\n for (let i = 1; i < ratios.length; i++) {\n const dd = Math.abs(r - ratios[i]);\n if (dd < d) {\n d = dd;\n best = ratios[i];\n }\n }\n return best * total;\n };\n // Axis snapping to nearby intersections\n const tol = 10;\n const rootRect = this.rootEl.getBoundingClientRect();\n let clientX = event.clientX;\n let clientY = event.clientY;\n if (this.cornerSnapXTargets.length) {\n let best = clientX, bestDist = tol + 1;\n this.cornerSnapXTargets.forEach((sx) => {\n const px = rootRect.left + sx;\n const d = Math.abs(px - clientX);\n if (d < bestDist) {\n bestDist = d;\n best = px;\n }\n });\n if (bestDist <= tol)\n clientX = best;\n }\n if (this.cornerSnapYTargets.length) {\n let best = clientY, bestDist = tol + 1;\n this.cornerSnapYTargets.forEach((sy) => {\n const py = rootRect.top + sy;\n const d = Math.abs(py - clientY);\n if (d < bestDist) {\n bestDist = d;\n best = py;\n }\n });\n if (bestDist <= tol)\n clientY = best;\n }\n // Update all horizontal bars (vertical splits) with Y delta\n state.hs.forEach((h) => {\n const node = this.resolveSplitNode(h.path);\n if (!node)\n return;\n const deltaY = clientY - h.startY;\n const minSize = 48;\n const pairTotal = h.beforeSize + h.afterSize;\n let newBefore = Math.min(Math.max(h.beforeSize + deltaY, minSize), pairTotal - minSize);\n newBefore = snapValue(newBefore, pairTotal, event.shiftKey);\n const newAfter = pairTotal - newBefore;\n const sizesPx = [...h.initialSizes];\n sizesPx[h.index] = newBefore;\n sizesPx[h.index + 1] = newAfter;\n const total = sizesPx.reduce((a, s) => a + s, 0);\n const normalized = total > 0 ? sizesPx.map((s) => s / total) : [];\n node.sizes = normalized;\n const children = Array.from(h.container.querySelectorAll(':scope > .dock-split__child'));\n normalized.forEach((size, idx) => { if (children[idx])\n children[idx].style.flex = `${Math.max(size, 0)} 1 0`; });\n });\n // Update all vertical bars (horizontal splits) with X delta\n state.vs.forEach((v) => {\n const node = this.resolveSplitNode(v.path);\n if (!node)\n return;\n const deltaX = clientX - v.startX;\n const minSize = 48;\n const pairTotal = v.beforeSize + v.afterSize;\n let newBefore = Math.min(Math.max(v.beforeSize + deltaX, minSize), pairTotal - minSize);\n newBefore = snapValue(newBefore, pairTotal, event.shiftKey);\n const newAfter = pairTotal - newBefore;\n const sizesPx = [...v.initialSizes];\n sizesPx[v.index] = newBefore;\n sizesPx[v.index + 1] = newAfter;\n const total = sizesPx.reduce((a, s) => a + s, 0);\n const normalized = total > 0 ? sizesPx.map((s) => s / total) : [];\n node.sizes = normalized;\n const children = Array.from(v.container.querySelectorAll(':scope > .dock-split__child'));\n normalized.forEach((size, idx) => { if (children[idx])\n children[idx].style.flex = `${Math.max(size, 0)} 1 0`; });\n });\n this.dispatchLayoutChanged();\n }\n endCornerResize(pointerId) {\n const state = this.cornerResizeState;\n if (!state || pointerId !== state.pointerId)\n return;\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch { }\n state.handle.dataset['resizing'] = 'false';\n this.cornerResizeState = null;\n // Re-render handles to account for new positions\n this.scheduleRenderIntersectionHandles();\n this.cornerSnapXTargets = [];\n this.cornerSnapYTargets = [];\n }\n onIntersectionDoubleClick(event, handle) {\n event.preventDefault();\n const pairsRaw = handle.dataset['pairs'];\n const parsed = pairsRaw ? JSON.parse(pairsRaw) : [];\n if (!Array.isArray(parsed) || parsed.length === 0) {\n const k = handle.dataset['key'] ?? '';\n const parts = k.split('|');\n if (parts.length === 2) {\n const [hPart, vPart] = parts;\n const hi = hPart.lastIndexOf(':');\n const vi = vPart.lastIndexOf(':');\n if (hi > 0 && vi > 0) {\n const hPathStr = hPart.slice(0, hi);\n const vPathStr = vPart.slice(0, vi);\n const hIdx = Number.parseInt(hPart.slice(hi + 1), 10);\n const vIdx = Number.parseInt(vPart.slice(vi + 1), 10);\n parsed.push({ h: { pathStr: hPathStr, index: hIdx }, v: { pathStr: vPathStr, index: vIdx } });\n }\n }\n }\n if (parsed.length === 0)\n return;\n const splitKeys = new Set();\n parsed.forEach((p) => { splitKeys.add(p.h.pathStr); splitKeys.add(p.v.pathStr); });\n let hasStored = false;\n splitKeys.forEach((k) => { if (this.previousSplitSizes.has(k))\n hasStored = true; });\n const applySizes = (pathStr, mutate) => {\n const path = this.parsePath(pathStr);\n if (!path)\n return;\n const node = this.resolveSplitNode(path);\n if (!node)\n return;\n const sizes = this.normalizeSizesArray(node.sizes ?? [], node.children.length);\n // Find divider index from any divider belonging to this path\n const divEl = this.shadowRoot?.querySelector(`.dock-split__divider[data-path=\"${pathStr}\"]`);\n const index = divEl ? Number.parseInt(divEl.dataset['index'] ?? '0', 10) : 0;\n const newSizes = mutate([...sizes], index);\n node.sizes = newSizes;\n const segments = path.segments.join('/');\n const container = this.shadowRoot?.querySelector(`.dock-split[data-path=\"${segments}\"]`);\n if (container) {\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n newSizes.forEach((s, i) => { if (children[i])\n children[i].style.flex = `${Math.max(s, 0)} 1 0`; });\n }\n };\n if (hasStored) {\n // Restore stored sizes\n this.previousSplitSizes.forEach((sizes, pathStr) => {\n const path = this.parsePath(pathStr);\n const node = path ? this.resolveSplitNode(path) : null;\n if (!node)\n return;\n const norm = this.normalizeSizesArray(sizes, node.children.length);\n node.sizes = norm;\n const segments = path.segments.join('/');\n const container = this.shadowRoot?.querySelector(`.dock-split[data-path=\"${segments}\"]`);\n if (container) {\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n norm.forEach((s, i) => { if (children[i])\n children[i].style.flex = `${Math.max(s, 0)} 1 0`; });\n }\n });\n this.previousSplitSizes.clear();\n }\n else {\n // Equalize the two panes adjacent to each divider and store previous sizes\n const touched = new Set();\n parsed.forEach((p) => {\n [p.h.pathStr, p.v.pathStr].forEach((key) => {\n if (touched.has(key))\n return;\n const path = this.parsePath(key);\n const node = path ? this.resolveSplitNode(path) : null;\n if (node && Array.isArray(node.sizes)) {\n this.previousSplitSizes.set(key, [...node.sizes]);\n }\n touched.add(key);\n });\n applySizes(p.h.pathStr, (sizes, idx) => {\n const total = (sizes[idx] ?? 0) + (sizes[idx + 1] ?? 0);\n if (total <= 0)\n return sizes;\n sizes[idx] = total / 2;\n sizes[idx + 1] = total / 2;\n const sum = sizes.reduce((a, s) => a + s, 0);\n return sum > 0 ? sizes.map((s) => s / sum) : sizes;\n });\n applySizes(p.v.pathStr, (sizes, idx) => {\n const total = (sizes[idx] ?? 0) + (sizes[idx + 1] ?? 0);\n if (total <= 0)\n return sizes;\n sizes[idx] = total / 2;\n sizes[idx + 1] = total / 2;\n const sum = sizes.reduce((a, s) => a + s, 0);\n return sum > 0 ? sizes.map((s) => s / sum) : sizes;\n });\n });\n }\n this.dispatchLayoutChanged();\n this.scheduleRenderIntersectionHandles();\n }\n beginFloatingDrag(event, index, wrapper, handle) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const { left, top } = floating.bounds;\n try {\n handle.setPointerCapture(event.pointerId);\n }\n catch (err) {\n /* no-op: pointer capture may not be supported in all environments */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingDragState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startLeft: left,\n startTop: top,\n wrapper,\n handle,\n };\n this.startPointerTracking();\n }\n beginFloatingResize(event, index, wrapper, handle, edges) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n try {\n handle.setPointerCapture(event.pointerId);\n handle.dataset['resizing'] = 'true';\n }\n catch (err) {\n /* pointer capture may not be supported */\n }\n this.promoteFloatingPane(index, wrapper);\n this.floatingResizeState = {\n index,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startWidth: floating.bounds.width,\n startHeight: floating.bounds.height,\n startLeft: floating.bounds.left,\n startTop: floating.bounds.top,\n wrapper,\n handle,\n edges,\n };\n this.startPointerTracking();\n }\n handleFloatingDragMove(event) {\n const state = this.floatingDragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const newLeft = state.startLeft + deltaX;\n const newTop = state.startTop + deltaY;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n this.updateFloatingDragDropTarget(event);\n }\n endFloatingDrag(pointerId) {\n const state = this.floatingDragState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n delete state.handle.dataset['resizing'];\n }\n catch (err) {\n /* no-op */\n }\n const dropHandled = state.dropTarget\n ? this.handleFloatingStackDrop(state.index, state.dropTarget.path, state.dropTarget.zone)\n : false;\n this.floatingDragState = null;\n this.hideDropIndicator();\n if (!dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n updateFloatingDragDropTarget(event) {\n const state = this.floatingDragState;\n if (!state) {\n return;\n }\n const stack = this.findStackAtPoint(event.clientX, event.clientY);\n if (!stack) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n if (!path || (path.type === 'floating' && path.index === state.index)) {\n if (state.dropTarget) {\n delete state.dropTarget;\n this.hideDropIndicator();\n }\n return;\n }\n // Reset sticky zone when moving to another stack while dragging the\n // floating window so the side doesn't carry over.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const zone = this.computeDropZone(stack, event, this.extractDropZoneFromEvent(event));\n if (zone) {\n state.dropTarget = { path, zone };\n }\n else if (state.dropTarget) {\n delete state.dropTarget;\n }\n this.showDropIndicator(stack, zone);\n }\n handleFloatingResizeMove(event) {\n const state = this.floatingResizeState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const deltaX = event.clientX - state.startX;\n const deltaY = event.clientY - state.startY;\n const minWidth = 192;\n const minHeight = 128;\n let newWidth = state.startWidth;\n let newHeight = state.startHeight;\n let newLeft = state.startLeft;\n let newTop = state.startTop;\n if (state.edges.horizontal === 'right') {\n newWidth = Math.max(minWidth, state.startWidth + deltaX);\n }\n else if (state.edges.horizontal === 'left') {\n newWidth = Math.max(minWidth, state.startWidth - deltaX);\n newLeft = state.startLeft + (state.startWidth - newWidth);\n }\n if (state.edges.vertical === 'bottom') {\n newHeight = Math.max(minHeight, state.startHeight + deltaY);\n }\n else if (state.edges.vertical === 'top') {\n newHeight = Math.max(minHeight, state.startHeight - deltaY);\n newTop = state.startTop + (state.startHeight - newHeight);\n }\n state.wrapper.style.width = `${newWidth}px`;\n state.wrapper.style.height = `${newHeight}px`;\n state.wrapper.style.left = `${newLeft}px`;\n state.wrapper.style.top = `${newTop}px`;\n const floating = this.floatingLayouts[state.index];\n if (floating) {\n floating.bounds.width = newWidth;\n floating.bounds.height = newHeight;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n }\n }\n endFloatingResize(pointerId) {\n const state = this.floatingResizeState;\n if (!state || pointerId !== state.pointerId) {\n return;\n }\n try {\n state.handle.releasePointerCapture(state.pointerId);\n }\n catch (err) {\n /* no-op */\n }\n this.floatingResizeState = null;\n this.dispatchLayoutChanged();\n }\n getFloatingPaneZIndex(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return 10 + index;\n }\n const base = typeof floating.zIndex === 'number' && Number.isFinite(floating.zIndex)\n ? floating.zIndex\n : 10 + index;\n return base;\n }\n promoteFloatingPane(index, wrapper) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const maxExisting = this.floatingLayouts.reduce((max, layout, idx) => {\n if (!layout) {\n return max;\n }\n const z = idx === index ? Number.NEGATIVE_INFINITY : this.getFloatingPaneZIndex(idx);\n return Math.max(max, z);\n }, 0);\n const nextZ = Math.max(maxExisting + 2, 12);\n floating.zIndex = nextZ;\n wrapper.style.zIndex = String(nextZ);\n }\n getFloatingWrapper(index) {\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n return this.floatingLayerEl.querySelector(selector);\n }\n startPointerTracking() {\n if (this.pointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.addEventListener('pointermove', this.onPointerMove);\n win?.addEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = true;\n }\n stopPointerTrackingIfIdle() {\n if (this.pointerTrackingActive &&\n !this.resizeState &&\n !this.floatingDragState &&\n !this.floatingResizeState &&\n !this.cornerResizeState) {\n const win = this.windowRef;\n win?.removeEventListener('pointermove', this.onPointerMove);\n win?.removeEventListener('pointerup', this.onPointerUp);\n this.pointerTrackingActive = false;\n }\n }\n getFloatingWindowTitle(floating) {\n const fallback = 'Floating Pane';\n if (!floating || !floating.root) {\n return fallback;\n }\n const preferred = floating.activePane ?? this.findFirstPaneName(floating.root);\n if (!preferred) {\n return fallback;\n }\n return this.titles[preferred] ?? preferred ?? fallback;\n }\n updateFloatingWindowTitle(index) {\n const floating = this.floatingLayouts[index];\n if (!floating) {\n return;\n }\n const selector = `.dock-floating[data-path=\"${this.formatPath({\n type: 'floating',\n index,\n segments: [],\n })}\"]`;\n const wrapper = this.floatingLayerEl.querySelector(selector);\n if (!wrapper) {\n return;\n }\n const titleEl = wrapper.querySelector('.dock-floating__title');\n if (!titleEl) {\n return;\n }\n titleEl.textContent = this.getFloatingWindowTitle(floating);\n }\n renderSplit(node, path, floatingIndex) {\n const container = this.documentRef.createElement('div');\n container.classList.add('dock-split');\n container.dataset['direction'] = node.direction;\n container.dataset['path'] = path.join('/');\n const sizes = Array.isArray(node.sizes) ? node.sizes : [];\n node.children.forEach((child, index) => {\n const childWrapper = this.documentRef.createElement('div');\n childWrapper.classList.add('dock-split__child');\n childWrapper.dataset['index'] = String(index);\n const size = sizes[index];\n if (typeof size === 'number' && Number.isFinite(size)) {\n childWrapper.style.flex = `${Math.max(size, 0)} 1 0`;\n }\n else {\n childWrapper.style.flex = '1 1 0';\n }\n childWrapper.appendChild(this.renderNode(child, [...path, index], floatingIndex));\n container.appendChild(childWrapper);\n if (index < node.children.length - 1) {\n const divider = this.documentRef.createElement('div');\n divider.classList.add('dock-split__divider');\n divider.setAttribute('role', 'separator');\n divider.tabIndex = 0;\n // Tag divider with metadata for intersection detection\n const dividerPath = typeof floatingIndex === 'number'\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] };\n divider.dataset['path'] = this.formatPath(dividerPath);\n divider.dataset['index'] = String(index);\n divider.dataset['orientation'] = node.direction;\n divider.addEventListener('pointerdown', (event) => this.beginResize(event, container, floatingIndex !== undefined\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] }, index));\n container.appendChild(divider);\n }\n });\n return container;\n }\n renderStack(node, path, floatingIndex) {\n const stack = this.documentRef.createElement('div');\n stack.classList.add('dock-stack');\n const location = typeof floatingIndex === 'number'\n ? { type: 'floating', index: floatingIndex, segments: [...path] }\n : { type: 'docked', segments: [...path] };\n stack.dataset['path'] = this.formatPath(location);\n const header = this.documentRef.createElement('div');\n header.classList.add('dock-stack__header');\n header.setAttribute('role', 'tablist');\n const content = this.documentRef.createElement('div');\n content.classList.add('dock-stack__content');\n const panes = Array.from(new Set(node.panes));\n if (panes.length === 0) {\n const empty = this.documentRef.createElement('div');\n empty.classList.add('dock-stack__pane');\n empty.textContent = 'No panes configured';\n content.appendChild(empty);\n stack.append(header, content);\n return stack;\n }\n const activePane = panes.includes(node.activePane ?? '')\n ? node.activePane\n : panes[0];\n const baseSlug = path.length ? path.join('-') : 'root';\n const pathSlug = typeof floatingIndex === 'number' ? `f${floatingIndex}-${baseSlug}` : baseSlug;\n panes.forEach((paneName) => {\n const paneSlugRaw = paneName.replace(/[^a-zA-Z0-9_-]/g, '-');\n const paneSlug = paneSlugRaw.length > 0 ? paneSlugRaw : 'pane';\n const tabId = `${this.instanceId}-tab-${pathSlug}-${paneSlug}`;\n const panelId = `${this.instanceId}-panel-${pathSlug}-${paneSlug}`;\n const button = this.documentRef.createElement('button');\n button.type = 'button';\n button.classList.add('dock-tab');\n button.dataset['pane'] = paneName;\n button.id = tabId;\n button.textContent = this.titles[paneName] ?? paneName;\n button.setAttribute('role', 'tab');\n button.setAttribute('aria-controls', panelId);\n if (paneName === activePane) {\n button.classList.add('dock-tab--active');\n }\n button.setAttribute('aria-selected', String(paneName === activePane));\n button.draggable = true;\n button.addEventListener('pointerdown', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.captureTabDragMetrics(event, stackEl ?? null);\n event.stopPropagation();\n });\n button.addEventListener('pointerup', () => this.clearPendingTabDragMetrics());\n button.addEventListener('pointercancel', () => this.clearPendingTabDragMetrics());\n button.addEventListener('dragstart', (event) => {\n const stackEl = button.closest('.dock-stack');\n this.beginPaneDrag(event, this.clonePath(location), paneName, stackEl ?? null);\n });\n button.addEventListener('dragend', () => {\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n });\n button.addEventListener('click', () => {\n this.activatePane(stack, paneName, this.clonePath(location));\n this.dispatchEvent(new CustomEvent('dock-pane-activated', {\n detail: { pane: paneName },\n bubbles: true,\n composed: true,\n }));\n });\n header.appendChild(button);\n const paneHost = this.documentRef.createElement('div');\n paneHost.classList.add('dock-stack__pane');\n paneHost.dataset['pane'] = paneName;\n paneHost.id = panelId;\n paneHost.setAttribute('role', 'tabpanel');\n paneHost.setAttribute('aria-labelledby', tabId);\n if (paneName !== activePane) {\n paneHost.setAttribute('hidden', '');\n }\n const slotEl = this.documentRef.createElement('slot');\n slotEl.name = paneName;\n paneHost.appendChild(slotEl);\n content.appendChild(paneHost);\n });\n stack.dataset['activePane'] = activePane;\n stack.append(header, content);\n return stack;\n }\n beginResize(event, container, path, index) {\n event.preventDefault();\n const divider = event.currentTarget;\n if (!divider) {\n return;\n }\n const orientation = container.dataset['direction'] ?? 'horizontal';\n const children = Array.from(container.querySelectorAll(':scope > .dock-split__child'));\n const initialSizes = children.map((child) => {\n const rect = child.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n const beforeSize = initialSizes[index];\n const afterSize = initialSizes[index + 1];\n const startPos = orientation === 'horizontal' ? event.clientX : event.clientY;\n divider.setPointerCapture(event.pointerId);\n divider.dataset['resizing'] = 'true';\n this.resizeState = {\n path: this.clonePath(path),\n index,\n pointerId: event.pointerId,\n orientation,\n container,\n divider,\n startPos,\n initialSizes,\n beforeSize,\n afterSize,\n };\n this.startPointerTracking();\n // Compute localized snap targets: intersections with perpendicular dividers near this divider\n try {\n const rootRect = this.rootEl.getBoundingClientRect();\n const dividerRect = divider.getBoundingClientRect();\n const allDividers = Array.from(this.shadowRoot?.querySelectorAll('.dock-split__divider') ?? []);\n const targets = [];\n if (orientation === 'horizontal') {\n // Current bar is vertical → snap X to centers of other vertical bars (no crossing check needed)\n allDividers.forEach((el) => {\n if (el === divider)\n return;\n const o = el.dataset['orientation'] ?? undefined;\n if (o !== 'horizontal')\n return; // vertical divider bars (split direction horizontal)\n const r = el.getBoundingClientRect();\n const xCenter = r.left + r.width / 2 - rootRect.left;\n targets.push(xCenter);\n });\n this.activeSnapAxis = 'x';\n this.activeSnapTargets = targets;\n this.renderSnapMarkersForDivider();\n }\n else {\n // Current bar is horizontal → snap Y to centers of other horizontal bars (no crossing check needed)\n allDividers.forEach((el) => {\n if (el === divider)\n return;\n const o = el.dataset['orientation'] ?? undefined;\n if (o !== 'vertical')\n return; // horizontal divider bars (split direction vertical)\n const r = el.getBoundingClientRect();\n const yCenter = r.top + r.height / 2 - rootRect.top;\n targets.push(yCenter);\n });\n this.activeSnapAxis = 'y';\n this.activeSnapTargets = targets;\n this.renderSnapMarkersForDivider();\n }\n }\n catch {\n this.activeSnapAxis = null;\n this.activeSnapTargets = [];\n this.clearSnapMarkers();\n }\n }\n onPointerMove(event) {\n if (this.cornerResizeState && event.pointerId === this.cornerResizeState.pointerId) {\n this.handleCornerResizeMove(event);\n }\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const state = this.resizeState;\n const splitNode = this.resolveSplitNode(state.path);\n if (!splitNode) {\n return;\n }\n let currentPos = state.orientation === 'horizontal' ? event.clientX : event.clientY;\n // Localized axis snap near neighboring intersections\n const tol = 10;\n const rootRect = this.rootEl.getBoundingClientRect();\n if (this.activeSnapTargets.length) {\n if (state.orientation === 'horizontal' && this.activeSnapAxis === 'x') {\n // Vertical divider snapping along X\n let closest = Number.POSITIVE_INFINITY;\n let best = currentPos;\n const pointerX = event.clientX;\n this.activeSnapTargets.forEach((sx) => {\n const px = rootRect.left + sx;\n const d = Math.abs(pointerX - px);\n if (d < closest) {\n closest = d;\n best = px;\n }\n });\n if (closest <= tol)\n currentPos = best;\n this.renderSnapMarkersForDivider();\n }\n else if (state.orientation === 'vertical' && this.activeSnapAxis === 'y') {\n // Horizontal divider snapping along Y\n let closest = Number.POSITIVE_INFINITY;\n let best = currentPos;\n const pointerY = event.clientY;\n this.activeSnapTargets.forEach((sy) => {\n const py = rootRect.top + sy;\n const d = Math.abs(pointerY - py);\n if (d < closest) {\n closest = d;\n best = py;\n }\n });\n if (closest <= tol)\n currentPos = best;\n this.renderSnapMarkersForDivider();\n }\n }\n const delta = currentPos - state.startPos;\n const minSize = 48;\n const pairTotal = state.beforeSize + state.afterSize;\n let newBefore = state.beforeSize + delta;\n // Optional snap with Shift\n if (event.shiftKey && pairTotal > 0) {\n const ratios = [1 / 3, 1 / 2, 2 / 3];\n const target = newBefore / pairTotal;\n let best = ratios[0];\n let bestDist = Math.abs(target - best);\n for (let i = 1; i < ratios.length; i++) {\n const d = Math.abs(target - ratios[i]);\n if (d < bestDist) {\n best = ratios[i];\n bestDist = d;\n }\n }\n newBefore = best * pairTotal;\n }\n newBefore = Math.min(Math.max(newBefore, minSize), pairTotal - minSize);\n let newAfter = pairTotal - newBefore;\n if (!Number.isFinite(newBefore) || !Number.isFinite(newAfter)) {\n return;\n }\n if (newAfter < minSize) {\n newAfter = minSize;\n newBefore = pairTotal - minSize;\n }\n const newSizesPixels = [...state.initialSizes];\n newSizesPixels[state.index] = newBefore;\n newSizesPixels[state.index + 1] = newAfter;\n const total = newSizesPixels.reduce((acc, size) => acc + size, 0);\n const normalized = total > 0 ? newSizesPixels.map((size) => size / total) : [];\n splitNode.sizes = normalized;\n const children = Array.from(state.container.querySelectorAll(':scope > .dock-split__child'));\n normalized.forEach((size, idx) => {\n if (children[idx]) {\n children[idx].style.flex = `${Math.max(size, 0)} 1 0`;\n }\n });\n this.dispatchLayoutChanged();\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.handleFloatingResizeMove(event);\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.handleFloatingDragMove(event);\n }\n }\n onPointerUp(event) {\n if (this.cornerResizeState && event.pointerId === this.cornerResizeState.pointerId) {\n this.endCornerResize(event.pointerId);\n }\n if (this.resizeState && event.pointerId === this.resizeState.pointerId) {\n const divider = this.resizeState.divider;\n divider.dataset['resizing'] = 'false';\n divider.releasePointerCapture(this.resizeState.pointerId);\n this.resizeState = null;\n this.scheduleRenderIntersectionHandles();\n this.activeSnapAxis = null;\n this.activeSnapTargets = [];\n }\n if (this.floatingDragState && event.pointerId === this.floatingDragState.pointerId) {\n this.endFloatingDrag(event.pointerId);\n }\n if (this.floatingResizeState && event.pointerId === this.floatingResizeState.pointerId) {\n this.endFloatingResize(event.pointerId);\n }\n this.stopPointerTrackingIfIdle();\n }\n captureTabDragMetrics(event, stackEl) {\n if (!stackEl) {\n this.pendingTabDragMetrics = null;\n return;\n }\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n this.pendingTabDragMetrics = null;\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl.getBoundingClientRect();\n const pointerOffsetX = event.clientX - stackRect.left;\n const pointerOffsetY = event.clientY - stackRect.top;\n const left = stackRect.left - hostRect.left;\n const top = stackRect.top - hostRect.top;\n const width = Number.isFinite(stackRect.width) ? stackRect.width : 0;\n const height = Number.isFinite(stackRect.height) ? stackRect.height : 0;\n this.pendingTabDragMetrics = {\n pointerOffsetX,\n pointerOffsetY,\n left,\n top,\n width,\n height,\n startClientX: event.clientX,\n startClientY: event.clientY,\n };\n }\n clearPendingTabDragMetrics() {\n this.pendingTabDragMetrics = null;\n }\n beginPaneDrag(event, path, pane, stackEl) {\n if (!event.dataTransfer) {\n return;\n }\n // Create a ghost element for the drag image. This prevents the browser from cancelling\n // the drag operation when the original element is removed from the DOM during re-render.\n const ghost = event.currentTarget.cloneNode(true);\n ghost.style.position = 'absolute';\n ghost.style.left = '-9999px';\n ghost.style.top = '-9999px';\n ghost.style.width = `${event.currentTarget.offsetWidth}px`;\n ghost.style.height = `${event.currentTarget.offsetHeight}px`;\n this.shadowRoot?.appendChild(ghost);\n // Use the ghost element as the drag image.\n // The offset is set to where the user's cursor is on the original element.\n const dragImgOffsetX = Number.isFinite(event.offsetX) ? event.offsetX : 0;\n const dragImgOffsetY = Number.isFinite(event.offsetY) ? event.offsetY : 0;\n event.dataTransfer.setDragImage(ghost, dragImgOffsetX, dragImgOffsetY);\n // The ghost element is no longer needed after the drag image is set.\n // We defer its removal to ensure the browser has captured it.\n setTimeout(() => ghost.remove(), 0);\n const { path: sourcePath, floatingIndex, pointerOffsetX, pointerOffsetY, } = this.preparePaneDragSource(path, pane, stackEl, event);\n // Capture header bounds for detecting when to convert to floating\n const headerEl = stackEl?.querySelector('.dock-stack__header') ?? null;\n const headerRect = headerEl ? headerEl.getBoundingClientRect() : null;\n const headerBounds = headerRect\n ? { left: headerRect.left, top: headerRect.top, right: headerRect.right, bottom: headerRect.bottom }\n : null;\n const metrics = this.pendingTabDragMetrics;\n this.dragState = {\n pane,\n sourcePath: this.clonePath(sourcePath),\n floatingIndex,\n pointerOffsetX,\n pointerOffsetY,\n dropHandled: false,\n sourceStackEl: stackEl,\n sourceHeaderBounds: headerBounds,\n startClientX: metrics && Number.isFinite(metrics.startClientX)\n ? metrics.startClientX\n : Number.isFinite(event.clientX)\n ? event.clientX\n : undefined,\n startClientY: metrics && Number.isFinite(metrics.startClientY)\n ? metrics.startClientY\n : Number.isFinite(event.clientY)\n ? event.clientY\n : undefined,\n };\n // Seed last known pointer position from pointerdown metrics to avoid (0,0) glitches in Firefox\n if (this.dragState.startClientX !== undefined &&\n this.dragState.startClientY !== undefined &&\n Number.isFinite(this.dragState.startClientX) &&\n Number.isFinite(this.dragState.startClientY)) {\n this.lastDragPointerPosition = {\n x: this.dragState.startClientX,\n y: this.dragState.startClientY,\n };\n }\n // Prefer the pointer offset relative to the dragged tab to avoid jumps on conversion\n if (Number.isFinite(event.offsetX)) {\n this.dragState.pointerOffsetX = event.offsetX;\n }\n if (Number.isFinite(event.offsetY)) {\n this.dragState.pointerOffsetY = event.offsetY;\n }\n this.updateDraggedFloatingPosition(event);\n this.startDragPointerTracking();\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', pane);\n // Preferred UX: if the dragged tab is the only one in its stack,\n // immediately convert to a floating window unless it is already the\n // only pane in a floating window (this case is handled by reuse logic).\n if (this.dragState && this.dragState.floatingIndex !== null && this.dragState.floatingIndex < 0) {\n const loc = this.resolveStackLocation(this.dragState.sourcePath);\n if (loc && Array.isArray(loc.node.panes) && loc.node.panes.length === 1) {\n let shouldConvert = false;\n if (loc.context === \"docked\") {\n shouldConvert = true;\n }\n else if (loc.context === \"floating\") {\n const floating = this.floatingLayouts[loc.index];\n const totalPanes = floating && floating.root ? this.countPanesInTree(floating.root) : 0;\n shouldConvert = totalPanes > 1; // not the only pane in this floating window\n }\n if (shouldConvert) {\n const startX = Number.isFinite(event.clientX) ? event.clientX : (this.dragState.startClientX ?? 0);\n const startY = Number.isFinite(event.clientY) ? event.clientY : (this.dragState.startClientY ?? 0);\n this.convertPendingTabDragToFloating(startX, startY);\n }\n }\n }\n }\n preparePaneDragSource(path, pane, stackEl, event) {\n const location = this.resolveStackLocation(path);\n if (!location || !location.node.panes.includes(pane)) {\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n const metrics = this.pendingTabDragMetrics;\n const domHasSibling = !!stackEl &&\n Array.from(stackEl.querySelectorAll('.dock-tab')).some((button) => button.dataset['pane'] && button.dataset['pane'] !== pane);\n const hasSiblingInStack = location.node.panes.some((existing) => existing !== pane);\n const floating = location.context === 'floating' ? this.floatingLayouts[location.index] : null;\n const floatingPaneCount = floating && floating.root ? this.countPanesInTree(floating.root) : hasSiblingInStack ? 2 : 1;\n const shouldReuseExistingWindow = location.context === 'floating' &&\n !!floating &&\n !hasSiblingInStack &&\n !domHasSibling &&\n floatingPaneCount <= 1;\n if (shouldReuseExistingWindow) {\n if (floating) {\n floating.activePane = pane;\n this.updateFloatingWindowTitle(location.index);\n const wrapper = this.getFloatingWrapper(location.index);\n if (wrapper) {\n this.promoteFloatingPane(location.index, wrapper);\n }\n const hostRect = this.getBoundingClientRect();\n const pointerOffsetX = metrics &&\n Number.isFinite(metrics.pointerOffsetX) &&\n Number.isFinite(metrics.left) &&\n Number.isFinite(floating.bounds.left)\n ? metrics.pointerOffsetX + (metrics.left - floating.bounds.left)\n : Number.isFinite(event.clientX) && Number.isFinite(floating.bounds.left)\n ? event.clientX - hostRect.left - floating.bounds.left\n : floating.bounds.width / 2;\n const pointerOffsetY = metrics &&\n Number.isFinite(metrics.pointerOffsetY) &&\n Number.isFinite(metrics.top) &&\n Number.isFinite(floating.bounds.top)\n ? metrics.pointerOffsetY + (metrics.top - floating.bounds.top)\n : Number.isFinite(event.clientY) && Number.isFinite(floating.bounds.top)\n ? event.clientY - hostRect.top - floating.bounds.top\n : floating.bounds.height / 2;\n return {\n path,\n floatingIndex: location.index,\n pointerOffsetX,\n pointerOffsetY,\n };\n }\n return {\n path,\n floatingIndex: null,\n pointerOffsetX: 0,\n pointerOffsetY: 0,\n };\n }\n // Do not convert to floating yet; allow in-header reordering first.\n // We return placeholder values and will convert once the pointer leaves the tab header.\n const pointerOffsetXVal = metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : 0;\n const pointerOffsetYVal = metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : 0;\n return {\n path,\n floatingIndex: -1,\n pointerOffsetX: pointerOffsetXVal,\n pointerOffsetY: pointerOffsetYVal,\n };\n }\n endPaneDrag() {\n this.clearPendingDragEndTimeout();\n const state = this.dragState;\n this.dragState = null;\n this.hideDropIndicator();\n this.clearHeaderDragPlaceholder();\n this.stopDragPointerTracking();\n this.lastDragPointerPosition = null;\n if (state && state.floatingIndex !== null && !state.dropHandled) {\n this.dispatchLayoutChanged();\n }\n }\n onDragOver(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n // Keep internal pointer tracking up-to-date.\n this.updateDraggedFloatingPosition(event);\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n // Some browsers intermittently report (0,0) for dragover coordinates.\n // Mirror the robust logic used in onDrop: prefer actual event coordinates\n // when valid, otherwise fall back to the last tracked pointer position.\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? { clientX: this.lastDragPointerPosition.x, clientY: this.lastDragPointerPosition.y }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n if (!stack) {\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n return;\n }\n const path = this.parsePath(stack.dataset['path']);\n // While reordering within the same header, suppress the joystick/indicator entirely\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const px = (point ? point.clientX : event.clientX);\n const py = (point ? point.clientY : event.clientY);\n if (Number.isFinite(px) && Number.isFinite(py) && this.isPointerOverSourceHeader(px, py)) {\n // Drive live reorder using the unified path so we update instantly.\n this.updatePaneDragDropTargetFromPoint(px, py);\n this.hideDropIndicator();\n return;\n }\n }\n // If the hovered stack changed, clear any sticky zone from the previous\n // target before computing the new zone.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint);\n this.showDropIndicator(stack, zone);\n }\n updateDraggedFloatingPosition(event) {\n if (!this.dragState) {\n return;\n }\n const { clientX, clientY } = event;\n const hasValidCoordinates = Number.isFinite(clientX) &&\n Number.isFinite(clientY) &&\n !(clientX === 0 && clientY === 0);\n if (hasValidCoordinates) {\n this.lastDragPointerPosition = { x: clientX, y: clientY };\n this.updateDraggedFloatingPositionFromPoint(clientX, clientY);\n return;\n }\n if (this.lastDragPointerPosition) {\n const { x, y } = this.lastDragPointerPosition;\n this.updateDraggedFloatingPositionFromPoint(x, y);\n }\n }\n onGlobalDragOver(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onDrag(event) {\n if (!this.dragState) {\n return;\n }\n this.updateDraggedFloatingPosition(event);\n }\n onGlobalDragEnd() {\n // Attempt to finalize a drop even if the drop event doesn't reach us (Firefox/edge cases)\n const state = this.dragState;\n const pos = this.lastDragPointerPosition;\n if (state && pos) {\n const stack = this.findStackAtPoint(pos.x, pos.y);\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n const path = stack ? this.parsePath(stack.dataset['path']) : (joystickPath ?? joystickTargetPath);\n const joystickZone = this.dropJoystick.dataset['zone'];\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : (stack ? this.computeDropZone(stack, { clientX: pos.x, clientY: pos.y }, null) : null);\n if (path && this.isDropZone(zone)) {\n this.handleDrop(path, zone);\n this.hideDropIndicator();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n }\n else {\n this.hideDropIndicator();\n }\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n }\n updateDraggedFloatingPositionFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) {\n return;\n }\n // Ignore obviously bogus coordinates sometimes seen during HTML5 drag\n if (clientX === 0 && clientY === 0) {\n return;\n }\n // If still dragging a tab inside its header, only convert to floating once we leave the header.\n if (this.dragState.floatingIndex !== null && this.dragState.floatingIndex < 0) {\n const b = this.dragState.sourceHeaderBounds;\n const sx = this.dragState.startClientX ?? clientX;\n const sy = this.dragState.startClientY ?? clientY;\n const dist = Math.hypot(clientX - sx, clientY - sy);\n const threshold = 8; // pixels to move before converting (tuned up)\n // Default to inside while bounds are unknown to avoid premature floating\n let insideHeader = true;\n const insideByBounds = b ? this.isPointWithinBounds(b, clientX, clientY) : true;\n const insideByHitTest = this.isPointerOverSourceHeader(clientX, clientY);\n insideHeader = insideByBounds || insideByHitTest;\n if (!insideHeader && dist > threshold) {\n // Convert to floating now using current pointer position\n this.convertPendingTabDragToFloating(clientX, clientY);\n }\n }\n this.updatePaneDragDropTargetFromPoint(clientX, clientY);\n const { floatingIndex, pointerOffsetX, pointerOffsetY } = this.dragState;\n if (floatingIndex === null || floatingIndex < 0) {\n return;\n }\n const floating = this.floatingLayouts[floatingIndex];\n if (!floating) {\n return;\n }\n const hostRect = this.getBoundingClientRect();\n const newLeft = clientX - hostRect.left - pointerOffsetX;\n const newTop = clientY - hostRect.top - pointerOffsetY;\n floating.bounds.left = newLeft;\n floating.bounds.top = newTop;\n const wrapper = this.getFloatingWrapper(floatingIndex);\n if (wrapper) {\n wrapper.style.left = `${newLeft}px`;\n wrapper.style.top = `${newTop}px`;\n }\n }\n updatePaneDragDropTargetFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const path = stack ? this.parsePath(stack.dataset['path']) : null;\n if (!stack || !path) {\n // While actively dragging, avoid hiding the indicator if it is visible.\n // Transient misses from hit-testing are common near the joystick.\n if (this.dropJoystick.dataset['visible'] !== 'true') {\n this.hideDropIndicator();\n }\n // Also ensure any in-header placeholder is cleared when not over a stack\n this.clearHeaderDragPlaceholder();\n return;\n }\n // If we moved to a different target stack, reset any sticky zone so\n // the new drop area doesn't inherit the previous side selection.\n if (this.dropJoystickTarget && this.dropJoystickTarget !== stack) {\n delete this.dropJoystick.dataset['zone'];\n this.updateDropJoystickActiveZone(null);\n }\n // Previous behavior hid the indicator and returned early here; instead,\n // allow the live-reorder branch below to handle in-header drags.\n // While dragging within the same header, show a placeholder and suppress joystick/indicator\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath)) {\n const inHeaderByBounds = !!this.dragState.sourceHeaderBounds && this.isPointWithinBounds(this.dragState.sourceHeaderBounds, clientX, clientY);\n const inHeaderByHitTest = this.isPointerOverSourceHeader(clientX, clientY);\n if (inHeaderByBounds || inHeaderByHitTest) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n // Ensure placeholder exists and move it as the pointer moves\n this.ensureHeaderDragPlaceholder(header, this.dragState.pane);\n const idx = this.computeHeaderInsertIndex(header, clientX);\n if (this.dragState.liveReorderIndex !== idx) {\n this.updateHeaderDragPlaceholderPosition(header, idx);\n // Keep model reordering until drop; only move the placeholder now\n this.dragState.liveReorderIndex = idx;\n }\n }\n this.hideDropIndicator();\n return;\n }\n }\n // Leaving the header: ensure any placeholder is removed immediately\n this.clearHeaderDragPlaceholder();\n const zoneHint = this.findDropZoneByPoint(clientX, clientY);\n const zone = this.computeDropZone(stack, { clientX, clientY }, zoneHint);\n this.showDropIndicator(stack, zone);\n }\n // Returns true when the pointer is currently over the source stack's header (tab strip)\n isPointerOverSourceHeader(clientX, clientY) {\n const state = this.dragState;\n if (!state) {\n return false;\n }\n const stackEl = state.sourceStackEl ?? null;\n const header = stackEl?.querySelector('.dock-stack__header');\n if (!header) {\n // Be conservative: if we cannot resolve the header, treat as inside\n return true;\n }\n const sr = this.shadowRoot;\n const elements = sr ? sr.elementsFromPoint(clientX, clientY) : [];\n for (const el of elements) {\n if (el instanceof HTMLElement && header.contains(el)) {\n return true;\n }\n }\n return false;\n }\n isPointWithinBounds(bounds, x, y) {\n return x >= bounds.left && x <= bounds.right && y >= bounds.top && y <= bounds.bottom;\n }\n // Ensure a placeholder tab exists during in-header drag and hide the real dragged tab visually\n ensureHeaderDragPlaceholder(header, pane) {\n if (this.dragState?.placeholderHeader === header && this.dragState.placeholderEl) {\n return;\n }\n const dragged = Array.from(header.querySelectorAll('.dock-tab')).find((t) => t.dataset['pane'] === pane) ?? null;\n if (!dragged) {\n return;\n }\n // Create placeholder\n const placeholder = this.documentRef.createElement('button');\n placeholder.type = 'button';\n placeholder.classList.add('dock-tab');\n placeholder.dataset['placeholder'] = 'true';\n // Keep the placeholder visually empty but reserving the same width\n placeholder.textContent = '';\n placeholder.setAttribute('aria-hidden', 'true');\n placeholder.style.width = `${dragged.offsetWidth}px`;\n // Hide the original dragged tab so it doesn't duplicate visually and free up its slot\n dragged.style.display = 'none';\n // Insert placeholder in the original position of the dragged tab\n header.insertBefore(placeholder, dragged);\n if (this.dragState) {\n this.dragState.placeholderHeader = header;\n this.dragState.placeholderEl = placeholder;\n }\n }\n // Move the placeholder to the computed target index within the header\n updateHeaderDragPlaceholderPosition(header, targetIndex) {\n const placeholder = this.dragState?.placeholderEl ?? null;\n if (!placeholder) {\n return;\n }\n const draggedPane = this.dragState?.pane ?? null;\n const tabs = Array.from(header.querySelectorAll('.dock-tab'))\n .filter((t) => t !== placeholder && (!draggedPane || t.dataset['pane'] !== draggedPane));\n const clampedTarget = Math.max(0, Math.min(targetIndex, tabs.length));\n const ref = tabs[clampedTarget] ?? null;\n header.insertBefore(placeholder, ref);\n }\n // Remove placeholder and restore original tab visibility\n clearHeaderDragPlaceholder() {\n const ph = this.dragState?.placeholderEl ?? null;\n const header = this.dragState?.placeholderHeader ?? null;\n if (header) {\n const dragged = this.dragState?.pane\n ? (Array.from(header.querySelectorAll('.dock-tab')).find((t) => t.dataset['pane'] === this.dragState?.pane) ?? null)\n : null;\n if (dragged) {\n dragged.style.display = '';\n }\n }\n if (ph && ph.parentElement) {\n ph.parentElement.removeChild(ph);\n }\n if (this.dragState) {\n this.dragState.placeholderEl = null;\n this.dragState.placeholderHeader = null;\n }\n }\n startDragPointerTracking() {\n if (this.dragPointerTrackingActive) {\n return;\n }\n this.lastDragPointerPosition = null;\n const win = this.windowRef;\n win?.addEventListener('mousemove', this.onDragMouseMove, true);\n win?.addEventListener('touchmove', this.onDragTouchMove, { passive: false });\n win?.addEventListener('mouseup', this.onDragMouseUp, true);\n win?.addEventListener('touchend', this.onDragTouchEnd, true);\n win?.addEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = true;\n }\n stopDragPointerTracking() {\n if (!this.dragPointerTrackingActive) {\n return;\n }\n const win = this.windowRef;\n win?.removeEventListener('mousemove', this.onDragMouseMove, true);\n win?.removeEventListener('touchmove', this.onDragTouchMove);\n win?.removeEventListener('mouseup', this.onDragMouseUp, true);\n win?.removeEventListener('touchend', this.onDragTouchEnd, true);\n win?.removeEventListener('touchcancel', this.onDragTouchEnd, true);\n this.dragPointerTrackingActive = false;\n this.lastDragPointerPosition = null;\n this.clearPendingDragEndTimeout();\n }\n onDragMouseMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n if (event.buttons === 0) {\n this.scheduleDeferredDragEnd();\n return;\n }\n this.lastDragPointerPosition = { x: event.clientX, y: event.clientY };\n this.updateDraggedFloatingPositionFromPoint(event.clientX, event.clientY);\n }\n onDragTouchMove(event) {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n const touch = event.touches[0];\n if (!touch) {\n this.scheduleDeferredDragEnd();\n return;\n }\n event.preventDefault();\n this.lastDragPointerPosition = { x: touch.clientX, y: touch.clientY };\n this.updateDraggedFloatingPositionFromPoint(touch.clientX, touch.clientY);\n }\n onDragMouseUp() {\n // Prefer committing a drop from pointer-up since some browsers suppress drop events\n if (this.dragState) {\n const pos = this.lastDragPointerPosition;\n if (pos) {\n this.finalizeDropFromPoint(pos.x, pos.y);\n }\n }\n this.handleDragPointerUpCommon();\n }\n // Convert a currently in-header tab drag into a floating window\n convertPendingTabDragToFloating(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const state = this.dragState;\n if (state.floatingIndex !== null && state.floatingIndex >= 0) {\n return; // already floating\n }\n // Clean up any placeholder before converting\n this.clearHeaderDragPlaceholder();\n const location = this.resolveStackLocation(state.sourcePath);\n if (!location) {\n return;\n }\n const pane = state.pane;\n const stackEl = state.sourceStackEl ?? null;\n const hostRect = this.getBoundingClientRect();\n const stackRect = stackEl?.getBoundingClientRect() ?? null;\n const metrics = this.pendingTabDragMetrics;\n const fallbackWidth = 320;\n const fallbackHeight = 240;\n const width = metrics && Number.isFinite(metrics.width) && metrics.width > 0\n ? metrics.width\n : stackRect && Number.isFinite(stackRect.width)\n ? stackRect.width\n : fallbackWidth;\n const height = metrics && Number.isFinite(metrics.height) && metrics.height > 0\n ? metrics.height\n : stackRect && Number.isFinite(stackRect.height)\n ? stackRect.height\n : fallbackHeight;\n const pointerOffsetX = Number.isFinite(this.dragState?.pointerOffsetX)\n ? this.dragState.pointerOffsetX\n : metrics && Number.isFinite(metrics.pointerOffsetX)\n ? metrics.pointerOffsetX\n : width / 2;\n const pointerOffsetY = Number.isFinite(this.dragState?.pointerOffsetY)\n ? this.dragState.pointerOffsetY\n : metrics && Number.isFinite(metrics.pointerOffsetY)\n ? metrics.pointerOffsetY\n : height / 2;\n const pointerLeft = Number.isFinite(clientX)\n ? clientX - hostRect.left - pointerOffsetX\n : 0;\n const pointerTop = Number.isFinite(clientY)\n ? clientY - hostRect.top - pointerOffsetY\n : 0;\n // Remove pane from its current stack and create a new floating entry\n this.removePaneFromLocation(location, pane);\n const floatingStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n const floatingLayout = {\n bounds: {\n left: pointerLeft,\n top: pointerTop,\n width,\n height,\n },\n root: floatingStack,\n activePane: pane,\n };\n this.floatingLayouts.push(floatingLayout);\n const newIndex = this.floatingLayouts.length - 1;\n this.render();\n const wrapper = this.getFloatingWrapper(newIndex);\n if (wrapper) {\n this.promoteFloatingPane(newIndex, wrapper);\n }\n // Update drag state so subsequent moves reposition the floating window\n state.sourcePath = { type: 'floating', index: newIndex, segments: [] };\n state.floatingIndex = newIndex;\n state.pointerOffsetX = pointerOffsetX;\n state.pointerOffsetY = pointerOffsetY;\n this.dispatchLayoutChanged();\n }\n // Compute the intended tab insert index within a header based on pointer X\n // Adds a slight rightward bias and uses the placeholder rect (if present)\n // to ensure offsets are correct even when the dragged tab is display:none.\n computeHeaderInsertIndex(header, clientX) {\n const allTabs = Array.from(header.querySelectorAll('.dock-tab'));\n if (allTabs.length === 0) {\n return 0;\n }\n const draggedPane = this.dragState?.pane ?? null;\n const draggedEl = draggedPane\n ? (allTabs.find((t) => t.dataset['pane'] === draggedPane) ?? null)\n : null;\n const placeholderEl = header.querySelector('.dock-tab[data-placeholder=\"true\"]');\n const targets = allTabs.filter((t) => t !== draggedEl && t !== placeholderEl);\n if (targets.length === 0) {\n return 0;\n }\n const rightBias = 12;\n const leftBias = 0;\n const baseRect = placeholderEl\n ? placeholderEl.getBoundingClientRect()\n : draggedEl\n ? draggedEl.getBoundingClientRect()\n : null;\n const rectValid = !!baseRect && Number.isFinite(baseRect.width) && baseRect.width > 0;\n const draggedCenter = rectValid && baseRect ? baseRect.left + baseRect.width / 2 : null;\n for (let i = 0; i < targets.length; i += 1) {\n const rect = targets[i].getBoundingClientRect();\n const baseMid = rect.left + rect.width / 2;\n const isRightOfDragged = draggedCenter !== null ? baseMid >= draggedCenter : false;\n const mid = isRightOfDragged ? baseMid + rightBias : baseMid - leftBias;\n if (clientX < mid) {\n return i;\n }\n }\n return targets.length;\n }\n reorderPaneInLocationAtIndex(location, pane, targetIndex) {\n const panes = location.node.panes;\n const currentIndex = panes.indexOf(pane);\n if (currentIndex === -1) {\n return;\n }\n const clampedTarget = Math.max(0, Math.min(targetIndex, panes.length - 1));\n if (clampedTarget === currentIndex) {\n return;\n }\n panes.splice(currentIndex, 1);\n panes.splice(clampedTarget, 0, pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n onDragTouchEnd() {\n this.handleDragPointerUpCommon();\n }\n // Commit a drop using current pointer coordinates and joystick state\n finalizeDropFromPoint(clientX, clientY) {\n if (!this.dragState) {\n return;\n }\n const stack = this.findStackAtPoint(clientX, clientY);\n const stackPath = stack ? this.parsePath(stack.dataset['path']) : null;\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickStoredPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n const path = (joystickVisible ? (joystickStoredPath ?? joystickTargetPath) : null) ?? stackPath;\n const joystickZone = this.dropJoystick.dataset['zone'];\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : (stack ? this.computeDropZone(stack, { clientX, clientY }, null) : null);\n // Same-header reorder case when no side zone is chosen\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n stack &&\n path &&\n stackPath &&\n this.pathsEqual(stackPath, this.dragState.sourcePath) &&\n (!zone || zone === 'center')) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, clientX);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n return;\n }\n }\n }\n if (path && this.isDropZone(zone)) {\n this.handleDrop(path, zone);\n this.dragState.dropHandled = true;\n }\n }\n clearPendingDragEndTimeout() {\n if (this.pendingDragEndTimeout !== null) {\n const win = this.windowRef;\n if (win && typeof this.pendingDragEndTimeout === 'number') {\n win.clearTimeout(this.pendingDragEndTimeout);\n }\n else {\n globalThis.clearTimeout(this.pendingDragEndTimeout);\n }\n this.pendingDragEndTimeout = null;\n }\n }\n scheduleDeferredDragEnd() {\n if (this.pendingDragEndTimeout !== null) {\n return;\n }\n const completeDrag = () => {\n this.pendingDragEndTimeout = null;\n this.hideDropIndicator();\n if (!this.dragState) {\n this.clearPendingTabDragMetrics();\n return;\n }\n this.endPaneDrag();\n this.clearPendingTabDragMetrics();\n };\n const win = this.windowRef;\n this.pendingDragEndTimeout = win\n ? win.setTimeout(completeDrag, 0)\n : setTimeout(completeDrag, 0);\n }\n onDrop(event) {\n if (!this.dragState) {\n return;\n }\n event.preventDefault();\n const pointFromEvent = Number.isFinite(event.clientX) && Number.isFinite(event.clientY)\n ? { clientX: event.clientX, clientY: event.clientY }\n : null;\n const point = pointFromEvent ??\n (this.lastDragPointerPosition\n ? {\n clientX: this.lastDragPointerPosition.x,\n clientY: this.lastDragPointerPosition.y,\n }\n : null);\n const stack = this.findStackElement(event) ??\n (point ? this.findStackAtPoint(point.clientX, point.clientY) : null);\n // Prefer joystick's stored target path when the joystick is visible (drop over buttons)\n const joystickVisible = this.dropJoystick.dataset['visible'] === 'true';\n const joystickPath = this.parsePath(this.dropJoystick.dataset['path']);\n const joystickTarget = this.dropJoystickTarget;\n const joystickTargetPath = joystickTarget ? this.parsePath(joystickTarget.dataset['path']) : null;\n let path = stack\n ? this.parsePath(stack.dataset['path'])\n : (joystickPath ?? joystickTargetPath);\n if (!path && joystickVisible) {\n // As a last resort, target the main dock surface only when empty\n const dockPath = this.parsePath(this.dockedEl.dataset['path']);\n path = (!this.rootLayout ? dockPath : null);\n }\n // Defer same-header reorder decision until after zone resolution below\n // Prefer joystick's active zone if available, else infer from event/point\n const joystickZone = this.dropJoystick.dataset['zone'];\n const eventZoneHint = this.extractDropZoneFromEvent(event);\n const pointZoneHint = point ? this.findDropZoneByPoint(point.clientX, point.clientY) : null;\n const zone = this.isDropZone(joystickZone)\n ? joystickZone\n : stack\n ? this.computeDropZone(stack, point ?? event, pointZoneHint ?? eventZoneHint)\n : (this.isDropZone(pointZoneHint ?? eventZoneHint) ? (pointZoneHint ?? eventZoneHint) : null);\n // If still in same header and no side zone chosen, treat as in-header reorder\n if (this.dragState &&\n this.dragState.floatingIndex !== null &&\n this.dragState.floatingIndex < 0 &&\n stack &&\n path &&\n this.pathsEqual(path, this.dragState.sourcePath) &&\n (!zone || zone === 'center')) {\n const header = stack.querySelector('.dock-stack__header');\n if (header) {\n const x = (point ? point.clientX : event.clientX);\n if (Number.isFinite(x)) {\n const location = this.resolveStackLocation(path);\n if (location) {\n const idx = this.computeHeaderInsertIndex(header, x);\n this.reorderPaneInLocationAtIndex(location, this.dragState.pane, idx);\n this.render();\n this.dispatchLayoutChanged();\n this.dragState.dropHandled = true;\n this.endPaneDrag();\n return;\n }\n }\n }\n }\n // If joystick is visible and both path and zone are resolved, force using joystick as authoritative\n if (joystickVisible && path && this.isDropZone(joystickZone)) {\n this.handleDrop(path, joystickZone);\n this.endPaneDrag();\n return;\n }\n if (!zone) {\n this.hideDropIndicator();\n this.endPaneDrag();\n return;\n }\n this.handleDrop(path, zone);\n this.endPaneDrag();\n }\n onDragLeave(event) {\n const related = event.relatedTarget;\n // During active drags, browsers can emit spurious dragleave with null\n // relatedTarget while the pointer is still over the joystick/buttons.\n // Be conservative: if we can resolve a stack/joystick at the last known\n // pointer position, don’t hide (prevents flicker of active state).\n if (this.dragState) {\n const pos = (Number.isFinite(event.clientX) && Number.isFinite(event.clientY))\n ? { x: event.clientX, y: event.clientY }\n : this.lastDragPointerPosition;\n if (pos) {\n const stackAtPoint = this.findStackAtPoint(pos.x, pos.y);\n if (stackAtPoint) {\n return; // still inside our drop area; ignore this dragleave\n }\n }\n }\n if (!related) {\n this.hideDropIndicator();\n return;\n }\n const rootContains = this.rootEl.contains(related);\n const joystickContains = this.dropJoystick.contains(related);\n if (!rootContains && !joystickContains) {\n this.hideDropIndicator();\n }\n }\n handleDrop(targetPath, zone) {\n if (!this.dragState || !targetPath) {\n return;\n }\n const { pane, sourcePath } = this.dragState;\n const source = this.resolveStackLocation(sourcePath);\n const target = this.resolveStackLocation(targetPath);\n // Special case: allow dropping onto an empty main dock area (no root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n if (!source) {\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n const newRoot = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n this.rootLayout = newRoot;\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n if (!source || !target) {\n return;\n }\n if (zone === 'center' && this.pathsEqual(sourcePath, targetPath)) {\n if (!source.node.panes.includes(pane)) {\n return;\n }\n this.reorderPaneInLocation(source, pane);\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const stackEmptied = this.removePaneFromLocation(source, pane, true);\n if (zone === 'center') {\n this.addPaneToLocation(target, pane);\n this.setActivePaneForLocation(target, pane);\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n return;\n }\n const newStack = {\n kind: 'stack',\n panes: [pane],\n activePane: pane,\n };\n if (target.context === 'docked') {\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, newStack, zone);\n }\n else {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n return;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, newStack, zone);\n floating.activePane = pane;\n }\n if (stackEmptied) {\n this.cleanupLocation(source);\n }\n this.render();\n this.dispatchLayoutChanged();\n if (this.dragState) {\n this.dragState.dropHandled = true;\n }\n }\n handleFloatingStackDrop(sourceIndex, targetPath, zone) {\n const source = this.floatingLayouts[sourceIndex];\n if (!source || !source.root) {\n return false;\n }\n const target = this.resolveStackLocation(targetPath);\n // Allow dropping an entire floating stack onto an empty main dock area\n // (no existing root).\n if (!target && targetPath.type === 'docked' && !this.rootLayout) {\n this.rootLayout = this.cloneLayoutNode(source.root);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (!target) {\n return false;\n }\n if (target.context === 'floating' && target.index === sourceIndex) {\n return false;\n }\n if (zone === 'center') {\n const panes = this.collectPaneNames(source.root);\n if (panes.length === 0) {\n return false;\n }\n panes.forEach((pane) => {\n this.addPaneToLocation(target, pane);\n });\n const activePane = source.activePane && panes.includes(source.activePane)\n ? source.activePane\n : this.findFirstPaneName(source.root) ?? panes[0];\n if (activePane) {\n this.setActivePaneForLocation(target, activePane);\n }\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n if (target.context === 'floating') {\n const floating = this.floatingLayouts[target.index];\n if (!floating) {\n return false;\n }\n floating.root = this.dockNodeBeside(floating.root, target.node, source.root, zone);\n floating.activePane = source.activePane ?? this.findFirstPaneName(source.root) ?? undefined;\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n this.rootLayout = this.dockNodeBeside(this.rootLayout, target.node, source.root, zone);\n this.removeFloatingAt(sourceIndex);\n this.render();\n this.dispatchLayoutChanged();\n return true;\n }\n insertWeight(sizes, index, totalChildren) {\n const existingCount = totalChildren - 1;\n const normalized = this.normalizeSizesArray(sizes, existingCount);\n const newWeight = 1 / totalChildren;\n const remaining = 1 - newWeight;\n const result = [];\n for (let i = 0; i < totalChildren; i += 1) {\n if (i === index) {\n result.push(newWeight);\n }\n else {\n const sourceIndex = i < index ? i : i - 1;\n result.push(normalized[sourceIndex] * remaining);\n }\n }\n return result;\n }\n removePaneFromStack(stack, pane, skipCleanup = false) {\n stack.panes = stack.panes.filter((p) => p !== pane);\n if (!stack.panes.includes(stack.activePane ?? '')) {\n if (stack.panes.length > 0) {\n stack.activePane = stack.panes[0];\n }\n else {\n delete stack.activePane;\n }\n }\n if (stack.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, stack);\n return true;\n }\n findParentSplit(node, child) {\n if (!node || node === child) {\n return null;\n }\n if (node.kind !== 'split') {\n return null;\n }\n const index = node.children.indexOf(child);\n if (index !== -1) {\n return { parent: node, index };\n }\n for (let i = 0; i < node.children.length; i += 1) {\n const result = this.findParentSplit(node.children[i], child);\n if (result) {\n return result;\n }\n }\n return null;\n }\n computeDropZone(stack, point, zoneHint) {\n // Do not force a zone: even when the main area is empty we only\n // activate a zone when the pointer is actually over a joystick button.\n const hintedZone = this.isDropZone(zoneHint) ? zoneHint : null;\n if (hintedZone) {\n this.updateDropJoystickActiveZone(hintedZone);\n return hintedZone;\n }\n const pointZone = point &&\n Number.isFinite(point.clientX) &&\n Number.isFinite(point.clientY)\n ? this.findDropZoneByPoint(point.clientX, point.clientY)\n : null;\n if (pointZone) {\n this.updateDropJoystickActiveZone(pointZone);\n return pointZone;\n }\n if (this.dropJoystickTarget === stack) {\n // Be sticky while hovering the joystick: if we recently had a zone\n // selected, prefer keeping it instead of briefly clearing to null\n // when the browser reports transient coordinates/targets during drag.\n const sticky = this.dropJoystick.dataset['zone'];\n if (this.isDropZone(sticky)) {\n this.updateDropJoystickActiveZone(sticky);\n return sticky;\n }\n this.updateDropJoystickActiveZone(null);\n }\n return null;\n }\n extractDropZoneFromEvent(event) {\n if (!event) {\n return null;\n }\n if (typeof event.composedPath === 'function') {\n const path = event.composedPath();\n const zone = this.findDropZoneInTargets(path);\n if (zone) {\n return zone;\n }\n }\n if ('clientX' in event && 'clientY' in event) {\n const pointEvent = event;\n const zoneFromPoint = this.findDropZoneByPoint(pointEvent.clientX, pointEvent.clientY);\n if (zoneFromPoint) {\n return zoneFromPoint;\n }\n }\n return null;\n }\n handleDragPointerUpCommon() {\n if (!this.dragState) {\n this.stopDragPointerTracking();\n return;\n }\n this.scheduleDeferredDragEnd();\n }\n findDropZoneInTargets(targets) {\n for (const target of targets) {\n if (target instanceof HTMLElement &&\n target.classList.contains('dock-drop-joystick__button')) {\n const zone = target.dataset?.['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n findDropZoneByPoint(clientX, clientY) {\n if (!this.dropJoystickButtons ||\n this.dropJoystick.dataset['visible'] !== 'true' ||\n !this.dropJoystickTarget) {\n return null;\n }\n for (const button of this.dropJoystickButtons) {\n // Skip hidden/inactive buttons (used in center-only mode)\n if ((button.dataset['hidden'] === 'true') || button.style.visibility === 'hidden' || button.style.display === 'none') {\n continue;\n }\n const rect = button.getBoundingClientRect();\n if (clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom) {\n const zone = button.dataset['zone'];\n if (this.isDropZone(zone)) {\n return zone;\n }\n }\n }\n return null;\n }\n updateDropJoystickActiveZone(zone) {\n // If no zone is computed but the joystick is visible, keep the last\n // known active zone to avoid visual jitter while dragging across\n // small gaps where hit‑testing momentarily fails.\n const visible = this.dropJoystick.dataset['visible'] === 'true';\n const sticky = visible ? this.dropJoystick.dataset['zone'] : undefined;\n const effectiveZone = zone ?? (this.isDropZone(sticky) ? sticky : null);\n this.dropJoystickButtons.forEach((button) => {\n const isActive = effectiveZone !== null && button.dataset['zone'] === effectiveZone;\n if (isActive) {\n button.dataset['active'] = 'true';\n }\n else {\n delete button.dataset['active'];\n }\n });\n if (effectiveZone) {\n this.dropJoystick.dataset['zone'] = effectiveZone;\n }\n else {\n delete this.dropJoystick.dataset['zone'];\n }\n }\n isDropZone(value) {\n return value === 'left' || value === 'right' || value === 'top' || value === 'bottom' || value === 'center';\n }\n showDropIndicator(stack, zone) {\n const targetPath = this.parsePath(stack.dataset['path']);\n const sourcePath = this.dragState?.sourcePath ?? null;\n if (targetPath && sourcePath && this.isOrIsAncestorOf(targetPath, sourcePath)) {\n // Don't show any drop indicators on the pane being dragged.\n return;\n }\n const rect = stack.getBoundingClientRect();\n const hostRect = this.getBoundingClientRect();\n const indicator = this.dropIndicator;\n const joystick = this.dropJoystick;\n joystick.hidden = false;\n const path = this.parsePath(stack.dataset['path']);\n let overlayZ = 100;\n if (path && path.type === 'floating') {\n overlayZ = this.getFloatingPaneZIndex(path.index) + 100;\n }\n indicator.style.zIndex = String(overlayZ);\n joystick.style.zIndex = String(overlayZ + 1);\n let left = rect.left - hostRect.left;\n let top = rect.top - hostRect.top;\n let width = rect.width;\n let height = rect.height;\n const portion = 0.5;\n if (zone) {\n switch (zone) {\n case 'left':\n width = rect.width * portion;\n break;\n case 'right':\n width = rect.width * portion;\n left += rect.width * (1 - portion);\n break;\n case 'top':\n height = rect.height * portion;\n break;\n case 'bottom':\n height = rect.height * portion;\n top += rect.height * (1 - portion);\n break;\n default:\n break;\n }\n indicator.style.left = `${left}px`;\n indicator.style.top = `${top}px`;\n indicator.style.width = `${width}px`;\n indicator.style.height = `${height}px`;\n indicator.dataset['visible'] = 'true';\n }\n else {\n indicator.dataset['visible'] = 'false';\n }\n joystick.style.left = `${rect.left - hostRect.left + rect.width / 2}px`;\n joystick.style.top = `${rect.top - hostRect.top + rect.height / 2}px`;\n joystick.dataset['visible'] = 'true';\n this.dropJoystick.style.display = 'grid';\n joystick.dataset['path'] = stack.dataset['path'] ?? '';\n const changedTarget = this.dropJoystickTarget && this.dropJoystickTarget !== stack;\n this.dropJoystickTarget = stack;\n if (changedTarget) {\n // New target stack: forget any previously sticky zone.\n delete this.dropJoystick.dataset['zone'];\n }\n // If main dock area is empty, show only the center button and collapse the grid\n const isEmptyMainArea = !this.rootLayout && (stack === this.dockedEl || (targetPath && targetPath.type === 'docked' && targetPath.segments.length === 0));\n const spacers = Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer'));\n if (isEmptyMainArea) {\n // Keep spacers visible so the joystick keeps its circular footprint.\n spacers.forEach((s) => {\n s.style.display = '';\n });\n this.dropJoystickButtons.forEach((btn) => {\n const isCenter = btn.dataset['zone'] === 'center';\n if (isCenter) {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n }\n else {\n // Hide visually but keep layout space; also prevent interaction.\n btn.style.visibility = 'hidden';\n btn.style.pointerEvents = 'none';\n btn.dataset['hidden'] = 'true';\n btn.style.display = '';\n }\n });\n // Keep default 3x3 grid so the circular background size stays the same.\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n // Do not set an active zone automatically; users must hover the button.\n }\n else {\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n btn.style.display = '';\n });\n spacers.forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n this.updateDropJoystickActiveZone(zone);\n }\n hideDropIndicator() {\n this.dropIndicator.dataset['visible'] = 'false';\n this.dropJoystick.dataset['visible'] = 'false';\n this.dropJoystick.style.display = 'none';\n delete this.dropJoystick.dataset['path'];\n this.dropJoystickTarget = null;\n this.updateDropJoystickActiveZone(null);\n // Restore joystick structure to default.\n this.dropJoystickButtons.forEach((btn) => {\n btn.style.display = '';\n btn.style.visibility = '';\n btn.style.pointerEvents = '';\n delete btn.dataset['hidden'];\n });\n Array.from(this.dropJoystick.querySelectorAll('.dock-drop-joystick__spacer')).forEach((s) => (s.style.display = ''));\n this.dropJoystick.style.gridTemplateColumns = '';\n this.dropJoystick.style.gridTemplateRows = '';\n }\n findStackAtPoint(clientX, clientY) {\n const shadow = this.shadowRoot;\n if (!shadow) {\n return null;\n }\n const elements = shadow.elementsFromPoint(clientX, clientY);\n const stack = this.findStackInTargets(elements);\n if (stack) {\n return stack;\n }\n // If there are no docked stacks (all panes are floating), allow the\n // docked surface itself to serve as a drop target for the main zone.\n if (!this.rootLayout) {\n const dockRect = this.dockedEl.getBoundingClientRect();\n if (clientX >= dockRect.left &&\n clientX <= dockRect.right &&\n clientY >= dockRect.top &&\n clientY <= dockRect.bottom) {\n return this.dockedEl;\n }\n }\n return null;\n }\n findStackElement(event) {\n const path = event.composedPath();\n const stack = this.findStackInTargets(path);\n if (stack) {\n return stack;\n }\n // If the root dock area is empty, treat the docked surface as a valid\n // target when it appears in the composed path.\n if (!this.rootLayout) {\n for (const target of path) {\n if (target instanceof HTMLElement &&\n (target === this.dockedEl || target.classList.contains('dock-docked'))) {\n return this.dockedEl;\n }\n }\n }\n return null;\n }\n findStackInTargets(targets) {\n for (const element of targets) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.classList.contains('dock-stack')) {\n return element;\n }\n if (this.dropJoystickTarget &&\n (element.classList.contains('dock-drop-joystick') ||\n element.classList.contains('dock-drop-joystick__button') ||\n element.classList.contains('dock-drop-joystick__spacer'))) {\n return this.dropJoystickTarget;\n }\n }\n return null;\n }\n activatePane(stack, paneName, path) {\n stack.dataset['activePane'] = paneName;\n const headerButtons = stack.querySelectorAll('.dock-tab');\n headerButtons.forEach((button) => {\n const isSelected = button.dataset['pane'] === paneName;\n button.classList.toggle('dock-tab--active', isSelected);\n button.setAttribute('aria-selected', String(isSelected));\n });\n const panes = stack.querySelectorAll('.dock-stack__pane');\n panes.forEach((pane) => {\n if (pane.dataset['pane'] === paneName) {\n pane.removeAttribute('hidden');\n }\n else {\n pane.setAttribute('hidden', '');\n }\n });\n const location = this.resolveStackLocation(path);\n if (!location) {\n return;\n }\n location.node.activePane = paneName;\n if (path.type === 'floating') {\n const floating = this.floatingLayouts[path.index];\n if (floating) {\n floating.activePane = paneName;\n }\n this.updateFloatingWindowTitle(path.index);\n }\n this.dispatchLayoutChanged();\n }\n getNodeAtPath(root, path) {\n if (!root) {\n return null;\n }\n let current = root;\n if (path.length === 0) {\n return current;\n }\n for (const segment of path) {\n if (!current || current.kind !== 'split') {\n return null;\n }\n current = current.children[segment] ?? null;\n }\n return current;\n }\n resolveSplitNode(path) {\n if (path.type === 'docked') {\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n const floating = this.floatingLayouts[path.index];\n if (!floating || !floating.root) {\n return null;\n }\n const node = this.getNodeAtPath(floating.root, path.segments);\n return node && node.kind === 'split' ? node : null;\n }\n replaceNodeInTree(root, target, replacement) {\n if (!root) {\n return replacement;\n }\n if (root === target) {\n return replacement;\n }\n const parentInfo = this.findParentSplit(root, target);\n if (!parentInfo) {\n return root;\n }\n parentInfo.parent.children[parentInfo.index] = replacement;\n this.normalizeSplitNode(parentInfo.parent);\n return root;\n }\n cleanupEmptyStackInTree(root, stack) {\n if (!root || stack.panes.length > 0) {\n return root;\n }\n const parentInfo = this.findParentSplit(root, stack);\n if (!parentInfo) {\n return root === stack ? null : root;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(stack);\n if (index === -1) {\n return root;\n }\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n cleanupSplitIfNecessary(root, split) {\n if (split.children.length === 1) {\n return this.replaceNodeInTree(root, split, split.children[0]);\n }\n if (split.children.length === 0) {\n const parentInfo = this.findParentSplit(root, split);\n if (!parentInfo) {\n return null;\n }\n const parent = parentInfo.parent;\n const index = parent.children.indexOf(split);\n if (index !== -1) {\n parent.children.splice(index, 1);\n if (Array.isArray(parent.sizes)) {\n parent.sizes.splice(index, 1);\n }\n this.normalizeSplitNode(parent);\n return this.cleanupSplitIfNecessary(root, parent);\n }\n }\n return root;\n }\n dockNodeBeside(root, targetNode, newNode, zone) {\n const orientation = zone === 'left' || zone === 'right' ? 'horizontal' : 'vertical';\n const placeBefore = zone === 'left' || zone === 'top';\n const parentInfo = this.findParentSplit(root, targetNode);\n if (parentInfo && parentInfo.parent.direction === orientation) {\n const insertIndex = placeBefore ? parentInfo.index : parentInfo.index + 1;\n parentInfo.parent.children.splice(insertIndex, 0, newNode);\n parentInfo.parent.sizes = this.insertWeight(parentInfo.parent.sizes, insertIndex, parentInfo.parent.children.length);\n return root ?? newNode;\n }\n const split = {\n kind: 'split',\n direction: orientation,\n children: placeBefore ? [newNode, targetNode] : [targetNode, newNode],\n sizes: [0.5, 0.5],\n };\n return this.replaceNodeInTree(root, targetNode, split);\n }\n forEachStack(node, visitor, path = []) {\n if (!node) {\n return;\n }\n if (node.kind === 'stack') {\n visitor(node, path);\n return;\n }\n node.children.forEach((child, index) => this.forEachStack(child, visitor, [...path, index]));\n }\n findStackContainingPane(node, pane) {\n let result = null;\n this.forEachStack(node, (stack) => {\n if (!result && stack.panes.includes(pane)) {\n result = stack;\n }\n });\n return result;\n }\n findFirstPaneName(node) {\n let found = null;\n this.forEachStack(node, (stack) => {\n if (found || stack.panes.length === 0) {\n return;\n }\n if (stack.activePane && stack.panes.includes(stack.activePane)) {\n found = stack.activePane;\n }\n else {\n found = stack.panes[0];\n }\n });\n return found;\n }\n collectFloatingPaneMetadata(node) {\n // Deprecated method retained temporarily for signature compatibility.\n // Use collectPaneNames instead.\n const panes = this.collectPaneNames(node);\n const titles = {};\n panes.forEach((p) => {\n const t = this.titles[p];\n if (t) {\n titles[p] = t;\n }\n });\n return { panes, titles };\n }\n collectPaneNames(node) {\n const panes = [];\n this.forEachStack(node, (stack) => {\n stack.panes.forEach((pane) => panes.push(pane));\n });\n return panes;\n }\n normalizeFloatingLayout(layout) {\n const bounds = layout.bounds ?? { left: 0, top: 0, width: 320, height: 200 };\n const normalizedBounds = {\n left: Number.isFinite(bounds.left) ? bounds.left : 0,\n top: Number.isFinite(bounds.top) ? bounds.top : 0,\n width: Number.isFinite(bounds.width) ? Math.max(bounds.width, 160) : 320,\n height: Number.isFinite(bounds.height) ? Math.max(bounds.height, 120) : 200,\n };\n const root = layout.root ? this.cloneLayoutNode(layout.root) : null;\n return {\n id: layout.id,\n bounds: normalizedBounds,\n zIndex: layout.zIndex,\n root,\n activePane: layout.activePane,\n };\n }\n formatPath(path) {\n if (path.type === 'floating') {\n const suffix = path.segments.length > 0\n ? `/${path.segments.map((segment) => segment.toString()).join('/')}`\n : '';\n return `f:${path.index}${suffix}`;\n }\n const suffix = path.segments.join('/');\n return suffix.length > 0 ? `d:${suffix}` : 'd:';\n }\n clonePath(path) {\n if (path.type === 'floating') {\n return { type: 'floating', index: path.index, segments: [...path.segments] };\n }\n return { type: 'docked', segments: [...path.segments] };\n }\n parsePath(path) {\n if (!path) {\n return null;\n }\n if (path.startsWith('f:')) {\n const remainder = path.slice(2);\n const [indexPart, ...segmentParts] = remainder.split('/');\n const index = Number.parseInt(indexPart, 10);\n if (!Number.isFinite(index)) {\n return null;\n }\n const segments = segmentParts\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'floating', index, segments };\n }\n const normalized = path.startsWith('d:') ? path.slice(2) : path;\n if (normalized.length === 0) {\n return { type: 'docked', segments: [] };\n }\n const segments = normalized\n .split('/')\n .filter((segment) => segment.length > 0)\n .map((segment) => Number.parseInt(segment, 10))\n .filter((value) => Number.isFinite(value));\n return { type: 'docked', segments };\n }\n pathsEqual(a, b) {\n if (a.type !== b.type) {\n return false;\n }\n if (a.type === 'floating') {\n const other = b;\n if (a.index !== other.index) {\n return false;\n }\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n const other = b;\n if (a.segments.length !== other.segments.length) {\n return false;\n }\n return a.segments.every((value, index) => value === other.segments[index]);\n }\n isOrIsAncestorOf(ancestor, descendant) {\n if (ancestor.type !== descendant.type) {\n return false;\n }\n if (ancestor.type === 'floating') {\n if (descendant.index !== ancestor.index) {\n return false;\n }\n }\n if (ancestor.segments.length > descendant.segments.length) {\n return false;\n }\n return ancestor.segments.every((segment, i) => segment === descendant.segments[i]);\n }\n countPanesInTree(node) {\n if (!node) {\n return 0;\n }\n if (node.kind === 'stack') {\n return node.panes.length;\n }\n return node.children.reduce((total, child) => total + this.countPanesInTree(child), 0);\n }\n resolveStackLocation(path) {\n if (path.type === 'floating') {\n const layout = this.floatingLayouts[path.index];\n if (!layout || !layout.root) {\n return null;\n }\n const node = this.getNodeAtPath(layout.root, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'floating', index: path.index, path: [...path.segments], node };\n }\n const node = this.getNodeAtPath(this.rootLayout, path.segments);\n if (!node || node.kind !== 'stack') {\n return null;\n }\n return { context: 'docked', path: [...path.segments], node };\n }\n removePaneFromLocation(location, pane, skipCleanup = false) {\n if (location.context === 'docked') {\n return this.removePaneFromStack(location.node, pane, skipCleanup);\n }\n return this.removePaneFromFloating(location.index, location.path, pane, skipCleanup);\n }\n addPaneToLocation(location, pane) {\n const panes = location.node.panes;\n const existingIndex = panes.indexOf(pane);\n if (existingIndex !== -1) {\n panes.splice(existingIndex, 1);\n }\n panes.push(pane);\n }\n setActivePaneForLocation(location, pane) {\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n cleanupLocation(location) {\n if (location.context === 'docked') {\n this.rootLayout = this.cleanupEmptyStackInTree(this.rootLayout, location.node);\n }\n else {\n const floating = this.floatingLayouts[location.index];\n if (!floating) {\n return;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, location.node);\n if (!floating.root) {\n this.removeFloatingAt(location.index);\n }\n }\n }\n reorderPaneInLocation(location, pane) {\n const panes = location.node.panes;\n const index = panes.indexOf(pane);\n if (index === -1) {\n return;\n }\n panes.splice(index, 1);\n panes.push(pane);\n location.node.activePane = pane;\n if (location.context === 'floating') {\n const floating = this.floatingLayouts[location.index];\n if (floating) {\n floating.activePane = pane;\n }\n }\n }\n removeFloatingAt(index) {\n if (index < 0 || index >= this.floatingLayouts.length) {\n return;\n }\n this.floatingLayouts.splice(index, 1);\n }\n removePaneFromFloating(index, path, pane, skipCleanup = false) {\n const floating = this.floatingLayouts[index];\n if (!floating || !floating.root) {\n return false;\n }\n const node = this.getNodeAtPath(floating.root, path);\n if (!node || node.kind !== 'stack') {\n return false;\n }\n node.panes = node.panes.filter((p) => p !== pane);\n if (!node.panes.includes(node.activePane ?? '')) {\n if (node.panes.length > 0) {\n node.activePane = node.panes[0];\n }\n else {\n delete node.activePane;\n }\n }\n if (floating.activePane === pane) {\n const fallback = this.findFirstPaneName(floating.root);\n if (fallback) {\n floating.activePane = fallback;\n }\n else {\n delete floating.activePane;\n }\n }\n if (node.panes.length > 0) {\n return false;\n }\n if (skipCleanup) {\n return true;\n }\n floating.root = this.cleanupEmptyStackInTree(floating.root, node);\n if (!floating.root) {\n this.removeFloatingAt(index);\n }\n return true;\n }\n normalizeSizesArray(sizes, count) {\n if (count <= 0) {\n return [];\n }\n if (!Array.isArray(sizes) || sizes.length !== count) {\n return Array.from({ length: count }, () => 1 / count);\n }\n const normalized = sizes.map((value) => (Number.isFinite(value) ? Math.max(value, 0) : 0));\n const total = normalized.reduce((acc, value) => acc + value, 0);\n if (total <= 0) {\n return Array.from({ length: count }, () => 1 / count);\n }\n return normalized.map((value) => value / total);\n }\n normalizeSplitNode(split) {\n split.sizes = this.normalizeSizesArray(split.sizes, split.children.length);\n }\n dispatchLayoutChanged() {\n this.dispatchEvent(new CustomEvent('dock-layout-changed', {\n detail: this.snapshot,\n bubbles: true,\n composed: true,\n }));\n }\n cloneLayoutNode(layout) {\n if (!layout) {\n return null;\n }\n return JSON.parse(JSON.stringify(layout));\n }\n cloneFloatingArray(layouts) {\n return JSON.parse(JSON.stringify(layouts));\n }\n}\nconst tagName = 'mint-dock-manager';\nif (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, MintDockManagerElement);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludC1kb2NrLW1hbmFnZXIuZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL3dlYi1jb21wb25lbnRzL21pbnQtZG9jay1tYW5hZ2VyLmVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb2VwQixDQUFDO0FBRUYsSUFBSSxjQUFjLEdBQStCLElBQUksQ0FBQztBQUN0RCxJQUFJLHNCQUFzQixHQUFvQixJQUFJLENBQUM7QUFFbkQsU0FBUyxjQUFjLENBQUMsV0FBcUI7SUFDM0MsSUFBSSxDQUFDLGNBQWMsSUFBSSxzQkFBc0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUM5RCxjQUFjLEdBQUcsV0FBVyxDQUFD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O1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNyQixPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBSU8sZUFBZSxDQUFDLE1BQTZCO1FBQ25ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFtQixDQUFDO0lBQzlELENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsT0FBa0M7UUFFbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQThCLENBQUM7SUFDMUUsQ0FBQzs7QUFHSCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQztBQUVwQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMxRSxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7XG4gIERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0LFxuICBEb2NrTGF5b3V0LFxuICBEb2NrTGF5b3V0Tm9kZSxcbiAgRG9ja0xheW91dFNuYXBzaG90LFxuICBEb2NrU3BsaXROb2RlLFxuICBEb2NrU3RhY2tOb2RlLFxufSBmcm9tICcuLi90eXBlcy9kb2NrLWxheW91dCc7XG5cbnR5cGUgRG9ja1BhdGggPVxuICB8IHsgdHlwZTogJ2RvY2tlZCc7IHNlZ21lbnRzOiBudW1iZXJbXSB9XG4gIHwgeyB0eXBlOiAnZmxvYXRpbmcnOyBpbmRleDogbnVtYmVyOyBzZWdtZW50czogbnVtYmVyW10gfTtcblxudHlwZSBEb2NrZWRMb2NhdGlvbiA9IHsgY29udGV4dDogJ2RvY2tlZCc7IHBhdGg6IG51bWJlcltdOyBub2RlOiBEb2NrU3RhY2tOb2RlIH07XG50eXBlIEZsb2F0aW5nTG9jYXRpb24gPSB7XG4gIGNvbnRleHQ6ICdmbG9hdGluZyc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHBhdGg6IG51bWJlcltdO1xuICBub2RlOiBEb2NrU3RhY2tOb2RlO1xufTtcblxudHlwZSBSZXNvbHZlZExvY2F0aW9uID0gRG9ja2VkTG9jYXRpb24gfCBGbG9hdGluZ0xvY2F0aW9uO1xuXG50eXBlIERyb3Bab25lID0gJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJztcblxudHlwZSBGbG9hdGluZ1Jlc2l6ZUVkZ2VzID0ge1xuICBob3Jpem9udGFsOiAnbGVmdCcgfCAncmlnaHQnIHwgJ25vbmUnO1xuICB2ZXJ0aWNhbDogJ3RvcCcgfCAnYm90dG9tJyB8ICdub25lJztcbn07XG5cbmNvbnN0IHRlbXBsYXRlSHRtbCA9IGBcbiAgPHN0eWxlPlxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBjb250YWluOiBsYXlvdXQgcGFpbnQgc2l6ZSBzdHlsZTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgICAgLS1kb2NrLXNwbGl0LWdhcDogMC4yNXJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1yb290LFxuICAgIC5kb2NrLWRvY2tlZCxcbiAgICAuZG9jay1zcGxpdCxcbiAgICAuZG9jay1zcGxpdF9fY2hpbGQsXG4gICAgLmRvY2stc3RhY2ssXG4gICAgLmRvY2stc3RhY2tfX2NvbnRlbnQsXG4gICAgLmRvY2stc3RhY2tfX3BhbmUge1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgfVxuXG4gICAgLmRvY2stcm9vdCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG5cbiAgICAuZG9jay1kb2NrZWQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgei1pbmRleDogMDtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZy1sYXllciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBpbnNldDogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgei1pbmRleDogNTtcbiAgICB9XG5cbiAgICAuZG9jay1pbnRlcnNlY3Rpb25zLWxheWVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB6LWluZGV4OiAxMjA7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmcge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7XG4gICAgICBib3gtc2hhZG93OiAwIDE2cHggMzJweCByZ2JhKDE1LCAyMywgNDIsIDAuMjUpO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIG1pbi13aWR0aDogMTJyZW07XG4gICAgICBtaW4taGVpZ2h0OiA4cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19jaHJvbWUge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIHBhZGRpbmc6IDAuMzVyZW0gMC43NXJlbTtcbiAgICAgIGN1cnNvcjogbW92ZTtcbiAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgdG8gYm90dG9tLFxuICAgICAgICByZ2JhKDE0OCwgMTYzLCAxODQsIDAuNiksXG4gICAgICAgIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4yNSlcbiAgICAgICk7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjUpO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX190aXRsZSB7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHJnYmEoMzAsIDQxLCA1OSwgMC45NSk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nID4gLmRvY2stc3RhY2sge1xuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICBtaW4td2lkdGg6IDEycmVtO1xuICAgICAgbWluLWhlaWdodDogOHJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0OCwgMTYzLCAxODQsIDAuMjUpO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyOmhvdmVyLFxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyW2RhdGEtcmVzaXppbmc9J3RydWUnXSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0OCwgMTYzLCAxODQsIDAuNCk7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tIHtcbiAgICAgIGxlZnQ6IDAuNzVyZW07XG4gICAgICByaWdodDogMC43NXJlbTtcbiAgICAgIGhlaWdodDogMC41cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3Age1xuICAgICAgdG9wOiAwO1xuICAgICAgY3Vyc29yOiBuLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tIHtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGN1cnNvcjogcy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWxlZnQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXJpZ2h0IHtcbiAgICAgIHRvcDogMS43NXJlbTtcbiAgICAgIGJvdHRvbTogMC43NXJlbTtcbiAgICAgIHdpZHRoOiAwLjVyZW07XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWxlZnQge1xuICAgICAgbGVmdDogMDtcbiAgICAgIGN1cnNvcjogdy1yZXNpemU7XG4gICAgfVxuXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXJpZ2h0IHtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgY3Vyc29yOiBlLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLWxlZnQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1yaWdodCxcbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLWxlZnQsXG4gICAgLmRvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1yaWdodCB7XG4gICAgICB3aWR0aDogMC43NXJlbTtcbiAgICAgIGhlaWdodDogMC43NXJlbTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tdG9wLWxlZnQge1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGN1cnNvcjogbnctcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AtcmlnaHQge1xuICAgICAgdG9wOiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBjdXJzb3I6IG5lLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLWxlZnQge1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGN1cnNvcjogc3ctcmVzaXplO1xuICAgIH1cblxuICAgIC5kb2NrLWZsb2F0aW5nX19yZXNpemVyLS1ib3R0b20tcmlnaHQge1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBib3R0b206IDA7XG4gICAgICBjdXJzb3I6IHNlLXJlc2l6ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMSAxIDA7XG4gICAgICBnYXA6IHZhcigtLWRvY2stc3BsaXQtZ2FwKTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cInZlcnRpY2FsXCJdIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJob3Jpem9udGFsXCJdIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRfX2NoaWxkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxIDEgMDtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlciB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBmbGV4OiAwIDAgYXV0bztcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJob3Jpem9udGFsXCJdID4gLmRvY2stc3BsaXRfX2RpdmlkZXIge1xuICAgICAgd2lkdGg6IDAuNXJlbTtcbiAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTtcbiAgICAgIC8qIEV4dGVuZCB0aHJvdWdoIHBlcnBlbmRpY3VsYXIgZ2FwcyBmb3IgdmlzdWFsIGNvbnRpbnVpdHkgKi9cbiAgICAgIG1hcmdpbi10b3A6IGNhbGModmFyKC0tZG9jay1zcGxpdC1nYXApICogLTEpO1xuICAgICAgbWFyZ2luLWJvdHRvbTogY2FsYyh2YXIoLS1kb2NrLXNwbGl0LWdhcCkgKiAtMSk7XG4gICAgfVxuXG4gICAgLmRvY2stc3BsaXRbZGF0YS1kaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiXSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyIHtcbiAgICAgIGhlaWdodDogMC41cmVtO1xuICAgICAgY3Vyc29yOiByb3ctcmVzaXplO1xuICAgICAgLyogRXh0ZW5kIHRocm91Z2ggcGVycGVuZGljdWxhciBnYXBzIGZvciB2aXN1YWwgY29udGludWl0eSAqL1xuICAgICAgbWFyZ2luLWxlZnQ6IGNhbGModmFyKC0tZG9jay1zcGxpdC1nYXApICogLTEpO1xuICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKHZhcigtLWRvY2stc3BsaXQtZ2FwKSAqIC0xKTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdF9fZGl2aWRlcjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0W2RhdGEtZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiXSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyOjphZnRlciB7XG4gICAgICB3aWR0aDogMC4xMjVyZW07XG4gICAgICBoZWlnaHQ6IDYwJTtcbiAgICB9XG5cbiAgICAuZG9jay1zcGxpdFtkYXRhLWRpcmVjdGlvbj1cInZlcnRpY2FsXCJdID4gLmRvY2stc3BsaXRfX2RpdmlkZXI6OmFmdGVyIHtcbiAgICAgIHdpZHRoOiA2MCU7XG4gICAgICBoZWlnaHQ6IDAuMTI1cmVtO1xuICAgIH1cblxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyOmhvdmVyLFxuICAgIC5kb2NrLXNwbGl0X19kaXZpZGVyOmZvY3VzLXZpc2libGUsXG4gICAgLmRvY2stc3BsaXRfX2RpdmlkZXJbZGF0YS1yZXNpemluZz0ndHJ1ZSddIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjM1KTtcbiAgICB9XG5cbiAgICAuZG9jay1pbnRlcnNlY3Rpb24taGFuZGxlIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAxcmVtO1xuICAgICAgaGVpZ2h0OiAxcmVtO1xuICAgICAgbWFyZ2luLWxlZnQ6IC0wLjVyZW07XG4gICAgICBtYXJnaW4tdG9wOiAtMC41cmVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjYpO1xuICAgICAgYm94LXNoYWRvdzogMCAycHggNnB4IHJnYmEoMTUsIDIzLCA0MiwgMC4yKTtcbiAgICAgIGN1cnNvcjogYWxsLXNjcm9sbDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTIwbXMgZWFzZSwgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsIG9wYWNpdHkgMTIwbXMgZWFzZTtcbiAgICB9XG5cbiAgICAuZG9jay1pbnRlcnNlY3Rpb24taGFuZGxlOmhvdmVyLFxuICAgIC5kb2NrLWludGVyc2VjdGlvbi1oYW5kbGU6Zm9jdXMtdmlzaWJsZSxcbiAgICAuZG9jay1pbnRlcnNlY3Rpb24taGFuZGxlW2RhdGEtdmlzaWJsZT0ndHJ1ZSddLFxuICAgIC5kb2NrLWludGVyc2VjdGlvbi1oYW5kbGVbZGF0YS1yZXNpemluZz0ndHJ1ZSddIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjM1KTtcbiAgICAgIGJvcmRlci1jb2xvcjogcmdiYSg1OSwgMTMwLCAyNDYsIDAuOSk7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICB9XG5cbiAgICAuZG9jay1zbmFwLW1hcmtlciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogNnB4O1xuICAgICAgaGVpZ2h0OiA2cHg7XG4gICAgICBtYXJnaW4tbGVmdDogLTNweDtcbiAgICAgIG1hcmdpbi10b3A6IC0zcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC43KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDU5LCAxMzAsIDI0NiwgMC4xNSk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDEzMDtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFjayB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGZsZXg6IDEgMSAwO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7XG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICB9XG5cbiAgICAuZG9jay1zdGFja19faGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBnYXA6IDAuMjVyZW07XG4gICAgICBwYWRkaW5nOiAwLjI1cmVtO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYiB7XG4gICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgcGFkZGluZzogMC4yNXJlbSAwLjVyZW07XG4gICAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgICBjdXJzb3I6IGdyYWI7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDE2MG1zIGVhc2U7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiOmFjdGl2ZSB7XG4gICAgICBjdXJzb3I6IGdyYWJiaW5nO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAgIH1cblxuICAgIC5kb2NrLXRhYjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC44KTtcbiAgICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG4gICAgfVxuXG4gICAgLmRvY2stdGFiLS1hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMTUpO1xuICAgIH1cblxuICAgIC5kb2NrLXN0YWNrX19jb250ZW50IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2tfX3BhbmUge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZmxleDogMSAxIDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmRvY2stc3RhY2tfX3BhbmVbaGlkZGVuXSB7XG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1pbmRpY2F0b3Ige1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC45KTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XG4gICAgICB6LWluZGV4OiAxMDA7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1pbmRpY2F0b3JbZGF0YS12aXNpYmxlPSd0cnVlJ10ge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG5cbiAgICAuZG9jay1kcm9wLWpveXN0aWNrIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCBtaW4tY29udGVudCk7XG4gICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCBtaW4tY29udGVudCk7XG4gICAgICBnYXA6IDAuMTI1cmVtO1xuICAgICAgcGFkZGluZzogMC4xMjVyZW07XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC4xNSk7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMTUsIDIzLCA0MiwgMC4yNSk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgei1pbmRleDogMTEwO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlciB7XG4gICAgICB3aWR0aDogMS43NXJlbTtcbiAgICAgIGhlaWdodDogMS43NXJlbTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbiB7XG4gICAgICB3aWR0aDogMS43NXJlbTtcbiAgICAgIGhlaWdodDogMS43NXJlbTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC40KTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcbiAgICAgIGNvbG9yOiByZ2JhKDMwLCA2NCwgMTc1LCAwLjkpO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsIGNvbG9yIDEyMG1zIGVhc2UsIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbltkYXRhLWFjdGl2ZT0ndHJ1ZSddLFxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbjpob3ZlcixcbiAgICAuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b246Zm9jdXMtdmlzaWJsZSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yNSk7XG4gICAgICBib3JkZXItY29sb3I6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjgpO1xuICAgICAgY29sb3I6IHJnYmEoMzAsIDY0LCAxNzUsIDEpO1xuICAgIH1cblxuICAgIC5kb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDU5LCAxMzAsIDI0NiwgMC45KTtcbiAgICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG4gICAgfVxuXG4gICAgLmRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uW2RhdGEtem9uZT0nY2VudGVyJ10ge1xuICAgICAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xuICAgIH1cblxuICAgIDo6c2xvdHRlZCgqKSB7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxkaXYgY2xhc3M9XCJkb2NrLXJvb3RcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kb2NrZWRcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1mbG9hdGluZy1sYXllclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWludGVyc2VjdGlvbnMtbGF5ZXIgZG9jay1pbnRlcnNlY3Rpb24tbGF5ZXJcIj48L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3AtaW5kaWNhdG9yXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tcIiBkYXRhLXZpc2libGU9XCJmYWxzZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlclwiPjwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLXpvbmU9XCJ0b3BcIlxuICAgICAgYXJpYS1sYWJlbD1cIkRvY2sgdG8gdG9wXCJcbiAgICA+XG4gICAgICDihpFcbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXJcIj48L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwibGVmdFwiXG4gICAgICBhcmlhLWxhYmVsPVwiRG9jayB0byBsZWZ0XCJcbiAgICA+XG4gICAgICDihpBcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwiY2VudGVyXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIGNlbnRlclwiXG4gICAgPlxuICAgICAg4oCiXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvblwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtem9uZT1cInJpZ2h0XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIHJpZ2h0XCJcbiAgICA+XG4gICAgICDihpJcbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXJcIj48L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS16b25lPVwiYm90dG9tXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJEb2NrIHRvIGJvdHRvbVwiXG4gICAgPlxuICAgICAg4oaTXG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyXCI+PC9kaXY+XG4gIDwvZGl2PlxuYDtcblxubGV0IGNhY2hlZFRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5sZXQgY2FjaGVkVGVtcGxhdGVEb2N1bWVudDogRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZW5zdXJlVGVtcGxhdGUoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGlmICghY2FjaGVkVGVtcGxhdGUgfHwgY2FjaGVkVGVtcGxhdGVEb2N1bWVudCAhPT0gZG9jdW1lbnRSZWYpIHtcbiAgICBjYWNoZWRUZW1wbGF0ZSA9IGRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgY2FjaGVkVGVtcGxhdGUuaW5uZXJIVE1MID0gdGVtcGxhdGVIdG1sO1xuICAgIGNhY2hlZFRlbXBsYXRlRG9jdW1lbnQgPSBkb2N1bWVudFJlZjtcbiAgfVxuXG4gIHJldHVybiBjYWNoZWRUZW1wbGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pbnREb2NrTWFuYWdlckVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIGRvY3VtZW50UmVmOiBEb2N1bWVudCB8IG51bGwgPVxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IG51bGw7XG5cbiAgc3RhdGljIGNvbmZpZ3VyZURvY3VtZW50KGRvY3VtZW50UmVmOiBEb2N1bWVudCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWYgPSBkb2N1bWVudFJlZjtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnbGF5b3V0J107XG4gICAgLy8gcmV0dXJuIFsnbGF5b3V0JywgJ2RlYnVnLXNuYXAtbWFya2VycyddO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VDb3VudGVyID0gMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50UmVmOiBEb2N1bWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dSZWY6IChXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcykgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RFbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9ja2VkRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGZsb2F0aW5nTGF5ZXJFbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcEluZGljYXRvcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcEpveXN0aWNrOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wSm95c3RpY2tCdXR0b25zOiBIVE1MQnV0dG9uRWxlbWVudFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBkcm9wSm95c3RpY2tUYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm9vdExheW91dDogRG9ja0xheW91dE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmbG9hdGluZ0xheW91dHM6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0W10gPSBbXTtcbiAgcHJpdmF0ZSB0aXRsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBwZW5kaW5nVGFiRHJhZ01ldHJpY3M6XG4gICAgfCB7XG4gICAgICAgIHBvaW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJPZmZzZXRZOiBudW1iZXI7XG4gICAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgICAgdG9wOiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBzdGFydENsaWVudFg6IG51bWJlcjtcbiAgICAgICAgc3RhcnRDbGllbnRZOiBudW1iZXI7XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNpemVTdGF0ZTpcbiAgICB8IHtcbiAgICAgICAgcGF0aDogRG9ja1BhdGg7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJJZDogbnVtYmVyO1xuICAgICAgICBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgZGl2aWRlcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHN0YXJ0UG9zOiBudW1iZXI7XG4gICAgICAgIGluaXRpYWxTaXplczogbnVtYmVyW107XG4gICAgICAgIGJlZm9yZVNpemU6IG51bWJlcjtcbiAgICAgICAgYWZ0ZXJTaXplOiBudW1iZXI7XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnU3RhdGU6IHtcbiAgICBwYW5lOiBzdHJpbmc7XG4gICAgc291cmNlUGF0aDogRG9ja1BhdGg7XG4gICAgZmxvYXRpbmdJbmRleDogbnVtYmVyIHwgbnVsbDtcbiAgICBwb2ludGVyT2Zmc2V0WDogbnVtYmVyO1xuICAgIHBvaW50ZXJPZmZzZXRZOiBudW1iZXI7XG4gICAgZHJvcEhhbmRsZWQ6IGJvb2xlYW47XG4gICAgLy8gRm9yIHRhYiByZW9yZGVyaW5nIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGZsb2F0aW5nXG4gICAgc291cmNlU3RhY2tFbD86IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBzb3VyY2VIZWFkZXJCb3VuZHM/OiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHJpZ2h0OiBudW1iZXI7IGJvdHRvbTogbnVtYmVyIH0gfCBudWxsO1xuICAgIHN0YXJ0Q2xpZW50WD86IG51bWJlcjtcbiAgICBzdGFydENsaWVudFk/OiBudW1iZXI7XG4gICAgbGl2ZVJlb3JkZXJJbmRleD86IG51bWJlcjtcbiAgICBwbGFjZWhvbGRlckhlYWRlcj86IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBwbGFjZWhvbGRlckVsPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmxvYXRpbmdEcmFnU3RhdGU6XG4gICAgfCB7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIHBvaW50ZXJJZDogbnVtYmVyO1xuICAgICAgICBzdGFydFg6IG51bWJlcjtcbiAgICAgICAgc3RhcnRZOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0TGVmdDogbnVtYmVyO1xuICAgICAgICBzdGFydFRvcDogbnVtYmVyO1xuICAgICAgICB3cmFwcGVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgaGFuZGxlOiBIVE1MRWxlbWVudDtcbiAgICAgICAgZHJvcFRhcmdldD86IHsgcGF0aDogRG9ja1BhdGg7IHpvbmU6IERyb3Bab25lIH07XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmbG9hdGluZ1Jlc2l6ZVN0YXRlOlxuICAgIHwge1xuICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICBwb2ludGVySWQ6IG51bWJlcjtcbiAgICAgICAgc3RhcnRYOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0WTogbnVtYmVyO1xuICAgICAgICBzdGFydFdpZHRoOiBudW1iZXI7XG4gICAgICAgIHN0YXJ0SGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIHN0YXJ0TGVmdDogbnVtYmVyO1xuICAgICAgICBzdGFydFRvcDogbnVtYmVyO1xuICAgICAgICB3cmFwcGVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgaGFuZGxlOiBIVE1MRWxlbWVudDtcbiAgICAgICAgZWRnZXM6IEZsb2F0aW5nUmVzaXplRWRnZXM7XG4gICAgICB9XG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbnRlcnNlY3Rpb25SYWY6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGludGVyc2VjdGlvbkhhbmRsZXM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb3JuZXJSZXNpemVTdGF0ZTpcbiAgICB8IHtcbiAgICAgICAgcG9pbnRlcklkOiBudW1iZXI7XG4gICAgICAgIGhhbmRsZTogSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vIEFsbCBob3Jpem9udGFsIGRpdmlkZXIgYmFycyAoYmVsb25nIHRvIHZlcnRpY2FsIHNwbGl0cylcbiAgICAgICAgaHM6IEFycmF5PHtcbiAgICAgICAgICBwYXRoOiBEb2NrUGF0aDtcbiAgICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgYmVmb3JlU2l6ZTogbnVtYmVyO1xuICAgICAgICAgIGFmdGVyU2l6ZTogbnVtYmVyO1xuICAgICAgICAgIGluaXRpYWxTaXplczogbnVtYmVyW107XG4gICAgICAgICAgc3RhcnRZOiBudW1iZXI7XG4gICAgICAgIH0+O1xuICAgICAgICAvLyBBbGwgdmVydGljYWwgZGl2aWRlciBiYXJzIChiZWxvbmcgdG8gaG9yaXpvbnRhbCBzcGxpdHMpXG4gICAgICAgIHZzOiBBcnJheTx7XG4gICAgICAgICAgcGF0aDogRG9ja1BhdGg7XG4gICAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICAgIGJlZm9yZVNpemU6IG51bWJlcjtcbiAgICAgICAgICBhZnRlclNpemU6IG51bWJlcjtcbiAgICAgICAgICBpbml0aWFsU2l6ZXM6IG51bWJlcltdO1xuICAgICAgICAgIHN0YXJ0WDogbnVtYmVyO1xuICAgICAgICB9PjtcbiAgICAgIH1cbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8vIExvY2FsaXplZCBzbmFwcGluZyB3aGlsZSBkcmFnZ2luZyBhIGRpdmlkZXJcbiAgcHJpdmF0ZSBhY3RpdmVTbmFwQXhpczogJ3gnIHwgJ3knIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aXZlU25hcFRhcmdldHM6IG51bWJlcltdID0gW107XG4gIC8vIExvY2FsaXplZCBzbmFwcGluZyB3aGlsZSBkcmFnZ2luZyBhbiBpbnRlcnNlY3Rpb24gaGFuZGxlXG4gIHByaXZhdGUgY29ybmVyU25hcFhUYXJnZXRzOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIGNvcm5lclNuYXBZVGFyZ2V0czogbnVtYmVyW10gPSBbXTtcbiAgLy8gRGVidWc6IHJlbmRlciBzbmFwIG1hcmtlcnMgd2hpbGUgZHJhZ2dpbmdcbiAgcHJpdmF0ZSBzaG93U25hcE1hcmtlcnMgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZW5kZXJTbmFwTWFya2Vyc0ZvckRpdmlkZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dTbmFwTWFya2VycykgcmV0dXJuO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2staW50ZXJzZWN0aW9ucy1sYXllciwgLmRvY2staW50ZXJzZWN0aW9uLWxheWVyJyk7XG4gICAgaWYgKCFsYXllcikgcmV0dXJuO1xuICAgIC8vIENsZWFyIHByZXZpb3VzXG4gICAgQXJyYXkuZnJvbShsYXllci5xdWVyeVNlbGVjdG9yQWxsKCcuZG9jay1zbmFwLW1hcmtlcicpKS5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgIGlmICghdGhpcy5yZXNpemVTdGF0ZSB8fCAhdGhpcy5hY3RpdmVTbmFwQXhpcyB8fCB0aGlzLmFjdGl2ZVNuYXBUYXJnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5yb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZFJlY3QgPSB0aGlzLnJlc2l6ZVN0YXRlLmRpdmlkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlU25hcEF4aXMgPT09ICd4Jykge1xuICAgICAgY29uc3QgeSA9IGRSZWN0LnRvcCArIGRSZWN0LmhlaWdodCAvIDIgLSByb290UmVjdC50b3A7XG4gICAgICB0aGlzLmFjdGl2ZVNuYXBUYXJnZXRzLmZvckVhY2goKHN4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvdCA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG9jay1zbmFwLW1hcmtlcic7XG4gICAgICAgIGRvdC5zdHlsZS5sZWZ0ID0gYCR7cm9vdFJlY3QubGVmdCArIHN4IC0gcm9vdFJlY3QubGVmdH1weGA7XG4gICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHt5fXB4YDtcbiAgICAgICAgbGF5ZXIuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVTbmFwQXhpcyA9PT0gJ3knKSB7XG4gICAgICBjb25zdCB4ID0gZFJlY3QubGVmdCArIGRSZWN0LndpZHRoIC8gMiAtIHJvb3RSZWN0LmxlZnQ7XG4gICAgICB0aGlzLmFjdGl2ZVNuYXBUYXJnZXRzLmZvckVhY2goKHN5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvdCA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG9jay1zbmFwLW1hcmtlcic7XG4gICAgICAgIGRvdC5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7XG4gICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHtyb290UmVjdC50b3AgKyBzeSAtIHJvb3RSZWN0LnRvcH1weGA7XG4gICAgICAgIGxheWVyLmFwcGVuZENoaWxkKGRvdCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclNuYXBNYXJrZXJzRm9yQ29ybmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93U25hcE1hcmtlcnMpIHJldHVybjtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLWludGVyc2VjdGlvbnMtbGF5ZXIsIC5kb2NrLWludGVyc2VjdGlvbi1sYXllcicpO1xuICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICBBcnJheS5mcm9tKGxheWVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kb2NrLXNuYXAtbWFya2VyJykpLmZvckVhY2goKGVsKSA9PiBlbC5yZW1vdmUoKSk7XG4gICAgaWYgKCF0aGlzLmNvcm5lclJlc2l6ZVN0YXRlKSByZXR1cm47XG4gICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLnJvb3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyBDb21wdXRlIHJlcHJlc2VudGF0aXZlIGNlbnRlciBsaW5lcyBmcm9tIGZpcnN0IGVudHJpZXNcbiAgICBsZXQgY2VudGVyWDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNlbnRlclk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHN0ID0gdGhpcy5jb3JuZXJSZXNpemVTdGF0ZTtcbiAgICBpZiAoc3QudnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdlJlY3QgPSBzdC52c1swXS5jb250YWluZXIucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJzpzY29wZSA+IC5kb2NrLXNwbGl0X19kaXZpZGVyJyk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHZSZWN0KSBjZW50ZXJYID0gdlJlY3QubGVmdCArIHZSZWN0LndpZHRoIC8gMiAtIHJvb3RSZWN0LmxlZnQ7XG4gICAgfVxuICAgIGlmIChzdC5ocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoUmVjdCA9IHN0LmhzWzBdLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2RpdmlkZXInKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoaFJlY3QpIGNlbnRlclkgPSBoUmVjdC50b3AgKyBoUmVjdC5oZWlnaHQgLyAyIC0gcm9vdFJlY3QudG9wO1xuICAgIH1cbiAgICBpZiAoY2VudGVyWSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmNvcm5lclNuYXBYVGFyZ2V0cy5mb3JFYWNoKChzeCkgPT4ge1xuICAgICAgICBjb25zdCBkb3QgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ2RvY2stc25hcC1tYXJrZXInO1xuICAgICAgICBkb3Quc3R5bGUubGVmdCA9IGAke3N4fXB4YDtcbiAgICAgICAgZG90LnN0eWxlLnRvcCA9IGAke2NlbnRlcll9cHhgO1xuICAgICAgICBsYXllci5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjZW50ZXJYICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29ybmVyU25hcFlUYXJnZXRzLmZvckVhY2goKHN5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvdCA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG9jay1zbmFwLW1hcmtlcic7XG4gICAgICAgIGRvdC5zdHlsZS5sZWZ0ID0gYCR7Y2VudGVyWH1weGA7XG4gICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHtzeX1weGA7XG4gICAgICAgIGxheWVyLmFwcGVuZENoaWxkKGRvdCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU25hcE1hcmtlcnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dTbmFwTWFya2VycykgcmV0dXJuO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2staW50ZXJzZWN0aW9ucy1sYXllciwgLmRvY2staW50ZXJzZWN0aW9uLWxheWVyJyk7XG4gICAgaWYgKCFsYXllcikgcmV0dXJuO1xuICAgIEFycmF5LmZyb20obGF5ZXIucXVlcnlTZWxlY3RvckFsbCgnLmRvY2stc25hcC1tYXJrZXInKSkuZm9yRWFjaCgoZWwpID0+IGVsLnJlbW92ZSgpKTtcbiAgfVxuICBwcml2YXRlIHBlbmRpbmdEcmFnRW5kVGltZW91dDogbnVtYmVyIHwgTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1NwbGl0U2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcltdPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IGRvY3VtZW50UmVmID0gdGhpcy5yZXNvbHZlRG9jdW1lbnQoKTtcbiAgICB0aGlzLmRvY3VtZW50UmVmID0gZG9jdW1lbnRSZWY7XG4gICAgdGhpcy53aW5kb3dSZWYgPSB0aGlzLnJlc29sdmVXaW5kb3coZG9jdW1lbnRSZWYpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGVuc3VyZVRlbXBsYXRlKGRvY3VtZW50UmVmKTtcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICBjb25zdCByb290ID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stcm9vdCcpO1xuICAgIGlmICghcm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSByb290IGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9ja2VkID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stZG9ja2VkJyk7XG4gICAgaWYgKCFkb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgZG9ja2VkIHN1cmZhY2UgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmbG9hdGluZ0xheWVyID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICcuZG9jay1mbG9hdGluZy1sYXllcicsXG4gICAgKTtcbiAgICBpZiAoIWZsb2F0aW5nTGF5ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyB0aGUgZmxvYXRpbmcgbGF5ZXIgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRpY2F0b3IgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1kcm9wLWluZGljYXRvcicpO1xuICAgIGlmICghaW5kaWNhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHRlbXBsYXRlIGlzIG1pc3NpbmcgdGhlIGRyb3AgaW5kaWNhdG9yIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgam95c3RpY2sgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1kcm9wLWpveXN0aWNrJyk7XG4gICAgaWYgKCFqb3lzdGljaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW50LWRvY2stbWFuYWdlciB0ZW1wbGF0ZSBpcyBtaXNzaW5nIHRoZSBkcm9wIGpveXN0aWNrIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgam95c3RpY2tCdXR0b25zID0gQXJyYXkuZnJvbShcbiAgICAgIGpveXN0aWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuZG9jay1kcm9wLWpveXN0aWNrX19idXR0b25bZGF0YS16b25lXScpLFxuICAgICk7XG4gICAgaWYgKGpveXN0aWNrQnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWludC1kb2NrLW1hbmFnZXIgdGVtcGxhdGUgaXMgbWlzc2luZyBkcm9wIGpveXN0aWNrIGJ1dHRvbnMuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5yb290RWwgPSByb290O1xuICAgIHRoaXMuZG9ja2VkRWwgPSBkb2NrZWQ7XG4gICAgdGhpcy5mbG9hdGluZ0xheWVyRWwgPSBmbG9hdGluZ0xheWVyO1xuICAgIHRoaXMuZHJvcEluZGljYXRvciA9IGluZGljYXRvcjtcbiAgICB0aGlzLmRyb3BKb3lzdGljayA9IGpveXN0aWNrO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucyA9IGpveXN0aWNrQnV0dG9ucztcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBgbWludC1kb2NrLSR7KytNaW50RG9ja01hbmFnZXJFbGVtZW50Lmluc3RhbmNlQ291bnRlcn1gO1xuICAgIHRoaXMub25Qb2ludGVyTW92ZSA9IHRoaXMub25Qb2ludGVyTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25Qb2ludGVyVXAgPSB0aGlzLm9uUG9pbnRlclVwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdPdmVyID0gdGhpcy5vbkRyYWdPdmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkdsb2JhbERyYWdPdmVyID0gdGhpcy5vbkdsb2JhbERyYWdPdmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkdsb2JhbERyYWdFbmQgPSB0aGlzLm9uR2xvYmFsRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25Ecm9wID0gdGhpcy5vbkRyb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ0xlYXZlID0gdGhpcy5vbkRyYWdMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnID0gdGhpcy5vbkRyYWcuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ01vdXNlTW92ZSA9IHRoaXMub25EcmFnTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdUb3VjaE1vdmUgPSB0aGlzLm9uRHJhZ1RvdWNoTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnTW91c2VVcCA9IHRoaXMub25EcmFnTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnVG91Y2hFbmQgPSB0aGlzLm9uRHJhZ1RvdWNoRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbldpbmRvd1Jlc2l6ZSA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYXBwbGljYXRpb24nKTtcbiAgICB9XG4gICAgLy8gVGFnIHRoZSBkb2NrZWQgc3VyZmFjZSB3aXRoIGEgcm9vdCBwYXRoIHNvIGl0IGNhbiBhY3QgYXNcbiAgICAvLyBhIGRyb3AgdGFyZ2V0IHdoZW4gdGhlIG1haW4gbGF5b3V0IGlzIGVtcHR5LlxuICAgIHRoaXMuZG9ja2VkRWwuZGF0YXNldFsncGF0aCddID0gdGhpcy5mb3JtYXRQYXRoKHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbXSB9KTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHRoaXMucm9vdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLnJvb3RFbC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMucm9vdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIC8vIFN0cmVuZ3RoZW4gem9uZSB0cmFja2luZyBieSByZWFjdGluZyB0byBkcmFnZW50ZXIvZHJhZ292ZXIgZGlyZWN0bHkgb24gdGhlIGJ1dHRvbnMuXG4gICAgLy8gVGhpcyBhdm9pZHMgcmVseWluZyBzb2xlbHkgb24gaGl0LXRlc3RpbmcgZWFjaCBmcmFtZSB3aGljaCBjYW4gYmUgaml0dGVyeSBkdXJpbmcgSFRNTDUgZHJhZy5cbiAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHogPSBidG4uZGF0YXNldFsnem9uZSddO1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bab25lKHopKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHopO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBoYW5kbGVyKTtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGhhbmRsZXIpO1xuICAgIH0pO1xuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uR2xvYmFsRHJhZ092ZXIpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMub25EcmFnKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLm9uR2xvYmFsRHJhZ0VuZCwgdHJ1ZSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uV2luZG93UmVzaXplKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMucm9vdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLnJvb3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMucm9vdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgICB0aGlzLmRyb3BKb3lzdGljay5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRyb3ApO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMub25EcmFnTGVhdmUpO1xuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLm9uR2xvYmFsRHJhZ092ZXIpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMub25EcmFnKTtcbiAgICB3aW4/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLm9uR2xvYmFsRHJhZ0VuZCwgdHJ1ZSk7XG4gICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICBjb25zdCB3aW4yID0gdGhpcy53aW5kb3dSZWY7XG4gICAgd2luMj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vbldpbmRvd1Jlc2l6ZSk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZTogc3RyaW5nLCBfb2xkVmFsdWU6IHN0cmluZyB8IG51bGwsIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKG5hbWUgPT09ICdsYXlvdXQnKSB7XG4gICAgICB0aGlzLmxheW91dCA9IG5ld1ZhbHVlID8gdGhpcy5wYXJzZUxheW91dChuZXdWYWx1ZSkgOiBudWxsO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2RlYnVnLXNuYXAtbWFya2VycycpIHtcbiAgICAgIHRoaXMuc2hvd1NuYXBNYXJrZXJzID0gIShuZXdWYWx1ZSA9PT0gbnVsbCB8fCBuZXdWYWx1ZSA9PT0gJ2ZhbHNlJyB8fCBuZXdWYWx1ZSA9PT0gJzAnKTtcbiAgICAgIGlmICghdGhpcy5zaG93U25hcE1hcmtlcnMpIHtcbiAgICAgICAgdGhpcy5jbGVhclNuYXBNYXJrZXJzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxheW91dCgpOiBEb2NrTGF5b3V0U25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICByb290OiB0aGlzLmNsb25lTGF5b3V0Tm9kZSh0aGlzLnJvb3RMYXlvdXQpLFxuICAgICAgZmxvYXRpbmc6IHRoaXMuY2xvbmVGbG9hdGluZ0FycmF5KHRoaXMuZmxvYXRpbmdMYXlvdXRzKSxcbiAgICAgIHRpdGxlczogeyAuLi50aGlzLnRpdGxlcyB9LFxuICAgIH07XG4gIH1cblxuICBzZXQgbGF5b3V0KHZhbHVlOiBEb2NrTGF5b3V0U25hcHNob3QgfCBEb2NrTGF5b3V0IHwgRG9ja0xheW91dE5vZGUgfCBudWxsKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmVuc3VyZVNuYXBzaG90KHZhbHVlKTtcbiAgICB0aGlzLnJvb3RMYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0Tm9kZShzbmFwc2hvdC5yb290KTtcbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cyA9IHRoaXMuY2xvbmVGbG9hdGluZ0FycmF5KHNuYXBzaG90LmZsb2F0aW5nKTtcbiAgICB0aGlzLnRpdGxlcyA9IHNuYXBzaG90LnRpdGxlcyA/IHsgLi4uc25hcHNob3QudGl0bGVzIH0gOiB7fTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgZ2V0IHNuYXBzaG90KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0O1xuICB9XG5cbiAgdG9KU09OKCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHRoaXMuc25hcHNob3Q7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVEb2N1bWVudCgpOiBEb2N1bWVudCB7XG4gICAgY29uc3Qgc3RhdGljRG9jdW1lbnQgPSBNaW50RG9ja01hbmFnZXJFbGVtZW50LmRvY3VtZW50UmVmO1xuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQgPz8gbnVsbDtcbiAgICBjb25zdCBnbG9iYWxEb2N1bWVudCA9XG4gICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiBudWxsO1xuICAgIGNvbnN0IHJlc29sdmVkRG9jdW1lbnQgPSBzdGF0aWNEb2N1bWVudCA/PyBvd25lckRvY3VtZW50ID8/IGdsb2JhbERvY3VtZW50O1xuXG4gICAgaWYgKCFyZXNvbHZlZERvY3VtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbnQtZG9jay1tYW5hZ2VyIHJlcXVpcmVzIGEgRG9jdW1lbnQgdG8gaW5pdGlhbGl6ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIU1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuZG9jdW1lbnRSZWYgPSByZXNvbHZlZERvY3VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZERvY3VtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlV2luZG93KFxuICAgIGRvY3VtZW50UmVmOiBEb2N1bWVudCxcbiAgKTogKFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzKSB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG5cbiAgICByZXR1cm4gKGRvY3VtZW50UmVmLmRlZmF1bHRWaWV3IGFzIChXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcykgfCBudWxsKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxheW91dCh2YWx1ZTogc3RyaW5nKTogRG9ja0xheW91dFNuYXBzaG90IHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsdWUpIGFzXG4gICAgICAgIHwgRG9ja0xheW91dFNuYXBzaG90XG4gICAgICAgIHwgRG9ja0xheW91dFxuICAgICAgICB8IERvY2tMYXlvdXROb2RlXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLmVuc3VyZVNuYXBzaG90KHBhcnNlZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ21pbnQtZG9jay1tYW5hZ2VyOiBmYWlsZWQgdG8gcGFyc2UgbGF5b3V0IGF0dHJpYnV0ZScsIGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVNuYXBzaG90KFxuICAgIHZhbHVlOiBEb2NrTGF5b3V0U25hcHNob3QgfCBEb2NrTGF5b3V0IHwgRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICApOiBEb2NrTGF5b3V0U25hcHNob3Qge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IHJvb3Q6IG51bGwsIGZsb2F0aW5nOiBbXSwgdGl0bGVzOiB7fSB9O1xuICAgIH1cblxuICAgIGlmICgodmFsdWUgYXMgRG9ja0xheW91dE5vZGUpLmtpbmQpIHtcbiAgICAgIHJldHVybiB7IHJvb3Q6IHZhbHVlIGFzIERvY2tMYXlvdXROb2RlLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXlvdXQgPSB2YWx1ZSBhcyBEb2NrTGF5b3V0IHwgRG9ja0xheW91dFNuYXBzaG90O1xuICAgIHJldHVybiB7XG4gICAgICByb290OiBsYXlvdXQucm9vdCA/PyBudWxsLFxuICAgICAgZmxvYXRpbmc6IEFycmF5LmlzQXJyYXkobGF5b3V0LmZsb2F0aW5nKVxuICAgICAgICA/IGxheW91dC5mbG9hdGluZy5tYXAoKGZsb2F0aW5nKSA9PiB0aGlzLm5vcm1hbGl6ZUZsb2F0aW5nTGF5b3V0KGZsb2F0aW5nKSlcbiAgICAgICAgOiBbXSxcbiAgICAgIHRpdGxlczogbGF5b3V0LnRpdGxlcyA/IHsgLi4ubGF5b3V0LnRpdGxlcyB9IDoge30sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuZG9ja2VkRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5mbG9hdGluZ0xheWVyRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuXG4gICAgaWYgKHRoaXMucm9vdExheW91dCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLnJlbmRlck5vZGUodGhpcy5yb290TGF5b3V0LCBbXSk7XG4gICAgICB0aGlzLmRvY2tlZEVsLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlckZsb2F0aW5nUGFuZXMoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVuZGVySW50ZXJzZWN0aW9uSGFuZGxlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJOb2RlKFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIGZsb2F0aW5nSW5kZXg/OiBudW1iZXIsXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAobm9kZS5raW5kID09PSAnc3BsaXQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJTcGxpdChub2RlLCBwYXRoLCBmbG9hdGluZ0luZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJTdGFjayhub2RlLCBwYXRoLCBmbG9hdGluZ0luZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRmxvYXRpbmdQYW5lcygpOiB2b2lkIHtcbiAgICB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cy5mb3JFYWNoKChmbG9hdGluZywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nJyk7XG4gICAgICB3cmFwcGVyLmRhdGFzZXRbJ3BhdGgnXSA9IHRoaXMuZm9ybWF0UGF0aCh7XG4gICAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBzZWdtZW50czogW10sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGZsb2F0aW5nLmJvdW5kcztcbiAgICAgIHdyYXBwZXIuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgd3JhcHBlci5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcblxuICAgICAgY29uc3QgekluZGV4ID0gdGhpcy5nZXRGbG9hdGluZ1BhbmVaSW5kZXgoaW5kZXgpO1xuICAgICAgd3JhcHBlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoekluZGV4KTtcblxuICAgICAgY29uc3QgY2hyb21lID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNocm9tZS5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nX19jaHJvbWUnKTtcbiAgICAgIGNocm9tZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldmVudCkgPT5cbiAgICAgICAgdGhpcy5iZWdpbkZsb2F0aW5nRHJhZyhldmVudCwgaW5kZXgsIHdyYXBwZXIsIGNocm9tZSksXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKCdkb2NrLWZsb2F0aW5nX190aXRsZScpO1xuICAgICAgdGl0bGUudGV4dENvbnRlbnQgPSB0aGlzLmdldEZsb2F0aW5nV2luZG93VGl0bGUoZmxvYXRpbmcpO1xuICAgICAgY2hyb21lLmFwcGVuZENoaWxkKHRpdGxlKTtcblxuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChjaHJvbWUpO1xuXG4gICAgICBpZiAoZmxvYXRpbmcucm9vdCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJOb2RlKGZsb2F0aW5nLnJvb3QsIFtdLCBpbmRleCk7XG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnZG9jay1mbG9hdGluZ19fc3RhY2snKTtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFjaycpO1xuICAgICAgICBwbGFjZWhvbGRlci5kYXRhc2V0WydwYXRoJ10gPSB0aGlzLmZvcm1hdFBhdGgoe1xuICAgICAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgc2VnbWVudHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW1wdHkgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbXB0eS5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19wYW5lJyk7XG4gICAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gJ05vIHBhbmVzIGNvbmZpZ3VyZWQnO1xuICAgICAgICBwbGFjZWhvbGRlci5hcHBlbmRDaGlsZChlbXB0eSk7XG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNpemVyQ29uZmlnczogeyBjbGFzc2VzOiBzdHJpbmdbXTsgZWRnZXM6IEZsb2F0aW5nUmVzaXplRWRnZXMgfVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1sZWZ0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ3RvcCcgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6IFsnZG9jay1mbG9hdGluZ19fcmVzaXplcicsICdkb2NrLWZsb2F0aW5nX19yZXNpemVyLS10b3AnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbm9uZScsIHZlcnRpY2FsOiAndG9wJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXRvcC1yaWdodCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAndG9wJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLXJpZ2h0J10sXG4gICAgICAgICAgZWRnZXM6IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdub25lJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbS1yaWdodCddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnYm90dG9tJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWJvdHRvbSddLFxuICAgICAgICAgIGVkZ2VzOiB7IGhvcml6b250YWw6ICdub25lJywgdmVydGljYWw6ICdib3R0b20nIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiBbJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXInLCAnZG9jay1mbG9hdGluZ19fcmVzaXplci0tYm90dG9tLWxlZnQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnYm90dG9tJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogWydkb2NrLWZsb2F0aW5nX19yZXNpemVyJywgJ2RvY2stZmxvYXRpbmdfX3Jlc2l6ZXItLWxlZnQnXSxcbiAgICAgICAgICBlZGdlczogeyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbm9uZScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlc2l6ZXJDb25maWdzLmZvckVhY2goKHsgY2xhc3NlcywgZWRnZXMgfSkgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVyID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVzaXplci5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xuICAgICAgICByZXNpemVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PlxuICAgICAgICAgIHRoaXMuYmVnaW5GbG9hdGluZ1Jlc2l6ZShldmVudCwgaW5kZXgsIHdyYXBwZXIsIHJlc2l6ZXIsIGVkZ2VzKSxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChyZXNpemVyKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZmxvYXRpbmdMYXllckVsLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICAvLyBSZWNvbXB1dGUgaW50ZXJzZWN0aW9uIGhhbmRsZXMgb24gd2luZG93IHJlc2l6ZVxuICAgIHRoaXMuc2NoZWR1bGVSZW5kZXJJbnRlcnNlY3Rpb25IYW5kbGVzKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVuZGVySW50ZXJzZWN0aW9uSGFuZGxlcygpOiB2b2lkIHtcbiAgICB0aGlzLmludGVyc2VjdGlvblJhZiA9IG51bGw7XG4gICAgdGhpcy5yZW5kZXJJbnRlcnNlY3Rpb25IYW5kbGVzKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckludGVyc2VjdGlvbkhhbmRsZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1pbnRlcnNlY3Rpb25zLWxheWVyLCAuZG9jay1pbnRlcnNlY3Rpb24tbGF5ZXInKTtcbiAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgLy8gS2VlcCBleGlzdGluZyBoYW5kbGVzOyB3ZSB3aWxsIGRpZmYgYW5kIHVwZGF0ZSBwb3NpdGlvbnNcbiAgICAvLyAxKSBDbGVhbiB1cCBsZWdhY3kgaGFuZGxlcyAoY3JlYXRlZCBiZWZvcmUga2V5aW5nKSB0aGF0IGxhY2sgYSBkYXRhLWtleVxuICAgIEFycmF5LmZyb20obGF5ZXIucXVlcnlTZWxlY3RvckFsbCgnLmRvY2staW50ZXJzZWN0aW9uLWhhbmRsZScpKVxuICAgICAgLmZpbHRlcigoZWwpID0+ICEoZWwgYXMgSFRNTEVsZW1lbnQpLmRhdGFzZXRbJ2tleSddKVxuICAgICAgLmZvckVhY2goKGVsKSA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAvLyAyKSBSZWJ1aWxkIHRoZSBpbnRlcm5hbCBtYXAgZnJvbSBET00gdG8gYXZvaWQgZHJpZnRpbmcgc3RhdGUgYW5kIGRlZHVwZSBkdXBsaWNhdGVzXG4gICAgY29uc3QgZG9tQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgSFRNTEVsZW1lbnQ+KCk7XG4gICAgQXJyYXkuZnJvbShsYXllci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2staW50ZXJzZWN0aW9uLWhhbmRsZVtkYXRhLWtleV0nKSkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGVsLmRhdGFzZXRbJ2tleSddID8/ICcnO1xuICAgICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICAgIGlmIChkb21CeUtleS5oYXMoa2V5KSkge1xuICAgICAgICAvLyBSZW1vdmUgZHVwbGljYXRlcyB3aXRoIHRoZSBzYW1lIGtleSwga2VlcCB0aGUgZmlyc3Qgb25lXG4gICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkb21CeUtleS5zZXQoa2V5LCBlbCk7XG4gICAgICAvLyBFbnN1cmUgbGlzdGVuZXIgaXMgYXR0YWNoZWQgb25seSBvbmNlXG4gICAgICBpZiAoIWVsLmRhdGFzZXRbJ2xpc3RlbmVyJ10pIHtcbiAgICAgICAgZWwuZGF0YXNldFsnbGlzdGVuZXInXSA9ICcxJztcbiAgICAgICAgLy8gTGlzdGVuZXIgd2lsbCBiZSAocmUpYXNzaWduZWQgbGF0ZXIgd2hlbiB3ZSBrbm93IHRoZSBjdXJyZW50IGgvdiBwYWlyXG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gU3luYyBpbnRlcm5hbCBtYXAgd2l0aCBET01cbiAgICB0aGlzLmludGVyc2VjdGlvbkhhbmRsZXMgPSBkb21CeUtleTtcblxuICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5yb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBJZiBhIGNvcm5lciByZXNpemUgaXMgYWN0aXZlLCBvbmx5IHVwZGF0ZSB0aGF0IGhhbmRsZSdzIHBvc2l0aW9uIGFuZCBhdm9pZCBjcmVhdGluZyBuZXcgb25lc1xuICAgIGlmICh0aGlzLmNvcm5lclJlc2l6ZVN0YXRlKSB7XG4gICAgICBjb25zdCBzdCA9IHRoaXMuY29ybmVyUmVzaXplU3RhdGU7XG4gICAgICBjb25zdCBoMCA9IHN0LmhzWzBdO1xuICAgICAgY29uc3QgdjAgPSBzdC52c1swXTtcbiAgICAgIGNvbnN0IGhQYXRoU3RyID0gdGhpcy5mb3JtYXRQYXRoKGgwLnBhdGgpO1xuICAgICAgY29uc3QgdlBhdGhTdHIgPSB0aGlzLmZvcm1hdFBhdGgodjAucGF0aCk7XG4gICAgICBjb25zdCBrZXkgPSBgJHtoUGF0aFN0cn06JHtoMC5pbmRleH18JHt2UGF0aFN0cn06JHt2MC5pbmRleH1gO1xuICAgICAgLy8gRmluZCBkaXZpZGVyIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gYWN0aXZlIHBhdGhzXG4gICAgICBjb25zdCBoRGl2ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgYC5kb2NrLXNwbGl0X19kaXZpZGVyW2RhdGEtcGF0aD1cIiR7aFBhdGhTdHJ9XCJdW2RhdGEtaW5kZXg9XCIke2gwLmluZGV4fVwiXWAsXG4gICAgICApO1xuICAgICAgY29uc3QgdkRpdiA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICAgIGAuZG9jay1zcGxpdF9fZGl2aWRlcltkYXRhLXBhdGg9XCIke3ZQYXRoU3RyfVwiXVtkYXRhLWluZGV4PVwiJHt2MC5pbmRleH1cIl1gLFxuICAgICAgKTtcbiAgICAgIGlmIChoRGl2ICYmIHZEaXYpIHtcbiAgICAgICAgY29uc3QgaHIgPSBoRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB2ciA9IHZEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHggPSB2ci5sZWZ0ICsgdnIud2lkdGggLyAyIC0gcm9vdFJlY3QubGVmdDtcbiAgICAgICAgY29uc3QgeSA9IGhyLnRvcCArIGhyLmhlaWdodCAvIDIgLSByb290UmVjdC50b3A7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IHN0LmhhbmRsZTtcbiAgICAgICAgaWYgKCFoYW5kbGUuZGF0YXNldFsna2V5J10pIHtcbiAgICAgICAgICBoYW5kbGUuZGF0YXNldFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25IYW5kbGVzLnNldChrZXksIGhhbmRsZSk7XG4gICAgICAgIGhhbmRsZS5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7XG4gICAgICAgIGhhbmRsZS5zdHlsZS50b3AgPSBgJHt5fXB4YDtcbiAgICAgICAgLy8gUmVtb3ZlIGFueSBvdGhlciBoYW5kbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGFjdGl2ZSBrZXlcbiAgICAgICAgQXJyYXkuZnJvbShsYXllci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2staW50ZXJzZWN0aW9uLWhhbmRsZScpKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgIGlmICgoZWwuZGF0YXNldFsna2V5J10gPz8gJycpICE9PSBrZXkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBpbnRlcm5hbCBtYXAgYXMgd2VsbFxuICAgICAgICB0aGlzLmludGVyc2VjdGlvbkhhbmRsZXMgPSBuZXcgTWFwKFtba2V5LCBoYW5kbGVdXSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFsbERpdmlkZXJzID0gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXNwbGl0X19kaXZpZGVyJykgPz8gW10sXG4gICAgKTtcblxuICAgIGNvbnN0IGhEaXZpZGVyczoge1xuICAgICAgZWw6IEhUTUxFbGVtZW50O1xuICAgICAgcmVjdDogRE9NUmVjdDtcbiAgICAgIHBhdGg6IERvY2tQYXRoIHwgbnVsbDtcbiAgICAgIHBhdGhTdHI/OiBzdHJpbmc7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICB9W10gPSBbXTtcbiAgICBjb25zdCB2RGl2aWRlcnM6IHtcbiAgICAgIGVsOiBIVE1MRWxlbWVudDtcbiAgICAgIHJlY3Q6IERPTVJlY3Q7XG4gICAgICBwYXRoOiBEb2NrUGF0aCB8IG51bGw7XG4gICAgICBwYXRoU3RyPzogc3RyaW5nO1xuICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgfVtdID0gW107XG5cbiAgICBhbGxEaXZpZGVycy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSAoZWwuZGF0YXNldFsnb3JpZW50YXRpb24nXSBhcyAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnIHwgdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBlbC5jbG9zZXN0KCcuZG9jay1zcGxpdCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChlbC5kYXRhc2V0WydwYXRoJ10pO1xuICAgICAgY29uc3QgcGF0aFN0ciA9IGVsLmRhdGFzZXRbJ3BhdGgnXSA/PyAnJztcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGVsLmRhdGFzZXRbJ2luZGV4J10gPz8gJycsIDEwKTtcbiAgICAgIGlmICghY29udGFpbmVyIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpKSByZXR1cm47XG4gICAgICBjb25zdCBpbmZvID0geyBlbCwgcmVjdCwgcGF0aCwgcGF0aFN0ciwgaW5kZXgsIGNvbnRhaW5lciB9O1xuICAgICAgLy8gTm90ZTogbm9kZS5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyBtZWFucyB0aGUgc3BsaXQgbGF5cyBvdXQgY2hpbGRyZW4gbGVmdC10by1yaWdodCxcbiAgICAgIC8vIHdoaWNoIHlpZWxkcyBhIFZFUlRJQ0FMIGRpdmlkZXIgYmFyLiBTbyBtYXBwaW5nIGlzIGludmVydGVkIGhlcmUuXG4gICAgICBpZiAob3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICB2RGl2aWRlcnMucHVzaChpbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgaERpdmlkZXJzLnB1c2goaW5mbyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBkZXNpcmVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgdG9sID0gMjQ7IC8vIHB4IHRvbGVyYW5jZSB0byBhY2NvdW50IGZvciBnYXBzIGFuZCBzdWJwaXhlbCBsYXlvdXRcbiAgICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBncm91cFBhaXJzID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PHsgaDogeyBwYXRoU3RyOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfTsgdjogeyBwYXRoU3RyOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfSB9Pj4oKTtcbiAgICBoRGl2aWRlcnMuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgY29uc3QgaENlbnRlclkgPSBoLnJlY3QudG9wICsgaC5yZWN0LmhlaWdodCAvIDI7XG4gICAgICB2RGl2aWRlcnMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICBjb25zdCB2Q2VudGVyWCA9IHYucmVjdC5sZWZ0ICsgdi5yZWN0LndpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgZHggPSB2Q2VudGVyWCA8IGgucmVjdC5sZWZ0ID8gaC5yZWN0LmxlZnQgLSB2Q2VudGVyWCA6IHZDZW50ZXJYID4gaC5yZWN0LnJpZ2h0ID8gdkNlbnRlclggLSBoLnJlY3QucmlnaHQgOiAwO1xuICAgICAgICBjb25zdCBkeSA9IGhDZW50ZXJZIDwgdi5yZWN0LnRvcCA/IHYucmVjdC50b3AgLSBoQ2VudGVyWSA6IGhDZW50ZXJZID4gdi5yZWN0LmJvdHRvbSA/IGhDZW50ZXJZIC0gdi5yZWN0LmJvdHRvbSA6IDA7XG4gICAgICAgIGlmIChkeCA+IHRvbCB8fCBkeSA+IHRvbCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHggPSB2Q2VudGVyWCAtIHJvb3RSZWN0LmxlZnQ7XG4gICAgICAgIGNvbnN0IHkgPSBoQ2VudGVyWSAtIHJvb3RSZWN0LnRvcDtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7aC5wYXRoU3RyfToke2guaW5kZXh9fCR7di5wYXRoU3RyfToke3YuaW5kZXh9YDtcbiAgICAgICAgY29uc3QgZ2sgPSBgJHtNYXRoLnJvdW5kKHgpfToke01hdGgucm91bmQoeSl9YDtcbiAgICAgICAgbGV0IGhhbmRsZSA9IGdyb3VwTWFwLmdldChnayk7XG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgLy8gVHJ5IHJldXNlIHZpYSBleGlzdGluZyBwYWlyIG1hcHBpbmdcbiAgICAgICAgICBoYW5kbGUgPSB0aGlzLmludGVyc2VjdGlvbkhhbmRsZXMuZ2V0KGtleSkgPz8gbnVsbCBhcyBhbnk7XG4gICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgIGhhbmRsZSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBoYW5kbGUuY2xhc3NMaXN0LmFkZCgnZG9jay1pbnRlcnNlY3Rpb24taGFuZGxlJywgJ2dseXBoJyk7XG4gICAgICAgICAgICBoYW5kbGUuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NlcGFyYXRvcicpO1xuICAgICAgICAgICAgaGFuZGxlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdSZXNpemUgc3BsaXQgaW50ZXJzZWN0aW9uJyk7XG4gICAgICAgICAgICBoYW5kbGUuZGF0YXNldFsna2V5J10gPSBrZXk7XG4gICAgICAgICAgICBoYW5kbGUuZGF0YXNldFsnbGlzdGVuZXInXSA9ICcxJztcbiAgICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldikgPT4gdGhpcy5iZWdpbkNvcm5lclJlc2l6ZShldiwgaCwgdiwgaGFuZGxlISkpO1xuICAgICAgICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGV2KSA9PiB0aGlzLm9uSW50ZXJzZWN0aW9uRG91YmxlQ2xpY2soZXYsIGhhbmRsZSEpKTtcbiAgICAgICAgICAgIGxheWVyLmFwcGVuZENoaWxkKGhhbmRsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdyb3VwTWFwLnNldChnaywgaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFjayBwYWlycyBmb3IgdGhpcyBncm91cCBhbmQgbWFwIGFsbCBwYWlyIGtleXMgdG8gdGhlIHNhbWUgaGFuZGxlXG4gICAgICAgIGNvbnN0IGFyciA9IGdyb3VwUGFpcnMuZ2V0KGdrKSA/PyBbXTtcbiAgICAgICAgYXJyLnB1c2goeyBoOiB7IHBhdGhTdHI6IGgucGF0aFN0ciA/PyAnJywgaW5kZXg6IGguaW5kZXggfSwgdjogeyBwYXRoU3RyOiB2LnBhdGhTdHIgPz8gJycsIGluZGV4OiB2LmluZGV4IH0gfSk7XG4gICAgICAgIGdyb3VwUGFpcnMuc2V0KGdrLCBhcnIpO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbkhhbmRsZXMuc2V0KGtleSwgaGFuZGxlKTtcbiAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uIGZvciB0aGUgZ3JvdXBlZCBoYW5kbGVcbiAgICAgICAgaGFuZGxlLnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcbiAgICAgICAgaGFuZGxlLnN0eWxlLnRvcCA9IGAke3l9cHhgO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBBdHRhY2ggZ3JvdXBlZCBwYWlycyBkYXRhIHRvIGVhY2ggaGFuZGxlIGFuZCBwcnVuZSBzdGFsZSBvbmVzXG4gICAgY29uc3Qga2VlcCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KGdyb3VwTWFwLnZhbHVlcygpKTtcbiAgICBncm91cE1hcC5mb3JFYWNoKChoYW5kbGUsIGdrKSA9PiB7XG4gICAgICBjb25zdCBwYWlycyA9IGdyb3VwUGFpcnMuZ2V0KGdrKSA/PyBbXTtcbiAgICAgIGhhbmRsZS5kYXRhc2V0WydwYWlycyddID0gSlNPTi5zdHJpbmdpZnkocGFpcnMpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20obGF5ZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLWludGVyc2VjdGlvbi1oYW5kbGUnKSkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGlmICgha2VlcC5oYXMoZWwpKSB7XG4gICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFJlc2V0IGludGVyc2VjdGlvbkhhbmRsZXMgdG8gb25seSBjdXJyZW50bHkgbWFwcGVkIGtleXNcbiAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwPHN0cmluZywgSFRNTEVsZW1lbnQ+KCk7XG4gICAgZ3JvdXBQYWlycy5mb3JFYWNoKChwYWlycywgZ2spID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGdyb3VwTWFwLmdldChnaykhO1xuICAgICAgcGFpcnMuZm9yRWFjaCgocCkgPT4gbmV3TWFwLnNldChgJHtwLmgucGF0aFN0cn06JHtwLmguaW5kZXh9fCR7cC52LnBhdGhTdHJ9OiR7cC52LmluZGV4fWAsIGhhbmRsZSkpO1xuICAgIH0pO1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uSGFuZGxlcyA9IG5ld01hcDtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5Db3JuZXJSZXNpemUoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBoOiB7IHBhdGg6IERvY2tQYXRoIHwgbnVsbDsgaW5kZXg6IG51bWJlcjsgY29udGFpbmVyOiBIVE1MRWxlbWVudDsgcmVjdDogRE9NUmVjdCB9LFxuICAgIHY6IHsgcGF0aDogRG9ja1BhdGggfCBudWxsOyBpbmRleDogbnVtYmVyOyBjb250YWluZXI6IEhUTUxFbGVtZW50OyByZWN0OiBET01SZWN0IH0sXG4gICAgaGFuZGxlOiBIVE1MRWxlbWVudCxcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIEJ1aWxkIHBhaXJzIGZyb20gZGF0YXNldCBpZiBhdmFpbGFibGUgKGdyb3VwZWQgaW50ZXJzZWN0aW9ucyksIG90aGVyd2lzZSBmcm9tIHRoZSBwcm92aWRlZCBwYWlyXG4gICAgY29uc3QgcGFpcnNSYXcgPSBoYW5kbGUuZGF0YXNldFsncGFpcnMnXTtcbiAgICBjb25zdCBwYXJzZWQ6IEFycmF5PHsgaDogeyBwYXRoU3RyOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfTsgdjogeyBwYXRoU3RyOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfSB9PiA9XG4gICAgICBwYWlyc1JhdyA/IEpTT04ucGFyc2UocGFpcnNSYXcpIDogW107XG4gICAgY29uc3QgaHM6IEFycmF5PHsgcGF0aDogRG9ja1BhdGg7IGluZGV4OiBudW1iZXI7IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7IGluaXRpYWxTaXplczogbnVtYmVyW107IGJlZm9yZTogbnVtYmVyOyBhZnRlcjogbnVtYmVyIH0+PVtdO1xuICAgIGNvbnN0IHZzOiBBcnJheTx7IHBhdGg6IERvY2tQYXRoOyBpbmRleDogbnVtYmVyOyBjb250YWluZXI6IEhUTUxFbGVtZW50OyBpbml0aWFsU2l6ZXM6IG51bWJlcltdOyBiZWZvcmU6IG51bWJlcjsgYWZ0ZXI6IG51bWJlciB9Pj1bXTtcblxuICAgIGNvbnN0IGVuc3VyZUhWID0gKHBhdGhTdHI6IHN0cmluZywgaW5kZXg6IG51bWJlciwgYXhpczogJ2gnfCd2JykgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMucGFyc2VQYXRoKHBhdGhTdHIpO1xuICAgICAgaWYgKCFwYXRoKSByZXR1cm47XG4gICAgICBjb25zdCBkaXYgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAuZG9jay1zcGxpdF9fZGl2aWRlcltkYXRhLXBhdGg9XCIke3BhdGhTdHJ9XCJdW2RhdGEtaW5kZXg9XCIke2luZGV4fVwiXWApID8/IG51bGw7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkaXY/LmNsb3Nlc3QoJy5kb2NrLXNwbGl0JykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgICAgIGlmIChheGlzID09PSAnaCcpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgIGhzLnB1c2goeyBwYXRoLCBpbmRleCwgY29udGFpbmVyLCBpbml0aWFsU2l6ZXM6IGluaXRpYWwsIGJlZm9yZTogaW5pdGlhbFtpbmRleF0sIGFmdGVyOiBpbml0aWFsW2luZGV4KzFdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgdnMucHVzaCh7IHBhdGgsIGluZGV4LCBjb250YWluZXIsIGluaXRpYWxTaXplczogaW5pdGlhbCwgYmVmb3JlOiBpbml0aWFsW2luZGV4XSwgYWZ0ZXI6IGluaXRpYWxbaW5kZXgrMV0gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChwYXJzZWQubGVuZ3RoID4gMCkge1xuICAgICAgcGFyc2VkLmZvckVhY2goKHApID0+IHsgZW5zdXJlSFYocC5oLnBhdGhTdHIsIHAuaC5pbmRleCwgJ2gnKTsgZW5zdXJlSFYocC52LnBhdGhTdHIsIHAudi5pbmRleCwgJ3YnKTsgfSk7XG4gICAgfSBlbHNlIGlmIChoLnBhdGggJiYgdi5wYXRoKSB7XG4gICAgICBlbnN1cmVIVih0aGlzLmZvcm1hdFBhdGgoaC5wYXRoKSwgaC5pbmRleCwgJ2gnKTtcbiAgICAgIGVuc3VyZUhWKHRoaXMuZm9ybWF0UGF0aCh2LnBhdGgpLCB2LmluZGV4LCAndicpO1xuICAgIH1cbiAgICBpZiAoaHMubGVuZ3RoID09PSAwICYmIHZzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgaGFuZGxlLmRhdGFzZXRbJ3Jlc2l6aW5nJ10gPSAndHJ1ZSc7XG4gICAgICBoYW5kbGUuY2xhc3NMaXN0LmFkZCgnaG92ZXJpbmcnKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0aGlzLmNvcm5lclJlc2l6ZVN0YXRlID0ge1xuICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICBoYW5kbGUsXG4gICAgICBoczogaHMubWFwKChlKSA9PiAoeyBwYXRoOiB0aGlzLmNsb25lUGF0aChlLnBhdGgpLCBpbmRleDogZS5pbmRleCwgY29udGFpbmVyOiBlLmNvbnRhaW5lciwgYmVmb3JlU2l6ZTogZS5iZWZvcmUsIGFmdGVyU2l6ZTogZS5hZnRlciwgaW5pdGlhbFNpemVzOiBlLmluaXRpYWxTaXplcywgc3RhcnRZOiBldmVudC5jbGllbnRZIH0pKSxcbiAgICAgIHZzOiB2cy5tYXAoKGUpID0+ICh7IHBhdGg6IHRoaXMuY2xvbmVQYXRoKGUucGF0aCksIGluZGV4OiBlLmluZGV4LCBjb250YWluZXI6IGUuY29udGFpbmVyLCBiZWZvcmVTaXplOiBlLmJlZm9yZSwgYWZ0ZXJTaXplOiBlLmFmdGVyLCBpbml0aWFsU2l6ZXM6IGUuaW5pdGlhbFNpemVzLCBzdGFydFg6IGV2ZW50LmNsaWVudFggfSkpLFxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9pbnRlclRyYWNraW5nKCk7XG4gICAgLy8gRW5zdXJlIGhhbmRsZSBoYXMgYSBzdGFibGUga2V5ICh1c2UgZ3JvdXAgaWYgcHJlc2VudClcbiAgICBpZiAoIWhhbmRsZS5kYXRhc2V0WydrZXknXSkge1xuICAgICAgaGFuZGxlLmRhdGFzZXRbJ2tleSddID0gaGFuZGxlLmRhdGFzZXRbJ2dyb3VwJ10gPz8gJyc7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyU25hcE1hcmtlcnNGb3JDb3JuZXIoKTtcblxuICAgIC8vIENvbXB1dGUgbG9jYWxpemVkIHNuYXAgdGFyZ2V0cyBmb3IgdGhpcyBpbnRlcnNlY3Rpb25cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLnJvb3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIC8vIFVzZSBmaXJzdCBwYWlyIHRvIGRlZmluZSB0aGUgY3Jvc3NpbmcgbGluZXNcbiAgICAgIGxldCBjZW50ZXJYOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCBjZW50ZXJZOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIC8vIFJlc29sdmUgb25lIHZlcnRpY2FsIGJhciAoZnJvbSB2cykgYW5kIG9uZSBob3Jpem9udGFsIGJhciAoZnJvbSBocylcbiAgICAgIGlmICh2cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZQYWlyID0gdnNbMF07XG4gICAgICAgIGNvbnN0IHZQYXRoU3RyID0gdGhpcy5mb3JtYXRQYXRoKHZQYWlyLnBhdGgpO1xuICAgICAgICBjb25zdCB2RGl2ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgLmRvY2stc3BsaXRfX2RpdmlkZXJbZGF0YS1wYXRoPVwiJHt2UGF0aFN0cn1cIl1bZGF0YS1pbmRleD1cIiR7dlBhaXIuaW5kZXh9XCJdYCkgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgdnIgPSB2RGl2Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKHZyKSBjZW50ZXJYID0gdnIubGVmdCArIHZyLndpZHRoIC8gMjtcbiAgICAgIH1cbiAgICAgIGlmIChocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGhQYWlyID0gaHNbMF07XG4gICAgICAgIGNvbnN0IGhQYXRoU3RyID0gdGhpcy5mb3JtYXRQYXRoKGhQYWlyLnBhdGgpO1xuICAgICAgICBjb25zdCBoRGl2ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgLmRvY2stc3BsaXRfX2RpdmlkZXJbZGF0YS1wYXRoPVwiJHtoUGF0aFN0cn1cIl1bZGF0YS1pbmRleD1cIiR7aFBhaXIuaW5kZXh9XCJdYCkgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgaHIgPSBoRGl2Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGhyKSBjZW50ZXJZID0gaHIudG9wICsgaHIuaGVpZ2h0IC8gMjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeFRhcmdldHM6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCB5VGFyZ2V0czogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGFsbERpdmlkZXJzID0gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay1zcGxpdF9fZGl2aWRlcicpID8/IFtdKTtcbiAgICAgIGFsbERpdmlkZXJzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSAoZWwuZGF0YXNldFsnb3JpZW50YXRpb24nXSBhcyAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnIHwgdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHIgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKG8gPT09ICdob3Jpem9udGFsJyAmJiBjZW50ZXJZICE9IG51bGwpIHtcbiAgICAgICAgICAvLyB2ZXJ0aWNhbCBiYXIg4oaSIGNvbnRyaWJ1dGVzIFggaWYgaXQgY3Jvc3NlcyBjZW50ZXJZXG4gICAgICAgICAgaWYgKGNlbnRlclkgPj0gci50b3AgJiYgY2VudGVyWSA8PSByLmJvdHRvbSkge1xuICAgICAgICAgICAgeFRhcmdldHMucHVzaChyLmxlZnQgKyByLndpZHRoIC8gMiAtIHJvb3RSZWN0LmxlZnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvID09PSAndmVydGljYWwnICYmIGNlbnRlclggIT0gbnVsbCkge1xuICAgICAgICAgIC8vIGhvcml6b250YWwgYmFyIOKGkiBjb250cmlidXRlcyBZIGlmIGl0IGNyb3NzZXMgY2VudGVyWFxuICAgICAgICAgIGlmIChjZW50ZXJYID49IHIubGVmdCAmJiBjZW50ZXJYIDw9IHIucmlnaHQpIHtcbiAgICAgICAgICAgIHlUYXJnZXRzLnB1c2goci50b3AgKyByLmhlaWdodCAvIDIgLSByb290UmVjdC50b3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvcm5lclNuYXBYVGFyZ2V0cyA9IHhUYXJnZXRzO1xuICAgICAgdGhpcy5jb3JuZXJTbmFwWVRhcmdldHMgPSB5VGFyZ2V0cztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuY29ybmVyU25hcFhUYXJnZXRzID0gW107XG4gICAgICB0aGlzLmNvcm5lclNuYXBZVGFyZ2V0cyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29ybmVyUmVzaXplTW92ZShldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvcm5lclJlc2l6ZVN0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgc3RhdGUucG9pbnRlcklkICE9PSBldmVudC5wb2ludGVySWQpIHJldHVybjtcblxuICAgIGNvbnN0IHNuYXBWYWx1ZSA9ICh2YWw6IG51bWJlciwgdG90YWw6IG51bWJlciwgYWN0aXZlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCB0b3RhbCA8PSAwKSByZXR1cm4gdmFsO1xuICAgICAgY29uc3QgcmF0aW9zID0gWzEvMywgMS8yLCAyLzNdO1xuICAgICAgY29uc3QgciA9IHZhbCAvIHRvdGFsO1xuICAgICAgbGV0IGJlc3QgPSByYXRpb3NbMF07XG4gICAgICBsZXQgZCA9IE1hdGguYWJzKHIgLSBiZXN0KTtcbiAgICAgIGZvciAobGV0IGk9MTtpPHJhdGlvcy5sZW5ndGg7aSsrKXsgY29uc3QgZGQgPSBNYXRoLmFicyhyIC0gcmF0aW9zW2ldKTsgaWYgKGRkIDwgZCkgeyBkID0gZGQ7IGJlc3QgPSByYXRpb3NbaV07IH0gfVxuICAgICAgcmV0dXJuIGJlc3QgKiB0b3RhbDtcbiAgICB9O1xuXG4gICAgLy8gQXhpcyBzbmFwcGluZyB0byBuZWFyYnkgaW50ZXJzZWN0aW9uc1xuICAgIGNvbnN0IHRvbCA9IDEwO1xuICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5yb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGNsaWVudFggPSBldmVudC5jbGllbnRYO1xuICAgIGxldCBjbGllbnRZID0gZXZlbnQuY2xpZW50WTtcbiAgICBpZiAodGhpcy5jb3JuZXJTbmFwWFRhcmdldHMubGVuZ3RoKSB7XG4gICAgICBsZXQgYmVzdCA9IGNsaWVudFgsIGJlc3REaXN0ID0gdG9sICsgMTtcbiAgICAgIHRoaXMuY29ybmVyU25hcFhUYXJnZXRzLmZvckVhY2goKHN4KSA9PiB7XG4gICAgICAgIGNvbnN0IHB4ID0gcm9vdFJlY3QubGVmdCArIHN4OyBjb25zdCBkID0gTWF0aC5hYnMocHggLSBjbGllbnRYKTsgaWYgKGQgPCBiZXN0RGlzdCkgeyBiZXN0RGlzdCA9IGQ7IGJlc3QgPSBweDsgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYmVzdERpc3QgPD0gdG9sKSBjbGllbnRYID0gYmVzdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29ybmVyU25hcFlUYXJnZXRzLmxlbmd0aCkge1xuICAgICAgbGV0IGJlc3QgPSBjbGllbnRZLCBiZXN0RGlzdCA9IHRvbCArIDE7XG4gICAgICB0aGlzLmNvcm5lclNuYXBZVGFyZ2V0cy5mb3JFYWNoKChzeSkgPT4ge1xuICAgICAgICBjb25zdCBweSA9IHJvb3RSZWN0LnRvcCArIHN5OyBjb25zdCBkID0gTWF0aC5hYnMocHkgLSBjbGllbnRZKTsgaWYgKGQgPCBiZXN0RGlzdCkgeyBiZXN0RGlzdCA9IGQ7IGJlc3QgPSBweTsgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYmVzdERpc3QgPD0gdG9sKSBjbGllbnRZID0gYmVzdDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgYWxsIGhvcml6b250YWwgYmFycyAodmVydGljYWwgc3BsaXRzKSB3aXRoIFkgZGVsdGFcbiAgICBzdGF0ZS5ocy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5yZXNvbHZlU3BsaXROb2RlKGgucGF0aCk7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybjtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGNsaWVudFkgLSBoLnN0YXJ0WTtcbiAgICAgIGNvbnN0IG1pblNpemUgPSA0ODtcbiAgICAgIGNvbnN0IHBhaXJUb3RhbCA9IGguYmVmb3JlU2l6ZSArIGguYWZ0ZXJTaXplO1xuICAgICAgbGV0IG5ld0JlZm9yZSA9IE1hdGgubWluKE1hdGgubWF4KGguYmVmb3JlU2l6ZSArIGRlbHRhWSwgbWluU2l6ZSksIHBhaXJUb3RhbCAtIG1pblNpemUpO1xuICAgICAgbmV3QmVmb3JlID0gc25hcFZhbHVlKG5ld0JlZm9yZSwgcGFpclRvdGFsLCBldmVudC5zaGlmdEtleSk7XG4gICAgICBjb25zdCBuZXdBZnRlciA9IHBhaXJUb3RhbCAtIG5ld0JlZm9yZTtcbiAgICAgIGNvbnN0IHNpemVzUHggPSBbLi4uaC5pbml0aWFsU2l6ZXNdO1xuICAgICAgc2l6ZXNQeFtoLmluZGV4XSA9IG5ld0JlZm9yZTtcbiAgICAgIHNpemVzUHhbaC5pbmRleCsxXSA9IG5ld0FmdGVyO1xuICAgICAgY29uc3QgdG90YWwgPSBzaXplc1B4LnJlZHVjZSgoYSxzKT0+YStzLDApO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRvdGFsPjAgPyBzaXplc1B4Lm1hcCgocyk9PnMvdG90YWwpIDogW107XG4gICAgICBub2RlLnNpemVzID0gbm9ybWFsaXplZDtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShoLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgICAgbm9ybWFsaXplZC5mb3JFYWNoKChzaXplLCBpZHgpID0+IHsgaWYgKGNoaWxkcmVuW2lkeF0pIGNoaWxkcmVuW2lkeF0uc3R5bGUuZmxleCA9IGAke01hdGgubWF4KHNpemUsMCl9IDEgMGA7IH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGFsbCB2ZXJ0aWNhbCBiYXJzIChob3Jpem9udGFsIHNwbGl0cykgd2l0aCBYIGRlbHRhXG4gICAgc3RhdGUudnMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucmVzb2x2ZVNwbGl0Tm9kZSh2LnBhdGgpO1xuICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICBjb25zdCBkZWx0YVggPSBjbGllbnRYIC0gdi5zdGFydFg7XG4gICAgICBjb25zdCBtaW5TaXplID0gNDg7XG4gICAgICBjb25zdCBwYWlyVG90YWwgPSB2LmJlZm9yZVNpemUgKyB2LmFmdGVyU2l6ZTtcbiAgICAgIGxldCBuZXdCZWZvcmUgPSBNYXRoLm1pbihNYXRoLm1heCh2LmJlZm9yZVNpemUgKyBkZWx0YVgsIG1pblNpemUpLCBwYWlyVG90YWwgLSBtaW5TaXplKTtcbiAgICAgIG5ld0JlZm9yZSA9IHNuYXBWYWx1ZShuZXdCZWZvcmUsIHBhaXJUb3RhbCwgZXZlbnQuc2hpZnRLZXkpO1xuICAgICAgY29uc3QgbmV3QWZ0ZXIgPSBwYWlyVG90YWwgLSBuZXdCZWZvcmU7XG4gICAgICBjb25zdCBzaXplc1B4ID0gWy4uLnYuaW5pdGlhbFNpemVzXTtcbiAgICAgIHNpemVzUHhbdi5pbmRleF0gPSBuZXdCZWZvcmU7XG4gICAgICBzaXplc1B4W3YuaW5kZXgrMV0gPSBuZXdBZnRlcjtcbiAgICAgIGNvbnN0IHRvdGFsID0gc2l6ZXNQeC5yZWR1Y2UoKGEscyk9PmErcywwKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0b3RhbD4wID8gc2l6ZXNQeC5tYXAoKHMpPT5zL3RvdGFsKSA6IFtdO1xuICAgICAgbm9kZS5zaXplcyA9IG5vcm1hbGl6ZWQ7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20odi5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJzpzY29wZSA+IC5kb2NrLXNwbGl0X19jaGlsZCcpKTtcbiAgICAgIG5vcm1hbGl6ZWQuZm9yRWFjaCgoc2l6ZSwgaWR4KSA9PiB7IGlmIChjaGlsZHJlbltpZHhdKSBjaGlsZHJlbltpZHhdLnN0eWxlLmZsZXggPSBgJHtNYXRoLm1heChzaXplLDApfSAxIDBgOyB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuZENvcm5lclJlc2l6ZShwb2ludGVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jb3JuZXJSZXNpemVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8IHBvaW50ZXJJZCAhPT0gc3RhdGUucG9pbnRlcklkKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHN0YXRlLmhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoc3RhdGUucG9pbnRlcklkKTtcbiAgICB9IGNhdGNoIHt9XG4gICAgc3RhdGUuaGFuZGxlLmRhdGFzZXRbJ3Jlc2l6aW5nJ10gPSAnZmFsc2UnO1xuICAgIHRoaXMuY29ybmVyUmVzaXplU3RhdGUgPSBudWxsO1xuICAgIC8vIFJlLXJlbmRlciBoYW5kbGVzIHRvIGFjY291bnQgZm9yIG5ldyBwb3NpdGlvbnNcbiAgICB0aGlzLnNjaGVkdWxlUmVuZGVySW50ZXJzZWN0aW9uSGFuZGxlcygpO1xuICAgIHRoaXMuY29ybmVyU25hcFhUYXJnZXRzID0gW107XG4gICAgdGhpcy5jb3JuZXJTbmFwWVRhcmdldHMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgb25JbnRlcnNlY3Rpb25Eb3VibGVDbGljayhldmVudDogTW91c2VFdmVudCwgaGFuZGxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGFpcnNSYXcgPSBoYW5kbGUuZGF0YXNldFsncGFpcnMnXTtcbiAgICBjb25zdCBwYXJzZWQ6IEFycmF5PHsgaDogeyBwYXRoU3RyOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfTsgdjogeyBwYXRoU3RyOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfSB9PlxuICAgICAgPSBwYWlyc1JhdyA/IEpTT04ucGFyc2UocGFpcnNSYXcpIDogW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkgfHwgcGFyc2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgayA9IGhhbmRsZS5kYXRhc2V0WydrZXknXSA/PyAnJztcbiAgICAgIGNvbnN0IHBhcnRzID0gay5zcGxpdCgnfCcpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBbaFBhcnQsIHZQYXJ0XSA9IHBhcnRzO1xuICAgICAgICBjb25zdCBoaSA9IGhQYXJ0Lmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgICAgIGNvbnN0IHZpID0gdlBhcnQubGFzdEluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKGhpID4gMCAmJiB2aSA+IDApIHtcbiAgICAgICAgICBjb25zdCBoUGF0aFN0ciA9IGhQYXJ0LnNsaWNlKDAsIGhpKTtcbiAgICAgICAgICBjb25zdCB2UGF0aFN0ciA9IHZQYXJ0LnNsaWNlKDAsIHZpKTtcbiAgICAgICAgICBjb25zdCBoSWR4ID0gTnVtYmVyLnBhcnNlSW50KGhQYXJ0LnNsaWNlKGhpICsgMSksIDEwKTtcbiAgICAgICAgICBjb25zdCB2SWR4ID0gTnVtYmVyLnBhcnNlSW50KHZQYXJ0LnNsaWNlKHZpICsgMSksIDEwKTtcbiAgICAgICAgICBwYXJzZWQucHVzaCh7IGg6IHsgcGF0aFN0cjogaFBhdGhTdHIsIGluZGV4OiBoSWR4IH0sIHY6IHsgcGF0aFN0cjogdlBhdGhTdHIsIGluZGV4OiB2SWR4IH0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnNlZC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IHNwbGl0S2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHBhcnNlZC5mb3JFYWNoKChwKSA9PiB7IHNwbGl0S2V5cy5hZGQocC5oLnBhdGhTdHIpOyBzcGxpdEtleXMuYWRkKHAudi5wYXRoU3RyKTsgfSk7XG4gICAgbGV0IGhhc1N0b3JlZCA9IGZhbHNlO1xuICAgIHNwbGl0S2V5cy5mb3JFYWNoKChrKSA9PiB7IGlmICh0aGlzLnByZXZpb3VzU3BsaXRTaXplcy5oYXMoaykpIGhhc1N0b3JlZCA9IHRydWU7IH0pO1xuXG4gICAgY29uc3QgYXBwbHlTaXplcyA9IChwYXRoU3RyOiBzdHJpbmcsIG11dGF0ZTogKHNpemVzOiBudW1iZXJbXSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyW10pID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChwYXRoU3RyKTtcbiAgICAgIGlmICghcGF0aCkgcmV0dXJuO1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucmVzb2x2ZVNwbGl0Tm9kZShwYXRoKTtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2l6ZXMgPSB0aGlzLm5vcm1hbGl6ZVNpemVzQXJyYXkobm9kZS5zaXplcyA/PyBbXSwgbm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgLy8gRmluZCBkaXZpZGVyIGluZGV4IGZyb20gYW55IGRpdmlkZXIgYmVsb25naW5nIHRvIHRoaXMgcGF0aFxuICAgICAgY29uc3QgZGl2RWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAuZG9jay1zcGxpdF9fZGl2aWRlcltkYXRhLXBhdGg9XCIke3BhdGhTdHJ9XCJdYCk7XG4gICAgICBjb25zdCBpbmRleCA9IGRpdkVsID8gTnVtYmVyLnBhcnNlSW50KGRpdkVsLmRhdGFzZXRbJ2luZGV4J10gPz8gJzAnLCAxMCkgOiAwO1xuICAgICAgY29uc3QgbmV3U2l6ZXMgPSBtdXRhdGUoWy4uLnNpemVzXSwgaW5kZXgpO1xuICAgICAgbm9kZS5zaXplcyA9IG5ld1NpemVzO1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNlZ21lbnRzLmpvaW4oJy8nKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYC5kb2NrLXNwbGl0W2RhdGEtcGF0aD1cIiR7c2VnbWVudHN9XCJdYCk7XG4gICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShjb250YWluZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJzpzY29wZSA+IC5kb2NrLXNwbGl0X19jaGlsZCcpKTtcbiAgICAgICAgbmV3U2l6ZXMuZm9yRWFjaCgocywgaSkgPT4geyBpZiAoY2hpbGRyZW5baV0pIGNoaWxkcmVuW2ldLnN0eWxlLmZsZXggPSBgJHtNYXRoLm1heChzLCAwKX0gMSAwYDsgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChoYXNTdG9yZWQpIHtcbiAgICAgIC8vIFJlc3RvcmUgc3RvcmVkIHNpemVzXG4gICAgICB0aGlzLnByZXZpb3VzU3BsaXRTaXplcy5mb3JFYWNoKChzaXplcywgcGF0aFN0cikgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5wYXJzZVBhdGgocGF0aFN0cik7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBwYXRoID8gdGhpcy5yZXNvbHZlU3BsaXROb2RlKHBhdGgpIDogbnVsbDtcbiAgICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5vcm0gPSB0aGlzLm5vcm1hbGl6ZVNpemVzQXJyYXkoc2l6ZXMsIG5vZGUuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgbm9kZS5zaXplcyA9IG5vcm07XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aCEuc2VnbWVudHMuam9pbignLycpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAuZG9jay1zcGxpdFtkYXRhLXBhdGg9XCIke3NlZ21lbnRzfVwiXWApO1xuICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgICAgICAgIG5vcm0uZm9yRWFjaCgocywgaSkgPT4geyBpZiAoY2hpbGRyZW5baV0pIGNoaWxkcmVuW2ldLnN0eWxlLmZsZXggPSBgJHtNYXRoLm1heChzLCAwKX0gMSAwYDsgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcmV2aW91c1NwbGl0U2l6ZXMuY2xlYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXF1YWxpemUgdGhlIHR3byBwYW5lcyBhZGphY2VudCB0byBlYWNoIGRpdmlkZXIgYW5kIHN0b3JlIHByZXZpb3VzIHNpemVzXG4gICAgICBjb25zdCB0b3VjaGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBwYXJzZWQuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBbcC5oLnBhdGhTdHIsIHAudi5wYXRoU3RyXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAodG91Y2hlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBwYXRoID8gdGhpcy5yZXNvbHZlU3BsaXROb2RlKHBhdGgpIDogbnVsbDtcbiAgICAgICAgICBpZiAobm9kZSAmJiBBcnJheS5pc0FycmF5KG5vZGUuc2l6ZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzU3BsaXRTaXplcy5zZXQoa2V5LCBbLi4ubm9kZS5zaXplc10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b3VjaGVkLmFkZChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXBwbHlTaXplcyhwLmgucGF0aFN0ciwgKHNpemVzLCBpZHgpID0+IHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IChzaXplc1tpZHhdID8/IDApICsgKHNpemVzW2lkeCArIDFdID8/IDApO1xuICAgICAgICAgIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gc2l6ZXM7XG4gICAgICAgICAgc2l6ZXNbaWR4XSA9IHRvdGFsIC8gMjtcbiAgICAgICAgICBzaXplc1tpZHggKyAxXSA9IHRvdGFsIC8gMjtcbiAgICAgICAgICBjb25zdCBzdW0gPSBzaXplcy5yZWR1Y2UoKGEsIHMpID0+IGEgKyBzLCAwKTtcbiAgICAgICAgICByZXR1cm4gc3VtID4gMCA/IHNpemVzLm1hcCgocykgPT4gcyAvIHN1bSkgOiBzaXplcztcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcGx5U2l6ZXMocC52LnBhdGhTdHIsIChzaXplcywgaWR4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSAoc2l6ZXNbaWR4XSA/PyAwKSArIChzaXplc1tpZHggKyAxXSA/PyAwKTtcbiAgICAgICAgICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIHNpemVzO1xuICAgICAgICAgIHNpemVzW2lkeF0gPSB0b3RhbCAvIDI7XG4gICAgICAgICAgc2l6ZXNbaWR4ICsgMV0gPSB0b3RhbCAvIDI7XG4gICAgICAgICAgY29uc3Qgc3VtID0gc2l6ZXMucmVkdWNlKChhLCBzKSA9PiBhICsgcywgMCk7XG4gICAgICAgICAgcmV0dXJuIHN1bSA+IDAgPyBzaXplcy5tYXAoKHMpID0+IHMgLyBzdW0pIDogc2l6ZXM7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVuZGVySW50ZXJzZWN0aW9uSGFuZGxlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWdpbkZsb2F0aW5nRHJhZyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgd3JhcHBlcjogSFRNTEVsZW1lbnQsXG4gICAgaGFuZGxlOiBIVE1MRWxlbWVudCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZmxvYXRpbmcuYm91bmRzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogbm8tb3A6IHBvaW50ZXIgY2FwdHVyZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiBhbGwgZW52aXJvbm1lbnRzICovXG4gICAgfVxuXG4gICAgdGhpcy5wcm9tb3RlRmxvYXRpbmdQYW5lKGluZGV4LCB3cmFwcGVyKTtcblxuICAgIHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgPSB7XG4gICAgICBpbmRleCxcbiAgICAgIHBvaW50ZXJJZDogZXZlbnQucG9pbnRlcklkLFxuICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgc3RhcnRMZWZ0OiBsZWZ0LFxuICAgICAgc3RhcnRUb3A6IHRvcCxcbiAgICAgIHdyYXBwZXIsXG4gICAgICBoYW5kbGUsXG4gICAgfTtcblxuICAgIHRoaXMuc3RhcnRQb2ludGVyVHJhY2tpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5GbG9hdGluZ1Jlc2l6ZShcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgd3JhcHBlcjogSFRNTEVsZW1lbnQsXG4gICAgaGFuZGxlOiBIVE1MRWxlbWVudCxcbiAgICBlZGdlczogRmxvYXRpbmdSZXNpemVFZGdlcyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0cnkge1xuICAgICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICBoYW5kbGUuZGF0YXNldFsncmVzaXppbmcnXSA9ICd0cnVlJztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIHBvaW50ZXIgY2FwdHVyZSBtYXkgbm90IGJlIHN1cHBvcnRlZCAqL1xuICAgIH1cblxuICAgIHRoaXMucHJvbW90ZUZsb2F0aW5nUGFuZShpbmRleCwgd3JhcHBlcik7XG5cbiAgICB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgPSB7XG4gICAgICBpbmRleCxcbiAgICAgIHBvaW50ZXJJZDogZXZlbnQucG9pbnRlcklkLFxuICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgc3RhcnRXaWR0aDogZmxvYXRpbmcuYm91bmRzLndpZHRoLFxuICAgICAgc3RhcnRIZWlnaHQ6IGZsb2F0aW5nLmJvdW5kcy5oZWlnaHQsXG4gICAgICBzdGFydExlZnQ6IGZsb2F0aW5nLmJvdW5kcy5sZWZ0LFxuICAgICAgc3RhcnRUb3A6IGZsb2F0aW5nLmJvdW5kcy50b3AsXG4gICAgICB3cmFwcGVyLFxuICAgICAgaGFuZGxlLFxuICAgICAgZWRnZXMsXG4gICAgfTtcblxuICAgIHRoaXMuc3RhcnRQb2ludGVyVHJhY2tpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmxvYXRpbmdEcmFnTW92ZShldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgZXZlbnQucG9pbnRlcklkICE9PSBzdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gc3RhdGUuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSBzdGF0ZS5zdGFydFk7XG4gICAgY29uc3QgbmV3TGVmdCA9IHN0YXRlLnN0YXJ0TGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBzdGF0ZS5zdGFydFRvcCArIGRlbHRhWTtcblxuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUubGVmdCA9IGAke25ld0xlZnR9cHhgO1xuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUudG9wID0gYCR7bmV3VG9wfXB4YDtcblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbc3RhdGUuaW5kZXhdO1xuICAgIGlmIChmbG9hdGluZykge1xuICAgICAgZmxvYXRpbmcuYm91bmRzLmxlZnQgPSBuZXdMZWZ0O1xuICAgICAgZmxvYXRpbmcuYm91bmRzLnRvcCA9IG5ld1RvcDtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUZsb2F0aW5nRHJhZ0Ryb3BUYXJnZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRGbG9hdGluZ0RyYWcocG9pbnRlcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdEcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSB8fCBwb2ludGVySWQgIT09IHN0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBzdGF0ZS5oYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHN0YXRlLnBvaW50ZXJJZCk7XG4gICAgICBkZWxldGUgc3RhdGUuaGFuZGxlLmRhdGFzZXRbJ3Jlc2l6aW5nJ107XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBuby1vcCAqL1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3BIYW5kbGVkID0gc3RhdGUuZHJvcFRhcmdldFxuICAgICAgPyB0aGlzLmhhbmRsZUZsb2F0aW5nU3RhY2tEcm9wKHN0YXRlLmluZGV4LCBzdGF0ZS5kcm9wVGFyZ2V0LnBhdGgsIHN0YXRlLmRyb3BUYXJnZXQuem9uZSlcbiAgICAgIDogZmFsc2U7XG5cbiAgICB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlID0gbnVsbDtcbiAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgaWYgKCFkcm9wSGFuZGxlZCkge1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZsb2F0aW5nRHJhZ0Ryb3BUYXJnZXQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZTtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgaWYgKHN0YXRlLmRyb3BUYXJnZXQpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmRyb3BUYXJnZXQ7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICBpZiAoIXBhdGggfHwgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJyAmJiBwYXRoLmluZGV4ID09PSBzdGF0ZS5pbmRleCkpIHtcbiAgICAgIGlmIChzdGF0ZS5kcm9wVGFyZ2V0KSB7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5kcm9wVGFyZ2V0O1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RpY2t5IHpvbmUgd2hlbiBtb3ZpbmcgdG8gYW5vdGhlciBzdGFjayB3aGlsZSBkcmFnZ2luZyB0aGVcbiAgICAvLyBmbG9hdGluZyB3aW5kb3cgc28gdGhlIHNpZGUgZG9lc24ndCBjYXJyeSBvdmVyLlxuICAgIGlmICh0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJiB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAhPT0gc3RhY2spIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgICB0aGlzLnVwZGF0ZURyb3BKb3lzdGlja0FjdGl2ZVpvbmUobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9uZSA9IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBldmVudCwgdGhpcy5leHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQpKTtcblxuICAgIGlmICh6b25lKSB7XG4gICAgICBzdGF0ZS5kcm9wVGFyZ2V0ID0geyBwYXRoLCB6b25lIH07XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5kcm9wVGFyZ2V0KSB7XG4gICAgICBkZWxldGUgc3RhdGUuZHJvcFRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dEcm9wSW5kaWNhdG9yKHN0YWNrLCB6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmxvYXRpbmdSZXNpemVNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8IGV2ZW50LnBvaW50ZXJJZCAhPT0gc3RhdGUucG9pbnRlcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gc3RhdGUuc3RhcnRZO1xuICAgIGNvbnN0IG1pbldpZHRoID0gMTkyO1xuICAgIGNvbnN0IG1pbkhlaWdodCA9IDEyODtcbiAgICBsZXQgbmV3V2lkdGggPSBzdGF0ZS5zdGFydFdpZHRoO1xuICAgIGxldCBuZXdIZWlnaHQgPSBzdGF0ZS5zdGFydEhlaWdodDtcbiAgICBsZXQgbmV3TGVmdCA9IHN0YXRlLnN0YXJ0TGVmdDtcbiAgICBsZXQgbmV3VG9wID0gc3RhdGUuc3RhcnRUb3A7XG5cbiAgICBpZiAoc3RhdGUuZWRnZXMuaG9yaXpvbnRhbCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgbmV3V2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgc3RhdGUuc3RhcnRXaWR0aCArIGRlbHRhWCk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lZGdlcy5ob3Jpem9udGFsID09PSAnbGVmdCcpIHtcbiAgICAgIG5ld1dpZHRoID0gTWF0aC5tYXgobWluV2lkdGgsIHN0YXRlLnN0YXJ0V2lkdGggLSBkZWx0YVgpO1xuICAgICAgbmV3TGVmdCA9IHN0YXRlLnN0YXJ0TGVmdCArIChzdGF0ZS5zdGFydFdpZHRoIC0gbmV3V2lkdGgpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5lZGdlcy52ZXJ0aWNhbCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgc3RhdGUuc3RhcnRIZWlnaHQgKyBkZWx0YVkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZWRnZXMudmVydGljYWwgPT09ICd0b3AnKSB7XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIHN0YXRlLnN0YXJ0SGVpZ2h0IC0gZGVsdGFZKTtcbiAgICAgIG5ld1RvcCA9IHN0YXRlLnN0YXJ0VG9wICsgKHN0YXRlLnN0YXJ0SGVpZ2h0IC0gbmV3SGVpZ2h0KTtcbiAgICB9XG5cbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xuICAgIHN0YXRlLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLmxlZnQgPSBgJHtuZXdMZWZ0fXB4YDtcbiAgICBzdGF0ZS53cmFwcGVyLnN0eWxlLnRvcCA9IGAke25ld1RvcH1weGA7XG5cbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW3N0YXRlLmluZGV4XTtcbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgZmxvYXRpbmcuYm91bmRzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy5sZWZ0ID0gbmV3TGVmdDtcbiAgICAgIGZsb2F0aW5nLmJvdW5kcy50b3AgPSBuZXdUb3A7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbmRGbG9hdGluZ1Jlc2l6ZShwb2ludGVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5mbG9hdGluZ1Jlc2l6ZVN0YXRlO1xuICAgIGlmICghc3RhdGUgfHwgcG9pbnRlcklkICE9PSBzdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgc3RhdGUuaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzdGF0ZS5wb2ludGVySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogbm8tb3AgKi9cbiAgICB9XG5cbiAgICB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZsb2F0aW5nUGFuZVpJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm4gMTAgKyBpbmRleDtcbiAgICB9XG4gICAgY29uc3QgYmFzZSA9XG4gICAgICB0eXBlb2YgZmxvYXRpbmcuekluZGV4ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuekluZGV4KVxuICAgICAgICA/IGZsb2F0aW5nLnpJbmRleFxuICAgICAgICA6IDEwICsgaW5kZXg7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHByb21vdGVGbG9hdGluZ1BhbmUoaW5kZXg6IG51bWJlciwgd3JhcHBlcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4RXhpc3RpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0cy5yZWR1Y2UoKG1heCwgbGF5b3V0LCBpZHgpID0+IHtcbiAgICAgIGlmICghbGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgICB9XG4gICAgICBjb25zdCB6ID0gaWR4ID09PSBpbmRleCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6IHRoaXMuZ2V0RmxvYXRpbmdQYW5lWkluZGV4KGlkeCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCB6KTtcbiAgICB9LCAwKTtcblxuICAgIGNvbnN0IG5leHRaID0gTWF0aC5tYXgobWF4RXhpc3RpbmcgKyAyLCAxMik7XG4gICAgZmxvYXRpbmcuekluZGV4ID0gbmV4dFo7XG4gICAgd3JhcHBlci5zdHlsZS56SW5kZXggPSBTdHJpbmcobmV4dFopO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbG9hdGluZ1dyYXBwZXIoaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgLmRvY2stZmxvYXRpbmdbZGF0YS1wYXRoPVwiJHt0aGlzLmZvcm1hdFBhdGgoe1xuICAgICAgdHlwZTogJ2Zsb2F0aW5nJyxcbiAgICAgIGluZGV4LFxuICAgICAgc2VnbWVudHM6IFtdLFxuICAgIH0pfVwiXWA7XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRpbmdMYXllckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQb2ludGVyVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5wb2ludGVyVHJhY2tpbmdBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9pbnRlclRyYWNraW5nSWZJZGxlKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlICYmXG4gICAgICAhdGhpcy5yZXNpemVTdGF0ZSAmJlxuICAgICAgIXRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgJiZcbiAgICAgICF0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgJiZcbiAgICAgICF0aGlzLmNvcm5lclJlc2l6ZVN0YXRlXG4gICAgKSB7XG4gICAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICAgIHRoaXMucG9pbnRlclRyYWNraW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbG9hdGluZ1dpbmRvd1RpdGxlKGZsb2F0aW5nOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCk6IHN0cmluZyB7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAnRmxvYXRpbmcgUGFuZSc7XG4gICAgaWYgKCFmbG9hdGluZyB8fCAhZmxvYXRpbmcucm9vdCkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZlcnJlZCA9IGZsb2F0aW5nLmFjdGl2ZVBhbmUgPz8gdGhpcy5maW5kRmlyc3RQYW5lTmFtZShmbG9hdGluZy5yb290KTtcbiAgICBpZiAoIXByZWZlcnJlZCkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRpdGxlc1twcmVmZXJyZWRdID8/IHByZWZlcnJlZCA/PyBmYWxsYmFjaztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmxvYXRpbmdXaW5kb3dUaXRsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tpbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yID0gYC5kb2NrLWZsb2F0aW5nW2RhdGEtcGF0aD1cIiR7dGhpcy5mb3JtYXRQYXRoKHtcbiAgICAgIHR5cGU6ICdmbG9hdGluZycsXG4gICAgICBpbmRleCxcbiAgICAgIHNlZ21lbnRzOiBbXSxcbiAgICB9KX1cIl1gO1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmZsb2F0aW5nTGF5ZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihzZWxlY3Rvcik7XG4gICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGVFbCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLWZsb2F0aW5nX190aXRsZScpO1xuICAgIGlmICghdGl0bGVFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0aGlzLmdldEZsb2F0aW5nV2luZG93VGl0bGUoZmxvYXRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTcGxpdChcbiAgICBub2RlOiBEb2NrU3BsaXROb2RlLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIGZsb2F0aW5nSW5kZXg/OiBudW1iZXIsXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkb2NrLXNwbGl0Jyk7XG4gICAgY29udGFpbmVyLmRhdGFzZXRbJ2RpcmVjdGlvbiddID0gbm9kZS5kaXJlY3Rpb247XG4gICAgY29udGFpbmVyLmRhdGFzZXRbJ3BhdGgnXSA9IHBhdGguam9pbignLycpO1xuXG4gICAgY29uc3Qgc2l6ZXMgPSBBcnJheS5pc0FycmF5KG5vZGUuc2l6ZXMpID8gbm9kZS5zaXplcyA6IFtdO1xuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZFdyYXBwZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2hpbGRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3BsaXRfX2NoaWxkJyk7XG4gICAgICBjaGlsZFdyYXBwZXIuZGF0YXNldFsnaW5kZXgnXSA9IFN0cmluZyhpbmRleCk7XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzaXplc1tpbmRleF07XG4gICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShzaXplKSkge1xuICAgICAgICBjaGlsZFdyYXBwZXIuc3R5bGUuZmxleCA9IGAke01hdGgubWF4KHNpemUsIDApfSAxIDBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRXcmFwcGVyLnN0eWxlLmZsZXggPSAnMSAxIDAnO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFdyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJOb2RlKGNoaWxkLCBbLi4ucGF0aCwgaW5kZXhdLCBmbG9hdGluZ0luZGV4KSk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hpbGRXcmFwcGVyKTtcblxuICAgICAgaWYgKGluZGV4IDwgbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGRpdmlkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3BsaXRfX2RpdmlkZXInKTtcbiAgICAgICAgZGl2aWRlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc2VwYXJhdG9yJyk7XG4gICAgICAgIGRpdmlkZXIudGFiSW5kZXggPSAwO1xuICAgICAgICAvLyBUYWcgZGl2aWRlciB3aXRoIG1ldGFkYXRhIGZvciBpbnRlcnNlY3Rpb24gZGV0ZWN0aW9uXG4gICAgICAgIGNvbnN0IGRpdmlkZXJQYXRoOiBEb2NrUGF0aCA9XG4gICAgICAgICAgdHlwZW9mIGZsb2F0aW5nSW5kZXggPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IGZsb2F0aW5nSW5kZXgsIHNlZ21lbnRzOiBbLi4ucGF0aF0gfVxuICAgICAgICAgICAgOiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50czogWy4uLnBhdGhdIH07XG4gICAgICAgIGRpdmlkZXIuZGF0YXNldFsncGF0aCddID0gdGhpcy5mb3JtYXRQYXRoKGRpdmlkZXJQYXRoKTtcbiAgICAgICAgZGl2aWRlci5kYXRhc2V0WydpbmRleCddID0gU3RyaW5nKGluZGV4KTtcbiAgICAgICAgZGl2aWRlci5kYXRhc2V0WydvcmllbnRhdGlvbiddID0gbm9kZS5kaXJlY3Rpb247XG4gICAgICAgIGRpdmlkZXIuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5iZWdpblJlc2l6ZShcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZmxvYXRpbmdJbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleDogZmxvYXRpbmdJbmRleCwgc2VnbWVudHM6IFsuLi5wYXRoXSB9XG4gICAgICAgICAgICAgIDogeyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFsuLi5wYXRoXSB9LFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU3RhY2soXG4gICAgbm9kZTogRG9ja1N0YWNrTm9kZSxcbiAgICBwYXRoOiBudW1iZXJbXSxcbiAgICBmbG9hdGluZ0luZGV4PzogbnVtYmVyLFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0YWNrLmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2snKTtcbiAgICBjb25zdCBsb2NhdGlvbjogRG9ja1BhdGggPVxuICAgICAgdHlwZW9mIGZsb2F0aW5nSW5kZXggPT09ICdudW1iZXInXG4gICAgICAgID8geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleDogZmxvYXRpbmdJbmRleCwgc2VnbWVudHM6IFsuLi5wYXRoXSB9XG4gICAgICAgIDogeyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFsuLi5wYXRoXSB9O1xuICAgIHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSA9IHRoaXMuZm9ybWF0UGF0aChsb2NhdGlvbik7XG5cbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19oZWFkZXInKTtcbiAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2RvY2stc3RhY2tfX2NvbnRlbnQnKTtcblxuICAgIGNvbnN0IHBhbmVzID0gQXJyYXkuZnJvbShuZXcgU2V0KG5vZGUucGFuZXMpKTtcbiAgICBpZiAocGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBlbXB0eSA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlbXB0eS5jbGFzc0xpc3QuYWRkKCdkb2NrLXN0YWNrX19wYW5lJyk7XG4gICAgICBlbXB0eS50ZXh0Q29udGVudCA9ICdObyBwYW5lcyBjb25maWd1cmVkJztcbiAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuICAgICAgc3RhY2suYXBwZW5kKGhlYWRlciwgY29udGVudCk7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlUGFuZSA9IHBhbmVzLmluY2x1ZGVzKG5vZGUuYWN0aXZlUGFuZSA/PyAnJylcbiAgICAgID8gbm9kZS5hY3RpdmVQYW5lIVxuICAgICAgOiBwYW5lc1swXTtcblxuICAgIGNvbnN0IGJhc2VTbHVnID0gcGF0aC5sZW5ndGggPyBwYXRoLmpvaW4oJy0nKSA6ICdyb290JztcbiAgICBjb25zdCBwYXRoU2x1ZyA9XG4gICAgICB0eXBlb2YgZmxvYXRpbmdJbmRleCA9PT0gJ251bWJlcicgPyBgZiR7ZmxvYXRpbmdJbmRleH0tJHtiYXNlU2x1Z31gIDogYmFzZVNsdWc7XG4gICAgcGFuZXMuZm9yRWFjaCgocGFuZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHBhbmVTbHVnUmF3ID0gcGFuZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJy0nKTtcbiAgICAgIGNvbnN0IHBhbmVTbHVnID0gcGFuZVNsdWdSYXcubGVuZ3RoID4gMCA/IHBhbmVTbHVnUmF3IDogJ3BhbmUnO1xuICAgICAgY29uc3QgdGFiSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LXRhYi0ke3BhdGhTbHVnfS0ke3BhbmVTbHVnfWA7XG4gICAgICBjb25zdCBwYW5lbElkID0gYCR7dGhpcy5pbnN0YW5jZUlkfS1wYW5lbC0ke3BhdGhTbHVnfS0ke3BhbmVTbHVnfWA7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZG9jdW1lbnRSZWYuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2RvY2stdGFiJyk7XG4gICAgICBidXR0b24uZGF0YXNldFsncGFuZSddID0gcGFuZU5hbWU7XG4gICAgICBidXR0b24uaWQgPSB0YWJJZDtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IHRoaXMudGl0bGVzW3BhbmVOYW1lXSA/PyBwYW5lTmFtZTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFiJyk7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgcGFuZWxJZCk7XG4gICAgICBpZiAocGFuZU5hbWUgPT09IGFjdGl2ZVBhbmUpIHtcbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2RvY2stdGFiLS1hY3RpdmUnKTtcbiAgICAgIH1cbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBTdHJpbmcocGFuZU5hbWUgPT09IGFjdGl2ZVBhbmUpKTtcbiAgICAgIGJ1dHRvbi5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YWNrRWwgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrJyk7XG4gICAgICAgIHRoaXMuY2FwdHVyZVRhYkRyYWdNZXRyaWNzKGV2ZW50LCBzdGFja0VsID8/IG51bGwpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsICgpID0+IHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsICgpID0+IHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YWNrRWwgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrJyk7XG4gICAgICAgIHRoaXMuYmVnaW5QYW5lRHJhZyhldmVudCwgdGhpcy5jbG9uZVBhdGgobG9jYXRpb24pLCBwYW5lTmFtZSwgc3RhY2tFbCA/PyBudWxsKTtcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVQYW5lKHN0YWNrLCBwYW5lTmFtZSwgdGhpcy5jbG9uZVBhdGgobG9jYXRpb24pKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnZG9jay1wYW5lLWFjdGl2YXRlZCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBwYW5lOiBwYW5lTmFtZSB9LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgY29uc3QgcGFuZUhvc3QgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcGFuZUhvc3QuY2xhc3NMaXN0LmFkZCgnZG9jay1zdGFja19fcGFuZScpO1xuICAgICAgcGFuZUhvc3QuZGF0YXNldFsncGFuZSddID0gcGFuZU5hbWU7XG4gICAgICBwYW5lSG9zdC5pZCA9IHBhbmVsSWQ7XG4gICAgICBwYW5lSG9zdC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFicGFuZWwnKTtcbiAgICAgIHBhbmVIb3N0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGFiSWQpO1xuICAgICAgaWYgKHBhbmVOYW1lICE9PSBhY3RpdmVQYW5lKSB7XG4gICAgICAgIHBhbmVIb3N0LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzbG90RWwgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKTtcbiAgICAgIHNsb3RFbC5uYW1lID0gcGFuZU5hbWU7XG4gICAgICBwYW5lSG9zdC5hcHBlbmRDaGlsZChzbG90RWwpO1xuICAgICAgY29udGVudC5hcHBlbmRDaGlsZChwYW5lSG9zdCk7XG4gICAgfSk7XG5cbiAgICBzdGFjay5kYXRhc2V0WydhY3RpdmVQYW5lJ10gPSBhY3RpdmVQYW5lO1xuICAgIHN0YWNrLmFwcGVuZChoZWFkZXIsIGNvbnRlbnQpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5SZXNpemUoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHBhdGg6IERvY2tQYXRoLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZGl2aWRlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZGl2aWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gKGNvbnRhaW5lci5kYXRhc2V0WydkaXJlY3Rpb24nXSBhcyAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnKSA/PyAnaG9yaXpvbnRhbCc7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgIGNvbnN0IGluaXRpYWxTaXplcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcmVjdC53aWR0aCA6IHJlY3QuaGVpZ2h0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgYmVmb3JlU2l6ZSA9IGluaXRpYWxTaXplc1tpbmRleF07XG4gICAgY29uc3QgYWZ0ZXJTaXplID0gaW5pdGlhbFNpemVzW2luZGV4ICsgMV07XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkaXZpZGVyLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgZGl2aWRlci5kYXRhc2V0WydyZXNpemluZyddID0gJ3RydWUnO1xuICAgIHRoaXMucmVzaXplU3RhdGUgPSB7XG4gICAgICBwYXRoOiB0aGlzLmNsb25lUGF0aChwYXRoKSxcbiAgICAgIGluZGV4LFxuICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRpdmlkZXIsXG4gICAgICBzdGFydFBvcyxcbiAgICAgIGluaXRpYWxTaXplcyxcbiAgICAgIGJlZm9yZVNpemUsXG4gICAgICBhZnRlclNpemUsXG4gICAgfTtcblxuICAgIHRoaXMuc3RhcnRQb2ludGVyVHJhY2tpbmcoKTtcbiAgICAvLyBDb21wdXRlIGxvY2FsaXplZCBzbmFwIHRhcmdldHM6IGludGVyc2VjdGlvbnMgd2l0aCBwZXJwZW5kaWN1bGFyIGRpdmlkZXJzIG5lYXIgdGhpcyBkaXZpZGVyXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5yb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBkaXZpZGVyUmVjdCA9IGRpdmlkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBhbGxEaXZpZGVycyA9IEFycmF5LmZyb20oXG4gICAgICAgIHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXNwbGl0X19kaXZpZGVyJykgPz8gW10sXG4gICAgICApO1xuICAgICAgY29uc3QgdGFyZ2V0czogbnVtYmVyW10gPSBbXTtcbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgYmFyIGlzIHZlcnRpY2FsIOKGkiBzbmFwIFggdG8gY2VudGVycyBvZiBvdGhlciB2ZXJ0aWNhbCBiYXJzIChubyBjcm9zc2luZyBjaGVjayBuZWVkZWQpXG4gICAgICAgIGFsbERpdmlkZXJzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsID09PSBkaXZpZGVyKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbyA9IChlbC5kYXRhc2V0WydvcmllbnRhdGlvbiddIGFzICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgfCB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobyAhPT0gJ2hvcml6b250YWwnKSByZXR1cm47IC8vIHZlcnRpY2FsIGRpdmlkZXIgYmFycyAoc3BsaXQgZGlyZWN0aW9uIGhvcml6b250YWwpXG4gICAgICAgICAgY29uc3QgciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIGNvbnN0IHhDZW50ZXIgPSByLmxlZnQgKyByLndpZHRoIC8gMiAtIHJvb3RSZWN0LmxlZnQ7XG4gICAgICAgICAgdGFyZ2V0cy5wdXNoKHhDZW50ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmVTbmFwQXhpcyA9ICd4JztcbiAgICAgICAgdGhpcy5hY3RpdmVTbmFwVGFyZ2V0cyA9IHRhcmdldHM7XG4gICAgICAgIHRoaXMucmVuZGVyU25hcE1hcmtlcnNGb3JEaXZpZGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDdXJyZW50IGJhciBpcyBob3Jpem9udGFsIOKGkiBzbmFwIFkgdG8gY2VudGVycyBvZiBvdGhlciBob3Jpem9udGFsIGJhcnMgKG5vIGNyb3NzaW5nIGNoZWNrIG5lZWRlZClcbiAgICAgICAgYWxsRGl2aWRlcnMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICBpZiAoZWwgPT09IGRpdmlkZXIpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0gKGVsLmRhdGFzZXRbJ29yaWVudGF0aW9uJ10gYXMgJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyB8IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChvICE9PSAndmVydGljYWwnKSByZXR1cm47IC8vIGhvcml6b250YWwgZGl2aWRlciBiYXJzIChzcGxpdCBkaXJlY3Rpb24gdmVydGljYWwpXG4gICAgICAgICAgY29uc3QgciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIGNvbnN0IHlDZW50ZXIgPSByLnRvcCArIHIuaGVpZ2h0IC8gMiAtIHJvb3RSZWN0LnRvcDtcbiAgICAgICAgICB0YXJnZXRzLnB1c2goeUNlbnRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2ZVNuYXBBeGlzID0gJ3knO1xuICAgICAgICB0aGlzLmFjdGl2ZVNuYXBUYXJnZXRzID0gdGFyZ2V0cztcbiAgICAgICAgdGhpcy5yZW5kZXJTbmFwTWFya2Vyc0ZvckRpdmlkZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYWN0aXZlU25hcEF4aXMgPSBudWxsO1xuICAgICAgdGhpcy5hY3RpdmVTbmFwVGFyZ2V0cyA9IFtdO1xuICAgICAgdGhpcy5jbGVhclNuYXBNYXJrZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3JuZXJSZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuY29ybmVyUmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvcm5lclJlc2l6ZU1vdmUoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMucmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVzaXplU3RhdGU7XG4gICAgICBjb25zdCBzcGxpdE5vZGUgPSB0aGlzLnJlc29sdmVTcGxpdE5vZGUoc3RhdGUucGF0aCk7XG4gICAgICBpZiAoIXNwbGl0Tm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBjdXJyZW50UG9zID0gc3RhdGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgICAgLy8gTG9jYWxpemVkIGF4aXMgc25hcCBuZWFyIG5laWdoYm9yaW5nIGludGVyc2VjdGlvbnNcbiAgICAgIGNvbnN0IHRvbCA9IDEwO1xuICAgICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLnJvb3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVNuYXBUYXJnZXRzLmxlbmd0aCkge1xuICAgICAgICBpZiAoc3RhdGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyAmJiB0aGlzLmFjdGl2ZVNuYXBBeGlzID09PSAneCcpIHtcbiAgICAgICAgICAvLyBWZXJ0aWNhbCBkaXZpZGVyIHNuYXBwaW5nIGFsb25nIFhcbiAgICAgICAgICBsZXQgY2xvc2VzdCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgICBsZXQgYmVzdCA9IGN1cnJlbnRQb3M7XG4gICAgICAgICAgY29uc3QgcG9pbnRlclggPSBldmVudC5jbGllbnRYO1xuICAgICAgICAgIHRoaXMuYWN0aXZlU25hcFRhcmdldHMuZm9yRWFjaCgoc3gpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHB4ID0gcm9vdFJlY3QubGVmdCArIHN4O1xuICAgICAgICAgICAgY29uc3QgZCA9IE1hdGguYWJzKHBvaW50ZXJYIC0gcHgpO1xuICAgICAgICAgICAgaWYgKGQgPCBjbG9zZXN0KSB7IGNsb3Nlc3QgPSBkOyBiZXN0ID0gcHg7IH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoY2xvc2VzdCA8PSB0b2wpIGN1cnJlbnRQb3MgPSBiZXN0O1xuICAgICAgICAgIHRoaXMucmVuZGVyU25hcE1hcmtlcnNGb3JEaXZpZGVyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiYgdGhpcy5hY3RpdmVTbmFwQXhpcyA9PT0gJ3knKSB7XG4gICAgICAgICAgLy8gSG9yaXpvbnRhbCBkaXZpZGVyIHNuYXBwaW5nIGFsb25nIFlcbiAgICAgICAgICBsZXQgY2xvc2VzdCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgICBsZXQgYmVzdCA9IGN1cnJlbnRQb3M7XG4gICAgICAgICAgY29uc3QgcG9pbnRlclkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICAgIHRoaXMuYWN0aXZlU25hcFRhcmdldHMuZm9yRWFjaCgoc3kpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHB5ID0gcm9vdFJlY3QudG9wICsgc3k7XG4gICAgICAgICAgICBjb25zdCBkID0gTWF0aC5hYnMocG9pbnRlclkgLSBweSk7XG4gICAgICAgICAgICBpZiAoZCA8IGNsb3Nlc3QpIHsgY2xvc2VzdCA9IGQ7IGJlc3QgPSBweTsgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChjbG9zZXN0IDw9IHRvbCkgY3VycmVudFBvcyA9IGJlc3Q7XG4gICAgICAgICAgdGhpcy5yZW5kZXJTbmFwTWFya2Vyc0ZvckRpdmlkZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZGVsdGEgPSBjdXJyZW50UG9zIC0gc3RhdGUuc3RhcnRQb3M7XG4gICAgICBjb25zdCBtaW5TaXplID0gNDg7XG4gICAgICBjb25zdCBwYWlyVG90YWwgPSBzdGF0ZS5iZWZvcmVTaXplICsgc3RhdGUuYWZ0ZXJTaXplO1xuXG4gICAgICBsZXQgbmV3QmVmb3JlID0gc3RhdGUuYmVmb3JlU2l6ZSArIGRlbHRhO1xuICAgICAgLy8gT3B0aW9uYWwgc25hcCB3aXRoIFNoaWZ0XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgcGFpclRvdGFsID4gMCkge1xuICAgICAgICBjb25zdCByYXRpb3MgPSBbMSAvIDMsIDEgLyAyLCAyIC8gM107XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ld0JlZm9yZSAvIHBhaXJUb3RhbDtcbiAgICAgICAgbGV0IGJlc3QgPSByYXRpb3NbMF07XG4gICAgICAgIGxldCBiZXN0RGlzdCA9IE1hdGguYWJzKHRhcmdldCAtIGJlc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJhdGlvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGQgPSBNYXRoLmFicyh0YXJnZXQgLSByYXRpb3NbaV0pO1xuICAgICAgICAgIGlmIChkIDwgYmVzdERpc3QpIHtcbiAgICAgICAgICAgIGJlc3QgPSByYXRpb3NbaV07XG4gICAgICAgICAgICBiZXN0RGlzdCA9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0JlZm9yZSA9IGJlc3QgKiBwYWlyVG90YWw7XG4gICAgICB9XG5cbiAgICAgIG5ld0JlZm9yZSA9IE1hdGgubWluKE1hdGgubWF4KG5ld0JlZm9yZSwgbWluU2l6ZSksIHBhaXJUb3RhbCAtIG1pblNpemUpO1xuICAgICAgbGV0IG5ld0FmdGVyID0gcGFpclRvdGFsIC0gbmV3QmVmb3JlO1xuXG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuZXdCZWZvcmUpIHx8ICFOdW1iZXIuaXNGaW5pdGUobmV3QWZ0ZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0FmdGVyIDwgbWluU2l6ZSkge1xuICAgICAgICBuZXdBZnRlciA9IG1pblNpemU7XG4gICAgICAgIG5ld0JlZm9yZSA9IHBhaXJUb3RhbCAtIG1pblNpemU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1NpemVzUGl4ZWxzID0gWy4uLnN0YXRlLmluaXRpYWxTaXplc107XG4gICAgICBuZXdTaXplc1BpeGVsc1tzdGF0ZS5pbmRleF0gPSBuZXdCZWZvcmU7XG4gICAgICBuZXdTaXplc1BpeGVsc1tzdGF0ZS5pbmRleCArIDFdID0gbmV3QWZ0ZXI7XG5cbiAgICAgIGNvbnN0IHRvdGFsID0gbmV3U2l6ZXNQaXhlbHMucmVkdWNlKChhY2MsIHNpemUpID0+IGFjYyArIHNpemUsIDApO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRvdGFsID4gMCA/IG5ld1NpemVzUGl4ZWxzLm1hcCgoc2l6ZSkgPT4gc2l6ZSAvIHRvdGFsKSA6IFtdO1xuXG4gICAgICBzcGxpdE5vZGUuc2l6ZXMgPSBub3JtYWxpemVkO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKHN0YXRlLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlID4gLmRvY2stc3BsaXRfX2NoaWxkJykpO1xuICAgICAgbm9ybWFsaXplZC5mb3JFYWNoKChzaXplLCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2lkeF0pIHtcbiAgICAgICAgICBjaGlsZHJlbltpZHhdLnN0eWxlLmZsZXggPSBgJHtNYXRoLm1heChzaXplLCAwKX0gMSAwYDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLmZsb2F0aW5nUmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmhhbmRsZUZsb2F0aW5nUmVzaXplTW92ZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmdEcmFnU3RhdGUgJiYgZXZlbnQucG9pbnRlcklkID09PSB0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlLnBvaW50ZXJJZCkge1xuICAgICAgdGhpcy5oYW5kbGVGbG9hdGluZ0RyYWdNb3ZlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlclVwKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3JuZXJSZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuY29ybmVyUmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICB0aGlzLmVuZENvcm5lclJlc2l6ZShldmVudC5wb2ludGVySWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMucmVzaXplU3RhdGUucG9pbnRlcklkKSB7XG4gICAgICBjb25zdCBkaXZpZGVyID0gdGhpcy5yZXNpemVTdGF0ZS5kaXZpZGVyO1xuICAgICAgZGl2aWRlci5kYXRhc2V0WydyZXNpemluZyddID0gJ2ZhbHNlJztcbiAgICAgIGRpdmlkZXIucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHRoaXMucmVzaXplU3RhdGUucG9pbnRlcklkKTtcbiAgICAgIHRoaXMucmVzaXplU3RhdGUgPSBudWxsO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlbmRlckludGVyc2VjdGlvbkhhbmRsZXMoKTtcbiAgICAgIHRoaXMuYWN0aXZlU25hcEF4aXMgPSBudWxsO1xuICAgICAgdGhpcy5hY3RpdmVTbmFwVGFyZ2V0cyA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsb2F0aW5nRHJhZ1N0YXRlICYmIGV2ZW50LnBvaW50ZXJJZCA9PT0gdGhpcy5mbG9hdGluZ0RyYWdTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHRoaXMuZW5kRmxvYXRpbmdEcmFnKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZSAmJiBldmVudC5wb2ludGVySWQgPT09IHRoaXMuZmxvYXRpbmdSZXNpemVTdGF0ZS5wb2ludGVySWQpIHtcbiAgICAgIHRoaXMuZW5kRmxvYXRpbmdSZXNpemUoZXZlbnQucG9pbnRlcklkKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BQb2ludGVyVHJhY2tpbmdJZklkbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FwdHVyZVRhYkRyYWdNZXRyaWNzKGV2ZW50OiBQb2ludGVyRXZlbnQsIHN0YWNrRWw6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghc3RhY2tFbCkge1xuICAgICAgdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3MgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WSkpIHtcbiAgICAgIHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgc3RhY2tSZWN0ID0gc3RhY2tFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHN0YWNrUmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHN0YWNrUmVjdC50b3A7XG4gICAgY29uc3QgbGVmdCA9IHN0YWNrUmVjdC5sZWZ0IC0gaG9zdFJlY3QubGVmdDtcbiAgICBjb25zdCB0b3AgPSBzdGFja1JlY3QudG9wIC0gaG9zdFJlY3QudG9wO1xuICAgIGNvbnN0IHdpZHRoID0gTnVtYmVyLmlzRmluaXRlKHN0YWNrUmVjdC53aWR0aCkgPyBzdGFja1JlY3Qud2lkdGggOiAwO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3QuaGVpZ2h0KSA/IHN0YWNrUmVjdC5oZWlnaHQgOiAwO1xuXG4gICAgdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3MgPSB7XG4gICAgICBwb2ludGVyT2Zmc2V0WCxcbiAgICAgIHBvaW50ZXJPZmZzZXRZLFxuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgc3RhcnRDbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRDbGllbnRZOiBldmVudC5jbGllbnRZLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk6IHZvaWQge1xuICAgIHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5QYW5lRHJhZyhcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICAgIHBhdGg6IERvY2tQYXRoLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBzdGFja0VsOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICk6IHZvaWQge1xuICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgZ2hvc3QgZWxlbWVudCBmb3IgdGhlIGRyYWcgaW1hZ2UuIFRoaXMgcHJldmVudHMgdGhlIGJyb3dzZXIgZnJvbSBjYW5jZWxsaW5nXG4gICAgLy8gdGhlIGRyYWcgb3BlcmF0aW9uIHdoZW4gdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gZHVyaW5nIHJlLXJlbmRlci5cbiAgICBjb25zdCBnaG9zdCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZ2hvc3Quc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGdob3N0LnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZ2hvc3Quc3R5bGUudG9wID0gJy05OTk5cHgnO1xuICAgIGdob3N0LnN0eWxlLndpZHRoID0gYCR7KGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRofXB4YDtcbiAgICBnaG9zdC5zdHlsZS5oZWlnaHQgPSBgJHsoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFwcGVuZENoaWxkKGdob3N0KTtcblxuICAgIC8vIFVzZSB0aGUgZ2hvc3QgZWxlbWVudCBhcyB0aGUgZHJhZyBpbWFnZS5cbiAgICAvLyBUaGUgb2Zmc2V0IGlzIHNldCB0byB3aGVyZSB0aGUgdXNlcidzIGN1cnNvciBpcyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudC5cbiAgICBjb25zdCBkcmFnSW1nT2Zmc2V0WCA9IE51bWJlci5pc0Zpbml0ZSgoZXZlbnQgYXMgYW55KS5vZmZzZXRYKSA/IChldmVudCBhcyBhbnkpLm9mZnNldFggOiAwO1xuICAgIGNvbnN0IGRyYWdJbWdPZmZzZXRZID0gTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFkpID8gKGV2ZW50IGFzIGFueSkub2Zmc2V0WSA6IDA7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShnaG9zdCwgZHJhZ0ltZ09mZnNldFgsIGRyYWdJbWdPZmZzZXRZKTtcblxuICAgIC8vIFRoZSBnaG9zdCBlbGVtZW50IGlzIG5vIGxvbmdlciBuZWVkZWQgYWZ0ZXIgdGhlIGRyYWcgaW1hZ2UgaXMgc2V0LlxuICAgIC8vIFdlIGRlZmVyIGl0cyByZW1vdmFsIHRvIGVuc3VyZSB0aGUgYnJvd3NlciBoYXMgY2FwdHVyZWQgaXQuXG4gICAgc2V0VGltZW91dCgoKSA9PiBnaG9zdC5yZW1vdmUoKSwgMCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBwYXRoOiBzb3VyY2VQYXRoLFxuICAgICAgZmxvYXRpbmdJbmRleCxcbiAgICAgIHBvaW50ZXJPZmZzZXRYLFxuICAgICAgcG9pbnRlck9mZnNldFksXG4gICAgfSA9IHRoaXMucHJlcGFyZVBhbmVEcmFnU291cmNlKHBhdGgsIHBhbmUsIHN0YWNrRWwsIGV2ZW50KTtcblxuICAgIC8vIENhcHR1cmUgaGVhZGVyIGJvdW5kcyBmb3IgZGV0ZWN0aW5nIHdoZW4gdG8gY29udmVydCB0byBmbG9hdGluZ1xuICAgIGNvbnN0IGhlYWRlckVsID0gc3RhY2tFbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrX19oZWFkZXInKSA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlclJlY3QgPSBoZWFkZXJFbCA/IGhlYWRlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICBjb25zdCBoZWFkZXJCb3VuZHMgPSBoZWFkZXJSZWN0XG4gICAgICA/IHsgbGVmdDogaGVhZGVyUmVjdC5sZWZ0LCB0b3A6IGhlYWRlclJlY3QudG9wLCByaWdodDogaGVhZGVyUmVjdC5yaWdodCwgYm90dG9tOiBoZWFkZXJSZWN0LmJvdHRvbSB9XG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMucGVuZGluZ1RhYkRyYWdNZXRyaWNzO1xuXG4gICAgdGhpcy5kcmFnU3RhdGUgPSB7XG4gICAgICBwYW5lLFxuICAgICAgc291cmNlUGF0aDogdGhpcy5jbG9uZVBhdGgoc291cmNlUGF0aCksXG4gICAgICBmbG9hdGluZ0luZGV4LFxuICAgICAgcG9pbnRlck9mZnNldFgsXG4gICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICAgIGRyb3BIYW5kbGVkOiBmYWxzZSxcbiAgICAgIHNvdXJjZVN0YWNrRWw6IHN0YWNrRWwsXG4gICAgICBzb3VyY2VIZWFkZXJCb3VuZHM6IGhlYWRlckJvdW5kcyxcbiAgICAgIHN0YXJ0Q2xpZW50WDpcbiAgICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5zdGFydENsaWVudFgpXG4gICAgICAgICAgPyBtZXRyaWNzLnN0YXJ0Q2xpZW50WFxuICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpXG4gICAgICAgICAgPyBldmVudC5jbGllbnRYXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzdGFydENsaWVudFk6XG4gICAgICAgIG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3Muc3RhcnRDbGllbnRZKVxuICAgICAgICAgID8gbWV0cmljcy5zdGFydENsaWVudFlcbiAgICAgICAgICA6IE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKVxuICAgICAgICAgID8gZXZlbnQuY2xpZW50WVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgLy8gU2VlZCBsYXN0IGtub3duIHBvaW50ZXIgcG9zaXRpb24gZnJvbSBwb2ludGVyZG93biBtZXRyaWNzIHRvIGF2b2lkICgwLDApIGdsaXRjaGVzIGluIEZpcmVmb3hcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE51bWJlci5pc0Zpbml0ZSh0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUodGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZKVxuICAgICkge1xuICAgICAgdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRYIGFzIG51bWJlcixcbiAgICAgICAgeTogdGhpcy5kcmFnU3RhdGUuc3RhcnRDbGllbnRZIGFzIG51bWJlcixcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIFByZWZlciB0aGUgcG9pbnRlciBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGRyYWdnZWQgdGFiIHRvIGF2b2lkIGp1bXBzIG9uIGNvbnZlcnNpb25cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFgpKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wb2ludGVyT2Zmc2V0WCA9IChldmVudCBhcyBhbnkpLm9mZnNldFggYXMgbnVtYmVyO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBhbnkpLm9mZnNldFkpKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wb2ludGVyT2Zmc2V0WSA9IChldmVudCBhcyBhbnkpLm9mZnNldFkgYXMgbnVtYmVyO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnN0YXJ0RHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJywgcGFuZSk7XG5cbiAgICAvLyBQcmVmZXJyZWQgVVg6IGlmIHRoZSBkcmFnZ2VkIHRhYiBpcyB0aGUgb25seSBvbmUgaW4gaXRzIHN0YWNrLFxuICAgIC8vIGltbWVkaWF0ZWx5IGNvbnZlcnQgdG8gYSBmbG9hdGluZyB3aW5kb3cgdW5sZXNzIGl0IGlzIGFscmVhZHkgdGhlXG4gICAgLy8gb25seSBwYW5lIGluIGEgZmxvYXRpbmcgd2luZG93ICh0aGlzIGNhc2UgaXMgaGFuZGxlZCBieSByZXVzZSBsb2dpYykuXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlICYmIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDApIHtcbiAgICAgIGNvbnN0IGxvYyA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24odGhpcy5kcmFnU3RhdGUuc291cmNlUGF0aCk7XG4gICAgICBpZiAobG9jICYmIEFycmF5LmlzQXJyYXkobG9jLm5vZGUucGFuZXMpICYmIGxvYy5ub2RlLnBhbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBsZXQgc2hvdWxkQ29udmVydCA9IGZhbHNlO1xuICAgICAgICBpZiAobG9jLmNvbnRleHQgPT09IFwiZG9ja2VkXCIpIHtcbiAgICAgICAgICBzaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2MuY29udGV4dCA9PT0gXCJmbG9hdGluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgZmxvYXRpbmcgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tsb2MuaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHRvdGFsUGFuZXMgPSBmbG9hdGluZyAmJiBmbG9hdGluZy5yb290ID8gdGhpcy5jb3VudFBhbmVzSW5UcmVlKGZsb2F0aW5nLnJvb3QpIDogMDtcbiAgICAgICAgICBzaG91bGRDb252ZXJ0ID0gdG90YWxQYW5lcyA+IDE7IC8vIG5vdCB0aGUgb25seSBwYW5lIGluIHRoaXMgZmxvYXRpbmcgd2luZG93XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZENvbnZlcnQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydFggPSBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgPyBldmVudC5jbGllbnRYIDogKHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WCA/PyAwKTtcbiAgICAgICAgICBjb25zdCBzdGFydFkgPSBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WSkgPyBldmVudC5jbGllbnRZIDogKHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNvbnZlcnRQZW5kaW5nVGFiRHJhZ1RvRmxvYXRpbmcoc3RhcnRYLCBzdGFydFkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUGFuZURyYWdTb3VyY2UoXG4gICAgcGF0aDogRG9ja1BhdGgsXG4gICAgcGFuZTogc3RyaW5nLFxuICAgIHN0YWNrRWw6IEhUTUxFbGVtZW50IHwgbnVsbCxcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICApOiB7IHBhdGg6IERvY2tQYXRoOyBmbG9hdGluZ0luZGV4OiBudW1iZXIgfCBudWxsOyBwb2ludGVyT2Zmc2V0WDogbnVtYmVyOyBwb2ludGVyT2Zmc2V0WTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoKTtcbiAgICBpZiAoIWxvY2F0aW9uIHx8ICFsb2NhdGlvbi5ub2RlLnBhbmVzLmluY2x1ZGVzKHBhbmUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoLFxuICAgICAgICBmbG9hdGluZ0luZGV4OiBudWxsLFxuICAgICAgICBwb2ludGVyT2Zmc2V0WDogMCxcbiAgICAgICAgcG9pbnRlck9mZnNldFk6IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5wZW5kaW5nVGFiRHJhZ01ldHJpY3M7XG5cbiAgICBjb25zdCBkb21IYXNTaWJsaW5nID1cbiAgICAgICEhc3RhY2tFbCAmJlxuICAgICAgQXJyYXkuZnJvbShzdGFja0VsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWInKSkuc29tZShcbiAgICAgICAgKGJ1dHRvbikgPT4gYnV0dG9uLmRhdGFzZXRbJ3BhbmUnXSAmJiBidXR0b24uZGF0YXNldFsncGFuZSddICE9PSBwYW5lLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGhhc1NpYmxpbmdJblN0YWNrID0gbG9jYXRpb24ubm9kZS5wYW5lcy5zb21lKChleGlzdGluZykgPT4gZXhpc3RpbmcgIT09IHBhbmUpO1xuICAgIGNvbnN0IGZsb2F0aW5nID0gbG9jYXRpb24uY29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XSA6IG51bGw7XG4gICAgY29uc3QgZmxvYXRpbmdQYW5lQ291bnQgPVxuICAgICAgZmxvYXRpbmcgJiYgZmxvYXRpbmcucm9vdCA/IHRoaXMuY291bnRQYW5lc0luVHJlZShmbG9hdGluZy5yb290KSA6IGhhc1NpYmxpbmdJblN0YWNrID8gMiA6IDE7XG4gICAgY29uc3Qgc2hvdWxkUmV1c2VFeGlzdGluZ1dpbmRvdyA9XG4gICAgICBsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnICYmXG4gICAgICAhIWZsb2F0aW5nICYmXG4gICAgICAhaGFzU2libGluZ0luU3RhY2sgJiZcbiAgICAgICFkb21IYXNTaWJsaW5nICYmXG4gICAgICBmbG9hdGluZ1BhbmVDb3VudCA8PSAxO1xuXG4gICAgaWYgKHNob3VsZFJldXNlRXhpc3RpbmdXaW5kb3cpIHtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgICAgdGhpcy51cGRhdGVGbG9hdGluZ1dpbmRvd1RpdGxlKGxvY2F0aW9uLmluZGV4KTtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZ2V0RmxvYXRpbmdXcmFwcGVyKGxvY2F0aW9uLmluZGV4KTtcbiAgICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgICB0aGlzLnByb21vdGVGbG9hdGluZ1BhbmUobG9jYXRpb24uaW5kZXgsIHdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgcG9pbnRlck9mZnNldFggPVxuICAgICAgICAgIG1ldHJpY3MgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WCkgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5sZWZ0KSAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy5ib3VuZHMubGVmdClcbiAgICAgICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WCArIChtZXRyaWNzLmxlZnQgLSBmbG9hdGluZy5ib3VuZHMubGVmdClcbiAgICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZShmbG9hdGluZy5ib3VuZHMubGVmdClcbiAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WCAtIGhvc3RSZWN0LmxlZnQgLSBmbG9hdGluZy5ib3VuZHMubGVmdFxuICAgICAgICAgICAgOiBmbG9hdGluZy5ib3VuZHMud2lkdGggLyAyO1xuICAgICAgICBjb25zdCBwb2ludGVyT2Zmc2V0WSA9XG4gICAgICAgICAgbWV0cmljcyAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRZKSAmJlxuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnRvcCkgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuYm91bmRzLnRvcClcbiAgICAgICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WSArIChtZXRyaWNzLnRvcCAtIGZsb2F0aW5nLmJvdW5kcy50b3ApXG4gICAgICAgICAgICA6IE51bWJlci5pc0Zpbml0ZShldmVudC5jbGllbnRZKSAmJiBOdW1iZXIuaXNGaW5pdGUoZmxvYXRpbmcuYm91bmRzLnRvcClcbiAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WSAtIGhvc3RSZWN0LnRvcCAtIGZsb2F0aW5nLmJvdW5kcy50b3BcbiAgICAgICAgICAgIDogZmxvYXRpbmcuYm91bmRzLmhlaWdodCAvIDI7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBmbG9hdGluZ0luZGV4OiBsb2NhdGlvbi5pbmRleCxcbiAgICAgICAgICBwb2ludGVyT2Zmc2V0WCxcbiAgICAgICAgICBwb2ludGVyT2Zmc2V0WSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZsb2F0aW5nSW5kZXg6IG51bGwsXG4gICAgICAgIHBvaW50ZXJPZmZzZXRYOiAwLFxuICAgICAgICBwb2ludGVyT2Zmc2V0WTogMCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIERvIG5vdCBjb252ZXJ0IHRvIGZsb2F0aW5nIHlldDsgYWxsb3cgaW4taGVhZGVyIHJlb3JkZXJpbmcgZmlyc3QuXG4gICAgLy8gV2UgcmV0dXJuIHBsYWNlaG9sZGVyIHZhbHVlcyBhbmQgd2lsbCBjb252ZXJ0IG9uY2UgdGhlIHBvaW50ZXIgbGVhdmVzIHRoZSB0YWIgaGVhZGVyLlxuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYVmFsID1cbiAgICAgIG1ldHJpY3MgJiYgTnVtYmVyLmlzRmluaXRlKG1ldHJpY3MucG9pbnRlck9mZnNldFgpXG4gICAgICAgID8gbWV0cmljcy5wb2ludGVyT2Zmc2V0WFxuICAgICAgICA6IDA7XG4gICAgY29uc3QgcG9pbnRlck9mZnNldFlWYWwgPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WSlcbiAgICAgICAgPyBtZXRyaWNzLnBvaW50ZXJPZmZzZXRZXG4gICAgICAgIDogMDtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZmxvYXRpbmdJbmRleDogLTEsXG4gICAgICBwb2ludGVyT2Zmc2V0WDogcG9pbnRlck9mZnNldFhWYWwsXG4gICAgICBwb2ludGVyT2Zmc2V0WTogcG9pbnRlck9mZnNldFlWYWwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kUGFuZURyYWcoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclBlbmRpbmdEcmFnRW5kVGltZW91dCgpO1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgdGhpcy5kcmFnU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG4gICAgdGhpcy5zdG9wRHJhZ1BvaW50ZXJUcmFja2luZygpO1xuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSBudWxsO1xuICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmICFzdGF0ZS5kcm9wSGFuZGxlZCkge1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBLZWVwIGludGVybmFsIHBvaW50ZXIgdHJhY2tpbmcgdXAtdG8tZGF0ZS5cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgICB9XG5cbiAgICAvLyBTb21lIGJyb3dzZXJzIGludGVybWl0dGVudGx5IHJlcG9ydCAoMCwwKSBmb3IgZHJhZ292ZXIgY29vcmRpbmF0ZXMuXG4gICAgLy8gTWlycm9yIHRoZSByb2J1c3QgbG9naWMgdXNlZCBpbiBvbkRyb3A6IHByZWZlciBhY3R1YWwgZXZlbnQgY29vcmRpbmF0ZXNcbiAgICAvLyB3aGVuIHZhbGlkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBsYXN0IHRyYWNrZWQgcG9pbnRlciBwb3NpdGlvbi5cbiAgICBjb25zdCBwb2ludEZyb21FdmVudCA9XG4gICAgICBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpXG4gICAgICAgID8geyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgcG9pbnQgPVxuICAgICAgcG9pbnRGcm9tRXZlbnQgPz9cbiAgICAgICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uXG4gICAgICAgID8geyBjbGllbnRYOiB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uLngsIGNsaWVudFk6IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24ueSB9XG4gICAgICAgIDogbnVsbCk7XG5cbiAgICBjb25zdCBzdGFjayA9XG4gICAgICB0aGlzLmZpbmRTdGFja0VsZW1lbnQoZXZlbnQpID8/XG4gICAgICAocG9pbnQgPyB0aGlzLmZpbmRTdGFja0F0UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSkgOiBudWxsKTtcbiAgICBpZiAoIXN0YWNrKSB7XG4gICAgICBpZiAodGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddICE9PSAndHJ1ZScpIHtcbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhcnNlUGF0aChzdGFjay5kYXRhc2V0WydwYXRoJ10pO1xuICAgIC8vIFdoaWxlIHJlb3JkZXJpbmcgd2l0aGluIHRoZSBzYW1lIGhlYWRlciwgc3VwcHJlc3MgdGhlIGpveXN0aWNrL2luZGljYXRvciBlbnRpcmVseVxuICAgIGlmIChcbiAgICAgIHRoaXMuZHJhZ1N0YXRlICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4ICE9PSBudWxsICYmXG4gICAgICB0aGlzLmRyYWdTdGF0ZS5mbG9hdGluZ0luZGV4IDwgMCAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgdGhpcy5wYXRoc0VxdWFsKHBhdGgsIHRoaXMuZHJhZ1N0YXRlLnNvdXJjZVBhdGgpXG4gICAgKSB7XG4gICAgICBjb25zdCBweCA9IChwb2ludCA/IHBvaW50LmNsaWVudFggOiBldmVudC5jbGllbnRYKSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBweSA9IChwb2ludCA/IHBvaW50LmNsaWVudFkgOiBldmVudC5jbGllbnRZKSBhcyBudW1iZXI7XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHB4KSAmJiBOdW1iZXIuaXNGaW5pdGUocHkpICYmIHRoaXMuaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihweCwgcHkpKSB7XG4gICAgICAgIC8vIERyaXZlIGxpdmUgcmVvcmRlciB1c2luZyB0aGUgdW5pZmllZCBwYXRoIHNvIHdlIHVwZGF0ZSBpbnN0YW50bHkuXG4gICAgICAgIHRoaXMudXBkYXRlUGFuZURyYWdEcm9wVGFyZ2V0RnJvbVBvaW50KHB4LCBweSk7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGUgaG92ZXJlZCBzdGFjayBjaGFuZ2VkLCBjbGVhciBhbnkgc3RpY2t5IHpvbmUgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyB0YXJnZXQgYmVmb3JlIGNvbXB1dGluZyB0aGUgbmV3IHpvbmUuXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFpvbmVIaW50ID0gdGhpcy5leHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IHBvaW50Wm9uZUhpbnQgPSBwb2ludCA/IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGw7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuY29tcHV0ZURyb3Bab25lKHN0YWNrLCBwb2ludCA/PyBldmVudCwgcG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KTtcbiAgICB0aGlzLnNob3dEcm9wSW5kaWNhdG9yKHN0YWNrLCB6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb24oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IGhhc1ZhbGlkQ29vcmRpbmF0ZXMgPVxuICAgICAgTnVtYmVyLmlzRmluaXRlKGNsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WSkgJiZcbiAgICAgICEoY2xpZW50WCA9PT0gMCAmJiBjbGllbnRZID09PSAwKTtcblxuICAgIGlmIChoYXNWYWxpZENvb3JkaW5hdGVzKSB7XG4gICAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0geyB4OiBjbGllbnRYLCB5OiBjbGllbnRZIH07XG4gICAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb247XG4gICAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25HbG9iYWxEcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEZsb2F0aW5nUG9zaXRpb24oZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkdsb2JhbERyYWdFbmQoKTogdm9pZCB7XG4gICAgLy8gQXR0ZW1wdCB0byBmaW5hbGl6ZSBhIGRyb3AgZXZlbiBpZiB0aGUgZHJvcCBldmVudCBkb2Vzbid0IHJlYWNoIHVzIChGaXJlZm94L2VkZ2UgY2FzZXMpXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBjb25zdCBwb3MgPSB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgIGlmIChzdGF0ZSAmJiBwb3MpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5maW5kU3RhY2tBdFBvaW50KHBvcy54LCBwb3MueSk7XG4gICAgICBjb25zdCBqb3lzdGlja1Zpc2libGUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPT09ICd0cnVlJztcbiAgICAgIGNvbnN0IGpveXN0aWNrUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgICBjb25zdCBqb3lzdGlja1RhcmdldCA9IHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0O1xuICAgICAgY29uc3Qgam95c3RpY2tUYXJnZXRQYXRoID0gam95c3RpY2tUYXJnZXQgPyB0aGlzLnBhcnNlUGF0aChqb3lzdGlja1RhcmdldC5kYXRhc2V0WydwYXRoJ10pIDogbnVsbDtcbiAgICAgIGNvbnN0IHBhdGggPSBzdGFjayA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSkgOiAoam95c3RpY2tQYXRoID8/IGpveXN0aWNrVGFyZ2V0UGF0aCk7XG4gICAgICBjb25zdCBqb3lzdGlja1pvbmUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gYXMgRHJvcFpvbmUgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB6b25lID0gdGhpcy5pc0Ryb3Bab25lKGpveXN0aWNrWm9uZSlcbiAgICAgICAgPyBqb3lzdGlja1pvbmVcbiAgICAgICAgOiAoc3RhY2sgPyB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgeyBjbGllbnRYOiBwb3MueCwgY2xpZW50WTogcG9zLnkgfSwgbnVsbCkgOiBudWxsKTtcbiAgICAgIFxuICAgICAgaWYgKHBhdGggJiYgdGhpcy5pc0Ryb3Bab25lKHpvbmUpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRHJvcChwYXRoLCB6b25lISk7XG4gICAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZURyb3BJbmRpY2F0b3IoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICB0aGlzLmNsZWFyUGVuZGluZ1RhYkRyYWdNZXRyaWNzKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KFxuICAgIGNsaWVudFg6IG51bWJlcixcbiAgICBjbGllbnRZOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjbGllbnRYKSB8fCAhTnVtYmVyLmlzRmluaXRlKGNsaWVudFkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElnbm9yZSBvYnZpb3VzbHkgYm9ndXMgY29vcmRpbmF0ZXMgc29tZXRpbWVzIHNlZW4gZHVyaW5nIEhUTUw1IGRyYWdcbiAgICBpZiAoY2xpZW50WCA9PT0gMCAmJiBjbGllbnRZID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc3RpbGwgZHJhZ2dpbmcgYSB0YWIgaW5zaWRlIGl0cyBoZWFkZXIsIG9ubHkgY29udmVydCB0byBmbG9hdGluZyBvbmNlIHdlIGxlYXZlIHRoZSBoZWFkZXIuXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDApIHtcbiAgICAgIGNvbnN0IGIgPSB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VIZWFkZXJCb3VuZHM7XG4gICAgICBjb25zdCBzeCA9IHRoaXMuZHJhZ1N0YXRlLnN0YXJ0Q2xpZW50WCA/PyBjbGllbnRYO1xuICAgICAgY29uc3Qgc3kgPSB0aGlzLmRyYWdTdGF0ZS5zdGFydENsaWVudFkgPz8gY2xpZW50WTtcbiAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLmh5cG90KGNsaWVudFggLSBzeCwgY2xpZW50WSAtIHN5KTtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDg7IC8vIHBpeGVscyB0byBtb3ZlIGJlZm9yZSBjb252ZXJ0aW5nICh0dW5lZCB1cClcbiAgICAgIC8vIERlZmF1bHQgdG8gaW5zaWRlIHdoaWxlIGJvdW5kcyBhcmUgdW5rbm93biB0byBhdm9pZCBwcmVtYXR1cmUgZmxvYXRpbmdcbiAgICAgIGxldCBpbnNpZGVIZWFkZXIgPSB0cnVlO1xuICAgICAgY29uc3QgaW5zaWRlQnlCb3VuZHMgPSBiID8gdGhpcy5pc1BvaW50V2l0aGluQm91bmRzKGIsIGNsaWVudFgsIGNsaWVudFkpIDogdHJ1ZTtcbiAgICAgIGNvbnN0IGluc2lkZUJ5SGl0VGVzdCA9IHRoaXMuaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIGluc2lkZUhlYWRlciA9IGluc2lkZUJ5Qm91bmRzIHx8IGluc2lkZUJ5SGl0VGVzdDtcbiAgICAgIGlmICghaW5zaWRlSGVhZGVyICYmIGRpc3QgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ29udmVydCB0byBmbG9hdGluZyBub3cgdXNpbmcgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uXG4gICAgICAgIHRoaXMuY29udmVydFBlbmRpbmdUYWJEcmFnVG9GbG9hdGluZyhjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBhbmVEcmFnRHJvcFRhcmdldEZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcblxuICAgIGNvbnN0IHsgZmxvYXRpbmdJbmRleCwgcG9pbnRlck9mZnNldFgsIHBvaW50ZXJPZmZzZXRZIH0gPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBpZiAoZmxvYXRpbmdJbmRleCA9PT0gbnVsbCB8fCBmbG9hdGluZ0luZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbZmxvYXRpbmdJbmRleF07XG4gICAgaWYgKCFmbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBuZXdMZWZ0ID0gY2xpZW50WCAtIGhvc3RSZWN0LmxlZnQgLSBwb2ludGVyT2Zmc2V0WDtcbiAgICBjb25zdCBuZXdUb3AgPSBjbGllbnRZIC0gaG9zdFJlY3QudG9wIC0gcG9pbnRlck9mZnNldFk7XG5cbiAgICBmbG9hdGluZy5ib3VuZHMubGVmdCA9IG5ld0xlZnQ7XG4gICAgZmxvYXRpbmcuYm91bmRzLnRvcCA9IG5ld1RvcDtcblxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldEZsb2F0aW5nV3JhcHBlcihmbG9hdGluZ0luZGV4KTtcbiAgICBpZiAod3JhcHBlcikge1xuICAgICAgd3JhcHBlci5zdHlsZS5sZWZ0ID0gYCR7bmV3TGVmdH1weGA7XG4gICAgICB3cmFwcGVyLnN0eWxlLnRvcCA9IGAke25ld1RvcH1weGA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYW5lRHJhZ0Ryb3BUYXJnZXRGcm9tUG9pbnQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3QgcGF0aCA9IHN0YWNrID8gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKSA6IG51bGw7XG4gICAgaWYgKCFzdGFjayB8fCAhcGF0aCkge1xuICAgICAgLy8gV2hpbGUgYWN0aXZlbHkgZHJhZ2dpbmcsIGF2b2lkIGhpZGluZyB0aGUgaW5kaWNhdG9yIGlmIGl0IGlzIHZpc2libGUuXG4gICAgICAvLyBUcmFuc2llbnQgbWlzc2VzIGZyb20gaGl0LXRlc3RpbmcgYXJlIGNvbW1vbiBuZWFyIHRoZSBqb3lzdGljay5cbiAgICAgIGlmICh0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gIT09ICd0cnVlJykge1xuICAgICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGVuc3VyZSBhbnkgaW4taGVhZGVyIHBsYWNlaG9sZGVyIGlzIGNsZWFyZWQgd2hlbiBub3Qgb3ZlciBhIHN0YWNrXG4gICAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHN0YWNrLCByZXNldCBhbnkgc3RpY2t5IHpvbmUgc29cbiAgICAgIC8vIHRoZSBuZXcgZHJvcCBhcmVhIGRvZXNuJ3QgaW5oZXJpdCB0aGUgcHJldmlvdXMgc2lkZSBzZWxlY3Rpb24uXG4gICAgaWYgKHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICYmIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ICE9PSBzdGFjaykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3pvbmUnXTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2aW91cyBiZWhhdmlvciBoaWQgdGhlIGluZGljYXRvciBhbmQgcmV0dXJuZWQgZWFybHkgaGVyZTsgaW5zdGVhZCxcbiAgICAvLyBhbGxvdyB0aGUgbGl2ZS1yZW9yZGVyIGJyYW5jaCBiZWxvdyB0byBoYW5kbGUgaW4taGVhZGVyIGRyYWdzLlxuXG4gICAgLy8gV2hpbGUgZHJhZ2dpbmcgd2l0aGluIHRoZSBzYW1lIGhlYWRlciwgc2hvdyBhIHBsYWNlaG9sZGVyIGFuZCBzdXBwcmVzcyBqb3lzdGljay9pbmRpY2F0b3JcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZSAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDAgJiZcbiAgICAgIHBhdGggJiZcbiAgICAgIHRoaXMucGF0aHNFcXVhbChwYXRoLCB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VQYXRoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5IZWFkZXJCeUJvdW5kcyA9ICEhdGhpcy5kcmFnU3RhdGUuc291cmNlSGVhZGVyQm91bmRzICYmIHRoaXMuaXNQb2ludFdpdGhpbkJvdW5kcyh0aGlzLmRyYWdTdGF0ZS5zb3VyY2VIZWFkZXJCb3VuZHMsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgICAgY29uc3QgaW5IZWFkZXJCeUhpdFRlc3QgPSB0aGlzLmlzUG9pbnRlck92ZXJTb3VyY2VIZWFkZXIoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpZiAoaW5IZWFkZXJCeUJvdW5kcyB8fCBpbkhlYWRlckJ5SGl0VGVzdCkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBzdGFjay5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX2hlYWRlcicpO1xuICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgLy8gRW5zdXJlIHBsYWNlaG9sZGVyIGV4aXN0cyBhbmQgbW92ZSBpdCBhcyB0aGUgcG9pbnRlciBtb3Zlc1xuICAgICAgICAgIHRoaXMuZW5zdXJlSGVhZGVyRHJhZ1BsYWNlaG9sZGVyKGhlYWRlciwgdGhpcy5kcmFnU3RhdGUucGFuZSk7XG4gICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyLCBjbGllbnRYKTtcbiAgICAgICAgICBpZiAodGhpcy5kcmFnU3RhdGUubGl2ZVJlb3JkZXJJbmRleCAhPT0gaWR4KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlckRyYWdQbGFjZWhvbGRlclBvc2l0aW9uKGhlYWRlciwgaWR4KTtcbiAgICAgICAgICAgIC8vIEtlZXAgbW9kZWwgcmVvcmRlcmluZyB1bnRpbCBkcm9wOyBvbmx5IG1vdmUgdGhlIHBsYWNlaG9sZGVyIG5vd1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhdGUubGl2ZVJlb3JkZXJJbmRleCA9IGlkeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlRHJvcEluZGljYXRvcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGVhdmluZyB0aGUgaGVhZGVyOiBlbnN1cmUgYW55IHBsYWNlaG9sZGVyIGlzIHJlbW92ZWQgaW1tZWRpYXRlbHlcbiAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG5cbiAgICBjb25zdCB6b25lSGludCA9IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICBjb25zdCB6b25lID0gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHsgY2xpZW50WCwgY2xpZW50WSB9LCB6b25lSGludCk7XG4gICAgdGhpcy5zaG93RHJvcEluZGljYXRvcihzdGFjaywgem9uZSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgb3ZlciB0aGUgc291cmNlIHN0YWNrJ3MgaGVhZGVyICh0YWIgc3RyaXApXG4gIHByaXZhdGUgaXNQb2ludGVyT3ZlclNvdXJjZUhlYWRlcihjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGFja0VsID0gc3RhdGUuc291cmNlU3RhY2tFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrRWw/LnF1ZXJ5U2VsZWN0b3IoJy5kb2NrLXN0YWNrX19oZWFkZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgIC8vIEJlIGNvbnNlcnZhdGl2ZTogaWYgd2UgY2Fubm90IHJlc29sdmUgdGhlIGhlYWRlciwgdHJlYXQgYXMgaW5zaWRlXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc3IgPSB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgY29uc3QgZWxlbWVudHMgPSBzciA/IHNyLmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpIDogW107XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaGVhZGVyLmNvbnRhaW5zKGVsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BvaW50V2l0aGluQm91bmRzKFxuICAgIGJvdW5kczogeyBsZWZ0OiBudW1iZXI7IHJpZ2h0OiBudW1iZXI7IHRvcDogbnVtYmVyOyBib3R0b206IG51bWJlciB9LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB4ID49IGJvdW5kcy5sZWZ0ICYmIHggPD0gYm91bmRzLnJpZ2h0ICYmIHkgPj0gYm91bmRzLnRvcCAmJiB5IDw9IGJvdW5kcy5ib3R0b207XG4gIH1cblxuICAvLyBFbnN1cmUgYSBwbGFjZWhvbGRlciB0YWIgZXhpc3RzIGR1cmluZyBpbi1oZWFkZXIgZHJhZyBhbmQgaGlkZSB0aGUgcmVhbCBkcmFnZ2VkIHRhYiB2aXN1YWxseVxuICBwcml2YXRlIGVuc3VyZUhlYWRlckRyYWdQbGFjZWhvbGRlcihoZWFkZXI6IEhUTUxFbGVtZW50LCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnU3RhdGU/LnBsYWNlaG9sZGVySGVhZGVyID09PSBoZWFkZXIgJiYgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkcmFnZ2VkID0gQXJyYXkuZnJvbShoZWFkZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLXRhYicpKS5maW5kKCh0KSA9PiB0LmRhdGFzZXRbJ3BhbmUnXSA9PT0gcGFuZSkgPz8gbnVsbDtcbiAgICBpZiAoIWRyYWdnZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIHBsYWNlaG9sZGVyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHBsYWNlaG9sZGVyLnR5cGUgPSAnYnV0dG9uJztcbiAgICBwbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCdkb2NrLXRhYicpO1xuICAgIHBsYWNlaG9sZGVyLmRhdGFzZXRbJ3BsYWNlaG9sZGVyJ10gPSAndHJ1ZSc7XG4gICAgLy8gS2VlcCB0aGUgcGxhY2Vob2xkZXIgdmlzdWFsbHkgZW1wdHkgYnV0IHJlc2VydmluZyB0aGUgc2FtZSB3aWR0aFxuICAgIHBsYWNlaG9sZGVyLnRleHRDb250ZW50ID0gJyc7XG4gICAgcGxhY2Vob2xkZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgcGxhY2Vob2xkZXIuc3R5bGUud2lkdGggPSBgJHtkcmFnZ2VkLm9mZnNldFdpZHRofXB4YDtcbiAgICAvLyBIaWRlIHRoZSBvcmlnaW5hbCBkcmFnZ2VkIHRhYiBzbyBpdCBkb2Vzbid0IGR1cGxpY2F0ZSB2aXN1YWxseSBhbmQgZnJlZSB1cCBpdHMgc2xvdFxuICAgIGRyYWdnZWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBJbnNlcnQgcGxhY2Vob2xkZXIgaW4gdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2VkIHRhYlxuICAgIGhlYWRlci5pbnNlcnRCZWZvcmUocGxhY2Vob2xkZXIsIGRyYWdnZWQpO1xuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5kcmFnU3RhdGUucGxhY2Vob2xkZXJIZWFkZXIgPSBoZWFkZXI7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wbGFjZWhvbGRlckVsID0gcGxhY2Vob2xkZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gTW92ZSB0aGUgcGxhY2Vob2xkZXIgdG8gdGhlIGNvbXB1dGVkIHRhcmdldCBpbmRleCB3aXRoaW4gdGhlIGhlYWRlclxuICBwcml2YXRlIHVwZGF0ZUhlYWRlckRyYWdQbGFjZWhvbGRlclBvc2l0aW9uKGhlYWRlcjogSFRNTEVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZHJhZ1N0YXRlPy5wbGFjZWhvbGRlckVsID8/IG51bGw7XG4gICAgaWYgKCFwbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkcmFnZ2VkUGFuZSA9IHRoaXMuZHJhZ1N0YXRlPy5wYW5lID8/IG51bGw7XG4gICAgY29uc3QgdGFicyA9IEFycmF5LmZyb20oaGVhZGVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWInKSlcbiAgICAgIC5maWx0ZXIoKHQpID0+IHQgIT09IHBsYWNlaG9sZGVyICYmICghZHJhZ2dlZFBhbmUgfHwgdC5kYXRhc2V0WydwYW5lJ10gIT09IGRyYWdnZWRQYW5lKSk7XG4gICAgY29uc3QgY2xhbXBlZFRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRhcmdldEluZGV4LCB0YWJzLmxlbmd0aCkpO1xuICAgIGNvbnN0IHJlZiA9IHRhYnNbY2xhbXBlZFRhcmdldF0gPz8gbnVsbDtcbiAgICBoZWFkZXIuaW5zZXJ0QmVmb3JlKHBsYWNlaG9sZGVyLCByZWYpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGFuZCByZXN0b3JlIG9yaWdpbmFsIHRhYiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgY2xlYXJIZWFkZXJEcmFnUGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgY29uc3QgcGggPSB0aGlzLmRyYWdTdGF0ZT8ucGxhY2Vob2xkZXJFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZHJhZ1N0YXRlPy5wbGFjZWhvbGRlckhlYWRlciA/PyBudWxsO1xuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGRyYWdnZWQgPSB0aGlzLmRyYWdTdGF0ZT8ucGFuZVxuICAgICAgICA/IChBcnJheS5mcm9tKGhlYWRlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stdGFiJykpLmZpbmQoKHQpID0+IHQuZGF0YXNldFsncGFuZSddID09PSB0aGlzLmRyYWdTdGF0ZT8ucGFuZSkgPz8gbnVsbClcbiAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKGRyYWdnZWQpIHtcbiAgICAgICAgZHJhZ2dlZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwaCAmJiBwaC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBwaC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHBoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5wbGFjZWhvbGRlckVsID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLnBsYWNlaG9sZGVySGVhZGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhZ1BvaW50ZXJUcmFja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSBudWxsO1xuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbkRyYWdNb3VzZU1vdmUsIHRydWUpO1xuICAgIHdpbj8uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdUb3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdNb3VzZVVwLCB0cnVlKTtcbiAgICB3aW4/LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdUb3VjaEVuZCwgdHJ1ZSk7XG4gICAgd2luPy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25EcmFnVG91Y2hFbmQsIHRydWUpO1xuICAgIHRoaXMuZHJhZ1BvaW50ZXJUcmFja2luZ0FjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnUG9pbnRlclRyYWNraW5nQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpbiA9IHRoaXMud2luZG93UmVmO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbkRyYWdNb3VzZU1vdmUsIHRydWUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdUb3VjaE1vdmUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25EcmFnTW91c2VVcCwgdHJ1ZSk7XG4gICAgd2luPy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25EcmFnVG91Y2hFbmQsIHRydWUpO1xuICAgIHdpbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uRHJhZ1RvdWNoRW5kLCB0cnVlKTtcbiAgICB0aGlzLmRyYWdQb2ludGVyVHJhY2tpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uID0gbnVsbDtcbiAgICB0aGlzLmNsZWFyUGVuZGluZ0RyYWdFbmRUaW1lb3V0KCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMuc3RvcERyYWdQb2ludGVyVHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PT0gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdUb3VjaE1vdmUoZXZlbnQ6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLnN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzWzBdO1xuICAgIGlmICghdG91Y2gpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVEZWZlcnJlZERyYWdFbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubGFzdERyYWdQb2ludGVyUG9zaXRpb24gPSB7IHg6IHRvdWNoLmNsaWVudFgsIHk6IHRvdWNoLmNsaWVudFkgfTtcbiAgICB0aGlzLnVwZGF0ZURyYWdnZWRGbG9hdGluZ1Bvc2l0aW9uRnJvbVBvaW50KHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdNb3VzZVVwKCk6IHZvaWQge1xuICAgIC8vIFByZWZlciBjb21taXR0aW5nIGEgZHJvcCBmcm9tIHBvaW50ZXItdXAgc2luY2Ugc29tZSBicm93c2VycyBzdXBwcmVzcyBkcm9wIGV2ZW50c1xuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbjtcbiAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZURyb3BGcm9tUG9pbnQocG9zLngsIHBvcy55KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oYW5kbGVEcmFnUG9pbnRlclVwQ29tbW9uKCk7XG4gIH1cblxuICAvLyBDb252ZXJ0IGEgY3VycmVudGx5IGluLWhlYWRlciB0YWIgZHJhZyBpbnRvIGEgZmxvYXRpbmcgd2luZG93XG4gIHByaXZhdGUgY29udmVydFBlbmRpbmdUYWJEcmFnVG9GbG9hdGluZyhjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBpZiAoc3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJiBzdGF0ZS5mbG9hdGluZ0luZGV4ID49IDApIHtcbiAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBmbG9hdGluZ1xuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBhbnkgcGxhY2Vob2xkZXIgYmVmb3JlIGNvbnZlcnRpbmdcbiAgICB0aGlzLmNsZWFySGVhZGVyRHJhZ1BsYWNlaG9sZGVyKCk7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHN0YXRlLnNvdXJjZVBhdGgpO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYW5lID0gc3RhdGUucGFuZTtcbiAgICBjb25zdCBzdGFja0VsID0gc3RhdGUuc291cmNlU3RhY2tFbCA/PyBudWxsO1xuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzdGFja1JlY3QgPSBzdGFja0VsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsO1xuICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLnBlbmRpbmdUYWJEcmFnTWV0cmljcztcblxuICAgIGNvbnN0IGZhbGxiYWNrV2lkdGggPSAzMjA7XG4gICAgY29uc3QgZmFsbGJhY2tIZWlnaHQgPSAyNDA7XG4gICAgY29uc3Qgd2lkdGggPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy53aWR0aCkgJiYgbWV0cmljcy53aWR0aCA+IDBcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoXG4gICAgICAgIDogc3RhY2tSZWN0ICYmIE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3Qud2lkdGgpXG4gICAgICAgID8gc3RhY2tSZWN0LndpZHRoXG4gICAgICAgIDogZmFsbGJhY2tXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPVxuICAgICAgbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5oZWlnaHQpICYmIG1ldHJpY3MuaGVpZ2h0ID4gMFxuICAgICAgICA/IG1ldHJpY3MuaGVpZ2h0XG4gICAgICAgIDogc3RhY2tSZWN0ICYmIE51bWJlci5pc0Zpbml0ZShzdGFja1JlY3QuaGVpZ2h0KVxuICAgICAgICA/IHN0YWNrUmVjdC5oZWlnaHRcbiAgICAgICAgOiBmYWxsYmFja0hlaWdodDtcblxuICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYID0gTnVtYmVyLmlzRmluaXRlKHRoaXMuZHJhZ1N0YXRlPy5wb2ludGVyT2Zmc2V0WCBhcyBudW1iZXIpXG4gICAgICA/ICh0aGlzLmRyYWdTdGF0ZSEucG9pbnRlck9mZnNldFggYXMgbnVtYmVyKVxuICAgICAgOiBtZXRyaWNzICYmIE51bWJlci5pc0Zpbml0ZShtZXRyaWNzLnBvaW50ZXJPZmZzZXRYKVxuICAgICAgPyAobWV0cmljcy5wb2ludGVyT2Zmc2V0WCBhcyBudW1iZXIpXG4gICAgICA6IHdpZHRoIC8gMjtcbiAgICBjb25zdCBwb2ludGVyT2Zmc2V0WSA9IE51bWJlci5pc0Zpbml0ZSh0aGlzLmRyYWdTdGF0ZT8ucG9pbnRlck9mZnNldFkgYXMgbnVtYmVyKVxuICAgICAgPyAodGhpcy5kcmFnU3RhdGUhLnBvaW50ZXJPZmZzZXRZIGFzIG51bWJlcilcbiAgICAgIDogbWV0cmljcyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0cmljcy5wb2ludGVyT2Zmc2V0WSlcbiAgICAgID8gKG1ldHJpY3MucG9pbnRlck9mZnNldFkgYXMgbnVtYmVyKVxuICAgICAgOiBoZWlnaHQgLyAyO1xuXG4gICAgY29uc3QgcG9pbnRlckxlZnQgPSBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WClcbiAgICAgID8gY2xpZW50WCAtIGhvc3RSZWN0LmxlZnQgLSBwb2ludGVyT2Zmc2V0WFxuICAgICAgOiAwO1xuICAgIGNvbnN0IHBvaW50ZXJUb3AgPSBOdW1iZXIuaXNGaW5pdGUoY2xpZW50WSlcbiAgICAgID8gY2xpZW50WSAtIGhvc3RSZWN0LnRvcCAtIHBvaW50ZXJPZmZzZXRZXG4gICAgICA6IDA7XG5cbiAgICAvLyBSZW1vdmUgcGFuZSBmcm9tIGl0cyBjdXJyZW50IHN0YWNrIGFuZCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgZW50cnlcbiAgICB0aGlzLnJlbW92ZVBhbmVGcm9tTG9jYXRpb24obG9jYXRpb24sIHBhbmUpO1xuICAgIGNvbnN0IGZsb2F0aW5nU3RhY2s6IERvY2tTdGFja05vZGUgPSB7XG4gICAgICBraW5kOiAnc3RhY2snLFxuICAgICAgcGFuZXM6IFtwYW5lXSxcbiAgICAgIGFjdGl2ZVBhbmU6IHBhbmUsXG4gICAgfTtcblxuICAgIGNvbnN0IGZsb2F0aW5nTGF5b3V0OiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCA9IHtcbiAgICAgIGJvdW5kczoge1xuICAgICAgICBsZWZ0OiBwb2ludGVyTGVmdCxcbiAgICAgICAgdG9wOiBwb2ludGVyVG9wLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgfSxcbiAgICAgIHJvb3Q6IGZsb2F0aW5nU3RhY2ssXG4gICAgICBhY3RpdmVQYW5lOiBwYW5lLFxuICAgIH07XG5cbiAgICB0aGlzLmZsb2F0aW5nTGF5b3V0cy5wdXNoKGZsb2F0aW5nTGF5b3V0KTtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRGbG9hdGluZ1dyYXBwZXIobmV3SW5kZXgpO1xuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICB0aGlzLnByb21vdGVGbG9hdGluZ1BhbmUobmV3SW5kZXgsIHdyYXBwZXIpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgZHJhZyBzdGF0ZSBzbyBzdWJzZXF1ZW50IG1vdmVzIHJlcG9zaXRpb24gdGhlIGZsb2F0aW5nIHdpbmRvd1xuICAgIHN0YXRlLnNvdXJjZVBhdGggPSB7IHR5cGU6ICdmbG9hdGluZycsIGluZGV4OiBuZXdJbmRleCwgc2VnbWVudHM6IFtdIH07XG4gICAgc3RhdGUuZmxvYXRpbmdJbmRleCA9IG5ld0luZGV4O1xuICAgIHN0YXRlLnBvaW50ZXJPZmZzZXRYID0gcG9pbnRlck9mZnNldFg7XG4gICAgc3RhdGUucG9pbnRlck9mZnNldFkgPSBwb2ludGVyT2Zmc2V0WTtcbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgaW50ZW5kZWQgdGFiIGluc2VydCBpbmRleCB3aXRoaW4gYSBoZWFkZXIgYmFzZWQgb24gcG9pbnRlciBYXG4gIC8vIEFkZHMgYSBzbGlnaHQgcmlnaHR3YXJkIGJpYXMgYW5kIHVzZXMgdGhlIHBsYWNlaG9sZGVyIHJlY3QgKGlmIHByZXNlbnQpXG4gIC8vIHRvIGVuc3VyZSBvZmZzZXRzIGFyZSBjb3JyZWN0IGV2ZW4gd2hlbiB0aGUgZHJhZ2dlZCB0YWIgaXMgZGlzcGxheTpub25lLlxuICBwcml2YXRlIGNvbXB1dGVIZWFkZXJJbnNlcnRJbmRleChoZWFkZXI6IEhUTUxFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGFsbFRhYnMgPSBBcnJheS5mcm9tKGhlYWRlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stdGFiJykpO1xuICAgIGlmIChhbGxUYWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhZ2dlZFBhbmUgPSB0aGlzLmRyYWdTdGF0ZT8ucGFuZSA/PyBudWxsO1xuICAgIGNvbnN0IGRyYWdnZWRFbCA9IGRyYWdnZWRQYW5lXG4gICAgICA/IChhbGxUYWJzLmZpbmQoKHQpID0+IHQuZGF0YXNldFsncGFuZSddID09PSBkcmFnZ2VkUGFuZSkgPz8gbnVsbClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBwbGFjZWhvbGRlckVsID0gaGVhZGVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay10YWJbZGF0YS1wbGFjZWhvbGRlcj1cInRydWVcIl0nKTtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhbGxUYWJzLmZpbHRlcigodCkgPT4gdCAhPT0gZHJhZ2dlZEVsICYmIHQgIT09IHBsYWNlaG9sZGVyRWwpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmlnaHRCaWFzID0gMTI7XG4gICAgY29uc3QgbGVmdEJpYXMgPSAwO1xuXG4gICAgY29uc3QgYmFzZVJlY3QgPSBwbGFjZWhvbGRlckVsXG4gICAgICA/IHBsYWNlaG9sZGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIDogZHJhZ2dlZEVsXG4gICAgICA/IGRyYWdnZWRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHJlY3RWYWxpZCA9ICEhYmFzZVJlY3QgJiYgTnVtYmVyLmlzRmluaXRlKGJhc2VSZWN0LndpZHRoKSAmJiAoYmFzZVJlY3QgYXMgRE9NUmVjdCkud2lkdGggPiAwO1xuICAgIGNvbnN0IGRyYWdnZWRDZW50ZXIgPSByZWN0VmFsaWQgJiYgYmFzZVJlY3QgPyBiYXNlUmVjdC5sZWZ0ICsgYmFzZVJlY3Qud2lkdGggLyAyIDogbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRhcmdldHNbaV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBiYXNlTWlkID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBpc1JpZ2h0T2ZEcmFnZ2VkID0gZHJhZ2dlZENlbnRlciAhPT0gbnVsbCA/IGJhc2VNaWQgPj0gZHJhZ2dlZENlbnRlciA6IGZhbHNlO1xuICAgICAgY29uc3QgbWlkID0gaXNSaWdodE9mRHJhZ2dlZCA/IGJhc2VNaWQgKyByaWdodEJpYXMgOiBiYXNlTWlkIC0gbGVmdEJpYXM7XG4gICAgICBpZiAoY2xpZW50WCA8IG1pZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSByZW9yZGVyUGFuZUluTG9jYXRpb25BdEluZGV4KGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcsIHRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lcyA9IGxvY2F0aW9uLm5vZGUucGFuZXM7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gcGFuZXMuaW5kZXhPZihwYW5lKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjbGFtcGVkVGFyZ2V0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0SW5kZXgsIHBhbmVzLmxlbmd0aCAtIDEpKTtcbiAgICBpZiAoY2xhbXBlZFRhcmdldCA9PT0gY3VycmVudEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhbmVzLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIHBhbmVzLnNwbGljZShjbGFtcGVkVGFyZ2V0LCAwLCBwYW5lKTtcbiAgICBsb2NhdGlvbi5ub2RlLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ1RvdWNoRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlRHJhZ1BvaW50ZXJVcENvbW1vbigpO1xuICB9XG5cbiAgLy8gQ29tbWl0IGEgZHJvcCB1c2luZyBjdXJyZW50IHBvaW50ZXIgY29vcmRpbmF0ZXMgYW5kIGpveXN0aWNrIHN0YXRlXG4gIHByaXZhdGUgZmluYWxpemVEcm9wRnJvbVBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IHRoaXMuZmluZFN0YWNrQXRQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICBjb25zdCBzdGFja1BhdGggPSBzdGFjayA/IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGNvbnN0IGpveXN0aWNrVmlzaWJsZSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9PT0gJ3RydWUnO1xuICAgIGNvbnN0IGpveXN0aWNrU3RvcmVkUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgY29uc3Qgam95c3RpY2tUYXJnZXQgPSB0aGlzLmRyb3BKb3lzdGlja1RhcmdldDtcbiAgICBjb25zdCBqb3lzdGlja1RhcmdldFBhdGggPSBqb3lzdGlja1RhcmdldCA/IHRoaXMucGFyc2VQYXRoKGpveXN0aWNrVGFyZ2V0LmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGNvbnN0IHBhdGggPSAoam95c3RpY2tWaXNpYmxlID8gKGpveXN0aWNrU3RvcmVkUGF0aCA/PyBqb3lzdGlja1RhcmdldFBhdGgpIDogbnVsbCkgPz8gc3RhY2tQYXRoO1xuXG4gICAgY29uc3Qgam95c3RpY2tab25lID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddIGFzIERyb3Bab25lIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvbmU6IERyb3Bab25lIHwgbnVsbCA9IHRoaXMuaXNEcm9wWm9uZShqb3lzdGlja1pvbmUpXG4gICAgICA/IGpveXN0aWNrWm9uZVxuICAgICAgOiAoc3RhY2sgPyB0aGlzLmNvbXB1dGVEcm9wWm9uZShzdGFjaywgeyBjbGllbnRYLCBjbGllbnRZIH0sIG51bGwpIDogbnVsbCk7XG5cbiAgICAvLyBTYW1lLWhlYWRlciByZW9yZGVyIGNhc2Ugd2hlbiBubyBzaWRlIHpvbmUgaXMgY2hvc2VuXG4gICAgaWYgKFxuICAgICAgdGhpcy5kcmFnU3RhdGUgJiZcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmZsb2F0aW5nSW5kZXggPCAwICYmXG4gICAgICBzdGFjayAmJlxuICAgICAgcGF0aCAmJlxuICAgICAgc3RhY2tQYXRoICYmXG4gICAgICB0aGlzLnBhdGhzRXF1YWwoc3RhY2tQYXRoLCB0aGlzLmRyYWdTdGF0ZS5zb3VyY2VQYXRoKSAmJlxuICAgICAgKCF6b25lIHx8IHpvbmUgPT09ICdjZW50ZXInKVxuICAgICkge1xuICAgICAgY29uc3QgaGVhZGVyID0gc3RhY2sucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5kb2NrLXN0YWNrX19oZWFkZXInKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGgpO1xuICAgICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLmNvbXB1dGVIZWFkZXJJbnNlcnRJbmRleChoZWFkZXIsIGNsaWVudFgpO1xuICAgICAgICAgIHRoaXMucmVvcmRlclBhbmVJbkxvY2F0aW9uQXRJbmRleChsb2NhdGlvbiwgdGhpcy5kcmFnU3RhdGUucGFuZSwgaWR4KTtcbiAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmIHRoaXMuaXNEcm9wWm9uZSh6b25lKSkge1xuICAgICAgdGhpcy5oYW5kbGVEcm9wKHBhdGgsIHpvbmUhKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZ0RyYWdFbmRUaW1lb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgd2luID0gdGhpcy53aW5kb3dSZWY7XG4gICAgICBpZiAod2luICYmIHR5cGVvZiB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgd2luLmNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbG9iYWxUaGlzLmNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZURlZmVycmVkRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nRHJhZ0VuZFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZURyYWcgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJQZW5kaW5nVGFiRHJhZ01ldHJpY3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgdGhpcy5jbGVhclBlbmRpbmdUYWJEcmFnTWV0cmljcygpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aW4gPSB0aGlzLndpbmRvd1JlZjtcbiAgICB0aGlzLnBlbmRpbmdEcmFnRW5kVGltZW91dCA9IHdpblxuICAgICAgPyB3aW4uc2V0VGltZW91dChjb21wbGV0ZURyYWcsIDApXG4gICAgICA6IHNldFRpbWVvdXQoY29tcGxldGVEcmFnLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBwb2ludEZyb21FdmVudCA9XG4gICAgICBOdW1iZXIuaXNGaW5pdGUoZXZlbnQuY2xpZW50WCkgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LmNsaWVudFkpXG4gICAgICAgID8geyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgcG9pbnQgPVxuICAgICAgcG9pbnRGcm9tRXZlbnQgPz9cbiAgICAgICh0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgY2xpZW50WDogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi54LFxuICAgICAgICAgICAgY2xpZW50WTogdGhpcy5sYXN0RHJhZ1BvaW50ZXJQb3NpdGlvbi55LFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsKTtcblxuICAgIGNvbnN0IHN0YWNrID1cbiAgICAgIHRoaXMuZmluZFN0YWNrRWxlbWVudChldmVudCkgPz9cbiAgICAgIChwb2ludCA/IHRoaXMuZmluZFN0YWNrQXRQb2ludChwb2ludC5jbGllbnRYLCBwb2ludC5jbGllbnRZKSA6IG51bGwpO1xuXG4gICAgLy8gUHJlZmVyIGpveXN0aWNrJ3Mgc3RvcmVkIHRhcmdldCBwYXRoIHdoZW4gdGhlIGpveXN0aWNrIGlzIHZpc2libGUgKGRyb3Agb3ZlciBidXR0b25zKVxuICAgIGNvbnN0IGpveXN0aWNrVmlzaWJsZSA9IHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9PT0gJ3RydWUnO1xuICAgIGNvbnN0IGpveXN0aWNrUGF0aCA9IHRoaXMucGFyc2VQYXRoKHRoaXMuZHJvcEpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgY29uc3Qgam95c3RpY2tUYXJnZXQgPSB0aGlzLmRyb3BKb3lzdGlja1RhcmdldDtcbiAgICBjb25zdCBqb3lzdGlja1RhcmdldFBhdGggPSBqb3lzdGlja1RhcmdldCA/IHRoaXMucGFyc2VQYXRoKGpveXN0aWNrVGFyZ2V0LmRhdGFzZXRbJ3BhdGgnXSkgOiBudWxsO1xuICAgIGxldCBwYXRoID0gc3RhY2tcbiAgICAgID8gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKVxuICAgICAgOiAoam95c3RpY2tQYXRoID8/IGpveXN0aWNrVGFyZ2V0UGF0aCk7XG4gICAgaWYgKCFwYXRoICYmIGpveXN0aWNrVmlzaWJsZSkge1xuICAgICAgLy8gQXMgYSBsYXN0IHJlc29ydCwgdGFyZ2V0IHRoZSBtYWluIGRvY2sgc3VyZmFjZSBvbmx5IHdoZW4gZW1wdHlcbiAgICAgIGNvbnN0IGRvY2tQYXRoID0gdGhpcy5wYXJzZVBhdGgodGhpcy5kb2NrZWRFbC5kYXRhc2V0WydwYXRoJ10pO1xuICAgICAgcGF0aCA9ICghdGhpcy5yb290TGF5b3V0ID8gZG9ja1BhdGggOiBudWxsKTtcbiAgICB9XG5cbiAgICAvLyBEZWZlciBzYW1lLWhlYWRlciByZW9yZGVyIGRlY2lzaW9uIHVudGlsIGFmdGVyIHpvbmUgcmVzb2x1dGlvbiBiZWxvd1xuXG4gICAgLy8gUHJlZmVyIGpveXN0aWNrJ3MgYWN0aXZlIHpvbmUgaWYgYXZhaWxhYmxlLCBlbHNlIGluZmVyIGZyb20gZXZlbnQvcG9pbnRcbiAgICBjb25zdCBqb3lzdGlja1pvbmUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gYXMgRHJvcFpvbmUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXZlbnRab25lSGludCA9IHRoaXMuZXh0cmFjdERyb3Bab25lRnJvbUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBwb2ludFpvbmVIaW50ID0gcG9pbnQgPyB0aGlzLmZpbmREcm9wWm9uZUJ5UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSkgOiBudWxsO1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmlzRHJvcFpvbmUoam95c3RpY2tab25lKVxuICAgICAgPyBqb3lzdGlja1pvbmVcbiAgICAgIDogc3RhY2tcbiAgICAgID8gdGhpcy5jb21wdXRlRHJvcFpvbmUoc3RhY2ssIHBvaW50ID8/IGV2ZW50LCBwb2ludFpvbmVIaW50ID8/IGV2ZW50Wm9uZUhpbnQpXG4gICAgICA6ICh0aGlzLmlzRHJvcFpvbmUocG9pbnRab25lSGludCA/PyBldmVudFpvbmVIaW50KSA/IChwb2ludFpvbmVIaW50ID8/IGV2ZW50Wm9uZUhpbnQpIDogbnVsbCk7XG5cbiAgICBcbiAgICAvLyBJZiBzdGlsbCBpbiBzYW1lIGhlYWRlciBhbmQgbm8gc2lkZSB6b25lIGNob3NlbiwgdHJlYXQgYXMgaW4taGVhZGVyIHJlb3JkZXJcbiAgICBpZiAoXG4gICAgICB0aGlzLmRyYWdTdGF0ZSAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5kcmFnU3RhdGUuZmxvYXRpbmdJbmRleCA8IDAgJiZcbiAgICAgIHN0YWNrICYmXG4gICAgICBwYXRoICYmXG4gICAgICB0aGlzLnBhdGhzRXF1YWwocGF0aCwgdGhpcy5kcmFnU3RhdGUuc291cmNlUGF0aCkgJiZcbiAgICAgICghem9uZSB8fCB6b25lID09PSAnY2VudGVyJylcbiAgICApIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcuZG9jay1zdGFja19faGVhZGVyJyk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IHggPSAocG9pbnQgPyBwb2ludC5jbGllbnRYIDogZXZlbnQuY2xpZW50WCkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHgpKSB7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHBhdGgpO1xuICAgICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jb21wdXRlSGVhZGVySW5zZXJ0SW5kZXgoaGVhZGVyLCB4KTtcbiAgICAgICAgICAgIHRoaXMucmVvcmRlclBhbmVJbkxvY2F0aW9uQXRJbmRleChsb2NhdGlvbiwgdGhpcy5kcmFnU3RhdGUucGFuZSwgaWR4KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhdGUuZHJvcEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbmRQYW5lRHJhZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBqb3lzdGljayBpcyB2aXNpYmxlIGFuZCBib3RoIHBhdGggYW5kIHpvbmUgYXJlIHJlc29sdmVkLCBmb3JjZSB1c2luZyBqb3lzdGljayBhcyBhdXRob3JpdGF0aXZlXG4gICAgaWYgKGpveXN0aWNrVmlzaWJsZSAmJiBwYXRoICYmIHRoaXMuaXNEcm9wWm9uZShqb3lzdGlja1pvbmUpKSB7XG4gICAgICB0aGlzLmhhbmRsZURyb3AocGF0aCwgam95c3RpY2tab25lKTtcbiAgICAgIHRoaXMuZW5kUGFuZURyYWcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF6b25lKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlRHJvcChwYXRoLCB6b25lKTtcbiAgICB0aGlzLmVuZFBhbmVEcmFnKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBOb2RlIHwgbnVsbDtcblxuICAgIC8vIER1cmluZyBhY3RpdmUgZHJhZ3MsIGJyb3dzZXJzIGNhbiBlbWl0IHNwdXJpb3VzIGRyYWdsZWF2ZSB3aXRoIG51bGxcbiAgICAvLyByZWxhdGVkVGFyZ2V0IHdoaWxlIHRoZSBwb2ludGVyIGlzIHN0aWxsIG92ZXIgdGhlIGpveXN0aWNrL2J1dHRvbnMuXG4gICAgLy8gQmUgY29uc2VydmF0aXZlOiBpZiB3ZSBjYW4gcmVzb2x2ZSBhIHN0YWNrL2pveXN0aWNrIGF0IHRoZSBsYXN0IGtub3duXG4gICAgLy8gcG9pbnRlciBwb3NpdGlvbiwgZG9u4oCZdCBoaWRlIChwcmV2ZW50cyBmbGlja2VyIG9mIGFjdGl2ZSBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICBjb25zdCBwb3MgPVxuICAgICAgICAoTnVtYmVyLmlzRmluaXRlKChldmVudCBhcyBEcmFnRXZlbnQpLmNsaWVudFgpICYmIE51bWJlci5pc0Zpbml0ZSgoZXZlbnQgYXMgRHJhZ0V2ZW50KS5jbGllbnRZKSlcbiAgICAgICAgICA/IHsgeDogKGV2ZW50IGFzIERyYWdFdmVudCkuY2xpZW50WCwgeTogKGV2ZW50IGFzIERyYWdFdmVudCkuY2xpZW50WSB9XG4gICAgICAgICAgOiB0aGlzLmxhc3REcmFnUG9pbnRlclBvc2l0aW9uO1xuICAgICAgaWYgKHBvcykge1xuICAgICAgICBjb25zdCBzdGFja0F0UG9pbnQgPSB0aGlzLmZpbmRTdGFja0F0UG9pbnQocG9zLngsIHBvcy55KTtcbiAgICAgICAgaWYgKHN0YWNrQXRQb2ludCkge1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgaW5zaWRlIG91ciBkcm9wIGFyZWE7IGlnbm9yZSB0aGlzIGRyYWdsZWF2ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZWxhdGVkKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdENvbnRhaW5zID0gdGhpcy5yb290RWwuY29udGFpbnMocmVsYXRlZCk7XG4gICAgY29uc3Qgam95c3RpY2tDb250YWlucyA9IHRoaXMuZHJvcEpveXN0aWNrLmNvbnRhaW5zKHJlbGF0ZWQpO1xuICAgIGlmICghcm9vdENvbnRhaW5zICYmICFqb3lzdGlja0NvbnRhaW5zKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wSW5kaWNhdG9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEcm9wKHRhcmdldFBhdGg6IERvY2tQYXRoIHwgbnVsbCwgem9uZTogRHJvcFpvbmUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlIHx8ICF0YXJnZXRQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYW5lLCBzb3VyY2VQYXRoIH0gPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVTdGFja0xvY2F0aW9uKHNvdXJjZVBhdGgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24odGFyZ2V0UGF0aCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IGFsbG93IGRyb3BwaW5nIG9udG8gYW4gZW1wdHkgbWFpbiBkb2NrIGFyZWEgKG5vIHJvb3QpLlxuICAgIGlmICghdGFyZ2V0ICYmIHRhcmdldFBhdGgudHlwZSA9PT0gJ2RvY2tlZCcgJiYgIXRoaXMucm9vdExheW91dCkge1xuICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhY2tFbXB0aWVkID0gdGhpcy5yZW1vdmVQYW5lRnJvbUxvY2F0aW9uKHNvdXJjZSwgcGFuZSwgdHJ1ZSk7XG4gICAgICBjb25zdCBuZXdSb290OiBEb2NrU3RhY2tOb2RlID0ge1xuICAgICAgICBraW5kOiAnc3RhY2snLFxuICAgICAgICBwYW5lczogW3BhbmVdLFxuICAgICAgICBhY3RpdmVQYW5lOiBwYW5lLFxuICAgICAgfTtcbiAgICAgIHRoaXMucm9vdExheW91dCA9IG5ld1Jvb3Q7XG4gICAgICBpZiAoc3RhY2tFbXB0aWVkKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuICAgICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2UgfHwgIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh6b25lID09PSAnY2VudGVyJyAmJiB0aGlzLnBhdGhzRXF1YWwoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkpIHtcbiAgICAgIGlmICghc291cmNlLm5vZGUucGFuZXMuaW5jbHVkZXMocGFuZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW9yZGVyUGFuZUluTG9jYXRpb24oc291cmNlLCBwYW5lKTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja0VtcHRpZWQgPSB0aGlzLnJlbW92ZVBhbmVGcm9tTG9jYXRpb24oc291cmNlLCBwYW5lLCB0cnVlKTtcblxuICAgIGlmICh6b25lID09PSAnY2VudGVyJykge1xuICAgICAgdGhpcy5hZGRQYW5lVG9Mb2NhdGlvbih0YXJnZXQsIHBhbmUpO1xuICAgICAgdGhpcy5zZXRBY3RpdmVQYW5lRm9yTG9jYXRpb24odGFyZ2V0LCBwYW5lKTtcbiAgICAgIGlmIChzdGFja0VtcHRpZWQpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwTG9jYXRpb24oc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXRlLmRyb3BIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGFjazogRG9ja1N0YWNrTm9kZSA9IHtcbiAgICAgIGtpbmQ6ICdzdGFjaycsXG4gICAgICBwYW5lczogW3BhbmVdLFxuICAgICAgYWN0aXZlUGFuZTogcGFuZSxcbiAgICB9O1xuXG4gICAgaWYgKHRhcmdldC5jb250ZXh0ID09PSAnZG9ja2VkJykge1xuICAgICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5kb2NrTm9kZUJlc2lkZSh0aGlzLnJvb3RMYXlvdXQsIHRhcmdldC5ub2RlLCBuZXdTdGFjaywgem9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbdGFyZ2V0LmluZGV4XTtcbiAgICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgICAgaWYgKHN0YWNrRW1wdGllZCkge1xuICAgICAgICAgIHRoaXMuY2xlYW51cExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmbG9hdGluZy5yb290ID0gdGhpcy5kb2NrTm9kZUJlc2lkZShmbG9hdGluZy5yb290LCB0YXJnZXQubm9kZSwgbmV3U3RhY2ssIHpvbmUpO1xuICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrRW1wdGllZCkge1xuICAgICAgdGhpcy5jbGVhbnVwTG9jYXRpb24oc291cmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLmRyYWdTdGF0ZS5kcm9wSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICAgIFxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGbG9hdGluZ1N0YWNrRHJvcChzb3VyY2VJbmRleDogbnVtYmVyLCB0YXJnZXRQYXRoOiBEb2NrUGF0aCwgem9uZTogRHJvcFpvbmUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1tzb3VyY2VJbmRleF07XG4gICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS5yb290KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlU3RhY2tMb2NhdGlvbih0YXJnZXRQYXRoKTtcbiAgICAvLyBBbGxvdyBkcm9wcGluZyBhbiBlbnRpcmUgZmxvYXRpbmcgc3RhY2sgb250byBhbiBlbXB0eSBtYWluIGRvY2sgYXJlYVxuICAgIC8vIChubyBleGlzdGluZyByb290KS5cbiAgICBpZiAoIXRhcmdldCAmJiB0YXJnZXRQYXRoLnR5cGUgPT09ICdkb2NrZWQnICYmICF0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuY2xvbmVMYXlvdXROb2RlKHNvdXJjZS5yb290KTtcbiAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXQuY29udGV4dCA9PT0gJ2Zsb2F0aW5nJyAmJiB0YXJnZXQuaW5kZXggPT09IHNvdXJjZUluZGV4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHpvbmUgPT09ICdjZW50ZXInKSB7XG4gICAgICBjb25zdCBwYW5lcyA9IHRoaXMuY29sbGVjdFBhbmVOYW1lcyhzb3VyY2Uucm9vdCk7XG4gICAgICBpZiAocGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcGFuZXMuZm9yRWFjaCgocGFuZSkgPT4ge1xuICAgICAgICB0aGlzLmFkZFBhbmVUb0xvY2F0aW9uKHRhcmdldCwgcGFuZSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWN0aXZlUGFuZSA9XG4gICAgICAgIHNvdXJjZS5hY3RpdmVQYW5lICYmIHBhbmVzLmluY2x1ZGVzKHNvdXJjZS5hY3RpdmVQYW5lKVxuICAgICAgICAgID8gc291cmNlLmFjdGl2ZVBhbmVcbiAgICAgICAgICA6IHRoaXMuZmluZEZpcnN0UGFuZU5hbWUoc291cmNlLnJvb3QpID8/IHBhbmVzWzBdO1xuXG4gICAgICBpZiAoYWN0aXZlUGFuZSkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVBhbmVGb3JMb2NhdGlvbih0YXJnZXQsIGFjdGl2ZVBhbmUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQoc291cmNlSW5kZXgpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0LmNvbnRleHQgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbdGFyZ2V0LmluZGV4XTtcbiAgICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmbG9hdGluZy5yb290ID0gdGhpcy5kb2NrTm9kZUJlc2lkZShmbG9hdGluZy5yb290LCB0YXJnZXQubm9kZSwgc291cmNlLnJvb3QsIHpvbmUpO1xuICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHNvdXJjZS5hY3RpdmVQYW5lID8/IHRoaXMuZmluZEZpcnN0UGFuZU5hbWUoc291cmNlLnJvb3QpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXNwYXRjaExheW91dENoYW5nZWQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMucm9vdExheW91dCA9IHRoaXMuZG9ja05vZGVCZXNpZGUodGhpcy5yb290TGF5b3V0LCB0YXJnZXQubm9kZSwgc291cmNlLnJvb3QsIHpvbmUpO1xuICAgIHRoaXMucmVtb3ZlRmxvYXRpbmdBdChzb3VyY2VJbmRleCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRXZWlnaHQoc2l6ZXM6IG51bWJlcltdIHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyLCB0b3RhbENoaWxkcmVuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZXhpc3RpbmdDb3VudCA9IHRvdGFsQ2hpbGRyZW4gLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVNpemVzQXJyYXkoc2l6ZXMsIGV4aXN0aW5nQ291bnQpO1xuICAgIGNvbnN0IG5ld1dlaWdodCA9IDEgLyB0b3RhbENoaWxkcmVuO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IDEgLSBuZXdXZWlnaHQ7XG4gICAgY29uc3QgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxDaGlsZHJlbjsgaSArPSAxKSB7XG4gICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3V2VpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gaSA8IGluZGV4ID8gaSA6IGkgLSAxO1xuICAgICAgICByZXN1bHQucHVzaChub3JtYWxpemVkW3NvdXJjZUluZGV4XSAqIHJlbWFpbmluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBhbmVGcm9tU3RhY2soc3RhY2s6IERvY2tTdGFja05vZGUsIHBhbmU6IHN0cmluZywgc2tpcENsZWFudXAgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIHN0YWNrLnBhbmVzID0gc3RhY2sucGFuZXMuZmlsdGVyKChwKSA9PiBwICE9PSBwYW5lKTtcbiAgICBpZiAoIXN0YWNrLnBhbmVzLmluY2x1ZGVzKHN0YWNrLmFjdGl2ZVBhbmUgPz8gJycpKSB7XG4gICAgICBpZiAoc3RhY2sucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGFjay5hY3RpdmVQYW5lID0gc3RhY2sucGFuZXNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgc3RhY2suYWN0aXZlUGFuZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhY2sucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChza2lwQ2xlYW51cCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZSh0aGlzLnJvb3RMYXlvdXQsIHN0YWNrKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmVudFNwbGl0KFxuICAgIG5vZGU6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICBjaGlsZDogRG9ja0xheW91dE5vZGUsXG4gICk6IHsgcGFyZW50OiBEb2NrU3BsaXROb2RlOyBpbmRleDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PT0gY2hpbGQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLmtpbmQgIT09ICdzcGxpdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gbm9kZS5jaGlsZHJlbi5pbmRleE9mKGNoaWxkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4geyBwYXJlbnQ6IG5vZGUsIGluZGV4IH07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChub2RlLmNoaWxkcmVuW2ldLCBjaGlsZCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVEcm9wWm9uZShcbiAgICBzdGFjazogSFRNTEVsZW1lbnQsXG4gICAgcG9pbnQ6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IG51bGwsXG4gICAgem9uZUhpbnQ/OiBEcm9wWm9uZSB8IG51bGwsXG4gICk6IERyb3Bab25lIHwgbnVsbCB7XG4gICAgLy8gRG8gbm90IGZvcmNlIGEgem9uZTogZXZlbiB3aGVuIHRoZSBtYWluIGFyZWEgaXMgZW1wdHkgd2Ugb25seVxuICAgIC8vIGFjdGl2YXRlIGEgem9uZSB3aGVuIHRoZSBwb2ludGVyIGlzIGFjdHVhbGx5IG92ZXIgYSBqb3lzdGljayBidXR0b24uXG4gICAgY29uc3QgaGludGVkWm9uZSA9IHRoaXMuaXNEcm9wWm9uZSh6b25lSGludCkgPyB6b25lSGludCA6IG51bGw7XG4gICAgaWYgKGhpbnRlZFpvbmUpIHtcbiAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShoaW50ZWRab25lKTtcbiAgICAgIHJldHVybiBoaW50ZWRab25lO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaW50Wm9uZSA9XG4gICAgICBwb2ludCAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKHBvaW50LmNsaWVudFgpICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUocG9pbnQuY2xpZW50WSlcbiAgICAgICAgPyB0aGlzLmZpbmREcm9wWm9uZUJ5UG9pbnQocG9pbnQuY2xpZW50WCwgcG9pbnQuY2xpZW50WSlcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKHBvaW50Wm9uZSkge1xuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKHBvaW50Wm9uZSk7XG4gICAgICByZXR1cm4gcG9pbnRab25lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyb3BKb3lzdGlja1RhcmdldCA9PT0gc3RhY2spIHtcbiAgICAgIC8vIEJlIHN0aWNreSB3aGlsZSBob3ZlcmluZyB0aGUgam95c3RpY2s6IGlmIHdlIHJlY2VudGx5IGhhZCBhIHpvbmVcbiAgICAgIC8vIHNlbGVjdGVkLCBwcmVmZXIga2VlcGluZyBpdCBpbnN0ZWFkIG9mIGJyaWVmbHkgY2xlYXJpbmcgdG8gbnVsbFxuICAgICAgLy8gd2hlbiB0aGUgYnJvd3NlciByZXBvcnRzIHRyYW5zaWVudCBjb29yZGluYXRlcy90YXJnZXRzIGR1cmluZyBkcmFnLlxuICAgICAgY29uc3Qgc3RpY2t5ID0gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZShzdGlja3kpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShzdGlja3kpO1xuICAgICAgICByZXR1cm4gc3RpY2t5O1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVEcm9wSm95c3RpY2tBY3RpdmVab25lKG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0RHJvcFpvbmVGcm9tRXZlbnQoZXZlbnQ6IEV2ZW50KTogRHJvcFpvbmUgfCBudWxsIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIChldmVudCBhcyBEcmFnRXZlbnQpLmNvbXBvc2VkUGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcGF0aCA9IChldmVudCBhcyBEcmFnRXZlbnQpLmNvbXBvc2VkUGF0aCgpO1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuZmluZERyb3Bab25lSW5UYXJnZXRzKHBhdGgpO1xuICAgICAgaWYgKHpvbmUpIHtcbiAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdjbGllbnRYJyBpbiBldmVudCAmJiAnY2xpZW50WScgaW4gZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50RXZlbnQgPSBldmVudCBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3Qgem9uZUZyb21Qb2ludCA9IHRoaXMuZmluZERyb3Bab25lQnlQb2ludChwb2ludEV2ZW50LmNsaWVudFgsIHBvaW50RXZlbnQuY2xpZW50WSk7XG4gICAgICBpZiAoem9uZUZyb21Qb2ludCkge1xuICAgICAgICByZXR1cm4gem9uZUZyb21Qb2ludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ1BvaW50ZXJVcENvbW1vbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLnN0b3BEcmFnUG9pbnRlclRyYWNraW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVEZWZlcnJlZERyYWdFbmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3Bab25lSW5UYXJnZXRzKHRhcmdldHM6IEl0ZXJhYmxlPEV2ZW50VGFyZ2V0Pik6IERyb3Bab25lIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb2NrLWRyb3Atam95c3RpY2tfX2J1dHRvbicpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgem9uZSA9IHRhcmdldC5kYXRhc2V0Py5bJ3pvbmUnXTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZSh6b25lKSkge1xuICAgICAgICAgIHJldHVybiB6b25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFpvbmVCeVBvaW50KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogRHJvcFpvbmUgfCBudWxsIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zIHx8XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gIT09ICd0cnVlJyB8fFxuICAgICAgIXRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0XG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMpIHtcbiAgICAgIC8vIFNraXAgaGlkZGVuL2luYWN0aXZlIGJ1dHRvbnMgKHVzZWQgaW4gY2VudGVyLW9ubHkgbW9kZSlcbiAgICAgIGlmICgoYnV0dG9uLmRhdGFzZXRbJ2hpZGRlbiddID09PSAndHJ1ZScpIHx8IGJ1dHRvbi5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCBidXR0b24uc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjdCA9IGJ1dHRvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmXG4gICAgICAgIGNsaWVudFkgPj0gcmVjdC50b3AgJiZcbiAgICAgICAgY2xpZW50WSA8PSByZWN0LmJvdHRvbVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHpvbmUgPSBidXR0b24uZGF0YXNldFsnem9uZSddO1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bab25lKHpvbmUpKSB7XG4gICAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZSh6b25lOiBEcm9wWm9uZSB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBJZiBubyB6b25lIGlzIGNvbXB1dGVkIGJ1dCB0aGUgam95c3RpY2sgaXMgdmlzaWJsZSwga2VlcCB0aGUgbGFzdFxuICAgIC8vIGtub3duIGFjdGl2ZSB6b25lIHRvIGF2b2lkIHZpc3VhbCBqaXR0ZXIgd2hpbGUgZHJhZ2dpbmcgYWNyb3NzXG4gICAgLy8gc21hbGwgZ2FwcyB3aGVyZSBoaXTigJF0ZXN0aW5nIG1vbWVudGFyaWx5IGZhaWxzLlxuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd2aXNpYmxlJ10gPT09ICd0cnVlJztcbiAgICBjb25zdCBzdGlja3kgPSB2aXNpYmxlID8gdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVpvbmU6IERyb3Bab25lIHwgbnVsbCA9IHpvbmUgPz8gKHRoaXMuaXNEcm9wWm9uZShzdGlja3kpID8gc3RpY2t5IDogbnVsbCk7XG5cbiAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGVmZmVjdGl2ZVpvbmUgIT09IG51bGwgJiYgYnV0dG9uLmRhdGFzZXRbJ3pvbmUnXSA9PT0gZWZmZWN0aXZlWm9uZTtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBidXR0b24uZGF0YXNldFsnYWN0aXZlJ10gPSAndHJ1ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgYnV0dG9uLmRhdGFzZXRbJ2FjdGl2ZSddO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChlZmZlY3RpdmVab25lKSB7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ10gPSBlZmZlY3RpdmVab25lO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsnem9uZSddO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEcm9wWm9uZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIERyb3Bab25lIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICdsZWZ0JyB8fCB2YWx1ZSA9PT0gJ3JpZ2h0JyB8fCB2YWx1ZSA9PT0gJ3RvcCcgfHwgdmFsdWUgPT09ICdib3R0b20nIHx8IHZhbHVlID09PSAnY2VudGVyJztcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Ryb3BJbmRpY2F0b3Ioc3RhY2s6IEhUTUxFbGVtZW50LCB6b25lOiBEcm9wWm9uZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gdGhpcy5wYXJzZVBhdGgoc3RhY2suZGF0YXNldFsncGF0aCddKTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gdGhpcy5kcmFnU3RhdGU/LnNvdXJjZVBhdGggPz8gbnVsbDtcbiAgICBpZiAodGFyZ2V0UGF0aCAmJiBzb3VyY2VQYXRoICYmIHRoaXMuaXNPcklzQW5jZXN0b3JPZih0YXJnZXRQYXRoLCBzb3VyY2VQYXRoKSkge1xuICAgICAgLy8gRG9uJ3Qgc2hvdyBhbnkgZHJvcCBpbmRpY2F0b3JzIG9uIHRoZSBwYW5lIGJlaW5nIGRyYWdnZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHN0YWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpbmRpY2F0b3IgPSB0aGlzLmRyb3BJbmRpY2F0b3I7XG4gICAgY29uc3Qgam95c3RpY2sgPSB0aGlzLmRyb3BKb3lzdGljaztcblxuICAgIGpveXN0aWNrLmhpZGRlbiA9IGZhbHNlO1xuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMucGFyc2VQYXRoKHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSk7XG4gICAgbGV0IG92ZXJsYXlaID0gMTAwO1xuICAgIGlmIChwYXRoICYmIHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgb3ZlcmxheVogPSB0aGlzLmdldEZsb2F0aW5nUGFuZVpJbmRleChwYXRoLmluZGV4KSArIDEwMDtcbiAgICB9XG4gICAgaW5kaWNhdG9yLnN0eWxlLnpJbmRleCA9IFN0cmluZyhvdmVybGF5Wik7XG4gICAgam95c3RpY2suc3R5bGUuekluZGV4ID0gU3RyaW5nKG92ZXJsYXlaICsgMSk7XG5cbiAgICBsZXQgbGVmdCA9IHJlY3QubGVmdCAtIGhvc3RSZWN0LmxlZnQ7XG4gICAgbGV0IHRvcCA9IHJlY3QudG9wIC0gaG9zdFJlY3QudG9wO1xuICAgIGxldCB3aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgbGV0IGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuXG4gICAgY29uc3QgcG9ydGlvbiA9IDAuNTtcblxuICAgIGlmICh6b25lKSB7XG4gICAgICBzd2l0Y2ggKHpvbmUpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgd2lkdGggPSByZWN0LndpZHRoICogcG9ydGlvbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCAqIHBvcnRpb247XG4gICAgICAgICAgbGVmdCArPSByZWN0LndpZHRoICogKDEgLSBwb3J0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCAqIHBvcnRpb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiBwb3J0aW9uO1xuICAgICAgICAgIHRvcCArPSByZWN0LmhlaWdodCAqICgxIC0gcG9ydGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGluZGljYXRvci5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICBpbmRpY2F0b3Iuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgIGluZGljYXRvci5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIGluZGljYXRvci5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgaW5kaWNhdG9yLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICd0cnVlJztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNhdG9yLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgam95c3RpY2suc3R5bGUubGVmdCA9IGAke3JlY3QubGVmdCAtIGhvc3RSZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMn1weGA7XG4gICAgam95c3RpY2suc3R5bGUudG9wID0gYCR7cmVjdC50b3AgLSBob3N0UmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJ9cHhgO1xuICAgIGpveXN0aWNrLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICd0cnVlJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgIGpveXN0aWNrLmRhdGFzZXRbJ3BhdGgnXSA9IHN0YWNrLmRhdGFzZXRbJ3BhdGgnXSA/PyAnJztcbiAgICBjb25zdCBjaGFuZ2VkVGFyZ2V0ID0gdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgJiYgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgIT09IHN0YWNrO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrVGFyZ2V0ID0gc3RhY2s7XG4gICAgaWYgKGNoYW5nZWRUYXJnZXQpIHtcbiAgICAgIC8vIE5ldyB0YXJnZXQgc3RhY2s6IGZvcmdldCBhbnkgcHJldmlvdXNseSBzdGlja3kgem9uZS5cbiAgICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0Wyd6b25lJ107XG4gICAgfVxuXG4gICAgLy8gSWYgbWFpbiBkb2NrIGFyZWEgaXMgZW1wdHksIHNob3cgb25seSB0aGUgY2VudGVyIGJ1dHRvbiBhbmQgY29sbGFwc2UgdGhlIGdyaWRcbiAgICBjb25zdCBpc0VtcHR5TWFpbkFyZWEgPSAhdGhpcy5yb290TGF5b3V0ICYmIChzdGFjayA9PT0gdGhpcy5kb2NrZWRFbCB8fCAodGFyZ2V0UGF0aCAmJiB0YXJnZXRQYXRoLnR5cGUgPT09ICdkb2NrZWQnICYmIHRhcmdldFBhdGguc2VnbWVudHMubGVuZ3RoID09PSAwKSk7XG4gICAgY29uc3Qgc3BhY2VycyA9IEFycmF5LmZyb20odGhpcy5kcm9wSm95c3RpY2sucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5kb2NrLWRyb3Atam95c3RpY2tfX3NwYWNlcicpKTtcbiAgICBpZiAoaXNFbXB0eU1haW5BcmVhKSB7XG4gICAgICAvLyBLZWVwIHNwYWNlcnMgdmlzaWJsZSBzbyB0aGUgam95c3RpY2sga2VlcHMgaXRzIGNpcmN1bGFyIGZvb3RwcmludC5cbiAgICAgIHNwYWNlcnMuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kcm9wSm95c3RpY2tCdXR0b25zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICBjb25zdCBpc0NlbnRlciA9IGJ0bi5kYXRhc2V0Wyd6b25lJ10gPT09ICdjZW50ZXInO1xuICAgICAgICBpZiAoaXNDZW50ZXIpIHtcbiAgICAgICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgICAgZGVsZXRlIGJ0bi5kYXRhc2V0WydoaWRkZW4nXTtcbiAgICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhpZGUgdmlzdWFsbHkgYnV0IGtlZXAgbGF5b3V0IHNwYWNlOyBhbHNvIHByZXZlbnQgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgYnRuLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICBidG4uZGF0YXNldFsnaGlkZGVuJ10gPSAndHJ1ZSc7XG4gICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBLZWVwIGRlZmF1bHQgM3gzIGdyaWQgc28gdGhlIGNpcmN1bGFyIGJhY2tncm91bmQgc2l6ZSBzdGF5cyB0aGUgc2FtZS5cbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSAnJztcbiAgICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZVJvd3MgPSAnJztcbiAgICAgIC8vIERvIG5vdCBzZXQgYW4gYWN0aXZlIHpvbmUgYXV0b21hdGljYWxseTsgdXNlcnMgbXVzdCBob3ZlciB0aGUgYnV0dG9uLlxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3BKb3lzdGlja0J1dHRvbnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIGRlbGV0ZSBidG4uZGF0YXNldFsnaGlkZGVuJ107XG4gICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9KTtcbiAgICAgIHNwYWNlcnMuZm9yRWFjaCgocykgPT4gKHMuc3R5bGUuZGlzcGxheSA9ICcnKSk7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJyc7XG4gICAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gJyc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZSh6b25lKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZURyb3BJbmRpY2F0b3IoKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wSW5kaWNhdG9yLmRhdGFzZXRbJ3Zpc2libGUnXSA9ICdmYWxzZSc7XG4gICAgdGhpcy5kcm9wSm95c3RpY2suZGF0YXNldFsndmlzaWJsZSddID0gJ2ZhbHNlJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRlbGV0ZSB0aGlzLmRyb3BKb3lzdGljay5kYXRhc2V0WydwYXRoJ107XG4gICAgdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlRHJvcEpveXN0aWNrQWN0aXZlWm9uZShudWxsKTtcbiAgICAvLyBSZXN0b3JlIGpveXN0aWNrIHN0cnVjdHVyZSB0byBkZWZhdWx0LlxuICAgIHRoaXMuZHJvcEpveXN0aWNrQnV0dG9ucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgIGRlbGV0ZSBidG4uZGF0YXNldFsnaGlkZGVuJ107XG4gICAgfSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLmRyb3BKb3lzdGljay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stZHJvcC1qb3lzdGlja19fc3BhY2VyJykpLmZvckVhY2goKHMpID0+IChzLnN0eWxlLmRpc3BsYXkgPSAnJykpO1xuICAgIHRoaXMuZHJvcEpveXN0aWNrLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSAnJztcbiAgICB0aGlzLmRyb3BKb3lzdGljay5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFja0F0UG9pbnQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuc2hhZG93Um9vdDtcbiAgICBpZiAoIXNoYWRvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBzaGFkb3cuZWxlbWVudHNGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0luVGFyZ2V0cyhlbGVtZW50cyk7XG4gICAgaWYgKHN0YWNrKSB7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfVxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBkb2NrZWQgc3RhY2tzIChhbGwgcGFuZXMgYXJlIGZsb2F0aW5nKSwgYWxsb3cgdGhlXG4gICAgLy8gZG9ja2VkIHN1cmZhY2UgaXRzZWxmIHRvIHNlcnZlIGFzIGEgZHJvcCB0YXJnZXQgZm9yIHRoZSBtYWluIHpvbmUuXG4gICAgaWYgKCF0aGlzLnJvb3RMYXlvdXQpIHtcbiAgICAgIGNvbnN0IGRvY2tSZWN0ID0gdGhpcy5kb2NrZWRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2xpZW50WCA+PSBkb2NrUmVjdC5sZWZ0ICYmXG4gICAgICAgIGNsaWVudFggPD0gZG9ja1JlY3QucmlnaHQgJiZcbiAgICAgICAgY2xpZW50WSA+PSBkb2NrUmVjdC50b3AgJiZcbiAgICAgICAgY2xpZW50WSA8PSBkb2NrUmVjdC5ib3R0b21cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NrZWRFbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWNrRWxlbWVudChldmVudDogRHJhZ0V2ZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmZpbmRTdGFja0luVGFyZ2V0cyhwYXRoKTtcbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcm9vdCBkb2NrIGFyZWEgaXMgZW1wdHksIHRyZWF0IHRoZSBkb2NrZWQgc3VyZmFjZSBhcyBhIHZhbGlkXG4gICAgLy8gdGFyZ2V0IHdoZW4gaXQgYXBwZWFycyBpbiB0aGUgY29tcG9zZWQgcGF0aC5cbiAgICBpZiAoIXRoaXMucm9vdExheW91dCkge1xuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgcGF0aCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgICAodGFyZ2V0ID09PSB0aGlzLmRvY2tlZEVsIHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZG9ja2VkJykpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRvY2tlZEVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhY2tJblRhcmdldHModGFyZ2V0czogSXRlcmFibGU8RXZlbnRUYXJnZXQ+KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGFyZ2V0cykge1xuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1zdGFjaycpKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmRyb3BKb3lzdGlja1RhcmdldCAmJlxuICAgICAgICAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZHJvcC1qb3lzdGljaycpIHx8XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY2stZHJvcC1qb3lzdGlja19fYnV0dG9uJykgfHxcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZG9jay1kcm9wLWpveXN0aWNrX19zcGFjZXInKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wSm95c3RpY2tUYXJnZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZVBhbmUoc3RhY2s6IEhUTUxFbGVtZW50LCBwYW5lTmFtZTogc3RyaW5nLCBwYXRoOiBEb2NrUGF0aCk6IHZvaWQge1xuICAgIHN0YWNrLmRhdGFzZXRbJ2FjdGl2ZVBhbmUnXSA9IHBhbmVOYW1lO1xuXG4gICAgY29uc3QgaGVhZGVyQnV0dG9ucyA9IHN0YWNrLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuZG9jay10YWInKTtcbiAgICBoZWFkZXJCdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1dHRvbi5kYXRhc2V0WydwYW5lJ10gPT09IHBhbmVOYW1lO1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ2RvY2stdGFiLS1hY3RpdmUnLCBpc1NlbGVjdGVkKTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBTdHJpbmcoaXNTZWxlY3RlZCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGFuZXMgPSBzdGFjay5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmRvY2stc3RhY2tfX3BhbmUnKTtcbiAgICBwYW5lcy5mb3JFYWNoKChwYW5lKSA9PiB7XG4gICAgICBpZiAocGFuZS5kYXRhc2V0WydwYW5lJ10gPT09IHBhbmVOYW1lKSB7XG4gICAgICAgIHBhbmUucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbmUuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMucmVzb2x2ZVN0YWNrTG9jYXRpb24ocGF0aCk7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvY2F0aW9uLm5vZGUuYWN0aXZlUGFuZSA9IHBhbmVOYW1lO1xuICAgIGlmIChwYXRoLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbcGF0aC5pbmRleF07XG4gICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgZmxvYXRpbmcuYWN0aXZlUGFuZSA9IHBhbmVOYW1lO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGbG9hdGluZ1dpbmRvd1RpdGxlKHBhdGguaW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoTGF5b3V0Q2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlQXRQYXRoKHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCwgcGF0aDogbnVtYmVyW10pOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnQ6IERvY2tMYXlvdXROb2RlIHwgbnVsbCA9IHJvb3Q7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQua2luZCAhPT0gJ3NwbGl0Jykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW3NlZ21lbnRdID8/IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTcGxpdE5vZGUocGF0aDogRG9ja1BhdGgpOiBEb2NrU3BsaXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2RvY2tlZCcpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgodGhpcy5yb290TGF5b3V0LCBwYXRoLnNlZ21lbnRzKTtcbiAgICAgIHJldHVybiBub2RlICYmIG5vZGUua2luZCA9PT0gJ3NwbGl0JyA/IG5vZGUgOiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbcGF0aC5pbmRleF07XG4gICAgaWYgKCFmbG9hdGluZyB8fCAhZmxvYXRpbmcucm9vdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aChmbG9hdGluZy5yb290LCBwYXRoLnNlZ21lbnRzKTtcbiAgICByZXR1cm4gbm9kZSAmJiBub2RlLmtpbmQgPT09ICdzcGxpdCcgPyBub2RlIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU5vZGVJblRyZWUoXG4gICAgcm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHRhcmdldDogRG9ja0xheW91dE5vZGUsXG4gICAgcmVwbGFjZW1lbnQ6IERvY2tMYXlvdXROb2RlLFxuICApOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwge1xuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH1cblxuICAgIGlmIChyb290ID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRJbmZvID0gdGhpcy5maW5kUGFyZW50U3BsaXQocm9vdCwgdGFyZ2V0KTtcbiAgICBpZiAoIXBhcmVudEluZm8pIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIHBhcmVudEluZm8ucGFyZW50LmNoaWxkcmVuW3BhcmVudEluZm8uaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG4gICAgdGhpcy5ub3JtYWxpemVTcGxpdE5vZGUocGFyZW50SW5mby5wYXJlbnQpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRW1wdHlTdGFja0luVHJlZShcbiAgICByb290OiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgc3RhY2s6IERvY2tTdGFja05vZGUsXG4gICk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKCFyb290IHx8IHN0YWNrLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEluZm8gPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChyb290LCBzdGFjayk7XG4gICAgaWYgKCFwYXJlbnRJbmZvKSB7XG4gICAgICByZXR1cm4gcm9vdCA9PT0gc3RhY2sgPyBudWxsIDogcm9vdDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRJbmZvLnBhcmVudDtcbiAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHN0YWNrKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnQuc2l6ZXMpKSB7XG4gICAgICBwYXJlbnQuc2l6ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5ub3JtYWxpemVTcGxpdE5vZGUocGFyZW50KTtcblxuICAgIHJldHVybiB0aGlzLmNsZWFudXBTcGxpdElmTmVjZXNzYXJ5KHJvb3QsIHBhcmVudCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBTcGxpdElmTmVjZXNzYXJ5KFxuICAgIHJvb3Q6IERvY2tMYXlvdXROb2RlIHwgbnVsbCxcbiAgICBzcGxpdDogRG9ja1NwbGl0Tm9kZSxcbiAgKTogRG9ja0xheW91dE5vZGUgfCBudWxsIHtcbiAgICBpZiAoc3BsaXQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTm9kZUluVHJlZShyb290LCBzcGxpdCwgc3BsaXQuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIGlmIChzcGxpdC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHBhcmVudEluZm8gPSB0aGlzLmZpbmRQYXJlbnRTcGxpdChyb290LCBzcGxpdCk7XG4gICAgICBpZiAoIXBhcmVudEluZm8pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudEluZm8ucGFyZW50O1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzcGxpdCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnQuc2l6ZXMpKSB7XG4gICAgICAgICAgcGFyZW50LnNpemVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3JtYWxpemVTcGxpdE5vZGUocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cFNwbGl0SWZOZWNlc3Nhcnkocm9vdCwgcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgZG9ja05vZGVCZXNpZGUoXG4gICAgcm9vdDogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHRhcmdldE5vZGU6IERvY2tTdGFja05vZGUsXG4gICAgbmV3Tm9kZTogRG9ja0xheW91dE5vZGUsXG4gICAgem9uZTogRHJvcFpvbmUsXG4gICk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB6b25lID09PSAnbGVmdCcgfHwgem9uZSA9PT0gJ3JpZ2h0JyA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgY29uc3QgcGxhY2VCZWZvcmUgPSB6b25lID09PSAnbGVmdCcgfHwgem9uZSA9PT0gJ3RvcCc7XG4gICAgY29uc3QgcGFyZW50SW5mbyA9IHRoaXMuZmluZFBhcmVudFNwbGl0KHJvb3QsIHRhcmdldE5vZGUpO1xuXG4gICAgaWYgKHBhcmVudEluZm8gJiYgcGFyZW50SW5mby5wYXJlbnQuZGlyZWN0aW9uID09PSBvcmllbnRhdGlvbikge1xuICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBwbGFjZUJlZm9yZSA/IHBhcmVudEluZm8uaW5kZXggOiBwYXJlbnRJbmZvLmluZGV4ICsgMTtcbiAgICAgIHBhcmVudEluZm8ucGFyZW50LmNoaWxkcmVuLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3Tm9kZSk7XG4gICAgICBwYXJlbnRJbmZvLnBhcmVudC5zaXplcyA9IHRoaXMuaW5zZXJ0V2VpZ2h0KFxuICAgICAgICBwYXJlbnRJbmZvLnBhcmVudC5zaXplcyxcbiAgICAgICAgaW5zZXJ0SW5kZXgsXG4gICAgICAgIHBhcmVudEluZm8ucGFyZW50LmNoaWxkcmVuLmxlbmd0aCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gcm9vdCA/PyBuZXdOb2RlO1xuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0OiBEb2NrU3BsaXROb2RlID0ge1xuICAgICAga2luZDogJ3NwbGl0JyxcbiAgICAgIGRpcmVjdGlvbjogb3JpZW50YXRpb24sXG4gICAgICBjaGlsZHJlbjogcGxhY2VCZWZvcmUgPyBbbmV3Tm9kZSwgdGFyZ2V0Tm9kZV0gOiBbdGFyZ2V0Tm9kZSwgbmV3Tm9kZV0sXG4gICAgICBzaXplczogWzAuNSwgMC41XSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZU5vZGVJblRyZWUocm9vdCwgdGFyZ2V0Tm9kZSwgc3BsaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JFYWNoU3RhY2soXG4gICAgbm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsLFxuICAgIHZpc2l0b3I6IChzdGFjazogRG9ja1N0YWNrTm9kZSwgcGF0aDogbnVtYmVyW10pID0+IHZvaWQsXG4gICAgcGF0aDogbnVtYmVyW10gPSBbXSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUua2luZCA9PT0gJ3N0YWNrJykge1xuICAgICAgdmlzaXRvcihub2RlLCBwYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT5cbiAgICAgIHRoaXMuZm9yRWFjaFN0YWNrKGNoaWxkLCB2aXNpdG9yLCBbLi4ucGF0aCwgaW5kZXhdKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhY2tDb250YWluaW5nUGFuZShcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICAgcGFuZTogc3RyaW5nLFxuICApOiBEb2NrU3RhY2tOb2RlIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogRG9ja1N0YWNrTm9kZSB8IG51bGwgPSBudWxsO1xuICAgIHRoaXMuZm9yRWFjaFN0YWNrKG5vZGUsIChzdGFjaykgPT4ge1xuICAgICAgaWYgKCFyZXN1bHQgJiYgc3RhY2sucGFuZXMuaW5jbHVkZXMocGFuZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gc3RhY2s7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEZpcnN0UGFuZU5hbWUobm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGZvdW5kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0aGlzLmZvckVhY2hTdGFjayhub2RlLCAoc3RhY2spID0+IHtcbiAgICAgIGlmIChmb3VuZCB8fCBzdGFjay5wYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHN0YWNrLmFjdGl2ZVBhbmUgJiYgc3RhY2sucGFuZXMuaW5jbHVkZXMoc3RhY2suYWN0aXZlUGFuZSkpIHtcbiAgICAgICAgZm91bmQgPSBzdGFjay5hY3RpdmVQYW5lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmQgPSBzdGFjay5wYW5lc1swXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RGbG9hdGluZ1BhbmVNZXRhZGF0YShcbiAgICBub2RlOiBEb2NrTGF5b3V0Tm9kZSB8IG51bGwsXG4gICk6IHsgcGFuZXM6IHN0cmluZ1tdOyB0aXRsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gICAgLy8gRGVwcmVjYXRlZCBtZXRob2QgcmV0YWluZWQgdGVtcG9yYXJpbHkgZm9yIHNpZ25hdHVyZSBjb21wYXRpYmlsaXR5LlxuICAgIC8vIFVzZSBjb2xsZWN0UGFuZU5hbWVzIGluc3RlYWQuXG4gICAgY29uc3QgcGFuZXMgPSB0aGlzLmNvbGxlY3RQYW5lTmFtZXMobm9kZSk7XG4gICAgY29uc3QgdGl0bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgcGFuZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgY29uc3QgdCA9IHRoaXMudGl0bGVzW3BdO1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgdGl0bGVzW3BdID0gdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBwYW5lcywgdGl0bGVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RQYW5lTmFtZXMobm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaFN0YWNrKG5vZGUsIChzdGFjaykgPT4ge1xuICAgICAgc3RhY2sucGFuZXMuZm9yRWFjaCgocGFuZSkgPT4gcGFuZXMucHVzaChwYW5lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVGbG9hdGluZ0xheW91dChcbiAgICBsYXlvdXQ6IERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0LFxuICApOiBEb2NrRmxvYXRpbmdTdGFja0xheW91dCB7XG4gICAgY29uc3QgYm91bmRzID0gbGF5b3V0LmJvdW5kcyA/PyB7IGxlZnQ6IDAsIHRvcDogMCwgd2lkdGg6IDMyMCwgaGVpZ2h0OiAyMDAgfTtcbiAgICBjb25zdCBub3JtYWxpemVkQm91bmRzID0ge1xuICAgICAgbGVmdDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy5sZWZ0KSA/IGJvdW5kcy5sZWZ0IDogMCxcbiAgICAgIHRvcDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy50b3ApID8gYm91bmRzLnRvcCA6IDAsXG4gICAgICB3aWR0aDogTnVtYmVyLmlzRmluaXRlKGJvdW5kcy53aWR0aCkgPyBNYXRoLm1heChib3VuZHMud2lkdGgsIDE2MCkgOiAzMjAsXG4gICAgICBoZWlnaHQ6IE51bWJlci5pc0Zpbml0ZShib3VuZHMuaGVpZ2h0KSA/IE1hdGgubWF4KGJvdW5kcy5oZWlnaHQsIDEyMCkgOiAyMDAsXG4gICAgfTtcblxuICAgIGNvbnN0IHJvb3QgPSBsYXlvdXQucm9vdCA/IHRoaXMuY2xvbmVMYXlvdXROb2RlKGxheW91dC5yb290KSA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGxheW91dC5pZCxcbiAgICAgIGJvdW5kczogbm9ybWFsaXplZEJvdW5kcyxcbiAgICAgIHpJbmRleDogbGF5b3V0LnpJbmRleCxcbiAgICAgIHJvb3QsXG4gICAgICBhY3RpdmVQYW5lOiBsYXlvdXQuYWN0aXZlUGFuZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXRoKHBhdGg6IERvY2tQYXRoKTogc3RyaW5nIHtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBzdWZmaXggPVxuICAgICAgICBwYXRoLnNlZ21lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAvJHtwYXRoLnNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50b1N0cmluZygpKS5qb2luKCcvJyl9YFxuICAgICAgICAgIDogJyc7XG4gICAgICByZXR1cm4gYGY6JHtwYXRoLmluZGV4fSR7c3VmZml4fWA7XG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeCA9IHBhdGguc2VnbWVudHMuam9pbignLycpO1xuICAgIHJldHVybiBzdWZmaXgubGVuZ3RoID4gMCA/IGBkOiR7c3VmZml4fWAgOiAnZDonO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZVBhdGgocGF0aDogRG9ja1BhdGgpOiBEb2NrUGF0aCB7XG4gICAgaWYgKHBhdGgudHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2Zsb2F0aW5nJywgaW5kZXg6IHBhdGguaW5kZXgsIHNlZ21lbnRzOiBbLi4ucGF0aC5zZWdtZW50c10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ2RvY2tlZCcsIHNlZ21lbnRzOiBbLi4ucGF0aC5zZWdtZW50c10gfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQYXRoKHBhdGg6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBEb2NrUGF0aCB8IG51bGwge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnZjonKSkge1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gcGF0aC5zbGljZSgyKTtcbiAgICAgIGNvbnN0IFtpbmRleFBhcnQsIC4uLnNlZ21lbnRQYXJ0c10gPSByZW1haW5kZXIuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4UGFydCwgMTApO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VnbWVudHMgPSBzZWdtZW50UGFydHNcbiAgICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwKVxuICAgICAgICAubWFwKChzZWdtZW50KSA9PiBOdW1iZXIucGFyc2VJbnQoc2VnbWVudCwgMTApKVxuICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmxvYXRpbmcnLCBpbmRleCwgc2VnbWVudHMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gcGF0aC5zdGFydHNXaXRoKCdkOicpID8gcGF0aC5zbGljZSgyKSA6IHBhdGg7XG4gICAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZG9ja2VkJywgc2VnbWVudHM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkXG4gICAgICAuc3BsaXQoJy8nKVxuICAgICAgLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gTnVtYmVyLnBhcnNlSW50KHNlZ21lbnQsIDEwKSlcbiAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdkb2NrZWQnLCBzZWdtZW50cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXRoc0VxdWFsKGE6IERvY2tQYXRoLCBiOiBEb2NrUGF0aCk6IGJvb2xlYW4ge1xuICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChhLnR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IG90aGVyID0gYiBhcyBFeHRyYWN0PERvY2tQYXRoLCB7IHR5cGU6ICdmbG9hdGluZycgfT47XG4gICAgICBpZiAoYS5pbmRleCAhPT0gb3RoZXIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGEuc2VnbWVudHMubGVuZ3RoICE9PSBvdGhlci5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGEuc2VnbWVudHMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IG90aGVyLnNlZ21lbnRzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3RoZXIgPSBiIGFzIEV4dHJhY3Q8RG9ja1BhdGgsIHsgdHlwZTogJ2RvY2tlZCcgfT47XG4gICAgaWYgKGEuc2VnbWVudHMubGVuZ3RoICE9PSBvdGhlci5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYS5zZWdtZW50cy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gb3RoZXIuc2VnbWVudHNbaW5kZXhdKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPcklzQW5jZXN0b3JPZihhbmNlc3RvcjogRG9ja1BhdGgsIGRlc2NlbmRhbnQ6IERvY2tQYXRoKTogYm9vbGVhbiB7XG4gICAgaWYgKGFuY2VzdG9yLnR5cGUgIT09IGRlc2NlbmRhbnQudHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChhbmNlc3Rvci50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBpZiAoKGRlc2NlbmRhbnQgYXMgYW55KS5pbmRleCAhPT0gYW5jZXN0b3IuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhbmNlc3Rvci5zZWdtZW50cy5sZW5ndGggPiBkZXNjZW5kYW50LnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3Rvci5zZWdtZW50cy5ldmVyeSgoc2VnbWVudCwgaSkgPT4gc2VnbWVudCA9PT0gZGVzY2VuZGFudC5zZWdtZW50c1tpXSk7XG4gIH1cblxuICBwcml2YXRlIGNvdW50UGFuZXNJblRyZWUobm9kZTogRG9ja0xheW91dE5vZGUgfCBudWxsKTogbnVtYmVyIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAobm9kZS5raW5kID09PSAnc3RhY2snKSB7XG4gICAgICByZXR1cm4gbm9kZS5wYW5lcy5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLnJlZHVjZSgodG90YWwsIGNoaWxkKSA9PiB0b3RhbCArIHRoaXMuY291bnRQYW5lc0luVHJlZShjaGlsZCksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU3RhY2tMb2NhdGlvbihwYXRoOiBEb2NrUGF0aCk6IFJlc29sdmVkTG9jYXRpb24gfCBudWxsIHtcbiAgICBpZiAocGF0aC50eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmZsb2F0aW5nTGF5b3V0c1twYXRoLmluZGV4XTtcbiAgICAgIGlmICghbGF5b3V0IHx8ICFsYXlvdXQucm9vdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVBdFBhdGgobGF5b3V0LnJvb3QsIHBhdGguc2VnbWVudHMpO1xuICAgICAgaWYgKCFub2RlIHx8IG5vZGUua2luZCAhPT0gJ3N0YWNrJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvbnRleHQ6ICdmbG9hdGluZycsIGluZGV4OiBwYXRoLmluZGV4LCBwYXRoOiBbLi4ucGF0aC5zZWdtZW50c10sIG5vZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQXRQYXRoKHRoaXMucm9vdExheW91dCwgcGF0aC5zZWdtZW50cyk7XG4gICAgaWYgKCFub2RlIHx8IG5vZGUua2luZCAhPT0gJ3N0YWNrJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGV4dDogJ2RvY2tlZCcsIHBhdGg6IFsuLi5wYXRoLnNlZ21lbnRzXSwgbm9kZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQYW5lRnJvbUxvY2F0aW9uKFxuICAgIGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBza2lwQ2xlYW51cCA9IGZhbHNlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobG9jYXRpb24uY29udGV4dCA9PT0gJ2RvY2tlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZVBhbmVGcm9tU3RhY2sobG9jYXRpb24ubm9kZSwgcGFuZSwgc2tpcENsZWFudXApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbW92ZVBhbmVGcm9tRmxvYXRpbmcobG9jYXRpb24uaW5kZXgsIGxvY2F0aW9uLnBhdGgsIHBhbmUsIHNraXBDbGVhbnVwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGFuZVRvTG9jYXRpb24obG9jYXRpb246IFJlc29sdmVkTG9jYXRpb24sIHBhbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhbmVzID0gbG9jYXRpb24ubm9kZS5wYW5lcztcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gcGFuZXMuaW5kZXhPZihwYW5lKTtcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIHBhbmVzLnNwbGljZShleGlzdGluZ0luZGV4LCAxKTtcbiAgICB9XG4gICAgcGFuZXMucHVzaChwYW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlUGFuZUZvckxvY2F0aW9uKGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhdGlvbi5ub2RlLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmIChmbG9hdGluZykge1xuICAgICAgICBmbG9hdGluZy5hY3RpdmVQYW5lID0gcGFuZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBMb2NhdGlvbihsb2NhdGlvbjogUmVzb2x2ZWRMb2NhdGlvbik6IHZvaWQge1xuICAgIGlmIChsb2NhdGlvbi5jb250ZXh0ID09PSAnZG9ja2VkJykge1xuICAgICAgdGhpcy5yb290TGF5b3V0ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZSh0aGlzLnJvb3RMYXlvdXQsIGxvY2F0aW9uLm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2xvY2F0aW9uLmluZGV4XTtcbiAgICAgIGlmICghZmxvYXRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmbG9hdGluZy5yb290ID0gdGhpcy5jbGVhbnVwRW1wdHlTdGFja0luVHJlZShmbG9hdGluZy5yb290LCBsb2NhdGlvbi5ub2RlKTtcbiAgICAgIGlmICghZmxvYXRpbmcucm9vdCkge1xuICAgICAgICB0aGlzLnJlbW92ZUZsb2F0aW5nQXQobG9jYXRpb24uaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVvcmRlclBhbmVJbkxvY2F0aW9uKGxvY2F0aW9uOiBSZXNvbHZlZExvY2F0aW9uLCBwYW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lcyA9IGxvY2F0aW9uLm5vZGUucGFuZXM7XG4gICAgY29uc3QgaW5kZXggPSBwYW5lcy5pbmRleE9mKHBhbmUpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFuZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBwYW5lcy5wdXNoKHBhbmUpO1xuICAgIGxvY2F0aW9uLm5vZGUuYWN0aXZlUGFuZSA9IHBhbmU7XG4gICAgaWYgKGxvY2F0aW9uLmNvbnRleHQgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGNvbnN0IGZsb2F0aW5nID0gdGhpcy5mbG9hdGluZ0xheW91dHNbbG9jYXRpb24uaW5kZXhdO1xuICAgICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBwYW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRmxvYXRpbmdBdChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsb2F0aW5nTGF5b3V0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mbG9hdGluZ0xheW91dHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGFuZUZyb21GbG9hdGluZyhcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhdGg6IG51bWJlcltdLFxuICAgIHBhbmU6IHN0cmluZyxcbiAgICBza2lwQ2xlYW51cCA9IGZhbHNlLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBmbG9hdGluZyA9IHRoaXMuZmxvYXRpbmdMYXlvdXRzW2luZGV4XTtcbiAgICBpZiAoIWZsb2F0aW5nIHx8ICFmbG9hdGluZy5yb290KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUF0UGF0aChmbG9hdGluZy5yb290LCBwYXRoKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnc3RhY2snKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbm9kZS5wYW5lcyA9IG5vZGUucGFuZXMuZmlsdGVyKChwKSA9PiBwICE9PSBwYW5lKTtcbiAgICBpZiAoIW5vZGUucGFuZXMuaW5jbHVkZXMobm9kZS5hY3RpdmVQYW5lID8/ICcnKSkge1xuICAgICAgaWYgKG5vZGUucGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBub2RlLmFjdGl2ZVBhbmUgPSBub2RlLnBhbmVzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5vZGUuYWN0aXZlUGFuZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmxvYXRpbmcuYWN0aXZlUGFuZSA9PT0gcGFuZSkge1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLmZpbmRGaXJzdFBhbmVOYW1lKGZsb2F0aW5nLnJvb3QpO1xuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIGZsb2F0aW5nLmFjdGl2ZVBhbmUgPSBmYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBmbG9hdGluZy5hY3RpdmVQYW5lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub2RlLnBhbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2tpcENsZWFudXApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZsb2F0aW5nLnJvb3QgPSB0aGlzLmNsZWFudXBFbXB0eVN0YWNrSW5UcmVlKGZsb2F0aW5nLnJvb3QsIG5vZGUpO1xuICAgIGlmICghZmxvYXRpbmcucm9vdCkge1xuICAgICAgdGhpcy5yZW1vdmVGbG9hdGluZ0F0KGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplU2l6ZXNBcnJheShzaXplczogbnVtYmVyW10gfCB1bmRlZmluZWQsIGNvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2l6ZXMpIHx8IHNpemVzLmxlbmd0aCAhPT0gY291bnQpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAxIC8gY291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBzaXplcy5tYXAoKHZhbHVlKSA9PiAoTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IE1hdGgubWF4KHZhbHVlLCAwKSA6IDApKTtcbiAgICBjb25zdCB0b3RhbCA9IG5vcm1hbGl6ZWQucmVkdWNlKChhY2MsIHZhbHVlKSA9PiBhY2MgKyB2YWx1ZSwgMCk7XG4gICAgaWYgKHRvdGFsIDw9IDApIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAxIC8gY291bnQpO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkLm1hcCgodmFsdWUpID0+IHZhbHVlIC8gdG90YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTcGxpdE5vZGUoc3BsaXQ6IERvY2tTcGxpdE5vZGUpOiB2b2lkIHtcbiAgICBzcGxpdC5zaXplcyA9IHRoaXMubm9ybWFsaXplU2l6ZXNBcnJheShzcGxpdC5zaXplcywgc3BsaXQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hMYXlvdXRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZG9jay1sYXlvdXQtY2hhbmdlZCcsIHtcbiAgICAgICAgZGV0YWlsOiB0aGlzLnNuYXBzaG90LFxuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lTGF5b3V0Tm9kZShsYXlvdXQ6IERvY2tMYXlvdXROb2RlKTogRG9ja0xheW91dE5vZGU7XG4gIHByaXZhdGUgY2xvbmVMYXlvdXROb2RlKGxheW91dDogRG9ja0xheW91dE5vZGUgfCBudWxsKTogRG9ja0xheW91dE5vZGUgfCBudWxsO1xuICBwcml2YXRlIGNsb25lTGF5b3V0Tm9kZShsYXlvdXQ6IERvY2tMYXlvdXROb2RlIHwgbnVsbCk6IERvY2tMYXlvdXROb2RlIHwgbnVsbCB7XG4gICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxheW91dCkpIGFzIERvY2tMYXlvdXROb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUZsb2F0aW5nQXJyYXkoXG4gICAgbGF5b3V0czogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXRbXSxcbiAgKTogRG9ja0Zsb2F0aW5nU3RhY2tMYXlvdXRbXSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0cykpIGFzIERvY2tGbG9hdGluZ1N0YWNrTGF5b3V0W107XG4gIH1cbn1cblxuY29uc3QgdGFnTmFtZSA9ICdtaW50LWRvY2stbWFuYWdlcic7XG5cbmlmICh0eXBlb2YgY3VzdG9tRWxlbWVudHMgIT09ICd1bmRlZmluZWQnICYmICFjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpIHtcbiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIE1pbnREb2NrTWFuYWdlckVsZW1lbnQpO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdtaW50LWRvY2stbWFuYWdlcic6IE1pbnREb2NrTWFuYWdlckVsZW1lbnQ7XG4gIH1cbn1cbiJdfQ==","import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, Output, QueryList, ViewChild, } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { BsDockPaneComponent } from './dock-pane.component';\nimport { MintDockManagerElement } from '../web-components/mint-dock-manager.element';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class BsDockManagerComponent {\n set layout(value) {\n const snapshot = this.cloneLayout(this.ensureSnapshot(value));\n this._layout = snapshot;\n this.layoutString = this.stringifyLayout(snapshot);\n this.applyLayout();\n }\n get layout() {\n if (!this._layout.root && this._layout.floating.length === 0) {\n return null;\n }\n return this.cloneLayout(this._layout);\n }\n constructor(changeDetector, documentRef) {\n this.changeDetector = changeDetector;\n this.layoutChange = new EventEmitter();\n this.layoutSnapshotChange = new EventEmitter();\n this.layoutString = null;\n this.panes = new QueryList();\n this.trackByPane = (_, pane) => pane.name;\n this._layout = { root: null, floating: [] };\n if (documentRef) {\n MintDockManagerElement.configureDocument(documentRef);\n }\n }\n ngAfterViewInit() {\n this.applyLayout();\n }\n captureLayout() {\n const element = this.managerRef?.nativeElement;\n return element?.snapshot ?? { root: null, floating: [] };\n }\n onLayoutChanged(event) {\n const snapshot = event.detail ?? {\n root: null,\n floating: [],\n };\n this._layout = this.cloneLayout(snapshot);\n this.layoutString = this.stringifyLayout(this._layout);\n this.layoutChange.emit(this.layout);\n this.layoutSnapshotChange.emit(this.cloneLayout(snapshot));\n this.changeDetector.markForCheck();\n }\n applyLayout() {\n if (!this.managerRef) {\n return;\n }\n const element = this.managerRef.nativeElement;\n const layout = this.layout;\n element.layout = layout ?? null;\n }\n ensureSnapshot(value) {\n if (!value) {\n return { root: null, floating: [], titles: {} };\n }\n if ('kind' in value) {\n return { root: value, floating: [], titles: {} };\n }\n return {\n root: value.root ?? null,\n floating: Array.isArray(value.floating) ? [...value.floating] : [],\n titles: value.titles ? { ...value.titles } : {},\n };\n }\n stringifyLayout(layout) {\n if (!layout.root && layout.floating.length === 0) {\n return null;\n }\n return JSON.stringify(layout);\n }\n cloneLayout(layout) {\n return JSON.parse(JSON.stringify(layout));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.1.7\", type: BsDockManagerComponent, isStandalone: false, selector: \"bs-dock-manager\", inputs: { layout: \"layout\" }, outputs: { layoutChange: \"layoutChange\", layoutSnapshotChange: \"layoutSnapshotChange\" }, queries: [{ propertyName: \"panes\", predicate: BsDockPaneComponent }], viewQueries: [{ propertyName: \"managerRef\", first: true, predicate: [\"manager\"], descendants: true, static: true }], ngImport: i0, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"], dependencies: [{ kind: \"directive\", type: i1.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i1.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockManagerComponent, decorators: [{\n type: Component,\n args: [{ selector: 'bs-dock-manager', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: \"<mint-dock-manager\\n #manager\\n class=\\\"bs-dock-manager\\\"\\n [attr.layout]=\\\"layoutString\\\"\\n (dock-layout-changed)=\\\"onLayoutChanged($event)\\\"\\n>\\n <ng-container *ngFor=\\\"let pane of panes; trackBy: trackByPane\\\">\\n <div class=\\\"bs-dock-pane\\\" [attr.slot]=\\\"pane.name\\\">\\n <ng-container *ngTemplateOutlet=\\\"pane.template\\\"></ng-container>\\n </div>\\n </ng-container>\\n</mint-dock-manager>\\n\", styles: [\":host{display:block;width:100%;height:100%}.bs-dock-manager{display:block;width:100%;height:100%}.bs-dock-pane{display:contents}\\n\"] }]\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }], propDecorators: { layout: [{\n type: Input\n }], layoutChange: [{\n type: Output\n }], layoutSnapshotChange: [{\n type: Output\n }], panes: [{\n type: ContentChildren,\n args: [BsDockPaneComponent]\n }], managerRef: [{\n type: ViewChild,\n args: ['manager', { static: true }]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9zcmMvbGliL2NvbXBvbmVudHMvZG9jay1tYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQVNyRixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLElBQ0ksTUFBTSxDQUFDLEtBQXlDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJ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dGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRG9ja0xheW91dCxcbiAgRG9ja0xheW91dE5vZGUsXG4gIERvY2tMYXlvdXRTbmFwc2hvdCxcbn0gZnJvbSAnLi4vdHlwZXMvZG9jay1sYXlvdXQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vZG9jay1wYW5lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNaW50RG9ja01hbmFnZXJFbGVtZW50IH0gZnJvbSAnLi4vd2ViLWNvbXBvbmVudHMvbWludC1kb2NrLW1hbmFnZXIuZWxlbWVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRvY2stbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb2NrLW1hbmFnZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHNldCBsYXlvdXQodmFsdWU6IERvY2tMYXlvdXROb2RlIHwgRG9ja0xheW91dCB8IG51bGwpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuY2xvbmVMYXlvdXQodGhpcy5lbnN1cmVTbmFwc2hvdCh2YWx1ZSkpO1xuICAgIHRoaXMuX2xheW91dCA9IHNuYXBzaG90O1xuICAgIHRoaXMubGF5b3V0U3RyaW5nID0gdGhpcy5zdHJpbmdpZnlMYXlvdXQoc25hcHNob3QpO1xuICAgIHRoaXMuYXBwbHlMYXlvdXQoKTtcbiAgfVxuICBnZXQgbGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5fbGF5b3V0LnJvb3QgJiYgdGhpcy5fbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lTGF5b3V0KHRoaXMuX2xheW91dCk7XG4gIH1cblxuICBAT3V0cHV0KCkgbGF5b3V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEb2NrTGF5b3V0U25hcHNob3QgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgbGF5b3V0U25hcHNob3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERvY2tMYXlvdXRTbmFwc2hvdD4oKTtcblxuICBsYXlvdXRTdHJpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnNEb2NrUGFuZUNvbXBvbmVudCkgcGFuZXM6IFF1ZXJ5TGlzdDxCc0RvY2tQYW5lQ29tcG9uZW50PiA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgQFZpZXdDaGlsZCgnbWFuYWdlcicsIHsgc3RhdGljOiB0cnVlIH0pIG1hbmFnZXJSZWYhOiBFbGVtZW50UmVmPE1pbnREb2NrTWFuYWdlckVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5UGFuZSA9IChfOiBudW1iZXIsIHBhbmU6IEJzRG9ja1BhbmVDb21wb25lbnQpID0+IHBhbmUubmFtZTtcblxuICBwcml2YXRlIF9sYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCA9IHsgcm9vdDogbnVsbCwgZmxvYXRpbmc6IFtdIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICApIHtcbiAgICBpZiAoZG9jdW1lbnRSZWYpIHtcbiAgICAgIE1pbnREb2NrTWFuYWdlckVsZW1lbnQuY29uZmlndXJlRG9jdW1lbnQoZG9jdW1lbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5TGF5b3V0KCk7XG4gIH1cblxuICBjYXB0dXJlTGF5b3V0KCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMubWFuYWdlclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWxlbWVudD8uc25hcHNob3QgPz8geyByb290OiBudWxsLCBmbG9hdGluZzogW10gfTtcbiAgfVxuXG4gIG9uTGF5b3V0Q2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9XG4gICAgICAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8RG9ja0xheW91dFNuYXBzaG90PikuZGV0YWlsID8/IHtcbiAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgZmxvYXRpbmc6IFtdLFxuICAgICAgfTtcbiAgICB0aGlzLl9sYXlvdXQgPSB0aGlzLmNsb25lTGF5b3V0KHNuYXBzaG90KTtcbiAgICB0aGlzLmxheW91dFN0cmluZyA9IHRoaXMuc3RyaW5naWZ5TGF5b3V0KHRoaXMuX2xheW91dCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2UuZW1pdCh0aGlzLmxheW91dCk7XG4gICAgdGhpcy5sYXlvdXRTbmFwc2hvdENoYW5nZS5lbWl0KHRoaXMuY2xvbmVMYXlvdXQoc25hcHNob3QpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFuYWdlclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm1hbmFnZXJSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dDtcbiAgICBlbGVtZW50LmxheW91dCA9IGxheW91dCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTbmFwc2hvdChcbiAgICB2YWx1ZTogRG9ja0xheW91dE5vZGUgfCBEb2NrTGF5b3V0IHwgbnVsbCxcbiAgKTogRG9ja0xheW91dFNuYXBzaG90IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiBudWxsLCBmbG9hdGluZzogW10sIHRpdGxlczoge30gfTtcbiAgICB9XG5cbiAgICBpZiAoJ2tpbmQnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4geyByb290OiB2YWx1ZSwgZmxvYXRpbmc6IFtdLCB0aXRsZXM6IHt9IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHZhbHVlLnJvb3QgPz8gbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBBcnJheS5pc0FycmF5KHZhbHVlLmZsb2F0aW5nKSA/IFsuLi52YWx1ZS5mbG9hdGluZ10gOiBbXSxcbiAgICAgIHRpdGxlczogdmFsdWUudGl0bGVzID8geyAuLi52YWx1ZS50aXRsZXMgfSA6IHt9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghbGF5b3V0LnJvb3QgJiYgbGF5b3V0LmZsb2F0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShsYXlvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUxheW91dChsYXlvdXQ6IERvY2tMYXlvdXRTbmFwc2hvdCk6IERvY2tMYXlvdXRTbmFwc2hvdCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGF5b3V0KSkgYXMgRG9ja0xheW91dFNuYXBzaG90O1xuICB9XG59XG4iLCI8bWludC1kb2NrLW1hbmFnZXJcbiAgI21hbmFnZXJcbiAgY2xhc3M9XCJicy1kb2NrLW1hbmFnZXJcIlxuICBbYXR0ci5sYXlvdXRdPVwibGF5b3V0U3RyaW5nXCJcbiAgKGRvY2stbGF5b3V0LWNoYW5nZWQpPVwib25MYXlvdXRDaGFuZ2VkKCRldmVudClcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lIG9mIHBhbmVzOyB0cmFja0J5OiB0cmFja0J5UGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJicy1kb2NrLXBhbmVcIiBbYXR0ci5zbG90XT1cInBhbmUubmFtZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhbmUudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L21pbnQtZG9jay1tYW5hZ2VyPlxuIl19","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BsDockManagerComponent } from './components/dock-manager.component';\nimport { BsDockPaneComponent } from './components/dock-pane.component';\nimport * as i0 from \"@angular/core\";\nexport class BsDockModule {\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, declarations: [BsDockManagerComponent, BsDockPaneComponent], imports: [CommonModule], exports: [BsDockManagerComponent, BsDockPaneComponent] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, imports: [CommonModule] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: BsDockModule, decorators: [{\n type: NgModule,\n args: [{\n declarations: [BsDockManagerComponent, BsDockPaneComponent],\n imports: [CommonModule],\n exports: [BsDockManagerComponent, BsDockPaneComponent],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL2RvY2svc3JjL2xpYi9kb2NrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFRdkUsTUFBTSxPQUFPLFlBQVk7OEdBQVosWUFBWTsrR0FBWixZQUFZLGlCQUxSLHNCQUFzQixFQUFFLG1CQUFtQixhQUNoRCxZQUFZLGFBQ1osc0JBQXNCLEVBQUUsbUJBQW1COytHQUcxQyxZQUFZLFlBSmIsWUFBWTs7MkZBSVgsWUFBWTtrQkFOeEIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDM0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQztvQkFDdEQsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCc0RvY2tNYW5hZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2RvY2stbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEb2NrUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kb2NrLXBhbmUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbQnNEb2NrTWFuYWdlckNvbXBvbmVudCwgQnNEb2NrUGFuZUNvbXBvbmVudF0sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNEb2NrTW9kdWxlIHt9XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWludHBsYXllci1uZy1ib290c3RyYXAtZG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvZG9jay9taW50cGxheWVyLW5nLWJvb3RzdHJhcC1kb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":";;;;;AAEO,MAAM,mBAAmB,CAAC;AACjC,IAAI,kBAAkB,GAAG;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACxB,YAAY,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;AAC3E;AACA;AACA,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AACrL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,oDAAoD,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACra;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AAC7H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,cAAc;AAC5C,oBAAoB,QAAQ,EAAE,CAAC,oDAAoD,CAAC;AACpF,oBAAoB,UAAU,EAAE,KAAK;AACrC,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;AACrC,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;AACxB,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC3B,gBAAgB,IAAI,EAAE,SAAS;AAC/B,gBAAgB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;AACpD,aAAa,CAAC,EAAE,EAAE,CAAC;;ACzBnB,MAAM,YAAY,GAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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"}
|