UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

217 lines 30 kB
/*! * devextreme-angular * Version: 20.2.5 * Build date: Fri Jan 15 2021 * * Copyright (c) 2012 - 2021 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 { EventEmitter } from '@angular/core'; import { DX_TEMPLATE_WRAPPER_CLASS } from './template'; import { getElement } from './utils'; import render from 'devextreme/core/renderer'; import * as events from 'devextreme/events'; import * as domAdapter from 'devextreme/core/dom_adapter'; const VISIBILITY_CHANGE_SELECTOR = 'dx-visibility-change-handler'; export class BaseNestedOption { constructor() { this._initialOptions = {}; this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this), this._filterItems.bind(this)); } _optionChangedHandler(e) { let fullOptionPath = this._fullOptionPath(); if (e.fullName.indexOf(fullOptionPath) === 0) { let optionName = e.fullName.slice(fullOptionPath.length); let 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); } else { 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) => { return 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; } } export class CollectionNestedOptionContainerImpl { constructor(_setOption, _filterItems) { this._setOption = _setOption; this._filterItems = _filterItems; this._activatedQueries = {}; } setChildren(propertyName, items) { if (this._filterItems) { items = this._filterItems(items); } if (items.length) { this._activatedQueries[propertyName] = true; } if (this._activatedQueries[propertyName]) { let 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() + '.'; } } export class CollectionNestedOption extends BaseNestedOption { _fullOptionPath() { return `${this._getOptionPath()}[${this._index}].`; } get _value() { return this._initialOptions; } get isLinked() { return this._index !== undefined && !!this.instance && this._host.isLinked; } } let triggerShownEvent = function (element) { let 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++) { events.triggerHandler(changeHandlers[i], 'dxshown'); } }; const ɵ0 = triggerShownEvent; export function extractTemplate(option, element, renderer, document) { if (!option.template === undefined || !element.nativeElement.hasChildNodes()) { return; } let childNodes = [].slice.call(element.nativeElement.childNodes); let userContent = childNodes.filter((n) => { if (n.tagName) { let tagNamePrefix = n.tagName.toLowerCase().substr(0, 3); return !(tagNamePrefix === 'dxi' || tagNamePrefix === 'dxo'); } else { return n.nodeName !== '#comment' && n.textContent.replace(/\s/g, '').length; } }); if (!userContent.length) { return; } option.template = { render: (renderData) => { let result = element.nativeElement; domAdapter.setClass(result, DX_TEMPLATE_WRAPPER_CLASS, true); if (renderData.container) { let container = getElement(renderData.container); let resultInContainer = container.contains(element.nativeElement); renderer.appendChild(container, element.nativeElement); if (!resultInContainer) { let resultInBody = document.body.contains(container); if (resultInBody) { triggerShownEvent(result); } } } return result; } }; } export class NestedOptionHost { getHost() { return this._host; } setHost(host, optionPath) { this._host = host; this._optionPath = optionPath || (() => ''); } setNestedOption(nestedOption) { nestedOption.setHost(this._host, this._optionPath); } } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2RldmV4dHJlbWUtYW5ndWxhci9jb3JlLyIsInNvdXJjZXMiOlsibmVzdGVkLW9wdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBb0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE9BQU8sTUFBTSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxNQUFNLDBCQUEwQixHQUFHLDhCQUE4QixDQUFDO0FBY2xFLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBU2xDO1FBTFUsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFNM0IsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksbUNBQW1DLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0SSxDQUFDO0lBRVMscUJBQXFCLENBQUMsQ0FBTTtRQUNsQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFFMUMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekI7U0FDSjtJQUNMLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxNQUFNO1FBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVTLFVBQVUsQ0FBQyxJQUFZO1FBQzdCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1NBQzlEO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRVMsVUFBVSxDQUFDLElBQVksRUFBRSxLQUFVO1FBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxJQUFZO1FBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDL0MsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxJQUFZO1FBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDL0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xHO0lBQ0wsQ0FBQztJQUVTLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ2pELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN2RjtJQUNMLENBQUM7SUFFUyxjQUFjO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUE0QixFQUFFLFVBQTZCO1FBQy9ELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxXQUFXLENBQW9DLFlBQW9CLEVBQUUsS0FBbUI7UUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBa0M7UUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSx1QkFBdUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksdUJBQXVCLENBQUMsS0FBSztRQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDekIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUkseUJBQXlCLENBQUMsS0FBSztRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxxQkFBcUI7UUFDckIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUM7SUFDMUQsQ0FBQztDQUNKO0FBTUQsTUFBTSxPQUFPLG1DQUFtQztJQUc1QyxZQUFvQixVQUFvQixFQUFVLFlBQXVCO1FBQXJELGVBQVUsR0FBVixVQUFVLENBQVU7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUZqRSxzQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFFOEMsQ0FBQztJQUU5RSxXQUFXLENBQW9DLFlBQW9CLEVBQUUsS0FBbUI7UUFDcEYsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMvQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3RDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBZ0IsWUFBYSxTQUFRLGdCQUFnQjtJQUN2RCxPQUFPLENBQUMsSUFBNEIsRUFBRSxVQUE2QjtRQUMvRCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3hELENBQUM7SUFFUyxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QyxDQUFDO0NBQ0o7QUFPRCxNQUFNLE9BQWdCLHNCQUF1QixTQUFRLGdCQUFnQjtJQUd2RCxlQUFlO1FBQ3JCLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDL0UsQ0FBQztDQUNKO0FBTUQsSUFBSSxpQkFBaUIsR0FBRyxVQUFTLE9BQU87SUFDcEMsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBRXhCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQUU7UUFDdkQsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNoQztJQUVELGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQztJQUV0RyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QyxNQUFNLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN2RDtBQUNMLENBQUMsQ0FBQzs7QUFFRixNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQTJCLEVBQUUsT0FBbUIsRUFBRSxRQUFtQixFQUFFLFFBQWE7SUFDaEgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUMxRSxPQUFPO0tBQ1Y7SUFFRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN0QyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDWCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekQsT0FBTyxDQUFDLENBQUMsYUFBYSxLQUFLLEtBQUssSUFBSSxhQUFhLEtBQUssS0FBSyxDQUFDLENBQUM7U0FDaEU7YUFBTTtZQUNILE9BQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUMvRTtJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7UUFDckIsT0FBTztLQUNWO0lBRUQsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNkLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ25CLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFFbkMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFN0QsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO2dCQUN0QixJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVsRSxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRXZELElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDcEIsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBRXJELElBQUksWUFBWSxFQUFFO3dCQUNkLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUM3QjtpQkFDSjthQUNKO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxPQUFPLGdCQUFnQjtJQUl6QixPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBNEIsRUFBRSxVQUE4QjtRQUNoRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxlQUFlLENBQUMsWUFBOEI7UUFDMUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjAuMi41XG4gKiBCdWlsZCBkYXRlOiBGcmkgSmFuIDE1IDIwMjFcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDIxIERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuaW1wb3J0IHsgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUyB9IGZyb20gJy4vdGVtcGxhdGUnO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50IH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5pbXBvcnQgcmVuZGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9yZW5kZXJlcic7XHJcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdkZXZleHRyZW1lL2V2ZW50cyc7XHJcbmltcG9ydCAqIGFzIGRvbUFkYXB0ZXIgZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL2RvbV9hZGFwdGVyJztcclxuXHJcbmNvbnN0IFZJU0lCSUxJVFlfQ0hBTkdFX1NFTEVDVE9SID0gJ2R4LXZpc2liaWxpdHktY2hhbmdlLWhhbmRsZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICAgIGluc3RhbmNlOiBhbnk7XHJcbiAgICBpc0xpbmtlZDogYm9vbGVhbjtcclxuICAgIHJlbW92ZWROZXN0ZWRDb21wb25lbnRzOiBzdHJpbmdbXTtcclxuICAgIG9wdGlvbkNoYW5nZWRIYW5kbGVyczogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgICByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzOiBhbnlbXTtcclxuICAgIHJlc2V0T3B0aW9uczogKGNvbGxlY3Rpb25OYW1lPzogc3RyaW5nKSA9PiB2b2lkO1xyXG4gICAgaXNSZWNyZWF0ZWQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvblBhdGhHZXR0ZXIgeyAoKTogc3RyaW5nOyB9XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU5lc3RlZE9wdGlvbiBpbXBsZW1lbnRzIElOZXN0ZWRPcHRpb25Db250YWluZXIsIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICAgIHByb3RlY3RlZCBfaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcclxuICAgIHByb3RlY3RlZCBfaG9zdE9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyO1xyXG4gICAgcHJpdmF0ZSBfY29sbGVjdGlvbkNvbnRhaW5lckltcGw6IElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyO1xyXG4gICAgcHJvdGVjdGVkIF9pbml0aWFsT3B0aW9ucyA9IHt9O1xyXG5cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgX29wdGlvblBhdGgoKTogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IF9mdWxsT3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwgPSBuZXcgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwodGhpcy5fc2V0T3B0aW9uLmJpbmQodGhpcyksIHRoaXMuX2ZpbHRlckl0ZW1zLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb3B0aW9uQ2hhbmdlZEhhbmRsZXIoZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGZ1bGxPcHRpb25QYXRoID0gdGhpcy5fZnVsbE9wdGlvblBhdGgoKTtcclxuXHJcbiAgICAgICAgaWYgKGUuZnVsbE5hbWUuaW5kZXhPZihmdWxsT3B0aW9uUGF0aCkgPT09IDApIHtcclxuICAgICAgICAgICAgbGV0IG9wdGlvbk5hbWUgPSBlLmZ1bGxOYW1lLnNsaWNlKGZ1bGxPcHRpb25QYXRoLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGxldCBlbWl0dGVyID0gdGhpc1tvcHRpb25OYW1lICsgJ0NoYW5nZSddO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVtaXR0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGVtaXR0ZXIubmV4dChlLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZUV2ZW50RW1pdHRlcnMoZXZlbnRzKSB7XHJcbiAgICAgICAgZXZlbnRzLmZvckVhY2goZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzW2V2ZW50LmVtaXRdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0T3B0aW9uKG5hbWU6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2Uub3B0aW9uKHRoaXMuX2Z1bGxPcHRpb25QYXRoKCkgKyBuYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdGlhbE9wdGlvbnNbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGlua2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5fZnVsbE9wdGlvblBhdGgoKSArIG5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKGZ1bGxQYXRoLCB2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9hZGRSZW1vdmVkT3B0aW9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cy5wdXNoKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RlbGV0ZVJlbW92ZWRPcHRpb25zKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cyA9IHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMuZmlsdGVyKCh4KSA9PiAheC5zdGFydHNXaXRoKG5hbWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9hZGRSZWNyZWF0ZWRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cy5wdXNoKHsgZ2V0T3B0aW9uUGF0aDogKCkgPT4gdGhpcy5fZ2V0T3B0aW9uUGF0aCgpIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldE9wdGlvblBhdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3RPcHRpb25QYXRoKCkgKyB0aGlzLl9vcHRpb25QYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgICAgICB0aGlzLl9ob3N0ID0gaG9zdDtcclxuICAgICAgICB0aGlzLl9ob3N0T3B0aW9uUGF0aCA9IG9wdGlvblBhdGg7XHJcbiAgICAgICAgdGhpcy5vcHRpb25DaGFuZ2VkSGFuZGxlcnMuc3Vic2NyaWJlKHRoaXMuX29wdGlvbkNoYW5nZWRIYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENoaWxkcmVuPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pIHtcclxuICAgICAgICB0aGlzLnJlc2V0T3B0aW9ucyhwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVySXRlbXMoaXRlbXM6IFF1ZXJ5TGlzdDxCYXNlTmVzdGVkT3B0aW9uPikge1xyXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW0gIT09IHRoaXM7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbnN0YW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0Lmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXNldE9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZXNldE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzUmVjcmVhdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QuaXNSZWNyZWF0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbW92ZWROZXN0ZWRDb21wb25lbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QucmVtb3ZlZE5lc3RlZENvbXBvbmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHJlbW92ZWROZXN0ZWRDb21wb25lbnRzKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2hvc3QucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0xpbmtlZCgpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbkNoYW5nZWRIYW5kbGVycygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0Lm9wdGlvbkNoYW5nZWRIYW5kbGVycztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgICBzZXRDaGlsZHJlbjxUIGV4dGVuZHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24+KHByb3BlcnR5TmFtZTogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFQ+KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZhdGVkUXVlcmllcyA9IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldE9wdGlvbjogRnVuY3Rpb24sIHByaXZhdGUgX2ZpbHRlckl0ZW1zPzogRnVuY3Rpb24pIHsgfVxyXG5cclxuICAgIHNldENoaWxkcmVuPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pIHtcclxuICAgICAgICBpZiAodGhpcy5fZmlsdGVySXRlbXMpIHtcclxuICAgICAgICAgICAgaXRlbXMgPSB0aGlzLl9maWx0ZXJJdGVtcyhpdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZhdGVkUXVlcmllc1twcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2YXRlZFF1ZXJpZXNbcHJvcGVydHlOYW1lXSkge1xyXG4gICAgICAgICAgICBsZXQgd2lkZ2V0SXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9pbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uX3ZhbHVlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0T3B0aW9uKHByb3BlcnR5TmFtZSwgd2lkZ2V0SXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5lc3RlZE9wdGlvbiBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24ge1xyXG4gICAgc2V0SG9zdChob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBvcHRpb25QYXRoOiBJT3B0aW9uUGF0aEdldHRlcikge1xyXG4gICAgICAgIHN1cGVyLnNldEhvc3QoaG9zdCwgb3B0aW9uUGF0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hvc3RbdGhpcy5fb3B0aW9uUGF0aF0gPSB0aGlzLl9pbml0aWFsT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2Z1bGxPcHRpb25QYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb25QYXRoKCkgKyAnLic7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24ge1xyXG4gICAgX2luZGV4OiBudW1iZXI7XHJcbiAgICBfdmFsdWU6IE9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24ge1xyXG4gICAgX2luZGV4OiBudW1iZXI7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9mdWxsT3B0aW9uUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5fZ2V0T3B0aW9uUGF0aCgpfVske3RoaXMuX2luZGV4fV0uYDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3ZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbml0aWFsT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNMaW5rZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4ICE9PSB1bmRlZmluZWQgJiYgISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbldpdGhUZW1wbGF0ZSBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24ge1xyXG4gICAgdGVtcGxhdGU6IGFueTtcclxufVxyXG5cclxubGV0IHRyaWdnZXJTaG93bkV2ZW50ID0gZnVuY3Rpb24oZWxlbWVudCkge1xyXG4gICAgbGV0IGNoYW5nZUhhbmRsZXJzID0gW107XHJcblxyXG4gICAgaWYgKCFyZW5kZXIoZWxlbWVudCkuaGFzQ2xhc3MoVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IpKSB7XHJcbiAgICAgICAgY2hhbmdlSGFuZGxlcnMucHVzaChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VIYW5kbGVycy5wdXNoLmFwcGx5KGNoYW5nZUhhbmRsZXJzLCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IpKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZUhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZXZlbnRzLnRyaWdnZXJIYW5kbGVyKGNoYW5nZUhhbmRsZXJzW2ldLCAnZHhzaG93bicpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUZW1wbGF0ZShvcHRpb246IElPcHRpb25XaXRoVGVtcGxhdGUsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgIGlmICghb3B0aW9uLnRlbXBsYXRlID09PSB1bmRlZmluZWQgfHwgIWVsZW1lbnQubmF0aXZlRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNoaWxkTm9kZXMgPSBbXS5zbGljZS5jYWxsKGVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzKTtcclxuICAgIGxldCB1c2VyQ29udGVudCA9IGNoaWxkTm9kZXMuZmlsdGVyKChuKSA9PiB7XHJcbiAgICAgICAgaWYgKG4udGFnTmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgdGFnTmFtZVByZWZpeCA9IG4udGFnTmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cigwLCAzKTtcclxuICAgICAgICAgICAgcmV0dXJuICEodGFnTmFtZVByZWZpeCA9PT0gJ2R4aScgfHwgdGFnTmFtZVByZWZpeCA9PT0gJ2R4bycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuLm5vZGVOYW1lICE9PSAnI2NvbW1lbnQnICYmIG4udGV4dENvbnRlbnQucmVwbGFjZSgvXFxzL2csICcnKS5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoIXVzZXJDb250ZW50Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvcHRpb24udGVtcGxhdGUgPSB7XHJcbiAgICAgICAgcmVuZGVyOiAocmVuZGVyRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgZG9tQWRhcHRlci5zZXRDbGFzcyhyZXN1bHQsIERYX1RFTVBMQVRFX1dSQVBQRVJfQ0xBU1MsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlbmRlckRhdGEuY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZ2V0RWxlbWVudChyZW5kZXJEYXRhLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0SW5Db250YWluZXIgPSBjb250YWluZXIuY29udGFpbnMoZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRJbkNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRJbkJvZHkgPSBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkJvZHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclNob3duRXZlbnQocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5lc3RlZE9wdGlvbkhvc3Qge1xyXG4gICAgcHJpdmF0ZSBfaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcclxuICAgIHByaXZhdGUgX29wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyO1xyXG5cclxuICAgIGdldEhvc3QoKTogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SG9zdChob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBvcHRpb25QYXRoPzogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgICAgICB0aGlzLl9ob3N0ID0gaG9zdDtcclxuICAgICAgICB0aGlzLl9vcHRpb25QYXRoID0gb3B0aW9uUGF0aCB8fCAoKCkgPT4gJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldE5lc3RlZE9wdGlvbihuZXN0ZWRPcHRpb246IEJhc2VOZXN0ZWRPcHRpb24pIHtcclxuICAgICAgICBuZXN0ZWRPcHRpb24uc2V0SG9zdCh0aGlzLl9ob3N0LCB0aGlzLl9vcHRpb25QYXRoKTtcclxuICAgIH1cclxufVxyXG4iXX0=