UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

1,089 lines • 114 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 * as tslib_1 from "tslib";
/* tslint:disable:max-line-length */
import { BrowserTransferStateModule } from '@angular/platform-browser';
import { TransferState } from '@angular/platform-browser';
import { Component, NgModule, ElementRef, NgZone, PLATFORM_ID, Inject, Input, Output, OnDestroy, EventEmitter, OnChanges, DoCheck, SimpleChanges, ContentChildren, QueryList } from '@angular/core';
import DxDiagram from 'devextreme/ui/diagram';
import { DxComponent, DxTemplateHost, DxIntegrationModule, DxTemplateModule, NestedOptionHost, IterableDifferHelper, WatcherHelper } from 'devextreme-angular/core';
import { DxoContextMenuModule } from 'devextreme-angular/ui/nested';
import { DxiCommandModule } from 'devextreme-angular/ui/nested';
import { DxiItemModule } from 'devextreme-angular/ui/nested';
import { DxoContextToolboxModule } from 'devextreme-angular/ui/nested';
import { DxiCustomShapeModule } from 'devextreme-angular/ui/nested';
import { DxiConnectionPointModule } from 'devextreme-angular/ui/nested';
import { DxoDefaultItemPropertiesModule } from 'devextreme-angular/ui/nested';
import { DxoEdgesModule } from 'devextreme-angular/ui/nested';
import { DxoEditingModule } from 'devextreme-angular/ui/nested';
import { DxoExportModule } from 'devextreme-angular/ui/nested';
import { DxoGridSizeModule } from 'devextreme-angular/ui/nested';
import { DxoHistoryToolbarModule } from 'devextreme-angular/ui/nested';
import { DxoMainToolbarModule } from 'devextreme-angular/ui/nested';
import { DxoNodesModule } from 'devextreme-angular/ui/nested';
import { DxoAutoLayoutModule } from 'devextreme-angular/ui/nested';
import { DxoPageSizeModule } from 'devextreme-angular/ui/nested';
import { DxoPropertiesPanelModule } from 'devextreme-angular/ui/nested';
import { DxiTabModule } from 'devextreme-angular/ui/nested';
import { DxiGroupModule } from 'devextreme-angular/ui/nested';
import { DxoToolboxModule } from 'devextreme-angular/ui/nested';
import { DxoViewToolbarModule } from 'devextreme-angular/ui/nested';
import { DxoZoomLevelModule } from 'devextreme-angular/ui/nested';
import { DxiCustomShapeComponent } from 'devextreme-angular/ui/nested';
/**
 * The Diagram UI component provides a visual interface to help you design new and modify existing diagrams.

 */
var DxDiagramComponent = /** @class */ (function (_super) {
    tslib_1.__extends(DxDiagramComponent, _super);
    function DxDiagramComponent(elementRef, ngZone, templateHost, _watcherHelper, _idh, optionHost, transferState, platformId) {
        var _this = _super.call(this, elementRef, ngZone, templateHost, _watcherHelper, transferState, platformId) || this;
        _this._watcherHelper = _watcherHelper;
        _this._idh = _idh;
        _this._createEventEmitters([
            { subscribe: 'contentReady', emit: 'onContentReady' },
            { subscribe: 'customCommand', emit: 'onCustomCommand' },
            { subscribe: 'disposing', emit: 'onDisposing' },
            { subscribe: 'initialized', emit: 'onInitialized' },
            { subscribe: 'itemClick', emit: 'onItemClick' },
            { subscribe: 'itemDblClick', emit: 'onItemDblClick' },
            { subscribe: 'optionChanged', emit: 'onOptionChanged' },
            { subscribe: 'requestEditOperation', emit: 'onRequestEditOperation' },
            { subscribe: 'requestLayoutUpdate', emit: 'onRequestLayoutUpdate' },
            { subscribe: 'selectionChanged', emit: 'onSelectionChanged' },
            { emit: 'autoZoomModeChange' },
            { emit: 'contextMenuChange' },
            { emit: 'contextToolboxChange' },
            { emit: 'customShapesChange' },
            { emit: 'customShapeTemplateChange' },
            { emit: 'customShapeToolboxTemplateChange' },
            { emit: 'defaultItemPropertiesChange' },
            { emit: 'disabledChange' },
            { emit: 'edgesChange' },
            { emit: 'editingChange' },
            { emit: 'elementAttrChange' },
            { emit: 'exportChange' },
            { emit: 'fullScreenChange' },
            { emit: 'gridSizeChange' },
            { emit: 'hasChangesChange' },
            { emit: 'heightChange' },
            { emit: 'historyToolbarChange' },
            { emit: 'mainToolbarChange' },
            { emit: 'nodesChange' },
            { emit: 'pageColorChange' },
            { emit: 'pageOrientationChange' },
            { emit: 'pageSizeChange' },
            { emit: 'propertiesPanelChange' },
            { emit: 'readOnlyChange' },
            { emit: 'rtlEnabledChange' },
            { emit: 'showGridChange' },
            { emit: 'simpleViewChange' },
            { emit: 'snapToGridChange' },
            { emit: 'toolboxChange' },
            { emit: 'unitsChange' },
            { emit: 'viewToolbarChange' },
            { emit: 'viewUnitsChange' },
            { emit: 'visibleChange' },
            { emit: 'widthChange' },
            { emit: 'zoomLevelChange' }
        ]);
        _this._idh.setHost(_this);
        optionHost.setHost(_this);
        return _this;
    }
    Object.defineProperty(DxDiagramComponent.prototype, "autoZoomMode", {
        /**
         * Specifies how the Diagram UI component automatically zooms the work area.
        
         */
        get: function () {
            return this._getOption('autoZoomMode');
        },
        set: function (value) {
            this._setOption('autoZoomMode', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "contextMenu", {
        /**
         * Configures the context menu's settings.
        
         */
        get: function () {
            return this._getOption('contextMenu');
        },
        set: function (value) {
            this._setOption('contextMenu', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "contextToolbox", {
        /**
         * Configures the context toolbox's settings.
        
         */
        get: function () {
            return this._getOption('contextToolbox');
        },
        set: function (value) {
            this._setOption('contextToolbox', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "customShapes", {
        /**
         * Provide access to an array of custom shapes.
        
         */
        get: function () {
            return this._getOption('customShapes');
        },
        set: function (value) {
            this._setOption('customShapes', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "customShapeTemplate", {
        /**
         * Specifies a custom template for shapes.
        
         */
        get: function () {
            return this._getOption('customShapeTemplate');
        },
        set: function (value) {
            this._setOption('customShapeTemplate', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "customShapeToolboxTemplate", {
        /**
         * Specifies a custom template for shapes in the toolbox.
        
         */
        get: function () {
            return this._getOption('customShapeToolboxTemplate');
        },
        set: function (value) {
            this._setOption('customShapeToolboxTemplate', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "defaultItemProperties", {
        /**
         * Configures default item properties.
        
         */
        get: function () {
            return this._getOption('defaultItemProperties');
        },
        set: function (value) {
            this._setOption('defaultItemProperties', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "disabled", {
        /**
         * Specifies whether the UI component responds to user interaction.
        
         */
        get: function () {
            return this._getOption('disabled');
        },
        set: function (value) {
            this._setOption('disabled', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "edges", {
        /**
         * Allows you to bind the collection of diagram edges to a data source. For more information, see the Data Binding section.
        
         */
        get: function () {
            return this._getOption('edges');
        },
        set: function (value) {
            this._setOption('edges', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "editing", {
        /**
         * Specifies which editing operations a user can perform.
        
         */
        get: function () {
            return this._getOption('editing');
        },
        set: function (value) {
            this._setOption('editing', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "elementAttr", {
        /**
         * Specifies the global attributes to be attached to the UI component's container element.
        
         */
        get: function () {
            return this._getOption('elementAttr');
        },
        set: function (value) {
            this._setOption('elementAttr', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "export", {
        /**
         * Configures export settings.
        
         */
        get: function () {
            return this._getOption('export');
        },
        set: function (value) {
            this._setOption('export', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "fullScreen", {
        /**
         * Specifies whether or not to display the UI component in full-screen mode.
        
         */
        get: function () {
            return this._getOption('fullScreen');
        },
        set: function (value) {
            this._setOption('fullScreen', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "gridSize", {
        /**
         * Specifies the grid pitch.
        
         */
        get: function () {
            return this._getOption('gridSize');
        },
        set: function (value) {
            this._setOption('gridSize', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "hasChanges", {
        /**
         * Indicates whether diagram content has been changed.
        
         */
        get: function () {
            return this._getOption('hasChanges');
        },
        set: function (value) {
            this._setOption('hasChanges', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "height", {
        /**
         * Specifies the UI component's height.
        
         */
        get: function () {
            return this._getOption('height');
        },
        set: function (value) {
            this._setOption('height', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "historyToolbar", {
        /**
         * Configures the history toolbar's settings.
        
         */
        get: function () {
            return this._getOption('historyToolbar');
        },
        set: function (value) {
            this._setOption('historyToolbar', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "mainToolbar", {
        /**
         * Configures the main toolbar settings.
        
         */
        get: function () {
            return this._getOption('mainToolbar');
        },
        set: function (value) {
            this._setOption('mainToolbar', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "nodes", {
        /**
         * Allows you to bind the collection of diagram nodes to a data source. For more information, see the Data Binding section.
        
         */
        get: function () {
            return this._getOption('nodes');
        },
        set: function (value) {
            this._setOption('nodes', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "pageColor", {
        /**
         * Specifies the color of a diagram page.
        
         */
        get: function () {
            return this._getOption('pageColor');
        },
        set: function (value) {
            this._setOption('pageColor', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "pageOrientation", {
        /**
         * Specifies the page orientation.
        
         */
        get: function () {
            return this._getOption('pageOrientation');
        },
        set: function (value) {
            this._setOption('pageOrientation', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "pageSize", {
        /**
         * Specifies a size of pages.
        
         */
        get: function () {
            return this._getOption('pageSize');
        },
        set: function (value) {
            this._setOption('pageSize', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "propertiesPanel", {
        /**
         * Configures the Properties panel settings.
        
         */
        get: function () {
            return this._getOption('propertiesPanel');
        },
        set: function (value) {
            this._setOption('propertiesPanel', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "readOnly", {
        /**
         * Specifies whether the diagram is read-only.
        
         */
        get: function () {
            return this._getOption('readOnly');
        },
        set: function (value) {
            this._setOption('readOnly', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "rtlEnabled", {
        /**
         * Switches the UI component to a right-to-left representation.
        
         */
        get: function () {
            return this._getOption('rtlEnabled');
        },
        set: function (value) {
            this._setOption('rtlEnabled', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "showGrid", {
        /**
         * Specifies whether grid lines are visible.
        
         */
        get: function () {
            return this._getOption('showGrid');
        },
        set: function (value) {
            this._setOption('showGrid', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "simpleView", {
        /**
         * Switch the Diagram UI component to simple view mode.
        
         */
        get: function () {
            return this._getOption('simpleView');
        },
        set: function (value) {
            this._setOption('simpleView', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "snapToGrid", {
        /**
         * Specifies whether diagram elements should snap to grid lines.
        
         */
        get: function () {
            return this._getOption('snapToGrid');
        },
        set: function (value) {
            this._setOption('snapToGrid', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "toolbox", {
        /**
         * Configures the toolbox settings.
        
         */
        get: function () {
            return this._getOption('toolbox');
        },
        set: function (value) {
            this._setOption('toolbox', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "units", {
        /**
         * Specifies the unit for measurement properties (for example, defaultHeight, gridSize, leftExpr).
        
         */
        get: function () {
            return this._getOption('units');
        },
        set: function (value) {
            this._setOption('units', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "viewToolbar", {
        /**
         * Configures the view toolbar settings.
        
         */
        get: function () {
            return this._getOption('viewToolbar');
        },
        set: function (value) {
            this._setOption('viewToolbar', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "viewUnits", {
        /**
         * Specifies the measurement unit that is displayed in user interface elements.
        
         */
        get: function () {
            return this._getOption('viewUnits');
        },
        set: function (value) {
            this._setOption('viewUnits', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "visible", {
        /**
         * Specifies whether the UI component is visible.
        
         */
        get: function () {
            return this._getOption('visible');
        },
        set: function (value) {
            this._setOption('visible', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "width", {
        /**
         * Specifies the UI component's width.
        
         */
        get: function () {
            return this._getOption('width');
        },
        set: function (value) {
            this._setOption('width', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "zoomLevel", {
        /**
         * Specifies the zoom level.
        
         */
        get: function () {
            return this._getOption('zoomLevel');
        },
        set: function (value) {
            this._setOption('zoomLevel', value);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DxDiagramComponent.prototype, "customShapesChildren", {
        get: function () {
            return this._getOption('customShapes');
        },
        set: function (value) {
            this.setChildren('customShapes', value);
        },
        enumerable: true,
        configurable: true
    });
    DxDiagramComponent.prototype._createInstance = function (element, options) {
        return new DxDiagram(element, options);
    };
    DxDiagramComponent.prototype.ngOnDestroy = function () {
        this._destroyWidget();
    };
    DxDiagramComponent.prototype.ngOnChanges = function (changes) {
        _super.prototype.ngOnChanges.call(this, changes);
        this.setupChanges('customShapes', changes);
    };
    DxDiagramComponent.prototype.setupChanges = function (prop, changes) {
        if (!(prop in this._optionsToUpdate)) {
            this._idh.setup(prop, changes);
        }
    };
    DxDiagramComponent.prototype.ngDoCheck = function () {
        this._idh.doCheck('customShapes');
        this._watcherHelper.checkWatchers();
        _super.prototype.ngDoCheck.call(this);
        _super.prototype.clearChangedOptions.call(this);
    };
    DxDiagramComponent.prototype._setOption = function (name, value) {
        var isSetup = this._idh.setupSingle(name, value);
        var isChanged = this._idh.getChanges(name, value) !== null;
        if (isSetup || isChanged) {
            _super.prototype._setOption.call(this, name, value);
        }
    };
    DxDiagramComponent.ctorParameters = function () { return [
        { type: ElementRef },
        { type: NgZone },
        { type: DxTemplateHost },
        { type: WatcherHelper },
        { type: IterableDifferHelper },
        { type: NestedOptionHost },
        { type: TransferState },
        { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
    ]; };
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", String),
        tslib_1.__metadata("design:paramtypes", [String])
    ], DxDiagramComponent.prototype, "autoZoomMode", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "contextMenu", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "contextToolbox", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Array),
        tslib_1.__metadata("design:paramtypes", [Array])
    ], DxDiagramComponent.prototype, "customShapes", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "customShapeTemplate", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "customShapeToolboxTemplate", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "defaultItemProperties", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "disabled", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "edges", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "editing", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "elementAttr", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "export", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "fullScreen", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "gridSize", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "hasChanges", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "height", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "historyToolbar", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "mainToolbar", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "nodes", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", String),
        tslib_1.__metadata("design:paramtypes", [String])
    ], DxDiagramComponent.prototype, "pageColor", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", String),
        tslib_1.__metadata("design:paramtypes", [String])
    ], DxDiagramComponent.prototype, "pageOrientation", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "pageSize", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "propertiesPanel", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "readOnly", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "rtlEnabled", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "showGrid", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "simpleView", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "snapToGrid", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "toolbox", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", String),
        tslib_1.__metadata("design:paramtypes", [String])
    ], DxDiagramComponent.prototype, "units", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "viewToolbar", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", String),
        tslib_1.__metadata("design:paramtypes", [String])
    ], DxDiagramComponent.prototype, "viewUnits", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Boolean),
        tslib_1.__metadata("design:paramtypes", [Boolean])
    ], DxDiagramComponent.prototype, "visible", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "width", null);
    tslib_1.__decorate([
        Input(),
        tslib_1.__metadata("design:type", Object),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "zoomLevel", null);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onContentReady", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onCustomCommand", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onDisposing", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onInitialized", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onItemClick", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onItemDblClick", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onOptionChanged", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onRequestEditOperation", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onRequestLayoutUpdate", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "onSelectionChanged", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "autoZoomModeChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "contextMenuChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "contextToolboxChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "customShapesChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "customShapeTemplateChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "customShapeToolboxTemplateChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "defaultItemPropertiesChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "disabledChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "edgesChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "editingChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "elementAttrChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "exportChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "fullScreenChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "gridSizeChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "hasChangesChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "heightChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "historyToolbarChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "mainToolbarChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "nodesChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "pageColorChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "pageOrientationChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "pageSizeChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "propertiesPanelChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "readOnlyChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "rtlEnabledChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "showGridChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "simpleViewChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "snapToGridChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "toolboxChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "unitsChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "viewToolbarChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "viewUnitsChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "visibleChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "widthChange", void 0);
    tslib_1.__decorate([
        Output(),
        tslib_1.__metadata("design:type", EventEmitter)
    ], DxDiagramComponent.prototype, "zoomLevelChange", void 0);
    tslib_1.__decorate([
        ContentChildren(DxiCustomShapeComponent),
        tslib_1.__metadata("design:type", QueryList),
        tslib_1.__metadata("design:paramtypes", [Object])
    ], DxDiagramComponent.prototype, "customShapesChildren", null);
    DxDiagramComponent = tslib_1.__decorate([
        Component({
            selector: 'dx-diagram',
            template: '',
            providers: [
                DxTemplateHost,
                WatcherHelper,
                NestedOptionHost,
                IterableDifferHelper
            ]
        }),
        tslib_1.__param(7, Inject(PLATFORM_ID)),
        tslib_1.__metadata("design:paramtypes", [ElementRef, NgZone, DxTemplateHost,
            WatcherHelper,
            IterableDifferHelper,
            NestedOptionHost,
            TransferState, Object])
    ], DxDiagramComponent);
    return DxDiagramComponent;
}(DxComponent));
export { DxDiagramComponent };
var DxDiagramModule = /** @class */ (function () {
    function DxDiagramModule() {
    }
    DxDiagramModule = tslib_1.__decorate([
        NgModule({
            imports: [
                DxoContextMenuModule,
                DxiCommandModule,
                DxiItemModule,
                DxoContextToolboxModule,
                DxiCustomShapeModule,
                DxiConnectionPointModule,
                DxoDefaultItemPropertiesModule,
                DxoEdgesModule,
                DxoEditingModule,
                DxoExportModule,
                DxoGridSizeModule,
                DxoHistoryToolbarModule,
                DxoMainToolbarModule,
                DxoNodesModule,
                DxoAutoLayoutModule,
                DxoPageSizeModule,
                DxoPropertiesPanelModule,
                DxiTabModule,
                DxiGroupModule,
                DxoToolboxModule,
                DxoViewToolbarModule,
                DxoZoomLevelModule,
                DxIntegrationModule,
                DxTemplateModule,
                BrowserTransferStateModule
            ],
            declarations: [
                DxDiagramComponent
            ],
            exports: [
                DxDiagramComponent,
                DxoContextMenuModule,
                DxiCommandModule,
                DxiItemModule,
                DxoContextToolboxModule,
                DxiCustomShapeModule,
                DxiConnectionPointModule,
                DxoDefaultItemPropertiesModule,
                DxoEdgesModule,
                DxoEditingModule,
                DxoExportModule,
                DxoGridSizeModule,
                DxoHistoryToolbarModule,
                DxoMainToolbarModule,
                DxoNodesModule,
                DxoAutoLayoutModule,
                DxoPageSizeModule,
                DxoPropertiesPanelModule,
                DxiTabModule,
                DxiGroupModule,
                DxoToolboxModule,
                DxoViewToolbarModule,
                DxoZoomLevelModule,
                DxTemplateModule
            ]
        })
    ], DxDiagramModule);
    return DxDiagramModule;
}());
export { DxDiagramModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kZXZleHRyZW1lLWFuZ3VsYXIvdWkvZGlhZ3JhbS8iLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHOztBQUVILG9DQUFvQztBQUdwQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFMUQsT0FBTyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE1BQU0sRUFDTixXQUFXLEVBQ1gsTUFBTSxFQUVOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1QsT0FBTyxFQUNQLGFBQWEsRUFDYixlQUFlLEVBQ2YsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRzlDLE9BQU8sRUFDSCxXQUFXLEVBQ1gsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixhQUFhLEVBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlFLE9B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QUNkLGdCQUFnQjtnQkFDaEIsZUFBZTtnQkFDZixpQkFBaUI7Z0JBQ2pCLHVCQUF1QjtnQkFDdkIsb0JBQW9CO2dCQUNwQixjQUFjO2dCQUNkLG1CQUFtQjtnQkFDbkIsaUJBQWlCO2dCQUNqQix3QkFBd0I7Z0JBQ3hCLFlBQVk7Z0JBQ1osY0FBYztnQkFDZCxnQkFBZ0I7Z0JBQ2hCLG9CQUFvQjtnQkFDcEIsa0JBQWtCO2dCQUNsQixtQkFBbUI7Z0JBQ25CLGdCQUFnQjtnQkFDaEIsMEJBQTBCO2FBQzNCO1lBQ0QsWUFBWSxFQUFFO2dCQUNaLGtCQUFrQjthQUNuQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxrQkFBa0I7Z0JBQ2xCLG9CQUFvQjtnQkFDcEIsZ0JBQWdCO2dCQUNoQixhQUFhO2dCQUNiLHVCQUF1QjtnQkFDdkIsb0JBQW9CO2dCQUNwQix3QkFBd0I7Z0JBQ3hCLDhCQUE4QjtnQkFDOUIsY0FBYztnQkFDZCxnQkFBZ0I7Z0JBQ2hCLGVBQWU7Z0JBQ2YsaUJBQWlCO2dCQUNqQix1QkFBdUI7Z0JBQ3ZCLG9CQUFvQjtnQkFDcEIsY0FBYztnQkFDZCxtQkFBbUI7Z0JBQ25CLGlCQUFpQjtnQkFDakIsd0JBQXdCO2dCQUN4QixZQUFZO2dCQUNaLGNBQWM7Z0JBQ2QsZ0JBQWdCO2dCQUNoQixvQkFBb0I7Z0JBQ3BCLGtCQUFrQjtnQkFDbEIsZ0JBQWdCO2FBQ2pCO1NBQ0YsQ0FBQztPQUNXLGVBQWUsQ0FBSTtJQUFELHNCQUFDO0NBQUEsQUFBaEMsSUFBZ0M7U0FBbkIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyMC4yLjVcbiAqIEJ1aWxkIGRhdGU6IEZyaSBKYW4gMTUgMjAyMVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjEgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cclxuXHJcblxyXG5pbXBvcnQgeyBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBUcmFuc2ZlclN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgTmdNb2R1bGUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgTmdab25lLFxyXG4gICAgUExBVEZPUk1fSUQsXHJcbiAgICBJbmplY3QsXHJcblxyXG4gICAgSW5wdXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBEb0NoZWNrLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIFF1ZXJ5TGlzdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuXHJcbmltcG9ydCBEZXZFeHByZXNzIGZyb20gJ2RldmV4dHJlbWUvYnVuZGxlcy9keC5hbGwnO1xyXG5cclxuaW1wb3J0IER4RGlhZ3JhbSBmcm9tICdkZXZleHRyZW1lL3VpL2RpYWdyYW0nO1xyXG5cclxuXHJcbmltcG9ydCB7XHJcbiAgICBEeENvbXBvbmVudCxcclxuICAgIER4VGVtcGxhdGVIb3N0LFxyXG4gICAgRHhJbnRlZ3JhdGlvbk1vZHVsZSxcclxuICAgIER4VGVtcGxhdGVNb2R1bGUsXHJcbiAgICBOZXN0ZWRPcHRpb25Ib3N0LFxyXG4gICAgSXRlcmFibGVEaWZmZXJIZWxwZXIsXHJcbiAgICBXYXRjaGVySGVscGVyXHJcbn0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRHhvQ29udGV4dE1lbnVNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhpQ29tbWFuZE1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeGlJdGVtTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4b0NvbnRleHRUb29sYm94TW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4aUN1c3RvbVNoYXBlTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4aUNvbm5lY3Rpb25Qb2ludE1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9EZWZhdWx0SXRlbVByb3BlcnRpZXNNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvRWRnZXNNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvRWRpdGluZ01vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9FeHBvcnRNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvR3JpZFNpemVNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvSGlzdG9yeVRvb2xiYXJNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvTWFpblRvb2xiYXJNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvTm9kZXNNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvQXV0b0xheW91dE1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9QYWdlU2l6ZU1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9Qcm9wZXJ0aWVzUGFuZWxNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhpVGFiTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4aUdyb3VwTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4b1Rvb2xib3hNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvVmlld1Rvb2xiYXJNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvWm9vbUxldmVsTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcblxyXG5pbXBvcnQgeyBEeGlDdXN0b21TaGFwZUNvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5cclxuXHJcblxyXG4vKipcclxuICogW2Rlc2NyOmR4RGlhZ3JhbV1cclxuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZHgtZGlhZ3JhbScsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBEeFRlbXBsYXRlSG9zdCxcclxuICAgICAgICBXYXRjaGVySGVscGVyLFxyXG4gICAgICAgIE5lc3RlZE9wdGlvbkhvc3QsXHJcbiAgICAgICAgSXRlcmFibGVEaWZmZXJIZWxwZXJcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIER4RGlhZ3JhbUNvbXBvbmVudCBleHRlbmRzIER4Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIERvQ2hlY2sge1xyXG4gICAgaW5zdGFuY2U6IER4RGlhZ3JhbTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5hdXRvWm9vbU1vZGVdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBhdXRvWm9vbU1vZGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdhdXRvWm9vbU1vZGUnKTtcclxuICAgIH1cclxuICAgIHNldCBhdXRvWm9vbU1vZGUodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignYXV0b1pvb21Nb2RlJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5jb250ZXh0TWVudV1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGNvbnRleHRNZW51KCk6IHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCBlbmFibGVkPzogYm9vbGVhbiB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdjb250ZXh0TWVudScpO1xyXG4gICAgfVxyXG4gICAgc2V0IGNvbnRleHRNZW51KHZhbHVlOiB7IGNvbW1hbmRzPzogQXJyYXk8RGV2RXhwcmVzcy51aS5keERpYWdyYW1DdXN0b21Db21tYW5kIHwgc3RyaW5nPiwgZW5hYmxlZD86IGJvb2xlYW4gfSkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignY29udGV4dE1lbnUnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLmNvbnRleHRUb29sYm94XVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgY29udGV4dFRvb2xib3goKTogeyBjYXRlZ29yeT86IHN0cmluZywgZGlzcGxheU1vZGU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBzaGFwZUljb25zUGVyUm93PzogbnVtYmVyLCBzaGFwZXM/OiBBcnJheTxzdHJpbmc+LCB3aWR0aD86IG51bWJlciB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdjb250ZXh0VG9vbGJveCcpO1xyXG4gICAgfVxyXG4gICAgc2V0IGNvbnRleHRUb29sYm94KHZhbHVlOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBkaXNwbGF5TW9kZT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4sIHNoYXBlSWNvbnNQZXJSb3c/OiBudW1iZXIsIHNoYXBlcz86IEFycmF5PHN0cmluZz4sIHdpZHRoPzogbnVtYmVyIH0pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2NvbnRleHRUb29sYm94JywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5jdXN0b21TaGFwZXNdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBjdXN0b21TaGFwZXMoKTogQXJyYXk8YW55IHwgeyBhbGxvd0VkaXRJbWFnZT86IGJvb2xlYW4sIGFsbG93RWRpdFRleHQ/OiBib29sZWFuLCBhbGxvd1Jlc2l6ZT86IGJvb2xlYW4sIGJhY2tncm91bmRJbWFnZUhlaWdodD86IG51bWJlciwgYmFja2dyb3VuZEltYWdlTGVmdD86IG51bWJlciwgYmFja2dyb3VuZEltYWdlVG9vbGJveFVybD86IHN0cmluZywgYmFja2dyb3VuZEltYWdlVG9wPzogbnVtYmVyLCBiYWNrZ3JvdW5kSW1hZ2VVcmw/OiBzdHJpbmcsIGJhY2tncm91bmRJbWFnZVdpZHRoPzogbnVtYmVyLCBiYXNlVHlwZT86IHN0cmluZywgY2F0ZWdvcnk/OiBzdHJpbmcsIGNvbm5lY3Rpb25Qb2ludHM/OiBBcnJheTxhbnkgfCB7IHg/OiBudW1iZXIsIHk/OiBudW1iZXIgfT4sIGRlZmF1bHRIZWlnaHQ/OiBudW1iZXIsIGRlZmF1bHRJbWFnZVVybD86IHN0cmluZywgZGVmYXVsdFRleHQ/OiBzdHJpbmcsIGRlZmF1bHRXaWR0aD86IG51bWJlciwgaW1hZ2VIZWlnaHQ/OiBudW1iZXIsIGltYWdlTGVmdD86IG51bWJlciwgaW1hZ2VUb3A/OiBudW1iZXIsIGltYWdlV2lkdGg/OiBudW1iZXIsIGtlZXBSYXRpb09uQXV0b1NpemU/OiBib29sZWFuLCBtYXhIZWlnaHQ/OiBudW1iZXIsIG1heFdpZHRoPzogbnVtYmVyLCBtaW5IZWlnaHQ/OiBudW1iZXIsIG1pbldpZHRoPzogbnVtYmVyLCB0ZW1wbGF0ZT86IGFueSwgdGVtcGxhdGVIZWlnaHQ/OiBudW1iZXIsIHRlbXBsYXRlTGVmdD86IG51bWJlciwgdGVtcGxhdGVUb3A/OiBudW1iZXIsIHRlbXBsYXRlV2lkdGg/OiBudW1iZXIsIHRleHRIZWlnaHQ/OiBudW1iZXIsIHRleHRMZWZ0PzogbnVtYmVyLCB0ZXh0VG9wPzogbnVtYmVyLCB0ZXh0V2lkdGg/OiBudW1iZXIsIHRpdGxlPzogc3RyaW5nLCB0b29sYm94VGVtcGxhdGU/OiBhbnksIHRvb2xib3hXaWR0aFRvSGVpZ2h0UmF0aW8/OiBudW1iZXIsIHR5cGU/OiBzdHJpbmcgfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2N1c3RvbVNoYXBlcycpO1xyXG4gICAgfVxyXG4gICAgc2V0IGN1c3RvbVNoYXBlcyh2YWx1ZTogQXJyYXk8YW55IHwgeyBhbGxvd0VkaXRJbWFnZT86IGJvb2xlYW4sIGFsbG93RWRpdFRleHQ/OiBib29sZWFuLCBhbGxvd1Jlc2l6ZT86IGJvb2xlYW4sIGJhY2tncm91bmRJbWFnZUhlaWdodD86IG51bWJlciwgYmFja2dyb3VuZEltYWdlTGVmdD86IG51bWJlciwgYmFja2dyb3VuZEltYWdlVG9vbGJveFVybD86IHN0cmluZywgYmFja2dyb3VuZEltYWdlVG9wPzogbnVtYmVyLCBiYWNrZ3JvdW5kSW1hZ2VVcmw/OiBzdHJpbmcsIGJhY2tncm91bmRJbWFnZVdpZHRoPzogbnVtYmVyLCBiYXNlVHlwZT86IHN0cmluZywgY2F0ZWdvcnk/OiBzdHJpbmcsIGNvbm5lY3Rpb25Qb2ludHM/OiBBcnJheTxhbnkgfCB7IHg/OiBudW1iZXIsIHk/OiBudW1iZXIgfT4sIGRlZmF1bHRIZWlnaHQ/OiBudW1iZXIsIGRlZmF1bHRJbWFnZVVybD86IHN0cmluZywgZGVmYXVsdFRleHQ/OiBzdHJpbmcsIGRlZmF1bHRXaWR0aD86IG51bWJlciwgaW1hZ2VIZWlnaHQ/OiBudW1iZXIsIGltYWdlTGVmdD86IG51bWJlciwgaW1hZ2VUb3A/OiBudW1iZXIsIGltYWdlV2lkdGg/OiBudW1iZXIsIGtlZXBSYXRpb09uQXV0b1NpemU/OiBib29sZWFuLCBtYXhIZWlnaHQ/OiBudW1iZXIsIG1heFdpZHRoPzogbnVtYmVyLCBtaW5IZWlnaHQ/OiBudW1iZXIsIG1pbldpZHRoPzogbnVtYmVyLCB0ZW1wbGF0ZT86IGFueSwgdGVtcGxhdGVIZWlnaHQ/OiBudW1iZXIsIHRlbXBsYXRlTGVmdD86IG51bWJlciwgdGVtcGxhdGVUb3A/OiBudW1iZXIsIHRlbXBsYXRlV2lkdGg/OiBudW1iZXIsIHRleHRIZWlnaHQ/OiBudW1iZXIsIHRleHRMZWZ0PzogbnVtYmVyLCB0ZXh0VG9wPzogbnVtYmVyLCB0ZXh0V2lkdGg/OiBudW1iZXIsIHRpdGxlPzogc3RyaW5nLCB0b29sYm94VGVtcGxhdGU/OiBhbnksIHRvb2xib3hXaWR0aFRvSGVpZ2h0UmF0aW8/OiBudW1iZXIsIHR5cGU/OiBzdHJpbmcgfT4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2N1c3RvbVNoYXBlcycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMuY3VzdG9tU2hhcGVUZW1wbGF0ZV1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGN1c3RvbVNoYXBlVGVtcGxhdGUoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdjdXN0b21TaGFwZVRlbXBsYXRlJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgY3VzdG9tU2hhcGVUZW1wbGF0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdjdXN0b21TaGFwZVRlbXBsYXRlJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5jdXN0b21TaGFwZVRvb2xib3hUZW1wbGF0ZV1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGN1c3RvbVNoYXBlVG9vbGJveFRlbXBsYXRlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignY3VzdG9tU2hhcGVUb29sYm94VGVtcGxhdGUnKTtcclxuICAgIH1cclxuICAgIHNldCBjdXN0b21TaGFwZVRvb2xib3hUZW1wbGF0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdjdXN0b21TaGFwZVRvb2xib3hUZW1wbGF0ZScsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMuZGVmYXVsdEl0ZW1Qcm9wZXJ0aWVzXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgZGVmYXVsdEl0ZW1Qcm9wZXJ0aWVzKCk6IHsgY29ubmVjdG9yTGluZUVuZD86IHN0cmluZywgY29ubmVjdG9yTGluZVN0YXJ0Pzogc3RyaW5nLCBjb25uZWN0b3JMaW5lVHlwZT86IHN0cmluZywgc2hhcGVNYXhIZWlnaHQ/OiBudW1iZXIsIHNoYXBlTWF4V2lkdGg/OiBudW1iZXIsIHNoYXBlTWluSGVpZ2h0PzogbnVtYmVyLCBzaGFwZU1pbldpZHRoPzogbnVtYmVyLCBzdHlsZT86IGFueSwgdGV4dFN0eWxlPzogYW55IH0ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2RlZmF1bHRJdGVtUHJvcGVydGllcycpO1xyXG4gICAgfVxyXG4gICAgc2V0IGRlZmF1bHRJdGVtUHJvcGVydGllcyh2YWx1ZTogeyBjb25uZWN0b3JMaW5lRW5kPzogc3RyaW5nLCBjb25uZWN0b3JMaW5lU3RhcnQ/OiBzdHJpbmcsIGNvbm5lY3RvckxpbmVUeXBlPzogc3RyaW5nLCBzaGFwZU1heEhlaWdodD86IG51bWJlciwgc2hhcGVNYXhXaWR0aD86IG51bWJlciwgc2hhcGVNaW5IZWlnaHQ/OiBudW1iZXIsIHNoYXBlTWluV2lkdGg/OiBudW1iZXIsIHN0eWxlPzogYW55LCB0ZXh0U3R5bGU/OiBhbnkgfSkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignZGVmYXVsdEl0ZW1Qcm9wZXJ0aWVzJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpXaWRnZXQuT3B0aW9ucy5kaXNhYmxlZF1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2Rpc2FibGVkJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2Rpc2FibGVkJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5lZGdlc11cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGVkZ2VzKCk6IHsgY3VzdG9tRGF0YUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgZGF0YVNvdXJjZT86IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlIHwgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2VPcHRpb25zIHwgQXJyYXk8YW55PiwgZnJvbUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgZnJvbUxpbmVFbmRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGZyb21Qb2ludEluZGV4RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBrZXlFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGxpbmVUeXBlRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBsb2NrZWRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHBvaW50c0V4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgc3R5bGVFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRleHRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRleHRTdHlsZUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdG9FeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRvTGluZUVuZEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdG9Qb2ludEluZGV4RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB6SW5kZXhFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcgfSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZWRnZXMnKTtcclxuICAgIH1cclxuICAgIHNldCBlZGdlcyh2YWx1ZTogeyBjdXN0b21EYXRhRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBkYXRhU291cmNlPzogRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2UgfCBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZU9wdGlvbnMgfCBBcnJheTxhbnk+LCBmcm9tRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBmcm9tTGluZUVuZEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgZnJvbVBvaW50SW5kZXhFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGtleUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgbGluZVR5cGVFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGxvY2tlZEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgcG9pbnRzRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBzdHlsZUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdGV4dEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdGV4dFN0eWxlRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB0b0V4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdG9MaW5lRW5kRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB0b1BvaW50SW5kZXhFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHpJbmRleEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZyB9KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdlZGdlcycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMuZWRpdGluZ11cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGVkaXRpbmcoKTogeyBhbGxvd0FkZFNoYXBlPzogYm9vbGVhbiwgYWxsb3dDaGFuZ2VDb25uZWN0aW9uPzogYm9vbGVhbiwgYWxsb3dDaGFuZ2VDb25uZWN0b3JQb2ludHM/OiBib29sZWFuLCBhbGxvd0NoYW5nZUNvbm5lY3RvclRleHQ/OiBib29sZWFuLCBhbGxvd0NoYW5nZVNoYXBlVGV4dD86IGJvb2xlYW4sIGFsbG93RGVsZXRlQ29ubmVjdG9yPzogYm9vbGVhbiwgYWxsb3dEZWxldGVTaGFwZT86IGJvb2xlYW4sIGFsbG93TW92ZVNoYXBlPzogYm9vbGVhbiwgYWxsb3dSZXNpemVTaGFwZT86IGJvb2xlYW4gfSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZWRpdGluZycpO1xyXG4gICAgfVxyXG4gICAgc2V0IGVkaXRpbmcodmFsdWU6IHsgYWxsb3dBZGRTaGFwZT86IGJvb2xlYW4sIGFsbG93Q2hhbmdlQ29ubmVjdGlvbj86IGJvb2xlYW4sIGFsbG93Q2hhbmdlQ29ubmVjdG9yUG9pbnRzPzogYm9vbGVhbiwgYWxsb3dDaGFuZ2VDb25uZWN0b3JUZXh0PzogYm9vbGVhbiwgYWxsb3dDaGFuZ2VTaGFwZVRleHQ/OiBib29sZWFuLCBhbGxvd0RlbGV0ZUNvbm5lY3Rvcj86IGJvb2xlYW4sIGFsbG93RGVsZXRlU2hhcGU/OiBib29sZWFuLCBhbGxvd01vdmVTaGFwZT86IGJvb2xlYW4sIGFsbG93UmVzaXplU2hhcGU/OiBib29sZWFuIH0pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2VkaXRpbmcnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOkRPTUNvbXBvbmVudC5PcHRpb25zLmVsZW1lbnRBdHRyXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgZWxlbWVudEF0dHIoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdlbGVtZW50QXR0cicpO1xyXG4gICAgfVxyXG4gICAgc2V0IGVsZW1lbnRBdHRyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2VsZW1lbnRBdHRyJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5leHBvcnRdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBleHBvcnQoKTogeyBmaWxlTmFtZT86IHN0cmluZywgcHJveHlVcmw/OiBzdHJpbmcgfSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZXhwb3J0Jyk7XHJcbiAgICB9XHJcbiAgICBzZXQgZXhwb3J0KHZhbHVlOiB7IGZpbGVOYW1lPzogc3RyaW5nLCBwcm94eVVybD86IHN0cmluZyB9KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdleHBvcnQnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLmZ1bGxTY3JlZW5dXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBmdWxsU2NyZWVuKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2Z1bGxTY3JlZW4nKTtcclxuICAgIH1cclxuICAgIHNldCBmdWxsU2NyZWVuKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdmdWxsU2NyZWVuJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5ncmlkU2l6ZV1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGdyaWRTaXplKCk6IG51bWJlciB8IHsgaXRlbXM/OiBBcnJheTxudW1iZXI+LCB2YWx1ZT86IG51bWJlciB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdncmlkU2l6ZScpO1xyXG4gICAgfVxyXG4gICAgc2V0IGdyaWRTaXplKHZhbHVlOiBudW1iZXIgfCB7IGl0ZW1zPzogQXJyYXk8bnVtYmVyPiwgdmFsdWU/OiBudW1iZXIgfSkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignZ3JpZFNpemUnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLmhhc0NoYW5nZXNdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBoYXNDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2hhc0NoYW5nZXMnKTtcclxuICAgIH1cclxuICAgIHNldCBoYXNDaGFuZ2VzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdoYXNDaGFuZ2VzJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpET01Db21wb25lbnQuT3B0aW9ucy5oZWlnaHRdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBoZWlnaHQoKTogbnVtYmVyIHwgRnVuY3Rpb24gfCBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2hlaWdodCcpO1xyXG4gICAgfVxyXG4gICAgc2V0IGhlaWdodCh2YWx1ZTogbnVtYmVyIHwgRnVuY3Rpb24gfCBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2hlaWdodCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMuaGlzdG9yeVRvb2xiYXJdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBoaXN0b3J5VG9vbGJhcigpOiB7IGNvbW1hbmRzPzogQXJyYXk8RGV2RXhwcmVzcy51aS5keERpYWdyYW1DdXN0b21Db21tYW5kIHwgc3RyaW5nPiwgdmlzaWJsZT86IGJvb2xlYW4gfSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignaGlzdG9yeVRvb2xiYXInKTtcclxuICAgIH1cclxuICAgIHNldCBoaXN0b3J5VG9vbGJhcih2YWx1ZTogeyBjb21tYW5kcz86IEFycmF5PERldkV4cHJlc3MudWkuZHhEaWFncmFtQ3VzdG9tQ29tbWFuZCB8IHN0cmluZz4sIHZpc2libGU/OiBib29sZWFuIH0pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2hpc3RvcnlUb29sYmFyJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5tYWluVG9vbGJhcl1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IG1haW5Ub29sYmFyKCk6IHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCB2aXNpYmxlPzogYm9vbGVhbiB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdtYWluVG9vbGJhcicpO1xyXG4gICAgfVxyXG4gICAgc2V0IG1haW5Ub29sYmFyKHZhbHVlOiB7IGNvbW1hbmRzPzogQXJyYXk8RGV2RXhwcmVzcy51aS5keERpYWdyYW1DdXN0b21Db21tYW5kIHwgc3RyaW5nPiwgdmlzaWJsZT86IGJvb2xlYW4gfSkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignbWFpblRvb2xiYXInLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLm5vZGVzXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbm9kZXMoKTogeyBhdXRvTGF5b3V0Pzogc3RyaW5nIHwgeyBvcmllbnRhdGlvbj86IHN0cmluZywgdHlwZT86IHN0cmluZyB9LCBhdXRvU2l6ZUVuYWJsZWQ/OiBib29sZWFuLCBjb250YWluZXJDaGlsZHJlbkV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgY29udGFpbmVyS2V5RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBjdXN0b21EYXRhRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBkYXRhU291cmNlPzogRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2UgfCBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZU9wdGlvbnMgfCBBcnJheTxhbnk+LCBoZWlnaHRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGltYWdlVXJsRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBpdGVtc0V4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywga2V5RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBsZWZ0RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBsb2NrZWRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHBhcmVudEtleUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgc3R5bGVFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRleHRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRleHRTdHlsZUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdG9wRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB0eXBlRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB3aWR0aEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgekluZGV4RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nIH0ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ25vZGVzJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgbm9kZXModmFsdWU6IHsgYXV0b0xheW91dD86IHN0cmluZyB8IHsgb3JpZW50YXRpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcgfSwgYXV0b1NpemVFbmFibGVkPzogYm9vbGVhbiwgY29udGFpbmVyQ2hpbGRyZW5FeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGNvbnRhaW5lcktleUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgY3VzdG9tRGF0YUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgZGF0YVNvdXJjZT86IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlIHwgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2VPcHRpb25zIHwgQXJyYXk8YW55PiwgaGVpZ2h0RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBpbWFnZVVybEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgaXRlbXNFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGtleUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgbGVmdEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgbG9ja2VkRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBwYXJlbnRLZXlFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHN0eWxlRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB0ZXh0RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB0ZXh0U3R5bGVFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRvcEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdHlwZUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgd2lkdGhFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHpJbmRleEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZyB9KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdub2RlcycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMucGFnZUNvbG9yXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcGFnZUNvbG9yKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigncGFnZUNvbG9yJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgcGFnZUNvbG9yKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3BhZ2VDb2xvcicsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMucGFnZU9yaWVudGF0aW9uXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcGFnZU9yaWVudGF0aW9uKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigncGFnZU9yaWVudGF0aW9uJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgcGFnZU9yaWVudGF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3BhZ2VPcmllbnRhdGlvbicsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMucGFnZVNpemVdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBwYWdlU2l6ZSgpOiB7IGhlaWdodD86IG51bWJlciwgaXRlbXM/OiBBcnJheTxhbnkgfCB7IGhlaWdodD86IG51bWJlciwgdGV4dD86IHN0cmluZywgd2lkdGg/OiBudW1iZXIgfT4sIHdpZHRoPzogbnVtYmVyIH0ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ3BhZ2VTaXplJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgcGFnZVNpemUodmFsdWU6IHsgaGVpZ2h0PzogbnVtYmVyLCBpdGVtcz86IEFycmF5PGFueSB8IHsgaGVpZ2h0PzogbnVtYmVyLCB0ZXh0Pzogc3RyaW5nLCB3aWR0aD86IG51bWJlciB9Piwgd2lkdGg/OiBudW1iZXIgfSkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbigncGFnZVNpemUnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLnByb3BlcnRpZXNQYW5lbF1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHByb3BlcnRpZXNQYW5lbCgpOiB7IHRhYnM/OiBBcnJheTxhbnkgfCB7IGNvbW1hbmRzPzogQXJyYXk8RGV2RXhwcmVzcy51aS5keERpYWdyYW1DdXN0b21Db21tYW5kIHwgc3RyaW5nPiwgZ3JvdXBzPzogQXJyYXk8YW55IHwgeyBjb21tYW5kcz86IEFycmF5PERldkV4cHJlc3MudWkuZHhEaWFncmFtQ3VzdG9tQ29tbWFuZCB8IHN0cmluZz4sIHRpdGxlPzogc3RyaW5nIH0+LCB0aXRsZT86IHN0cmluZyB9PiwgdmlzaWJpbGl0eT86IHN0cmluZyB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdwcm9wZXJ0aWVzUGFuZWwnKTtcclxuICAgIH1cclxuICAgIHNldCBwcm9wZXJ0aWVzUGFuZWwodmFsdWU6IHsgdGFicz86IEFycmF5PGFueSB8IHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCBncm91cHM/OiBBcnJheTxhbnkgfCB7IGNvbW1hbmRzPzogQXJyYXk8RGV2RXhwcmVzcy51aS5keERpYWdyYW1DdXN0b21Db21tYW5kIHwgc3RyaW5nPiwgdGl0bGU/OiBzdHJpbmcgfT4sIHRpdGxlPzogc3RyaW5nIH0+LCB2aXNpYmlsaXR5Pzogc3RyaW5nIH0pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3Byb3BlcnRpZXNQYW5lbCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMucmVhZE9ubHldXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdyZWFkT25seScpO1xyXG4gICAgfVxyXG4gICAgc2V0IHJlYWRPbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdyZWFkT25seScsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6RE9NQ29tcG9uZW50Lk9wdGlvbnMucnRsRW5hYmxlZF1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHJ0bEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigncnRsRW5hYmxlZCcpO1xyXG4gICAgfVxyXG4gICAgc2V0IHJ0bEVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3J0bEVuYWJsZWQnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLnNob3dHcmlkXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgc2hvd0dyaWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignc2hvd0dyaWQnKTtcclxuICAgIH1cclxuICAgIHNldCBzaG93R3JpZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignc2hvd0dyaWQnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLnNpbXBsZVZpZXddXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzaW1wbGVWaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ3NpbXBsZVZpZXcnKTtcclxuICAgIH1cclxuICAgIHNldCBzaW1wbGVWaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdzaW1wbGVWaWV3JywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5zbmFwVG9HcmlkXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgc25hcFRvR3JpZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdzbmFwVG9HcmlkJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgc25hcFRvR3JpZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignc25hcFRvR3JpZCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMudG9vbGJveF1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvb2xib3goKTogeyBncm91cHM/OiBBcnJheTxhbnkgfCBzdHJpbmcgfCB7IGNhdGVnb3J5Pzogc3RyaW5nLCBkaXNwbGF5TW9kZT86IHN0cmluZywgZXhwYW5kZWQ/OiBib29sZWFuLCBzaGFwZXM/OiBBcnJheTxzdHJpbmc+LCB0aXRsZT86IHN0cmluZyB9Piwgc2hhcGVJY29uc1BlclJvdz86IG51bWJlciwgc2hvd1NlYXJjaD86IGJvb2xlYW4sIHZpc2liaWxpdHk/OiBzdHJpbmcsIHdpZHRoPzogbnVtYmVyIH0ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ3Rvb2xib3gnKTtcclxuICAgIH1cclxuICAgIHNldCB0b29sYm94KHZhbHVlOiB7IGdyb3Vwcz86IEFycmF5PGFueSB8IHN0cmluZyB8IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIGRpc3BsYXlNb2RlPzogc3RyaW5nLCBleHBhbmRlZD86IGJvb2xlYW4sIHNoYXBlcz86IEFycmF5PHN0cmluZz4sIHRpdGxlPzogc3RyaW5nIH0+LCBzaGFwZUljb25zUGVyUm93PzogbnVtYmVyLCBzaG93U2VhcmNoPzogYm9vbGVhbiwgdmlzaWJpbGl0eT86IHN0cmluZywgd2lkdGg/OiBudW1iZXIgfSkge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbigndG9vbGJveCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMudW5pdHNdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCB1bml0cygpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ3VuaXRzJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgdW5pdHModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbigndW5pdHMnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLnZpZXdUb29sYmFyXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdmlld1Rvb2xiYXIoKTogeyBjb21tYW5kcz86IEFycmF5PERldkV4cHJlc3MudWkuZHhEaWFncmFtQ3VzdG9tQ29tbWFuZCB8IHN0cmluZz4sIHZpc2libGU/OiBib29sZWFuIH0ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ3ZpZXdUb29sYmFyJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgdmlld1Rvb2xiYXIodmFsdWU6IHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCB2aXNpYmxlPzogYm9vbGVhbiB9KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCd2aWV3VG9vbGJhcicsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMudmlld1VuaXRzXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdmlld1VuaXRzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigndmlld1VuaXRzJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgdmlld1VuaXRzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3ZpZXdVbml0cycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6V2lkZ2V0Lk9wdGlvbnMudmlzaWJsZV1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbigndmlzaWJsZScpO1xyXG4gICAgfVxyXG4gICAgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ3Zpc2libGUnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOkRPTUNvbXBvbmVudC5PcHRpb25zLndpZHRoXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHwgRnVuY3Rpb24gfCBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ3dpZHRoJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgd2lkdGgodmFsdWU6IG51bWJlciB8IEZ1bmN0aW9uIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCd3aWR0aCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhEaWFncmFtLk9wdGlvbnMuem9vbUxldmVsXVxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgem9vbUxldmVsKCk6IG51bWJlciB8IHsgaXRlbXM/OiBBcnJheTxudW1iZXI+LCB2YWx1ZT86IG51bWJlciB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCd6b29tTGV2ZWwnKTtcclxuICAgIH1cclxuICAgIHNldCB6b29tTGV2ZWwodmFsdWU6IG51bWJlciB8IHsgaXRlbXM/OiBBcnJheTxudW1iZXI+LCB2YWx1ZT86IG51bWJlciB9KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCd6b29tTGV2ZWwnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFtkZXNjcjpXaWRnZXQuT3B0aW9ucy5vbkNvbnRlbnRSZWFkeV1cclxuICAgIFxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvbkNvbnRlbnRSZWFkeTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5vbkN1c3RvbUNvbW1hbmRdXHJcbiAgICBcclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25DdXN0b21Db21tYW5kOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogW2Rlc2NyOkRPTUNvbXBvbmVudC5PcHRpb25zLm9uRGlzcG9zaW5nXVxyXG4gICAgXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIG9uRGlzcG9zaW5nOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogW2Rlc2NyOkNvbXBvbmVudC5PcHRpb25zLm9uSW5pdGlhbGl6ZWRdXHJcbiAgICBcclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25Jbml0aWFsaXplZDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5vbkl0ZW1DbGlja11cclxuICAgIFxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvbkl0ZW1DbGljazogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5vbkl0ZW1EYmxDbGlja11cclxuICAgIFxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvbkl0ZW1EYmxDbGljazogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFtkZXNjcjpET01Db21wb25lbnQuT3B0aW9ucy5vbk9wdGlvbkNoYW5nZWRdXHJcbiAgICBcclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25PcHRpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLm9uUmVxdWVzdEVkaXRPcGVyYXRpb25dXHJcbiAgICBcclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25SZXF1ZXN0RWRpdE9wZXJhdGlvbjogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFtkZXNjcjpkeERpYWdyYW0uT3B0aW9ucy5vblJlcXVlc3RMYXlvdXRVcGRhdGVdXHJcbiAgICBcclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25SZXF1ZXN0TGF5b3V0VXBkYXRlOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogW2Rlc2NyOmR4RGlhZ3JhbS5PcHRpb25zLm9uU2VsZWN0aW9uQ2hhbmdlZF1cclxuICAgIFxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBhdXRvWm9vbU1vZGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBjb250ZXh0TWVudUNoYW5nZTogRXZlbnRFbWl0dGVyPHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCBlbmFibGVkPzogYm9vbGVhbiB9PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgY29udGV4dFRvb2xib3hDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGNhdGVnb3J5Pzogc3RyaW5nLCBkaXNwbGF5TW9kZT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4sIHNoYXBlSWNvbnNQZXJSb3c/OiBudW1iZXIsIHNoYXBlcz86IEFycmF5PHN0cmluZz4sIHdpZHRoPzogbnVtYmVyIH0+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBjdXN0b21TaGFwZXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxBcnJheTxhbnkgfCB7IGFsbG93RWRpdEltYWdlPzogYm9vbGVhbiwgYWxsb3dFZGl0VGV4dD86IGJvb2xlYW4sIGFsbG93UmVzaXplPzogYm9vbGVhbiwgYmFja2dyb3VuZEltYWdlSGVpZ2h0PzogbnVtYmVyLCBiYWNrZ3JvdW5kSW1hZ2VMZWZ0PzogbnVtYmVyLCBiYWNrZ3JvdW5kSW1hZ2VUb29sYm94VXJsPzogc3RyaW5nLCBiYWNrZ3JvdW5kSW1hZ2VUb3A/OiBudW1iZXIsIGJhY2tncm91bmRJbWFnZVVybD86IHN0cmluZywgYmFja2dyb3VuZEltYWdlV2lkdGg/OiBudW1iZXIsIGJhc2VUeXBlPzogc3RyaW5nLCBjYXRlZ29yeT86IHN0cmluZywgY29ubmVjdGlvblBvaW50cz86IEFycmF5PGFueSB8IHsgeD86IG51bWJlciwgeT86IG51bWJlciB9PiwgZGVmYXVsdEhlaWdodD86IG51bWJlciwgZGVmYXVsdEltYWdlVXJsPzogc3RyaW5nLCBkZWZhdWx0VGV4dD86IHN0cmluZywgZGVmYXVsdFdpZHRoPzogbnVtYmVyLCBpbWFnZUhlaWdodD86IG51bWJlciwgaW1hZ2VMZWZ0PzogbnVtYmVyLCBpbWFnZVRvcD86IG51bWJlciwgaW1hZ2VXaWR0aD86IG51bWJlciwga2VlcFJhdGlvT25BdXRvU2l6ZT86IGJvb2xlYW4sIG1heEhlaWdodD86IG51bWJlciwgbWF4V2lkdGg/OiBudW1iZXIsIG1pbkhlaWdodD86IG51bWJlciwgbWluV2lkdGg/OiBudW1iZXIsIHRlbXBsYXRlPzogYW55LCB0ZW1wbGF0ZUhlaWdodD86IG51bWJlciwgdGVtcGxhdGVMZWZ0PzogbnVtYmVyLCB0ZW1wbGF0ZVRvcD86IG51bWJlciwgdGVtcGxhdGVXaWR0aD86IG51bWJlciwgdGV4dEhlaWdodD86IG51bWJlciwgdGV4dExlZnQ/OiBudW1iZXIsIHRleHRUb3A/OiBudW1iZXIsIHRleHRXaWR0aD86IG51bWJlciwgdGl0bGU/OiBzdHJpbmcsIHRvb2xib3hUZW1wbGF0ZT86IGFueSwgdG9vbGJveFdpZHRoVG9IZWlnaHRSYXRpbz86IG51bWJlciwgdHlwZT86IHN0cmluZyB9Pj47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIGN1c3RvbVNoYXBlVGVtcGxhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBjdXN0b21TaGFwZVRvb2xib3hUZW1wbGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIGRlZmF1bHRJdGVtUHJvcGVydGllc0NoYW5nZTogRXZlbnRFbWl0dGVyPHsgY29ubmVjdG9yTGluZUVuZD86IHN0cmluZywgY29ubmVjdG9yTGluZVN0YXJ0Pzogc3RyaW5nLCBjb25uZWN0b3JMaW5lVHlwZT86IHN0cmluZywgc2hhcGVNYXhIZWlnaHQ/OiBudW1iZXIsIHNoYXBlTWF4V2lkdGg/OiBudW1iZXIsIHNoYXBlTWluSGVpZ2h0PzogbnVtYmVyLCBzaGFwZU1pbldpZHRoPzogbnVtYmVyLCBzdHlsZT86IGFueSwgdGV4dFN0eWxlPzogYW55IH0+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBkaXNhYmxlZENoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBlZGdlc0NoYW5nZTogRXZlbnRFbWl0dGVyPHsgY3VzdG9tRGF0YUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgZGF0YVNvdXJjZT86IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlIHwgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2VPcHRpb25zIHwgQXJyYXk8YW55PiwgZnJvbUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgZnJvbUxpbmVFbmRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGZyb21Qb2ludEluZGV4RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBrZXlFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGxpbmVUeXBlRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBsb2NrZWRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHBvaW50c0V4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgc3R5bGVFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRleHRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRleHRTdHlsZUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdG9FeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHRvTGluZUVuZEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdG9Qb2ludEluZGV4RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB6SW5kZXhFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcgfT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIGVkaXRpbmdDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGFsbG93QWRkU2hhcGU/OiBib29sZWFuLCBhbGxvd0NoYW5nZUNvbm5lY3Rpb24/OiBib29sZWFuLCBhbGxvd0NoYW5nZUNvbm5lY3RvclBvaW50cz86IGJvb2xlYW4sIGFsbG93Q2hhbmdlQ29ubmVjdG9yVGV4dD86IGJvb2xlYW4sIGFsbG93Q2hhbmdlU2hhcGVUZXh0PzogYm9vbGVhbiwgYWxsb3dEZWxldGVDb25uZWN0b3I/OiBib29sZWFuLCBhbGxvd0RlbGV0ZVNoYXBlPzogYm9vbGVhbiwgYWxsb3dNb3ZlU2hhcGU/OiBib29sZWFuLCBhbGxvd1Jlc2l6ZVNoYXBlPzogYm9vbGVhbiB9PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgZWxlbWVudEF0dHJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBleHBvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGZpbGVOYW1lPzogc3RyaW5nLCBwcm94eVVybD86IHN0cmluZyB9PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgZnVsbFNjcmVlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBncmlkU2l6ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlciB8IHsgaXRlbXM/OiBBcnJheTxudW1iZXI+LCB2YWx1ZT86IG51bWJlciB9PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgaGFzQ2hhbmdlc0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBoZWlnaHRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBGdW5jdGlvbiB8IHN0cmluZz47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIGhpc3RvcnlUb29sYmFyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBjb21tYW5kcz86IEFycmF5PERldkV4cHJlc3MudWkuZHhEaWFncmFtQ3VzdG9tQ29tbWFuZCB8IHN0cmluZz4sIHZpc2libGU/OiBib29sZWFuIH0+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBtYWluVG9vbGJhckNoYW5nZTogRXZlbnRFbWl0dGVyPHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCB2aXNpYmxlPzogYm9vbGVhbiB9PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgbm9kZXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGF1dG9MYXlvdXQ/OiBzdHJpbmcgfCB7IG9yaWVudGF0aW9uPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nIH0sIGF1dG9TaXplRW5hYmxlZD86IGJvb2xlYW4sIGNvbnRhaW5lckNoaWxkcmVuRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBjb250YWluZXJLZXlFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGN1c3RvbURhdGFFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGRhdGFTb3VyY2U/OiBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSB8IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlT3B0aW9ucyB8IEFycmF5PGFueT4sIGhlaWdodEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgaW1hZ2VVcmxFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGl0ZW1zRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBrZXlFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGxlZnRFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIGxvY2tlZEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgcGFyZW50S2V5RXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCBzdHlsZUV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdGV4dEV4cHI/OiBGdW5jdGlvbiB8IHN0cmluZywgdGV4dFN0eWxlRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB0b3BFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHR5cGVFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcsIHdpZHRoRXhwcj86IEZ1bmN0aW9uIHwgc3RyaW5nLCB6SW5kZXhFeHByPzogRnVuY3Rpb24gfCBzdHJpbmcgfT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHBhZ2VDb2xvckNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHBhZ2VPcmllbnRhdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBoZWlnaHQ/OiBudW1iZXIsIGl0ZW1zPzogQXJyYXk8YW55IHwgeyBoZWlnaHQ/OiBudW1iZXIsIHRleHQ/OiBzdHJpbmcsIHdpZHRoPzogbnVtYmVyIH0+LCB3aWR0aD86IG51bWJlciB9PjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgcHJvcGVydGllc1BhbmVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyB0YWJzPzogQXJyYXk8YW55IHwgeyBjb21tYW5kcz86IEFycmF5PERldkV4cHJlc3MudWkuZHhEaWFncmFtQ3VzdG9tQ29tbWFuZCB8IHN0cmluZz4sIGdyb3Vwcz86IEFycmF5PGFueSB8IHsgY29tbWFuZHM/OiBBcnJheTxEZXZFeHByZXNzLnVpLmR4RGlhZ3JhbUN1c3RvbUNvbW1hbmQgfCBzdHJpbmc+LCB0aXRsZT86IHN0cmluZyB9PiwgdGl0bGU/OiBzdHJpbmcgfT4sIHZpc2liaWxpdHk/OiBzdHJpbmcgfT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHJlYWRPbmx5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHJ0bEVuYWJsZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc2hvd0dyaWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc2ltcGxlVmlld0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgXHJcbiAgICAgKiBUaGlzIG1lbWJlciBzdXBwb3J0cyB0aGUgaW50ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGZyb20geW91ciBjb2RlLlxyXG4gICAgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBzbmFwVG9HcmlkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHRvb2xib3hDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGdyb3Vwcz86IEFycmF5PGFueSB8IHN0cmluZyB8IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIGRpc3BsYXlNb2RlPzogc3RyaW5nLCBleHBhbmRlZD86IGJvb2xlYW4sIHNoYXBlcz86IEFycmF5PHN0cmluZz4sIHRpdGxlPzogc3RyaW5nIH0+LCBzaGFwZUljb25zUGVyUm93PzogbnVtYmVyLCBzaG93U2VhcmNoPzogYm9vbGVhbiwgdmlzaWJpbGl0eT86IHN0cmluZywgd2lkdGg/OiBudW1iZXIgfT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHVuaXRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgdmlld1Rvb2xiYXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGNvbW1hbmRzPzogQXJyYXk8RGV2RXhwcmVzcy51aS5keERpYWdyYW1DdXN0b21Db21tYW5kIHwgc3RyaW5nPiwgdmlzaWJsZT86IGJvb2xlYW4gfT47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHZpZXdVbml0c0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPjtcclxuXHJcbiAgICAvKipcclxuICAgIFxyXG4gICAgICogVGhpcyBtZW1iZXIgc3VwcG9ydHMgdGhlIGludGVybmFsIGluZnJhc3RydWN0dXJlIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSBmcm9tIHlvdXIgY29kZS5cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgd2lkdGhDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBGdW5jdGlvbiB8IHN0cmluZz47XHJcblxyXG4gICAgLyoqXHJcbiAgICBcclxuICAgICAqIFRoaXMgbWVtYmVyIHN1cHBvcnRzIHRoZSBpbnRlcm5hbCBpbmZyYXN0cnVjdHVyZSBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSB5b3VyIGNvZGUuXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHpvb21MZXZlbENoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlciB8IHsgaXRlbXM/OiBBcnJheTxudW1iZXI+LCB2YWx1ZT86IG51bWJlciB9PjtcclxuXHJcblxyXG5cclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKER4aUN1c3RvbVNoYXBlQ29tcG9uZW50KVxyXG4gICAgZ2V0IGN1c3RvbVNoYXBlc0NoaWxkcmVuKCk6IFF1ZXJ5TGlzdDxEeGlDdXN0b21TaGFwZUNvbXBvbmVudD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2N1c3RvbVNoYXBlcycpO1xyXG4gICAgfVxyXG4gICAgc2V0IGN1c3RvbVNoYXBlc0NoaWxkcmVuKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDaGlsZHJlbignY3VzdG9tU2hhcGVzJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5nWm9uZTogTmdab25lLCB0ZW1wbGF0ZUhvc3Q6IER4VGVtcGxhdGVIb3N0LFxyXG4gICAgICAgICAgICBwcml2YXRlIF93YXRjaGVySGVscGVyOiBXYXRjaGVySGVscGVyLFxyXG4gICAgICAgICAgICBwcml2YXRlIF9pZGg6IEl0ZXJhYmxlRGlmZmVySGVscGVyLFxyXG4gICAgICAgICAgICBvcHRpb25Ib3N0OiBOZXN0ZWRPcHRpb25Ib3N0LFxyXG4gICAgICAgICAgICB0cmFuc2ZlclN0YXRlOiBUcmFuc2ZlclN0YXRlLFxyXG4gICAgICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBhbnkpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgbmdab25lLCB0ZW1wbGF0ZUhvc3QsIF93YXRjaGVySGVscGVyLCB0cmFuc2ZlclN0YXRlLCBwbGF0Zm9ybUlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY3JlYXRlRXZlbnRFbWl0dGVycyhbXHJcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlOiAnY29udGVudFJlYWR5JywgZW1pdDogJ29uQ29udGVudFJlYWR5JyB9LFxyXG4gICAgICAgICAgICB7IHN1YnNjcmliZTogJ2N1c3RvbUNvbW1hbmQnLCBlbWl0OiAnb25DdXN0b21Db21tYW5kJyB9LFxyXG4gICAgICAgICAgICB7IHN1YnNjcmliZTogJ2Rpc3Bvc2luZycsIGVtaXQ6ICdvbkRpc3Bvc2luZycgfSxcclxuICAgICAgICAgICAgeyBzdWJzY3JpYmU6ICdpbml0aWFsaXplZCcsIGVtaXQ6ICdvbkluaXRpYWxpemVkJyB9LFxyXG4gICAgICAgICAgICB7IHN1YnNjcmliZTogJ2l0ZW1DbGljaycsIGVtaXQ6ICdvbkl0ZW1DbGljaycgfSxcclxuICAgICAgICAgICAgeyBzdWJzY3JpYmU6ICdpdGVtRGJsQ2xpY2snLCBlbWl0OiAnb25JdGVtRGJsQ2xpY2snIH0sXHJcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlOiAnb3B0aW9uQ2hhbmdlZCcsIGVtaXQ6ICdvbk9wdGlvbkNoYW5nZWQnIH0sXHJcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlOiAncmVxdWVzdEVkaXRPcGVyYXRpb24nLCBlbWl0OiAnb25SZXF1ZXN0RWRpdE9wZXJhdGlvbicgfSxcclxuICAgICAgICAgICAgeyBzdWJzY3JpYmU6ICdyZXF1ZXN0TGF5b3V0VXBkYXRlJywgZW1pdDogJ29uUmVxdWVzdExheW91dFVwZGF0ZScgfSxcclxuICAgICAgICAgICAgeyBzdWJzY3JpYmU6ICdzZWxlY3Rpb25DaGFuZ2VkJywgZW1pdDogJ29uU2VsZWN0aW9uQ2hhbmdlZCcgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnYXV0b1pvb21Nb2RlQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdjb250ZXh0TWVudUNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnY29udGV4dFRvb2xib3hDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ2N1c3RvbVNoYXBlc0NoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnY3VzdG9tU2hhcGVUZW1wbGF0ZUNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnY3VzdG9tU2hhcGVUb29sYm94VGVtcGxhdGVDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ2RlZmF1bHRJdGVtUHJvcGVydGllc0NoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnZGlzYWJsZWRDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ2VkZ2VzQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdlZGl0aW5nQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdlbGVtZW50QXR0ckNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnZXhwb3J0Q2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdmdWxsU2NyZWVuQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdncmlkU2l6ZUNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnaGFzQ2hhbmdlc0NoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnaGVpZ2h0Q2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdoaXN0b3J5VG9vbGJhckNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnbWFpblRvb2xiYXJDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ25vZGVzQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdwYWdlQ29sb3JDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ3BhZ2VPcmllbnRhdGlvbkNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAncGFnZVNpemVDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ3Byb3BlcnRpZXNQYW5lbENoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAncmVhZE9ubHlDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ3J0bEVuYWJsZWRDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ3Nob3dHcmlkQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdzaW1wbGVWaWV3Q2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICdzbmFwVG9HcmlkQ2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICd0b29sYm94Q2hhbmdlJyB9LFxyXG4gICAgICAgICAgICB7IGVtaXQ6ICd1bml0c0NoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAndmlld1Rvb2xiYXJDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ3ZpZXdVbml0c0NoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAndmlzaWJsZUNoYW5nZScgfSxcclxuICAgICAgICAgICAgeyBlbWl0OiAnd2lkdGhDaGFuZ2UnIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdDogJ3pvb21MZXZlbENoYW5nZScgfVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICB0aGlzLl9pZGguc2V0SG9zdCh0aGlzKTtcclxuICAgICAgICBvcHRpb25Ib3N0LnNldEhvc3QodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVJbnN0YW5jZShlbGVtZW50LCBvcHRpb25zKSB7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgRHhEaWFncmFtKGVsZW1lbnQsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl9kZXN0cm95V2lkZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBDaGFuZ2VzKCdjdXN0b21TaGFwZXMnLCBjaGFuZ2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cENoYW5nZXMocHJvcDogc3RyaW5nLCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0aGlzLl9vcHRpb25zVG9VcGRhdGUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lkaC5zZXR1cChwcm9wLCBjaGFuZ2VzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdEb0NoZWNrKCkge1xyXG4gICAgICAgIHRoaXMuX2lkaC5kb0NoZWNrKCdjdXN0b21TaGFwZXMnKTtcclxuICAgICAgICB0aGlzLl93YXRjaGVySGVscGVyLmNoZWNrV2F0Y2hlcnMoKTtcclxuICAgICAgICBzdXBlci5uZ0RvQ2hlY2soKTtcclxuICAgICAgICBzdXBlci5jbGVhckNoYW5nZWRPcHRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX3NldE9wdGlvbihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNTZXR1cCA9IHRoaXMuX2lkaC5zZXR1cFNpbmdsZShuYW1lLCB2YWx1ZSk7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZCA9IHRoaXMuX2lkaC5nZXRDaGFuZ2VzKG5hbWUsIHZhbHVlKSAhPT0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGlzU2V0dXAgfHwgaXNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLl9zZXRPcHRpb24obmFtZSwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbXHJcbiAgICBEeG9Db250ZXh0TWVudU1vZHVsZSxcclxuICAgIER4aUNvbW1hbmRNb2R1bGUsXHJcbiAgICBEeGlJdGVtTW9kdWxlLFxyXG4gICAgRHhvQ29udGV4dFRvb2xib3hNb2R1bGUsXHJcbiAgICBEeGlDdXN0b21TaGFwZU1vZHVsZSxcclxuICAgIER4aUNvbm5lY3Rpb25Qb2ludE1vZHVsZSxcclxuICAgIER4b0RlZmF1bHRJdGVtUHJvcGVydGllc01vZHVsZSxcclxuICAgIER4b0VkZ2VzTW9kdWxlLFxyXG4gICAgRHhvRWRpdGluZ01vZHVsZSxcclxuICAgIER4b0V4cG9ydE1vZHVsZSxcclxuICAgIER4b0dyaWRTaXplTW9kdWxlLFxyXG4gICAgRHhvSGlzdG9yeVRvb2xiYXJNb2R1bGUsXHJcbiAgICBEeG9NYWluVG9vbGJhck1vZHVsZSxcclxuICAgIER4b05vZGVzTW9kdWxlLFxyXG4gICAgRHhvQXV0b0xheW91dE1vZHVsZSxcclxuICAgIER4b1BhZ2VTaXplTW9kdWxlLFxyXG4gICAgRHhvUHJvcGVydGllc1BhbmVsTW9kdWxlLFxyXG4gICAgRHhpVGFiTW9kdWxlLFxyXG4gICAgRHhpR3JvdXBNb2R1bGUsXHJcbiAgICBEeG9Ub29sYm94TW9kdWxlLFxyXG4gICAgRHhvVmlld1Rvb2xiYXJNb2R1bGUsXHJcbiAgICBEeG9ab29tTGV2ZWxNb2R1bGUsXHJcbiAgICBEeEludGVncmF0aW9uTW9kdWxlLFxyXG4gICAgRHhUZW1wbGF0ZU1vZHVsZSxcclxuICAgIEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIER4RGlhZ3JhbUNvbXBvbmVudFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgRHhEaWFncmFtQ29tcG9uZW50LFxyXG4gICAgRHhvQ29udGV4dE1lbnVNb2R1bGUsXHJcbiAgICBEeGlDb21tYW5kTW9kdWxlLFxyXG4gICAgRHhpSXRlbU1vZHVsZSxcclxuICAgIER4b0NvbnRleHRUb29sYm94TW9kdWxlLFxyXG4gICAgRHhpQ3VzdG9tU2hhcGVNb2R1bGUsXHJcbiAgICBEeGlDb25uZWN0aW9uUG9pbnRNb2R1bGUsXHJcbiAgICBEeG9EZWZhdWx0SXRlbVByb3BlcnRpZXNNb2R1bGUsXHJcbiAgICBEeG9FZGdlc01vZHVsZSxcclxuICAgIER4b0VkaXRpbmdNb2R1bGUsXHJcbiAgICBEeG9FeHBvcnRNb2R1bGUsXHJcbiAgICBEeG9HcmlkU2l6ZU1vZHVsZSxcclxuICAgIER4b0hpc3RvcnlUb29sYmFyTW9kdWxlLFxyXG4gICAgRHhvTWFpblRvb2xiYXJNb2R1bGUsXHJcbiAgICBEeG9Ob2Rlc01vZHVsZSxcclxuICAgIER4b0F1dG9MYXlvdXRNb2R1bGUsXHJcbiAgICBEeG9QYWdlU2l6ZU1vZHVsZSxcclxuICAgIER4b1Byb3BlcnRpZXNQYW5lbE1vZHVsZSxcclxuICAgIER4aVRhYk1vZHVsZSxcclxuICAgIER4aUdyb3VwTW9kdWxlLFxyXG4gICAgRHhvVG9vbGJveE1vZHVsZSxcclxuICAgIER4b1ZpZXdUb29sYmFyTW9kdWxlLFxyXG4gICAgRHhvWm9vbUxldmVsTW9kdWxlLFxyXG4gICAgRHhUZW1wbGF0ZU1vZHVsZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIER4RGlhZ3JhbU1vZHVsZSB7IH1cclxuIl19