UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

246 lines 32.3 kB
/*! * devextreme-angular * Version: 25.2.3 * Build date: Fri Dec 12 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 { warnIfLegacyNestedComponent } from './deprecated-config-warning'; 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?.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); warnIfLegacyNestedComponent(nestedOption, this._host); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvY29yZS9uZXN0ZWQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFBb0MsWUFBWSxHQUMxRCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLE1BQU0sTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRXZELE1BQU0sMEJBQTBCLEdBQUcsOEJBQThCLENBQUM7QUFpQmxFLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQzFCLEtBQUssQ0FBeUI7SUFFOUIsZUFBZSxDQUFvQjtJQUU1Qix3QkFBd0IsQ0FBbUM7SUFFbEUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUsvQjtRQUNFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVTLHFCQUFxQixDQUFDLENBQU07UUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsQ0FB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QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxlQUFlLENBQUMsWUFBOEI7UUFDNUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyNS4yLjNcbiAqIEJ1aWxkIGRhdGU6IEZyaSBEZWMgMTIgMjAyNVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjUgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCByZW5kZXIgZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3JlbmRlcmVyJztcclxuaW1wb3J0IHsgdHJpZ2dlckhhbmRsZXIgfSBmcm9tICdkZXZleHRyZW1lL2V2ZW50cyc7XHJcbmltcG9ydCBkb21BZGFwdGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9kb21fYWRhcHRlcic7XHJcbmltcG9ydCB7IGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgd2FybklmTGVnYWN5TmVzdGVkQ29tcG9uZW50IH0gZnJvbSAnLi9kZXByZWNhdGVkLWNvbmZpZy13YXJuaW5nJztcclxuaW1wb3J0IHsgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUyB9IGZyb20gJy4vdGVtcGxhdGUnO1xyXG5cclxuY29uc3QgVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IgPSAnZHgtdmlzaWJpbGl0eS1jaGFuZ2UtaGFuZGxlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIGluc3RhbmNlOiBhbnk7XHJcbiAgaXNMaW5rZWQ6IGJvb2xlYW47XHJcbiAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHM6IHN0cmluZ1tdO1xyXG4gIG9wdGlvbkNoYW5nZWRIYW5kbGVyczogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50czogYW55W107XHJcbiAgcmVzZXRPcHRpb25zOiAoY29sbGVjdGlvbk5hbWU/OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgaXNSZWNyZWF0ZWQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElPcHRpb25QYXRoR2V0dGVyID0gKCkgPT4gc3RyaW5nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU5lc3RlZE9wdGlvbiBpbXBsZW1lbnRzIElOZXN0ZWRPcHRpb25Db250YWluZXIsIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICBwcm90ZWN0ZWQgX2hvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfaG9zdE9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xsZWN0aW9uQ29udGFpbmVySW1wbDogSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE9wdGlvbnMgPSB7fTtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBfb3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9mdWxsT3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwgPSBuZXcgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwodGhpcy5fc2V0T3B0aW9uLmJpbmQodGhpcyksIHRoaXMuX2ZpbHRlckl0ZW1zLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9vcHRpb25DaGFuZ2VkSGFuZGxlcihlOiBhbnkpIHtcclxuICAgIGNvbnN0IGZ1bGxPcHRpb25QYXRoID0gdGhpcy5fZnVsbE9wdGlvblBhdGgoKTtcclxuXHJcbiAgICBpZiAoZS5mdWxsTmFtZS5pbmRleE9mKGZ1bGxPcHRpb25QYXRoKSA9PT0gMCkge1xyXG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gZS5mdWxsTmFtZS5zbGljZShmdWxsT3B0aW9uUGF0aC5sZW5ndGgpO1xyXG4gICAgICBjb25zdCBlbWl0dGVyID0gdGhpc1tgJHtvcHRpb25OYW1lfUNoYW5nZWBdO1xyXG5cclxuICAgICAgaWYgKGVtaXR0ZXIpIHtcclxuICAgICAgICBlbWl0dGVyLm5leHQoZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfY3JlYXRlRXZlbnRFbWl0dGVycyhldmVudHMpIHtcclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICB0aGlzW2V2ZW50LmVtaXRdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2dldE9wdGlvbihuYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2Uub3B0aW9uKHRoaXMuX2Z1bGxPcHRpb25QYXRoKCkgKyBuYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsT3B0aW9uc1tuYW1lXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLl9mdWxsT3B0aW9uUGF0aCgpICsgbmFtZTtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5vcHRpb24oZnVsbFBhdGgsIHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FkZFJlbW92ZWRPcHRpb24obmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMucHVzaChuYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZGVsZXRlUmVtb3ZlZE9wdGlvbnMobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLmZpbHRlcigoeCkgPT4gIXguc3RhcnRzV2l0aChuYW1lKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FkZFJlY3JlYXRlZENvbXBvbmVudCgpIHtcclxuICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cykge1xyXG4gICAgICB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMucHVzaCh7IGdldE9wdGlvblBhdGg6ICgpID0+IHRoaXMuX2dldE9wdGlvblBhdGgoKSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZ2V0T3B0aW9uUGF0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0T3B0aW9uUGF0aCgpICsgdGhpcy5fb3B0aW9uUGF0aDtcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgdGhpcy5faG9zdE9wdGlvblBhdGggPSBvcHRpb25QYXRoO1xyXG4gICAgdGhpcy5vcHRpb25DaGFuZ2VkSGFuZGxlcnMuc3Vic2NyaWJlKHRoaXMuX29wdGlvbkNoYW5nZWRIYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hpbGRyZW48VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikge1xyXG4gICAgdGhpcy5yZXNldE9wdGlvbnMocHJvcGVydHlOYW1lKTtcclxuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcclxuICB9XHJcblxyXG4gIF9maWx0ZXJJdGVtcyhpdGVtczogUXVlcnlMaXN0PEJhc2VOZXN0ZWRPcHRpb24+KSB7XHJcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB0aGlzKTtcclxuICB9XHJcblxyXG4gIGdldCBpbnN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0Py5pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIGdldCByZXNldE9wdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlc2V0T3B0aW9ucztcclxuICB9XHJcblxyXG4gIGdldCBpc1JlY3JlYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QuaXNSZWNyZWF0ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlbW92ZWROZXN0ZWRDb21wb25lbnRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJlbW92ZWROZXN0ZWRDb21wb25lbnRzKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9ob3N0LnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cygpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cztcclxuICB9XHJcblxyXG4gIHNldCByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9ob3N0LnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBpc0xpbmtlZCgpIHtcclxuICAgIHJldHVybiAhIXRoaXMuaW5zdGFuY2UgJiYgdGhpcy5faG9zdC5pc0xpbmtlZDtcclxuICB9XHJcblxyXG4gIGdldCBvcHRpb25DaGFuZ2VkSGFuZGxlcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0Lm9wdGlvbkNoYW5nZWRIYW5kbGVycztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIHNldENoaWxkcmVuOiA8VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikgPT4gYW55O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwgaW1wbGVtZW50cyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgcHJpdmF0ZSBfYWN0aXZhdGVkUXVlcmllcyA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9zZXRPcHRpb246IEZ1bmN0aW9uLCBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJJdGVtcz86IEZ1bmN0aW9uKSB7IH1cclxuXHJcbiAgc2V0Q2hpbGRyZW48VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikge1xyXG4gICAgaWYgKHRoaXMuX2ZpbHRlckl0ZW1zKSB7XHJcbiAgICAgIGl0ZW1zID0gdGhpcy5fZmlsdGVySXRlbXMoaXRlbXMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmF0ZWRRdWVyaWVzW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFF1ZXJpZXNbcHJvcGVydHlOYW1lXSkge1xyXG4gICAgICBjb25zdCB3aWRnZXRJdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICBpdGVtLl9pbmRleCA9IGluZGV4O1xyXG4gICAgICAgIHJldHVybiBpdGVtLl92YWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3NldE9wdGlvbihwcm9wZXJ0eU5hbWUsIHdpZGdldEl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5lc3RlZE9wdGlvbiBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24ge1xyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHN1cGVyLnNldEhvc3QoaG9zdCwgb3B0aW9uUGF0aCk7XHJcblxyXG4gICAgdGhpcy5faG9zdFt0aGlzLl9vcHRpb25QYXRoXSA9IHRoaXMuX2luaXRpYWxPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9mdWxsT3B0aW9uUGF0aCgpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLl9nZXRPcHRpb25QYXRoKCl9LmA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uIHtcclxuICBfaW5kZXg6IG51bWJlcjtcclxuICBfdmFsdWU6IG9iamVjdDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbiBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24gaW1wbGVtZW50cyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbiB7XHJcbiAgX2luZGV4OiBudW1iZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfZnVsbE9wdGlvblBhdGgoKSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5fZ2V0T3B0aW9uUGF0aCgpfVske3RoaXMuX2luZGV4fV0uYDtcclxuICB9XHJcblxyXG4gIGdldCBfdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNMaW5rZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5kZXggIT09IHVuZGVmaW5lZCAmJiAhIXRoaXMuaW5zdGFuY2UgJiYgdGhpcy5faG9zdC5pc0xpbmtlZDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbldpdGhUZW1wbGF0ZSBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24ge1xyXG4gIHRlbXBsYXRlOiBhbnk7XHJcbn1cclxuXHJcbmNvbnN0IHRyaWdnZXJTaG93bkV2ZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICBjb25zdCBjaGFuZ2VIYW5kbGVycyA9IFtdO1xyXG5cclxuICBpZiAoIXJlbmRlcihlbGVtZW50KS5oYXNDbGFzcyhWSVNJQklMSVRZX0NIQU5HRV9TRUxFQ1RPUikpIHtcclxuICAgIGNoYW5nZUhhbmRsZXJzLnB1c2goZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VIYW5kbGVycy5wdXNoLmFwcGx5KGNoYW5nZUhhbmRsZXJzLCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke1ZJU0lCSUxJVFlfQ0hBTkdFX1NFTEVDVE9SfWApKTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VIYW5kbGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgdHJpZ2dlckhhbmRsZXIoY2hhbmdlSGFuZGxlcnNbaV0sICdkeHNob3duJyk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUZW1wbGF0ZShvcHRpb246IElPcHRpb25XaXRoVGVtcGxhdGUsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIsIGRvY3VtZW50OiBhbnkpIHtcclxuICBpZiAoIW9wdGlvbi50ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkIHx8ICFlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBjaGlsZE5vZGVzID0gW10uc2xpY2UuY2FsbChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlcyk7XHJcbiAgY29uc3QgdXNlckNvbnRlbnQgPSBjaGlsZE5vZGVzLmZpbHRlcigobikgPT4ge1xyXG4gICAgaWYgKG4udGFnTmFtZSkge1xyXG4gICAgICBjb25zdCB0YWdOYW1lUHJlZml4ID0gbi50YWdOYW1lLnRvTG93ZXJDYXNlKCkuc3Vic3RyKDAsIDMpO1xyXG4gICAgICByZXR1cm4gISh0YWdOYW1lUHJlZml4ID09PSAnZHhpJyB8fCB0YWdOYW1lUHJlZml4ID09PSAnZHhvJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbi5ub2RlTmFtZSAhPT0gJyNjb21tZW50JyAmJiBuLnRleHRDb250ZW50LnJlcGxhY2UoL1xccy9nLCAnJykubGVuZ3RoO1xyXG4gIH0pO1xyXG4gIGlmICghdXNlckNvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBvcHRpb24udGVtcGxhdGUgPSB7XHJcbiAgICByZW5kZXI6IChyZW5kZXJEYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgIGRvbUFkYXB0ZXIuc2V0Q2xhc3MocmVzdWx0LCBEWF9URU1QTEFURV9XUkFQUEVSX0NMQVNTLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChyZW5kZXJEYXRhLmNvbnRhaW5lcikge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldEVsZW1lbnQocmVuZGVyRGF0YS5jb250YWluZXIpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdEluQ29udGFpbmVyID0gY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHRJbkNvbnRhaW5lcikge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0SW5Cb2R5ID0gZG9jdW1lbnQuYm9keS5jb250YWlucyhjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgIGlmIChyZXN1bHRJbkJvZHkpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclNob3duRXZlbnQocmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXN0ZWRPcHRpb25Ib3N0IHtcclxuICBwcml2YXRlIF9ob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyO1xyXG5cclxuICBwcml2YXRlIF9vcHRpb25QYXRoOiBJT3B0aW9uUGF0aEdldHRlcjtcclxuXHJcbiAgZ2V0SG9zdCgpOiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0O1xyXG4gIH1cclxuXHJcbiAgc2V0SG9zdChob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBvcHRpb25QYXRoPzogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgdGhpcy5fb3B0aW9uUGF0aCA9IG9wdGlvblBhdGggfHwgKCgpID0+ICcnKTtcclxuICB9XHJcblxyXG4gIHNldE5lc3RlZE9wdGlvbihuZXN0ZWRPcHRpb246IEJhc2VOZXN0ZWRPcHRpb24pIHtcclxuICAgIG5lc3RlZE9wdGlvbi5zZXRIb3N0KHRoaXMuX2hvc3QsIHRoaXMuX29wdGlvblBhdGgpO1xyXG4gICAgd2FybklmTGVnYWN5TmVzdGVkQ29tcG9uZW50KG5lc3RlZE9wdGlvbiwgdGhpcy5faG9zdCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==