UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

449 lines 56.2 kB
import { __decorate, __metadata, __param } from "tslib"; import { Directive, Optional, Input, NgModule, Host, ComponentFactoryResolver, ViewContainerRef } from '@angular/core'; import { FilteringExpressionsTree } from '../data-operations/filtering-expressions-tree'; import { IgxColumnComponent } from './columns/column.component'; import { DataType } from '../data-operations/data-util'; import { IgxBooleanFilteringOperand, IgxNumberFilteringOperand, IgxDateFilteringOperand, IgxStringFilteringOperand } from '../data-operations/filtering-condition'; import { IgxGridComponent } from './grid/grid.component'; const COLUMNS = 'columns'; const FILTERING = 'filtering'; const ADVANCED_FILTERING = 'advancedFiltering'; const SORTING = 'sorting'; const GROUPBY = 'groupBy'; const PAGING = 'paging'; const ROW_SELECTION = 'rowSelection'; const CELL_SELECTION = 'cellSelection'; let IgxGridStateDirective = class IgxGridStateDirective { /** * @hidden */ constructor(grid, resolver, viewRef) { this.grid = grid; this.resolver = resolver; this.viewRef = viewRef; this._options = { columns: true, filtering: true, advancedFiltering: true, sorting: true, groupBy: true, paging: true, cellSelection: true, rowSelection: true }; } /** * An object with options determining if a certain feature state should be saved. * * ```html * <igx-grid [igxGridState]="options"></igx-grid> * ``` * ```typescript * public options = {selection: false, advancedFiltering: false}; * ``` */ get options() { return this._options; } set options(value) { Object.assign(this._options, value); } /** * Gets the state of a feature or states of all grid features, unless a certain feature is disabled through the `options` property. * @param `serialize` determines whether the returned object will be serialized to JSON string. Default value is false. * @param `feature` string or array of strings determining the features which state to retrieve. If skipped, returns all. * @returns Returns the serialized to JSON string IGridState object, or the non-serialized IGridState object. * ```html * <igx-grid [igxGridState]="options"></igx-grid> * ``` * ```typescript * @ViewChild(IgxGridStateDirective, { static: true }) public state; * let state = this.state.getState(); * ``` */ getState(serialize = true, feature) { let state; if (feature) { state = {}; if (Array.isArray(feature)) { feature.forEach(f => { state = Object.assign(state, this.getGridFeature(f)); }); } else { state = this.getGridFeature(feature); } } else { state = this.getAllGridFeatures(); } if (serialize) { state = JSON.stringify(state, this.stringifyCallback); return state; } else { return state; } } /** * Restores grid features' state based on the IGridState object passed as an argument. * @param IGridState object to restore state from. * @returns * ```html * <igx-grid [igxGridState]="options"></igx-grid> * ``` * ```typescript * @ViewChild(IgxGridStateDirective, { static: true }) public state; * this.state.setState(gridState); * ``` */ setState(state) { if (typeof state === 'string') { state = JSON.parse(state); } this.state = state; this.restoreGridState(); this.grid.cdr.detectChanges(); } /** * The method that calls corresponding methods to restore feature from this.state object. */ restoreGridState() { for (const key of Object.keys(this.state)) { if (this.state[key]) { this.restoreFeature(key, this.state[key]); } } } /** * Restores the state of a feature. */ restoreFeature(feature, state) { switch (feature) { case COLUMNS: { this.restoreColumns(state); break; } case FILTERING: { this.restoreFiltering(state); break; } case ADVANCED_FILTERING: { this.restoreAdvancedFiltering(state); break; } case SORTING: { this.restoreSorting(state); break; } case GROUPBY: { this.restoreGroupBy(state); break; } case PAGING: { this.restorePaging(state); break; } case ROW_SELECTION: { this.restoreRowSelection(state); break; } case CELL_SELECTION: { this.restoreCellSelection(state); break; } } } /** * Returns an object containing all grid features state. */ getAllGridFeatures() { let gridState = {}; for (const key of Object.keys(this.options)) { if (this.options[key]) { const feature = this.getGridFeature(key); gridState = Object.assign(gridState, feature); } } gridState = Object.assign({}, gridState); return gridState; } /** * Restores an object containing the state for a grid feature. * `serialize` param determines whether the returned object will be serialized to a JSON string. Default value is false., */ getGridFeature(feature) { const state = {}; switch (feature) { case COLUMNS: { Object.assign(state, this.getColumns()); break; } case FILTERING: { Object.assign(state, this.getFiltering()); break; } case ADVANCED_FILTERING: { Object.assign(state, this.getAdvancedFiltering()); break; } case SORTING: { Object.assign(state, this.getSorting()); break; } case GROUPBY: { Object.assign(state, this.getGroupBy()); break; } case PAGING: { Object.assign(state, this.getPaging()); break; } case ROW_SELECTION: { Object.assign(state, this.getRowSelection()); break; } case CELL_SELECTION: { Object.assign(state, this.getCellSelection()); break; } } return state; } /** * Helper method that creates a new array with the current grid columns. */ getColumns() { const gridColumns = this.grid.columns.sort(this.sortByVisibleIndex).map((c) => { return { pinned: c.pinned, sortable: c.sortable, filterable: c.filterable, editable: c.editable, sortingIgnoreCase: c.sortingIgnoreCase, filteringIgnoreCase: c.filteringIgnoreCase, headerClasses: c.headerClasses, headerGroupClasses: c.headerGroupClasses, maxWidth: c.maxWidth, groupable: c.groupable, movable: c.movable, hidden: c.hidden, dataType: c.dataType, hasSummary: c.hasSummary, field: c.field, width: c.width, header: c.header, resizable: c.resizable, searchable: c.searchable }; }); return { columns: gridColumns }; } getFiltering() { const filteringState = this.grid.filteringExpressionsTree; return { filtering: filteringState }; } getAdvancedFiltering() { const advancedFiltering = this.grid.advancedFilteringExpressionsTree; return { advancedFiltering: advancedFiltering }; } getPaging() { const pagingState = this.grid.pagingState; return { paging: pagingState }; } getSorting() { const sortingState = this.grid.sortingExpressions; sortingState.forEach(s => { delete s.strategy; }); return { sorting: sortingState }; } getGroupBy() { const groupingExpressions = this.grid.groupingExpressions; groupingExpressions.forEach(expr => { delete expr.strategy; }); const expansionState = this.grid.groupingExpansionState; const groupsExpanded = this.grid.groupsExpanded; return { groupBy: { expressions: groupingExpressions, expansion: expansionState, defaultExpanded: groupsExpanded } }; } getRowSelection() { const selection = this.grid.selectedRows(); return { rowSelection: selection }; } getCellSelection() { const selection = this.grid.getSelectedRanges().map(range => { return { rowStart: range.rowStart, rowEnd: range.rowEnd, columnStart: range.columnStart, columnEnd: range.columnEnd }; }); return { cellSelection: selection }; } /** * Restores the grid columns by modifying the `columnList` collection of the grid. */ restoreColumns(columnsState) { const newColumns = []; const factory = this.resolver.resolveComponentFactory(IgxColumnComponent); columnsState.forEach((colState) => { const ref = factory.create(this.viewRef.injector); Object.assign(ref.instance, colState); ref.changeDetectorRef.detectChanges(); newColumns.push(ref.instance); }); this.grid.columnList.reset(newColumns); this.grid.columnList.notifyOnChanges(); } sortByVisibleIndex(colA, colB) { const a = colA.visibleIndex, b = colB.visibleIndex; return a > b ? 1 : a < b ? -1 : 0; } /** * Restores the grid filtering state, i.e. sets the `filteringExpressionsTree` property value. */ restoreFiltering(state) { const filterTree = this.createExpressionsTreeFromObject(state); this.grid.filteringExpressionsTree = filterTree; } /** * Restores the grid advanced filtering state, i.e. sets the `advancedFilteringExpressionsTree` property value. */ restoreAdvancedFiltering(state) { const advFilterTree = this.createExpressionsTreeFromObject(state); this.grid.advancedFilteringExpressionsTree = advFilterTree; } /** * Restores the grid sorting state, i.e. sets the `sortingExpressions` property value. */ restoreSorting(state) { this.grid.sortingExpressions = state; } /** * Restores the grid grouping state, i.e. sets the `groupbyExpressions` property value. */ restoreGroupBy(state) { this.grid.groupingExpressions = state.expressions; if (this.grid.groupsExpanded !== state.defaultExpanded) { this.grid.toggleAllGroupRows(); } else { this.grid.groupingExpansionState = state.expansion; } } /** * Restores the grid paging state, i.e. sets the `perPage` property value and paginate to index. */ restorePaging(state) { if (this.grid.perPage !== state.recordsPerPage) { this.grid.perPage = state.recordsPerPage; this.grid.cdr.detectChanges(); } this.grid.page = state.index; } restoreRowSelection(state) { this.grid.selectRows(state); } restoreCellSelection(state) { state.forEach(r => { const range = { rowStart: r.rowStart, rowEnd: r.rowEnd, columnStart: r.columnStart, columnEnd: r.columnEnd }; this.grid.selectRange(range); }); } /** * This method builds a FilteringExpressionsTree from a provided object. */ createExpressionsTreeFromObject(exprTreeObject) { if (!exprTreeObject || !exprTreeObject.filteringOperands) { return null; } const expressionsTree = new FilteringExpressionsTree(exprTreeObject.operator, exprTreeObject.fieldName); for (const item of exprTreeObject.filteringOperands) { // Check if item is an expressions tree or a single expression. if (item.filteringOperands) { const subTree = this.createExpressionsTreeFromObject(item); expressionsTree.filteringOperands.push(subTree); } else { const expr = item; let dataType; if (this.grid.columnList.length > 0) { dataType = this.grid.columnList.find(c => c.field === expr.fieldName).dataType; } else { dataType = this.state[COLUMNS].find(c => c.field === expr.fieldName).dataType; } // when ESF, values are stored in Set. // First those values are converted to an array before returning string in the stringifyCallback // now we need to convert those back to Set if (Array.isArray(expr.searchVal)) { expr.searchVal = new Set(expr.searchVal); } else { expr.searchVal = (dataType === 'date') ? new Date(Date.parse(expr.searchVal)) : expr.searchVal; } expr.condition = this.generateFilteringCondition(dataType, expr.condition.name); expressionsTree.filteringOperands.push(expr); } } return expressionsTree; } /** * Returns the filtering logic function for a given dataType and condition (contains, greaterThan, etc.) */ generateFilteringCondition(dataType, name) { let filters; switch (dataType) { case DataType.Boolean: filters = IgxBooleanFilteringOperand.instance(); break; case DataType.Number: filters = IgxNumberFilteringOperand.instance(); break; case DataType.Date: filters = IgxDateFilteringOperand.instance(); break; case DataType.String: default: filters = IgxStringFilteringOperand.instance(); break; } return filters.condition(name); } stringifyCallback(key, val) { if (key === 'searchVal' && val instanceof Set) { return Array.from(val); } return val; } }; IgxGridStateDirective.ctorParameters = () => [ { type: IgxGridComponent, decorators: [{ type: Host }, { type: Optional }] }, { type: ComponentFactoryResolver }, { type: ViewContainerRef } ]; __decorate([ Input('igxGridState'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxGridStateDirective.prototype, "options", null); IgxGridStateDirective = __decorate([ Directive({ selector: '[igxGridState]' }), __param(0, Host()), __param(0, Optional()), __metadata("design:paramtypes", [IgxGridComponent, ComponentFactoryResolver, ViewContainerRef]) ], IgxGridStateDirective); export { IgxGridStateDirective }; /** * @hidden */ let IgxGridStateModule = class IgxGridStateModule { }; IgxGridStateModule = __decorate([ NgModule({ declarations: [IgxGridStateDirective], exports: [IgxGridStateDirective] }) ], IgxGridStateModule); export { IgxGridStateModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9zdGF0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQ0FBK0MsQ0FBQztBQUVwSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUNuRix5QkFBeUIsRUFBc0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUlsRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQThDekQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzFCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUM5QixNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBQy9DLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNyQyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUM7QUFLdkMsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFrQzlCOztPQUVHO0lBQ0gsWUFDZ0MsSUFBc0IsRUFDMUMsUUFBa0MsRUFDaEMsT0FBeUI7UUFGUCxTQUFJLEdBQUosSUFBSSxDQUFrQjtRQUMxQyxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNoQyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQXRDL0IsYUFBUSxHQUFzQjtZQUNsQyxPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSTtZQUNuQixZQUFZLEVBQUUsSUFBSTtTQUNyQixDQUFDO0lBNkJ5QyxDQUFDO0lBekI1Qzs7Ozs7Ozs7O09BU0c7SUFFSCxJQUFXLE9BQU87UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQXdCO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBVUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLEVBQUUsT0FBMkI7UUFDekQsSUFBSSxLQUEwQixDQUFDO1FBQy9CLElBQUksT0FBTyxFQUFFO1lBQ1QsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNYLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDeEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDaEIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekQsQ0FBQyxDQUFDLENBQUM7YUFDTjtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QztTQUNKO2FBQU07WUFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDckM7UUFDRCxJQUFJLFNBQVMsRUFBRTtZQUNYLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN0RCxPQUFPLEtBQWUsQ0FBQztTQUMxQjthQUFNO1lBQ0gsT0FBTyxLQUFtQixDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksUUFBUSxDQUFDLEtBQTBCO1FBQ3RDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzNCLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFtQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQjtRQUNwQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzdDO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsT0FBZSxFQUFFLEtBQ29DO1FBQ3hFLFFBQVEsT0FBTyxFQUFFO1lBQ2IsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQXVCLENBQUMsQ0FBQztnQkFDN0MsTUFBTTthQUNSO1lBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBaUMsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNO2FBQ1Q7WUFDRCxLQUFLLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFpQyxDQUFDLENBQUM7Z0JBQ2pFLE1BQU07YUFDVDtZQUNELEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUE2QixDQUFDLENBQUM7Z0JBQ25ELE1BQU07YUFDUjtZQUNELEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUF1QixDQUFDLENBQUM7Z0JBQzdDLE1BQU07YUFDUjtZQUNELEtBQUssTUFBTSxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFxQixDQUFDLENBQUM7Z0JBQzFDLE1BQU07YUFDUDtZQUNELEtBQUssYUFBYSxDQUFDLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFjLENBQUMsQ0FBQztnQkFDekMsTUFBTTthQUNQO1lBQ0QsS0FBSyxjQUFjLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQTZCLENBQUMsQ0FBQztnQkFDekQsTUFBTTthQUNQO1NBQ0w7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0I7UUFDdEIsSUFBSSxTQUFTLEdBQWUsRUFBRSxDQUFDO1FBRS9CLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxTQUFTLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDbEQ7U0FDSjtRQUVELFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLE9BQWU7UUFDbEMsTUFBTSxLQUFLLEdBQWUsRUFBRSxDQUFDO1FBQzdCLFFBQVEsT0FBTyxFQUFFO1lBQ2IsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDWCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsTUFBTTthQUNSO1lBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztnQkFDWixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsTUFBTTthQUNUO1lBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNO2FBQ1Q7WUFDRCxLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNO2FBQ1I7WUFDRCxLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNO2FBQ1I7WUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNO2FBQ1A7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDO2dCQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsTUFBTTthQUNQO1lBQ0QsS0FBSyxjQUFjLENBQUMsQ0FBQztnQkFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztnQkFDOUMsTUFBTTthQUNQO1NBQ0w7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVO1FBQ2QsTUFBTSxXQUFXLEdBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMxRixPQUFPO2dCQUNILE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtnQkFDaEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO2dCQUNwQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7Z0JBQ3hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtnQkFDdEMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtnQkFDMUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhO2dCQUM5QixrQkFBa0IsRUFBRSxDQUFDLENBQUMsa0JBQWtCO2dCQUN4QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7Z0JBQ3BCLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztnQkFDdEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO2dCQUNsQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO2dCQUN4QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtnQkFDaEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2dCQUN0QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7YUFDM0IsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sWUFBWTtRQUNoQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVPLG9CQUFvQjtRQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7UUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVPLFNBQVM7UUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyxVQUFVO1FBQ2QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNsRCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLFVBQVU7UUFDZCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDMUQsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUMsRUFBRyxDQUFDO0lBQ3pILENBQUM7SUFFTyxlQUFlO1FBQ25CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUgsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxZQUE0QjtRQUMvQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsSUFBd0IsRUFBRSxJQUF3QjtRQUN2RSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLEtBQStCO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFVBQXNDLENBQUM7SUFDaEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCLENBQUMsS0FBK0I7UUFDNUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsYUFBeUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsS0FBMkI7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLEtBQXFCO1FBQ3ZDLElBQUksQ0FBQyxJQUF5QixDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxXQUFvQyxDQUFDO1FBQ2pHLElBQUssSUFBSSxDQUFDLElBQXlCLENBQUMsY0FBYyxLQUFLLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDMUUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQ2xDO2FBQU07WUFDRixJQUFJLENBQUMsSUFBeUIsQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMsU0FBa0MsQ0FBQztTQUNyRztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGFBQWEsQ0FBQyxLQUFtQjtRQUNyQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQVk7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQTJCO1FBQ3BELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDZCxNQUFNLEtBQUssR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFDLENBQUM7WUFDNUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSywrQkFBK0IsQ0FBQyxjQUF3QztRQUM1RSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhHLEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxDQUFDLGlCQUFpQixFQUFFO1lBQ2pELCtEQUErRDtZQUMvRCxJQUFLLElBQWlDLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBRSxJQUFpQyxDQUFDLENBQUM7Z0JBQ3pGLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkQ7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBNEIsQ0FBQztnQkFDMUMsSUFBSSxRQUFnQixDQUFDO2dCQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUM7aUJBQ2xGO3FCQUFNO29CQUNILFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztpQkFDakY7Z0JBQ0Qsc0NBQXNDO2dCQUN0QyxnR0FBZ0c7Z0JBQ2hHLDJDQUEyQztnQkFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzVDO3FCQUFNO29CQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7aUJBQ2xHO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRixlQUFlLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hEO1NBQ0o7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSywwQkFBMEIsQ0FBQyxRQUFnQixFQUFFLElBQVk7UUFDN0QsSUFBSSxPQUFPLENBQUM7UUFDWixRQUFRLFFBQVEsRUFBRTtZQUNkLEtBQUssUUFBUSxDQUFDLE9BQU87Z0JBQ2pCLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEQsTUFBTTtZQUNWLEtBQUssUUFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsTUFBTTtZQUNWLEtBQUssUUFBUSxDQUFDLElBQUk7Z0JBQ2QsT0FBTyxHQUFHLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxNQUFNO1lBQ1YsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3JCO2dCQUNJLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsTUFBTTtTQUNiO1FBQ0QsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsR0FBUTtRQUMzQyxJQUFJLEdBQUcsS0FBSyxXQUFXLElBQUksR0FBRyxZQUFZLEdBQUcsRUFBRTtZQUMzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Q0FDSixDQUFBOztZQTNZeUMsZ0JBQWdCLHVCQUFqRCxJQUFJLFlBQUksUUFBUTtZQUNDLHdCQUF3QjtZQUN2QixnQkFBZ0I7O0FBZHZDO0lBREMsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7O29EQUdyQjtBQTVCUSxxQkFBcUI7SUFIakMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGdCQUFnQjtLQUM3QixDQUFDO0lBdUNPLFdBQUEsSUFBSSxFQUFFLENBQUEsRUFBRSxXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQUFlLGdCQUFnQjtRQUNoQyx3QkFBd0I7UUFDdkIsZ0JBQWdCO0dBeEM5QixxQkFBcUIsQ0FpYmpDO1NBamJZLHFCQUFxQjtBQW1ibEM7O0dBRUc7QUFLSCxJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtDQUFJLENBQUE7QUFBdEIsa0JBQWtCO0lBSjlCLFFBQVEsQ0FBQztRQUNOLFlBQVksRUFBRSxDQUFDLHFCQUFxQixDQUFDO1FBQ3JDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO0tBQ25DLENBQUM7R0FDVyxrQkFBa0IsQ0FBSTtTQUF0QixrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9wdGlvbmFsLCBJbnB1dCwgTmdNb2R1bGUsIEhvc3QsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JvdXBpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElQYWdpbmdTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9wYWdpbmctc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZCwgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSUZpbHRlcmluZ09wZXJhdGlvbn0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgR3JpZFNlbGVjdGlvblJhbmdlIH0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlFeHBhbmRTdGF0ZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LWV4cGFuZC1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwaW5nU3RhdGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XG4gICAgY29sdW1ucz86IElDb2x1bW5TdGF0ZVtdO1xuICAgIGZpbHRlcmluZz86IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgYWR2YW5jZWRGaWx0ZXJpbmc/OiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIHBhZ2luZz86IElQYWdpbmdTdGF0ZTtcbiAgICBzb3J0aW5nPzogSVNvcnRpbmdFeHByZXNzaW9uW107XG4gICAgZ3JvdXBCeT86IElHcm91cGluZ1N0YXRlO1xuICAgIGNlbGxTZWxlY3Rpb24/OiBHcmlkU2VsZWN0aW9uUmFuZ2VbXTtcbiAgICByb3dTZWxlY3Rpb24/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFN0YXRlT3B0aW9ucyB7XG4gICAgY29sdW1ucz86IGJvb2xlYW47XG4gICAgZmlsdGVyaW5nPzogYm9vbGVhbjtcbiAgICBhZHZhbmNlZEZpbHRlcmluZz86IGJvb2xlYW47XG4gICAgc29ydGluZz86IGJvb2xlYW47XG4gICAgZ3JvdXBCeT86IGJvb2xlYW47XG4gICAgcGFnaW5nPzogYm9vbGVhbjtcbiAgICBjZWxsU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgICByb3dTZWxlY3Rpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2x1bW5TdGF0ZSB7XG4gICAgcGlubmVkOiBib29sZWFuO1xuICAgIHNvcnRhYmxlOiBib29sZWFuO1xuICAgIGZpbHRlcmFibGU6IGJvb2xlYW47XG4gICAgZWRpdGFibGU6IGJvb2xlYW47XG4gICAgc29ydGluZ0lnbm9yZUNhc2U6IGJvb2xlYW47XG4gICAgZmlsdGVyaW5nSWdub3JlQ2FzZTogYm9vbGVhbjtcbiAgICBoZWFkZXJDbGFzc2VzOiBzdHJpbmc7XG4gICAgaGVhZGVyR3JvdXBDbGFzc2VzOiBzdHJpbmc7XG4gICAgbWF4V2lkdGg6IHN0cmluZztcbiAgICBncm91cGFibGU6IGJvb2xlYW47XG4gICAgbW92YWJsZTogYm9vbGVhbjtcbiAgICBoaWRkZW46IGJvb2xlYW47XG4gICAgZGF0YVR5cGU6IERhdGFUeXBlO1xuICAgIGhhc1N1bW1hcnk6IGJvb2xlYW47XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICB3aWR0aDogYW55O1xuICAgIGhlYWRlcjogc3RyaW5nO1xuICAgIHJlc2l6YWJsZTogYm9vbGVhbjtcbiAgICBzZWFyY2hhYmxlOiBib29sZWFuO1xufVxuXG5jb25zdCBDT0xVTU5TID0gJ2NvbHVtbnMnO1xuY29uc3QgRklMVEVSSU5HID0gJ2ZpbHRlcmluZyc7XG5jb25zdCBBRFZBTkNFRF9GSUxURVJJTkcgPSAnYWR2YW5jZWRGaWx0ZXJpbmcnO1xuY29uc3QgU09SVElORyA9ICdzb3J0aW5nJztcbmNvbnN0IEdST1VQQlkgPSAnZ3JvdXBCeSc7XG5jb25zdCBQQUdJTkcgPSAncGFnaW5nJztcbmNvbnN0IFJPV19TRUxFQ1RJT04gPSAncm93U2VsZWN0aW9uJztcbmNvbnN0IENFTExfU0VMRUNUSU9OID0gJ2NlbGxTZWxlY3Rpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hHcmlkU3RhdGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkU3RhdGVEaXJlY3RpdmUge1xuXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSUdyaWRTdGF0ZU9wdGlvbnMgPSB7XG4gICAgICAgIGNvbHVtbnM6IHRydWUsXG4gICAgICAgIGZpbHRlcmluZzogdHJ1ZSxcbiAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmc6IHRydWUsXG4gICAgICAgIHNvcnRpbmc6IHRydWUsXG4gICAgICAgIGdyb3VwQnk6IHRydWUsXG4gICAgICAgIHBhZ2luZzogdHJ1ZSxcbiAgICAgICAgY2VsbFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgcm93U2VsZWN0aW9uOiB0cnVlXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGU6IElHcmlkU3RhdGU7XG5cbiAgICAvKipcbiAgICAgKiAgQW4gb2JqZWN0IHdpdGggb3B0aW9ucyBkZXRlcm1pbmluZyBpZiBhIGNlcnRhaW4gZmVhdHVyZSBzdGF0ZSBzaG91bGQgYmUgc2F2ZWQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZ3hHcmlkU3RhdGVdPVwib3B0aW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvcHRpb25zID0ge3NlbGVjdGlvbjogZmFsc2UsIGFkdmFuY2VkRmlsdGVyaW5nOiBmYWxzZX07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hHcmlkU3RhdGUnKVxuICAgIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBJR3JpZFN0YXRlT3B0aW9ucyB7XG4gICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvcHRpb25zKHZhbHVlOiBJR3JpZFN0YXRlT3B0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSBncmlkOiBJZ3hHcmlkQ29tcG9uZW50LFxuICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YXRlIG9mIGEgZmVhdHVyZSBvciBzdGF0ZXMgb2YgYWxsIGdyaWQgZmVhdHVyZXMsIHVubGVzcyBhIGNlcnRhaW4gZmVhdHVyZSBpcyBkaXNhYmxlZCB0aHJvdWdoIHRoZSBgb3B0aW9uc2AgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGBzZXJpYWxpemVgIGRldGVybWluZXMgd2hldGhlciB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OIHN0cmluZy4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS5cbiAgICAgKiBAcGFyYW0gYGZlYXR1cmVgIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIGRldGVybWluaW5nIHRoZSBmZWF0dXJlcyB3aGljaCBzdGF0ZSB0byByZXRyaWV2ZS4gSWYgc2tpcHBlZCwgcmV0dXJucyBhbGwuXG4gICAgICogQHJldHVybnMgUmV0dXJucyB0aGUgc2VyaWFsaXplZCB0byBKU09OIHN0cmluZyBJR3JpZFN0YXRlIG9iamVjdCwgb3IgdGhlIG5vbi1zZXJpYWxpemVkIElHcmlkU3RhdGUgb2JqZWN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lneEdyaWRTdGF0ZV09XCJvcHRpb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChJZ3hHcmlkU3RhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBzdGF0ZTtcbiAgICAgKiBsZXQgc3RhdGUgPSAgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdGF0ZShzZXJpYWxpemUgPSB0cnVlLCBmZWF0dXJlPzogc3RyaW5nIHwgc3RyaW5nW10pOiBJR3JpZFN0YXRlIHwgc3RyaW5nICB7XG4gICAgICAgIGxldCBzdGF0ZTogSUdyaWRTdGF0ZSB8IHN0cmluZztcbiAgICAgICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgICAgICAgIHN0YXRlID0ge307XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmZWF0dXJlKSkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmUuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldEdyaWRGZWF0dXJlKGYpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmdldEdyaWRGZWF0dXJlKGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmdldEFsbEdyaWRGZWF0dXJlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHRoaXMuc3RyaW5naWZ5Q2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIGFzIHN0cmluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSBhcyBJR3JpZFN0YXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgZ3JpZCBmZWF0dXJlcycgc3RhdGUgYmFzZWQgb24gdGhlIElHcmlkU3RhdGUgb2JqZWN0IHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0gSUdyaWRTdGF0ZSBvYmplY3QgdG8gcmVzdG9yZSBzdGF0ZSBmcm9tLlxuICAgICAqIEByZXR1cm5zXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWd4R3JpZFN0YXRlXT1cIm9wdGlvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKElneEdyaWRTdGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHN0YXRlO1xuICAgICAqIHRoaXMuc3RhdGUuc2V0U3RhdGUoZ3JpZFN0YXRlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IElHcmlkU3RhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIGFzIElHcmlkU3RhdGU7XG4gICAgICAgIHRoaXMucmVzdG9yZUdyaWRTdGF0ZSgpO1xuICAgICAgICB0aGlzLmdyaWQuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHRoYXQgY2FsbHMgY29ycmVzcG9uZGluZyBtZXRob2RzIHRvIHJlc3RvcmUgZmVhdHVyZSBmcm9tIHRoaXMuc3RhdGUgb2JqZWN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzdG9yZUdyaWRTdGF0ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVGZWF0dXJlKGtleSwgdGhpcy5zdGF0ZVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlRmVhdHVyZShmZWF0dXJlOiBzdHJpbmcsIHN0YXRlOiBJQ29sdW1uU3RhdGVbXSB8IElQYWdpbmdTdGF0ZSB8IElTb3J0aW5nRXhwcmVzc2lvbltdIHxcbiAgICAgICAgSUdyb3VwaW5nU3RhdGUgfCBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IGFueVtdKSB7XG4gICAgICAgIHN3aXRjaCAoZmVhdHVyZSkge1xuICAgICAgICAgICAgY2FzZSBDT0xVTU5TOiB7XG4gICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVDb2x1bW5zKHN0YXRlIGFzIElDb2x1bW5TdGF0ZVtdKTtcbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBGSUxURVJJTkc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVGaWx0ZXJpbmcoc3RhdGUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgQURWQU5DRURfRklMVEVSSU5HOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlQWR2YW5jZWRGaWx0ZXJpbmcoc3RhdGUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU09SVElORzoge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVNvcnRpbmcoc3RhdGUgYXMgSVNvcnRpbmdFeHByZXNzaW9uW10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBjYXNlIEdST1VQQlk6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVHcm91cEJ5KHN0YXRlIGFzIElHcm91cGluZ1N0YXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2FzZSBQQUdJTkc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVQYWdpbmcoc3RhdGUgYXMgSVBhZ2luZ1N0YXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFJPV19TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVSb3dTZWxlY3Rpb24oc3RhdGUgYXMgYW55W10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgQ0VMTF9TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVDZWxsU2VsZWN0aW9uKHN0YXRlIGFzIEdyaWRTZWxlY3Rpb25SYW5nZVtdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGdyaWQgZmVhdHVyZXMgc3RhdGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBbGxHcmlkRmVhdHVyZXMoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGxldCBncmlkU3RhdGU6IElHcmlkU3RhdGUgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRHcmlkRmVhdHVyZShrZXkpO1xuICAgICAgICAgICAgICAgIGdyaWRTdGF0ZSA9ICBPYmplY3QuYXNzaWduKGdyaWRTdGF0ZSwgZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBncmlkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBncmlkU3RhdGUpO1xuICAgICAgICByZXR1cm4gZ3JpZFN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBmb3IgYSBncmlkIGZlYXR1cmUuXG4gICAgICogYHNlcmlhbGl6ZWAgcGFyYW0gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgSlNPTiBzdHJpbmcuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuLFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0R3JpZEZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHN0YXRlOiBJR3JpZFN0YXRlID0ge307XG4gICAgICAgIHN3aXRjaCAoZmVhdHVyZSkge1xuICAgICAgICAgICAgY2FzZSBDT0xVTU5TOiB7XG4gICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldENvbHVtbnMoKSk7XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRklMVEVSSU5HOiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgdGhpcy5nZXRGaWx0ZXJpbmcoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEFEVkFOQ0VEX0ZJTFRFUklORzoge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0QWR2YW5jZWRGaWx0ZXJpbmcoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFNPUlRJTkc6IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldFNvcnRpbmcoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGNhc2UgR1JPVVBCWToge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHRoaXMuZ2V0R3JvdXBCeSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgY2FzZSBQQUdJTkc6IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldFBhZ2luZygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFJPV19TRUxFQ1RJT046IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB0aGlzLmdldFJvd1NlbGVjdGlvbigpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIENFTExfU0VMRUNUSU9OOiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgdGhpcy5nZXRDZWxsU2VsZWN0aW9uKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgYXJyYXkgd2l0aCB0aGUgY3VycmVudCBncmlkIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb2x1bW5zKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBncmlkQ29sdW1uczogSUNvbHVtblN0YXRlW10gPSB0aGlzLmdyaWQuY29sdW1ucy5zb3J0KHRoaXMuc29ydEJ5VmlzaWJsZUluZGV4KS5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGlubmVkOiBjLnBpbm5lZCxcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogYy5zb3J0YWJsZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJhYmxlOiBjLmZpbHRlcmFibGUsXG4gICAgICAgICAgICAgICAgZWRpdGFibGU6IGMuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgc29ydGluZ0lnbm9yZUNhc2U6IGMuc29ydGluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nSWdub3JlQ2FzZTogYy5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgIGhlYWRlckNsYXNzZXM6IGMuaGVhZGVyQ2xhc3NlcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJHcm91cENsYXNzZXM6IGMuaGVhZGVyR3JvdXBDbGFzc2VzLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBjLm1heFdpZHRoLFxuICAgICAgICAgICAgICAgIGdyb3VwYWJsZTogYy5ncm91cGFibGUsXG4gICAgICAgICAgICAgICAgbW92YWJsZTogYy5tb3ZhYmxlLFxuICAgICAgICAgICAgICAgIGhpZGRlbjogYy5oaWRkZW4sXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgaGFzU3VtbWFyeTogYy5oYXNTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBjLndpZHRoLFxuICAgICAgICAgICAgICAgIGhlYWRlcjogYy5oZWFkZXIsXG4gICAgICAgICAgICAgICAgcmVzaXphYmxlOiBjLnJlc2l6YWJsZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hhYmxlOiBjLnNlYXJjaGFibGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBncmlkQ29sdW1ucyB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmlsdGVyaW5nKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdTdGF0ZSA9IHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIHJldHVybiB7IGZpbHRlcmluZzogZmlsdGVyaW5nU3RhdGUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFkdmFuY2VkRmlsdGVyaW5nKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZyA9IHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgcmV0dXJuIHsgYWR2YW5jZWRGaWx0ZXJpbmc6IGFkdmFuY2VkRmlsdGVyaW5nIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYWdpbmcoKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHBhZ2luZ1N0YXRlID0gdGhpcy5ncmlkLnBhZ2luZ1N0YXRlO1xuICAgICAgICByZXR1cm4geyBwYWdpbmc6IHBhZ2luZ1N0YXRlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3J0aW5nKCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBzb3J0aW5nU3RhdGUgPSB0aGlzLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zO1xuICAgICAgICBzb3J0aW5nU3RhdGUuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBzLnN0cmF0ZWd5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgc29ydGluZzogc29ydGluZ1N0YXRlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcm91cEJ5KCk6IElHcmlkU3RhdGUge1xuICAgICAgICBjb25zdCBncm91cGluZ0V4cHJlc3Npb25zID0gdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnM7XG4gICAgICAgIGdyb3VwaW5nRXhwcmVzc2lvbnMuZm9yRWFjaChleHByID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBleHByLnN0cmF0ZWd5O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZXhwYW5zaW9uU3RhdGUgPSB0aGlzLmdyaWQuZ3JvdXBpbmdFeHBhbnNpb25TdGF0ZTtcbiAgICAgICAgY29uc3QgZ3JvdXBzRXhwYW5kZWQgPSB0aGlzLmdyaWQuZ3JvdXBzRXhwYW5kZWQ7XG5cbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBCeTogeyBleHByZXNzaW9uczogZ3JvdXBpbmdFeHByZXNzaW9ucywgZXhwYW5zaW9uOiBleHBhbnNpb25TdGF0ZSwgZGVmYXVsdEV4cGFuZGVkOiBncm91cHNFeHBhbmRlZH0gIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSb3dTZWxlY3Rpb24oKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgcmV0dXJuIHsgcm93U2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENlbGxTZWxlY3Rpb24oKTogSUdyaWRTdGF0ZSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ3JpZC5nZXRTZWxlY3RlZFJhbmdlcygpLm1hcChyYW5nZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dTdGFydDogcmFuZ2Uucm93U3RhcnQsIHJvd0VuZDogcmFuZ2Uucm93RW5kLCBjb2x1bW5TdGFydDogcmFuZ2UuY29sdW1uU3RhcnQsIGNvbHVtbkVuZDogcmFuZ2UuY29sdW1uRW5kIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBjZWxsU2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgZ3JpZCBjb2x1bW5zIGJ5IG1vZGlmeWluZyB0aGUgYGNvbHVtbkxpc3RgIGNvbGxlY3Rpb24gb2YgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXN0b3JlQ29sdW1ucyhjb2x1bW5zU3RhdGU6IElDb2x1bW5TdGF0ZVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29sdW1uc1N0YXRlLmZvckVhY2goKGNvbFN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBmYWN0b3J5LmNyZWF0ZSh0aGlzLnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZWYuaW5zdGFuY2UsIGNvbFN0YXRlKTtcbiAgICAgICAgICAgIHJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICBuZXdDb2x1bW5zLnB1c2gocmVmLmluc3RhbmNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbkxpc3QucmVzZXQobmV3Q29sdW1ucyk7XG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5MaXN0Lm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc29ydEJ5VmlzaWJsZUluZGV4KGNvbEE6IElneENvbHVtbkNvbXBvbmVudCwgY29sQjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgYSA9IGNvbEEudmlzaWJsZUluZGV4LCBiID0gY29sQi52aXNpYmxlSW5kZXg7XG4gICAgICAgICAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBncmlkIGZpbHRlcmluZyBzdGF0ZSwgaS5lLiBzZXRzIHRoZSBgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlYCBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc3RvcmVGaWx0ZXJpbmcoc3RhdGU6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJUcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uc1RyZWVGcm9tT2JqZWN0KHN0YXRlKTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBncmlkIGFkdmFuY2VkIGZpbHRlcmluZyBzdGF0ZSwgaS5lLiBzZXRzIHRoZSBgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVgIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzdG9yZUFkdmFuY2VkRmlsdGVyaW5nKHN0YXRlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgY29uc3QgYWR2RmlsdGVyVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvbnNUcmVlRnJvbU9iamVjdChzdGF0ZSk7XG4gICAgICAgIHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGFkdkZpbHRlclRyZWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBncmlkIHNvcnRpbmcgc3RhdGUsIGkuZS4gc