UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

244 lines 31.9 kB
/*! * devextreme-angular * Version: 24.2.6 * Build date: Mon Mar 17 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * * This software may be modified and distributed under the terms * of the MIT license. See the LICENSE file in the root of the project for details. * * https://github.com/DevExpress/devextreme-angular */ import { Component, EventEmitter, } from '@angular/core'; import render from 'devextreme/core/renderer'; import { triggerHandler } from 'devextreme/events'; import domAdapter from 'devextreme/core/dom_adapter'; import { getElement } from './utils'; import { DX_TEMPLATE_WRAPPER_CLASS } from './template'; import * as i0 from "@angular/core"; const VISIBILITY_CHANGE_SELECTOR = 'dx-visibility-change-handler'; export class BaseNestedOption { _host; _hostOptionPath; _collectionContainerImpl; _initialOptions = {}; constructor() { this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this), this._filterItems.bind(this)); } _optionChangedHandler(e) { const fullOptionPath = this._fullOptionPath(); if (e.fullName.indexOf(fullOptionPath) === 0) { const optionName = e.fullName.slice(fullOptionPath.length); const emitter = this[`${optionName}Change`]; if (emitter) { emitter.next(e.value); } } } _createEventEmitters(events) { events.forEach((event) => { this[event.emit] = new EventEmitter(); }); } _getOption(name) { if (this.isLinked) { return this.instance.option(this._fullOptionPath() + name); } return this._initialOptions[name]; } _setOption(name, value) { if (this.isLinked) { const fullPath = this._fullOptionPath() + name; this.instance.option(fullPath, value); } else { this._initialOptions[name] = value; } } _addRemovedOption(name) { if (this.instance && this.removedNestedComponents) { this.removedNestedComponents.push(name); } } _deleteRemovedOptions(name) { if (this.instance && this.removedNestedComponents) { this.removedNestedComponents = this.removedNestedComponents.filter((x) => !x.startsWith(name)); } } _addRecreatedComponent() { if (this.instance && this.recreatedNestedComponents) { this.recreatedNestedComponents.push({ getOptionPath: () => this._getOptionPath() }); } } _getOptionPath() { return this._hostOptionPath() + this._optionPath; } setHost(host, optionPath) { this._host = host; this._hostOptionPath = optionPath; this.optionChangedHandlers.subscribe(this._optionChangedHandler.bind(this)); } setChildren(propertyName, items) { this.resetOptions(propertyName); return this._collectionContainerImpl.setChildren(propertyName, items); } _filterItems(items) { return items.filter((item) => item !== this); } get instance() { return this._host && this._host.instance; } get resetOptions() { return this._host && this._host.resetOptions; } get isRecreated() { return this._host && this._host.isRecreated; } get removedNestedComponents() { return this._host && this._host.removedNestedComponents; } set removedNestedComponents(value) { this._host.removedNestedComponents = value; } get recreatedNestedComponents() { return this._host && this._host.recreatedNestedComponents; } set recreatedNestedComponents(value) { this._host.recreatedNestedComponents = value; } get isLinked() { return !!this.instance && this._host.isLinked; } get optionChangedHandlers() { return this._host && this._host.optionChangedHandlers; } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseNestedOption, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseNestedOption, selector: "ng-component", ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseNestedOption, decorators: [{ type: Component, args: [{ template: '', }] }], ctorParameters: () => [] }); export class CollectionNestedOptionContainerImpl { _setOption; _filterItems; _activatedQueries = {}; constructor(_setOption, _filterItems) { this._setOption = _setOption; this._filterItems = _filterItems; } setChildren(propertyName, items) { if (this._filterItems) { items = this._filterItems(items); } if (items.length) { this._activatedQueries[propertyName] = true; } if (this._activatedQueries[propertyName]) { const widgetItems = items.map((item, index) => { item._index = index; return item._value; }); this._setOption(propertyName, widgetItems); } } } export class NestedOption extends BaseNestedOption { setHost(host, optionPath) { super.setHost(host, optionPath); this._host[this._optionPath] = this._initialOptions; } _fullOptionPath() { return `${this._getOptionPath()}.`; } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NestedOption, deps: null, target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NestedOption, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NestedOption, decorators: [{ type: Component, args: [{ template: '', }] }] }); export class CollectionNestedOption extends BaseNestedOption { _index; _fullOptionPath() { return `${this._getOptionPath()}[${this._index}].`; } get _value() { return this._initialOptions; } get isLinked() { return this._index !== undefined && !!this.instance && this._host.isLinked; } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CollectionNestedOption, deps: null, target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CollectionNestedOption, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CollectionNestedOption, decorators: [{ type: Component, args: [{ template: '', }] }] }); const triggerShownEvent = function (element) { const changeHandlers = []; if (!render(element).hasClass(VISIBILITY_CHANGE_SELECTOR)) { changeHandlers.push(element); } changeHandlers.push.apply(changeHandlers, element.querySelectorAll(`.${VISIBILITY_CHANGE_SELECTOR}`)); for (let i = 0; i < changeHandlers.length; i++) { triggerHandler(changeHandlers[i], 'dxshown'); } }; export function extractTemplate(option, element, renderer, document) { if (!option.template === undefined || !element.nativeElement.hasChildNodes()) { return; } const childNodes = [].slice.call(element.nativeElement.childNodes); const userContent = childNodes.filter((n) => { if (n.tagName) { const tagNamePrefix = n.tagName.toLowerCase().substr(0, 3); return !(tagNamePrefix === 'dxi' || tagNamePrefix === 'dxo'); } return n.nodeName !== '#comment' && n.textContent.replace(/\s/g, '').length; }); if (!userContent.length) { return; } option.template = { render: (renderData) => { const result = element.nativeElement; domAdapter.setClass(result, DX_TEMPLATE_WRAPPER_CLASS, true); if (renderData.container) { const container = getElement(renderData.container); const resultInContainer = container.contains(element.nativeElement); renderer.appendChild(container, element.nativeElement); if (!resultInContainer) { const resultInBody = document.body.contains(container); if (resultInBody) { triggerShownEvent(result); } } } return result; }, }; } export class NestedOptionHost { _host; _optionPath; getHost() { return this._host; } setHost(host, optionPath) { this._host = host; this._optionPath = optionPath || (() => ''); } setNestedOption(nestedOption) { nestedOption.setHost(this._host, this._optionPath); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvY29yZS9uZXN0ZWQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFBb0MsWUFBWSxHQUMxRCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLE1BQU0sTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRXZELE1BQU0sMEJBQTBCLEdBQUcsOEJBQThCLENBQUM7QUFpQmxFLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQzFCLEtBQUssQ0FBeUI7SUFFOUIsZUFBZSxDQUFvQjtJQUU1Qix3QkFBd0IsQ0FBbUM7SUFFbEUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUsvQjtRQUNFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVTLHFCQUFxQixDQUFDLENBQU07UUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FB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VSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGVBQWUsQ0FBQyxZQUE4QjtRQUM1QyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyNC4yLjZcbiAqIEJ1aWxkIGRhdGU6IE1vbiBNYXIgMTcgMjAyNVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjUgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCByZW5kZXIgZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3JlbmRlcmVyJztcclxuaW1wb3J0IHsgdHJpZ2dlckhhbmRsZXIgfSBmcm9tICdkZXZleHRyZW1lL2V2ZW50cyc7XHJcbmltcG9ydCBkb21BZGFwdGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9kb21fYWRhcHRlcic7XHJcbmltcG9ydCB7IGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUyB9IGZyb20gJy4vdGVtcGxhdGUnO1xyXG5cclxuY29uc3QgVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IgPSAnZHgtdmlzaWJpbGl0eS1jaGFuZ2UtaGFuZGxlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIGluc3RhbmNlOiBhbnk7XHJcbiAgaXNMaW5rZWQ6IGJvb2xlYW47XHJcbiAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHM6IHN0cmluZ1tdO1xyXG4gIG9wdGlvbkNoYW5nZWRIYW5kbGVyczogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50czogYW55W107XHJcbiAgcmVzZXRPcHRpb25zOiAoY29sbGVjdGlvbk5hbWU/OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgaXNSZWNyZWF0ZWQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElPcHRpb25QYXRoR2V0dGVyID0gKCkgPT4gc3RyaW5nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU5lc3RlZE9wdGlvbiBpbXBsZW1lbnRzIElOZXN0ZWRPcHRpb25Db250YWluZXIsIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICBwcm90ZWN0ZWQgX2hvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfaG9zdE9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xsZWN0aW9uQ29udGFpbmVySW1wbDogSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE9wdGlvbnMgPSB7fTtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBfb3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9mdWxsT3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwgPSBuZXcgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwodGhpcy5fc2V0T3B0aW9uLmJpbmQodGhpcyksIHRoaXMuX2ZpbHRlckl0ZW1zLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9vcHRpb25DaGFuZ2VkSGFuZGxlcihlOiBhbnkpIHtcclxuICAgIGNvbnN0IGZ1bGxPcHRpb25QYXRoID0gdGhpcy5fZnVsbE9wdGlvblBhdGgoKTtcclxuXHJcbiAgICBpZiAoZS5mdWxsTmFtZS5pbmRleE9mKGZ1bGxPcHRpb25QYXRoKSA9PT0gMCkge1xyXG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gZS5mdWxsTmFtZS5zbGljZShmdWxsT3B0aW9uUGF0aC5sZW5ndGgpO1xyXG4gICAgICBjb25zdCBlbWl0dGVyID0gdGhpc1tgJHtvcHRpb25OYW1lfUNoYW5nZWBdO1xyXG5cclxuICAgICAgaWYgKGVtaXR0ZXIpIHtcclxuICAgICAgICBlbWl0dGVyLm5leHQoZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfY3JlYXRlRXZlbnRFbWl0dGVycyhldmVudHMpIHtcclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICB0aGlzW2V2ZW50LmVtaXRdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2dldE9wdGlvbihuYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2Uub3B0aW9uKHRoaXMuX2Z1bGxPcHRpb25QYXRoKCkgKyBuYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsT3B0aW9uc1tuYW1lXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLl9mdWxsT3B0aW9uUGF0aCgpICsgbmFtZTtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5vcHRpb24oZnVsbFBhdGgsIHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FkZFJlbW92ZWRPcHRpb24obmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMucHVzaChuYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZGVsZXRlUmVtb3ZlZE9wdGlvbnMobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLmZpbHRlcigoeCkgPT4gIXguc3RhcnRzV2l0aChuYW1lKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FkZFJlY3JlYXRlZENvbXBvbmVudCgpIHtcclxuICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cykge1xyXG4gICAgICB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMucHVzaCh7IGdldE9wdGlvblBhdGg6ICgpID0+IHRoaXMuX2dldE9wdGlvblBhdGgoKSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZ2V0T3B0aW9uUGF0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0T3B0aW9uUGF0aCgpICsgdGhpcy5fb3B0aW9uUGF0aDtcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgdGhpcy5faG9zdE9wdGlvblBhdGggPSBvcHRpb25QYXRoO1xyXG4gICAgdGhpcy5vcHRpb25DaGFuZ2VkSGFuZGxlcnMuc3Vic2NyaWJlKHRoaXMuX29wdGlvbkNoYW5nZWRIYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hpbGRyZW48VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikge1xyXG4gICAgdGhpcy5yZXNldE9wdGlvbnMocHJvcGVydHlOYW1lKTtcclxuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcclxuICB9XHJcblxyXG4gIF9maWx0ZXJJdGVtcyhpdGVtczogUXVlcnlMaXN0PEJhc2VOZXN0ZWRPcHRpb24+KSB7XHJcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB0aGlzKTtcclxuICB9XHJcblxyXG4gIGdldCBpbnN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QuaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVzZXRPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZXNldE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZWNyZWF0ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LmlzUmVjcmVhdGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlbW92ZWROZXN0ZWRDb21wb25lbnRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cztcclxuICB9XHJcblxyXG4gIHNldCByZW1vdmVkTmVzdGVkQ29tcG9uZW50cyh2YWx1ZSkge1xyXG4gICAgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHM7XHJcbiAgfVxyXG5cclxuICBzZXQgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyh2YWx1ZSkge1xyXG4gICAgdGhpcy5faG9zdC5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNMaW5rZWQoKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgb3B0aW9uQ2hhbmdlZEhhbmRsZXJzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5vcHRpb25DaGFuZ2VkSGFuZGxlcnM7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICBzZXRDaGlsZHJlbjogPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pID0+IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIHByaXZhdGUgX2FjdGl2YXRlZFF1ZXJpZXMgPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfc2V0T3B0aW9uOiBGdW5jdGlvbiwgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVySXRlbXM/OiBGdW5jdGlvbikgeyB9XHJcblxyXG4gIHNldENoaWxkcmVuPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pIHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXJJdGVtcykge1xyXG4gICAgICBpdGVtcyA9IHRoaXMuX2ZpbHRlckl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fYWN0aXZhdGVkUXVlcmllc1twcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9hY3RpdmF0ZWRRdWVyaWVzW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgY29uc3Qgd2lkZ2V0SXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaXRlbS5faW5kZXggPSBpbmRleDtcclxuICAgICAgICByZXR1cm4gaXRlbS5fdmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9zZXRPcHRpb24ocHJvcGVydHlOYW1lLCB3aWRnZXRJdGVtcyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJycsXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIHtcclxuICBzZXRIb3N0KGhvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXIsIG9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyKSB7XHJcbiAgICBzdXBlci5zZXRIb3N0KGhvc3QsIG9wdGlvblBhdGgpO1xyXG5cclxuICAgIHRoaXMuX2hvc3RbdGhpcy5fb3B0aW9uUGF0aF0gPSB0aGlzLl9pbml0aWFsT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZnVsbE9wdGlvblBhdGgoKSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5fZ2V0T3B0aW9uUGF0aCgpfS5gO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbiB7XHJcbiAgX2luZGV4OiBudW1iZXI7XHJcbiAgX3ZhbHVlOiBPYmplY3Q7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24ge1xyXG4gIF9pbmRleDogbnVtYmVyO1xyXG5cclxuICBwcm90ZWN0ZWQgX2Z1bGxPcHRpb25QYXRoKCkge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuX2dldE9wdGlvblBhdGgoKX1bJHt0aGlzLl9pbmRleH1dLmA7XHJcbiAgfVxyXG5cclxuICBnZXQgX3ZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGlua2VkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4ICE9PSB1bmRlZmluZWQgJiYgISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25XaXRoVGVtcGxhdGUgZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIHtcclxuICB0ZW1wbGF0ZTogYW55O1xyXG59XHJcblxyXG5jb25zdCB0cmlnZ2VyU2hvd25FdmVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgY29uc3QgY2hhbmdlSGFuZGxlcnMgPSBbXTtcclxuXHJcbiAgaWYgKCFyZW5kZXIoZWxlbWVudCkuaGFzQ2xhc3MoVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IpKSB7XHJcbiAgICBjaGFuZ2VIYW5kbGVycy5wdXNoKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlSGFuZGxlcnMucHVzaC5hcHBseShjaGFuZ2VIYW5kbGVycywgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHtWSVNJQklMSVRZX0NIQU5HRV9TRUxFQ1RPUn1gKSk7XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgIHRyaWdnZXJIYW5kbGVyKGNoYW5nZUhhbmRsZXJzW2ldLCAnZHhzaG93bicpO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VGVtcGxhdGUob3B0aW9uOiBJT3B0aW9uV2l0aFRlbXBsYXRlLCBlbGVtZW50OiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyLCBkb2N1bWVudDogYW55KSB7XHJcbiAgaWYgKCFvcHRpb24udGVtcGxhdGUgPT09IHVuZGVmaW5lZCB8fCAhZWxlbWVudC5uYXRpdmVFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2hpbGROb2RlcyA9IFtdLnNsaWNlLmNhbGwoZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpO1xyXG4gIGNvbnN0IHVzZXJDb250ZW50ID0gY2hpbGROb2Rlcy5maWx0ZXIoKG4pID0+IHtcclxuICAgIGlmIChuLnRhZ05hbWUpIHtcclxuICAgICAgY29uc3QgdGFnTmFtZVByZWZpeCA9IG4udGFnTmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cigwLCAzKTtcclxuICAgICAgcmV0dXJuICEodGFnTmFtZVByZWZpeCA9PT0gJ2R4aScgfHwgdGFnTmFtZVByZWZpeCA9PT0gJ2R4bycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG4ubm9kZU5hbWUgIT09ICcjY29tbWVudCcgJiYgbi50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHMvZywgJycpLmxlbmd0aDtcclxuICB9KTtcclxuICBpZiAoIXVzZXJDb250ZW50Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgb3B0aW9uLnRlbXBsYXRlID0ge1xyXG4gICAgcmVuZGVyOiAocmVuZGVyRGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICBkb21BZGFwdGVyLnNldENsYXNzKHJlc3VsdCwgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAocmVuZGVyRGF0YS5jb250YWluZXIpIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBnZXRFbGVtZW50KHJlbmRlckRhdGEuY29udGFpbmVyKTtcclxuICAgICAgICBjb25zdCByZXN1bHRJbkNvbnRhaW5lciA9IGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghcmVzdWx0SW5Db250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdEluQm9keSA9IGRvY3VtZW50LmJvZHkuY29udGFpbnMoY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0SW5Cb2R5KSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJTaG93bkV2ZW50KHJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmVzdGVkT3B0aW9uSG9zdCB7XHJcbiAgcHJpdmF0ZSBfaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcclxuXHJcbiAgcHJpdmF0ZSBfb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXI7XHJcblxyXG4gIGdldEhvc3QoKTogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdDtcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aD86IElPcHRpb25QYXRoR2V0dGVyKSB7XHJcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcclxuICAgIHRoaXMuX29wdGlvblBhdGggPSBvcHRpb25QYXRoIHx8ICgoKSA9PiAnJyk7XHJcbiAgfVxyXG5cclxuICBzZXROZXN0ZWRPcHRpb24obmVzdGVkT3B0aW9uOiBCYXNlTmVzdGVkT3B0aW9uKSB7XHJcbiAgICBuZXN0ZWRPcHRpb24uc2V0SG9zdCh0aGlzLl9ob3N0LCB0aGlzLl9vcHRpb25QYXRoKTtcclxuICB9XHJcbn1cclxuIl19