ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
246 lines • 34 kB
JavaScript
import { Injectable } from '@angular/core';
import { Codes } from '../../util/codes';
import { Util } from '../../util/util';
import { AbstractComponentStateService } from './o-component-state.service';
import { OTableComponentStateClass } from './o-table-component-state.class';
import * as i0 from "@angular/core";
export class OTableComponentStateService extends AbstractComponentStateService {
initialize(component) {
this.state = new OTableComponentStateClass();
super.initialize(component);
}
initializeState(state) {
super.initializeState(state);
const initialConfigurationRawObj = state.initialConfiguration || {};
state.initialConfiguration = new OTableComponentStateClass();
state.initialConfiguration.setData(initialConfigurationRawObj);
}
refreshSelection() {
this.state.selection = this.getSelectionState();
}
getDataToStore() {
const dataToStore = {};
const propertiesKeys = [
'sort-columns',
'oColumns-display',
'columns-filter',
'quick-filter',
'page',
'selection',
'initial-configuration',
'filter-columns',
'filter-column-active',
'grouped-columns',
'grouped-column-types',
'user-stored-filters',
'user-stored-configurations',
'expandable-rows'
];
Object.assign(dataToStore, this.getTablePropertiesToStore(propertiesKeys));
return dataToStore;
}
storeFilter(filter) {
let newFilter = { name: filter.name, description: filter.description };
const storedFilter = {};
Object.assign(storedFilter, this.getColumnFiltersState());
Object.assign(storedFilter, this.getColumnsQuickFilterState());
Object.assign(storedFilter, this.getFilterBuilderState());
newFilter['stored-filter'] = storedFilter;
this.state.addStoredFilter(newFilter);
}
storeConfiguration(configurationAgs, tableProperties) {
const newConfiguration = {};
this.component.storePaginationState = true;
const storedConfiguration = this.getTablePropertiesToStore(tableProperties);
this.component.storePaginationState = false;
newConfiguration['stored-configuration'] = storedConfiguration;
Object.assign(newConfiguration, configurationAgs);
newConfiguration['stored-properties'] = tableProperties;
this.state.addStoredConfiguration(newConfiguration);
}
getTablePropertiesToStore(properties) {
const result = {};
properties.forEach(prop => {
Object.assign(result, this.getTablePropertyToStore(prop));
});
return result;
}
getTablePropertyToStore(property) {
let result = {};
switch (property) {
case 'sort-columns':
result = this.getSortState();
break;
case 'oColumns-display':
result = this.getColumnsDisplayState();
break;
case 'quick-filter':
result = this.getColumnsQuickFilterState();
break;
case 'columns-filter':
result = this.getColumnFiltersState();
break;
case 'page':
result = this.getPageState();
break;
case 'selection':
result['selection'] = this.getSelectionState();
break;
case 'initial-configuration':
result = this.getInitialConfigurationState();
break;
case 'filter-column-active':
result['filter-column-active'] = this.component.isColumnFiltersActive;
break;
case 'filter-columns':
result['filter-columns'] = this.component.filterColumns;
break;
case 'grouped-columns':
result['grouped-columns'] = this.component.groupedColumnsArray;
break;
case 'grouped-column-types':
result['grouped-column-types'] = this.component.groupedColumnTypes;
break;
case 'user-stored-filters':
result['user-stored-filters'] = this.state.storedFilters;
break;
case 'user-stored-configurations':
result['user-stored-configurations'] = this.state.storedConfigurations;
break;
case 'filter-builder':
if (this.component.filterBuilder) {
result['filter-builder'] = this.component.filterBuilder.getFilterValues();
}
break;
case 'expandable-rows':
if (this.component.isColumnExpandable()) {
result['expandable-rows'] = this.state.expandableRows;
}
break;
}
return result;
}
getColumnsDisplayState() {
const oColumnsData = [];
this.component.oTableOptions.columns.forEach((oCol) => {
oColumnsData.push({
attr: oCol.attr,
visible: oCol.visible,
width: oCol.getWidthToStore()
});
});
return {
'oColumns-display': oColumnsData,
'select-column-visible': this.component.oTableOptions.selectColumn.visible
};
}
getColumnsQuickFilterState() {
const tableOptions = this.component.oTableOptions;
const oColumnsData = [];
tableOptions.columns.forEach((oCol) => {
oColumnsData.push({
attr: oCol.attr,
searchable: oCol.searchable,
searching: oCol.searching
});
});
return {
'oColumns': oColumnsData,
'filter-case-sensitive': tableOptions.filterCaseSensitive,
'filter': this.component.oTableQuickFilterComponent ? this.component.oTableQuickFilterComponent.value : ''
};
}
getFilterBuilderState() {
const result = {};
if (this.component.filterBuilder) {
let filterBuilder = this.component.filterBuilder.getFilterValues();
if (!Util.isObjectEmpty(filterBuilder)) {
result['filter-builder-values'] = filterBuilder;
}
}
return result;
}
getColumnFiltersState() {
const result = {};
if (this.component.dataSource) {
const columnValueFilters = this.component.dataSource.getColumnValueFilters();
if (columnValueFilters.length > 0) {
result['column-value-filters'] = columnValueFilters;
}
}
return result;
}
getPageState() {
const result = {};
if (this.component.matpaginator) {
result['query-rows'] = this.component.matpaginator.pageSize;
}
else if (this.component.state.queryRows) {
result['query-rows'] = this.component.state.queryRows;
}
else {
result['query-rows'] = this.component.originalQueryRows;
}
;
if (this.component.currentPage > 0 && this.component.storePaginationState) {
result.currentPage = this.component.currentPage;
}
if (this.component.pageable && this.component.storePaginationState) {
result.totalQueryRecordsNumber = this.component.state.totalQueryRecordsNumber;
result.queryRecordOffset = Math.max((this.component.state.queryRecordOffset - this.component.dataSource.renderedData.length), (this.component.state.queryRecordOffset - this.component.queryRows));
}
return result;
}
getSelectionState() {
const selection = [];
if (this.component && this.component.keepSelectedItems) {
const tableKeys = this.component.getKeys();
this.component.getSelectedItems().forEach(item => {
const data = {};
tableKeys.forEach(key => {
data[key] = item[key];
});
selection.push(data);
});
}
return selection;
}
getInitialConfigurationState() {
const oColumnsData = [];
Util.parseArray(this.component.visibleColumns, true).forEach((columnAttr) => {
let oCol = this.component.getOColumn(columnAttr);
oColumnsData.push({
attr: oCol.attr,
visible: true,
width: oCol.definition ? oCol.definition.originalWidth : undefined
});
});
return {
'initial-configuration': {
'oColumns-display': oColumnsData,
'sort-columns': this.component.sortColumns,
'select-column-visible': this.component.oTableOptions.selectColumn.visible,
'filter-case-sensitive': this.component.filterCaseSensitive,
'query-rows': this.component.originalQueryRows,
'filter-column-active-by-default': this.component.filterColumnActiveByDefault,
'filter-columns': this.component.originalFilterColumns,
'grouped-columns': this.component.originalGroupedColumnsArray
}
};
}
getSortState() {
const sortColumns = [];
this.component.sort?.getSortColumns().forEach(sortData => {
sortColumns.push(sortData.id + Codes.COLUMNS_ALIAS_SEPARATOR + sortData.direction);
});
return {
'sort-columns': sortColumns.join(Codes.ARRAY_INPUT_SEPARATOR)
};
}
}
OTableComponentStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableComponentStateService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
OTableComponentStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableComponentStateService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableComponentStateService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1jb21wb25lbnQtc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9zZXJ2aWNlcy9zdGF0ZS9vLXRhYmxlLWNvbXBvbmVudC1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFTM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFHNUUsTUFBTSxPQUFPLDJCQUE0QixTQUFRLDZCQUF5RTtJQUV4SCxVQUFVLENBQUMsU0FBMEI7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLHlCQUF5QixFQUFFLENBQUM7UUFDN0MsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWdDO1FBQzlDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBQ3BFLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLHlCQUF5QixFQUFFLENBQUM7UUFDN0QsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sV0FBVyxHQUFRLEVBQUUsQ0FBQztRQUM1QixNQUFNLGNBQWMsR0FBRztZQUNyQixjQUFjO1lBQ2Qsa0JBQWtCO1lBQ2xCLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QsTUFBTTtZQUNOLFdBQVc7WUFDWCx1QkFBdUI7WUFDdkIsZ0JBQWdCO1lBQ2hCLHNCQUFzQjtZQUN0QixpQkFBaUI7WUFDakIsc0JBQXNCO1lBQ3RCLHFCQUFxQjtZQUNyQiw0QkFBNEI7WUFDNUIsaUJBQWlCO1NBQ2xCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUMzRSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXlCO1FBQ25DLElBQUksU0FBUyxHQUF3QixFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUYsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQzFELFNBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxZQUFrQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxnQkFBcUMsRUFBRSxlQUFzQjtRQUM5RSxNQUFNLGdCQUFnQixHQUF3QixFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDM0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFNUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxlQUFlLENBQUM7UUFFeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyx5QkFBeUIsQ0FBQyxVQUFvQjtRQUN0RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxRQUFnQjtRQUNoRCxJQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDckIsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxjQUFjO2dCQUNqQixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1IsS0FBSyxrQkFBa0I7Z0JBQ3JCLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDdkMsTUFBTTtZQUNSLEtBQUssY0FBYztnQkFDakIsTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUMzQyxNQUFNO1lBQ1IsS0FBSyxnQkFBZ0I7Z0JBQ25CLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDdEMsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDL0MsTUFBTTtZQUNSLEtBQUssdUJBQXVCO2dCQUMxQixNQUFNLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQzdDLE1BQU07WUFDUixLQUFLLHNCQUFzQjtnQkFDekIsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDdEUsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDeEQsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDO2dCQUMvRCxNQUFNO1lBQ1IsS0FBSyxzQkFBc0I7Z0JBQ3pCLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7Z0JBQ25FLE1BQU07WUFDUixLQUFLLHFCQUFxQjtnQkFDeEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7Z0JBQ3pELE1BQU07WUFDUixLQUFLLDRCQUE0QjtnQkFDL0IsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDdkUsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO29CQUNoQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztpQkFDM0U7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtvQkFDdkMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7aUJBQ3ZEO2dCQUNELE1BQU07U0FDVDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxzQkFBc0I7UUFDOUIsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtZQUM3RCxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRTthQUM5QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxrQkFBa0IsRUFBRSxZQUFZO1lBQ2hDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPO1NBQzNFLENBQUM7SUFDSixDQUFDO0lBRVMsMEJBQTBCO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1FBQ2xELE1BQU0sWUFBWSxHQUF3QixFQUFFLENBQUM7UUFDN0MsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtZQUM3QyxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsVUFBVSxFQUFFLFlBQVk7WUFDeEIsdUJBQXVCLEVBQUUsWUFBWSxDQUFDLG1CQUFtQjtZQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDM0csQ0FBQztJQUNKLENBQUM7SUFFUyxxQkFBcUI7UUFDN0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUU7WUFDaEMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLGFBQWEsQ0FBQzthQUNqRDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUdTLHFCQUFxQjtRQUM3QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtZQUM3QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0UsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsR0FBRyxrQkFBa0IsQ0FBQzthQUNyRDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVTLFlBQVk7UUFDcEIsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBRXZCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUU7WUFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztTQUM3RDthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDdkQ7YUFBTTtZQUNMLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1NBQ3pEO1FBQUEsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUU7WUFDekUsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUNqRDtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRTtZQUNsRSxNQUFNLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUM7WUFDOUUsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2pDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUN4RixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQ3BFLENBQUM7U0FDSDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFO1lBRXRELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDL0MsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRVMsNEJBQTRCO1FBQ3BDLE1BQU0sWUFBWSxHQUFxQixFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFrQixFQUFFLEVBQUU7WUFDbEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNuRSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCx1QkFBdUIsRUFBRTtnQkFDdkIsa0JBQWtCLEVBQUUsWUFBWTtnQkFDaEMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVztnQkFDMUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU87Z0JBQzFFLHVCQUF1QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CO2dCQUMzRCxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUI7Z0JBQzlDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQTJCO2dCQUM3RSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQjtnQkFDdEQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBMkI7YUFDOUQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVTLFlBQVk7UUFDcEIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN2RCxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxjQUFjLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUM7U0FDOUQsQ0FBQztJQUNKLENBQUM7O3lIQTlQVSwyQkFBMkI7NkhBQTNCLDJCQUEyQjs0RkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IE9Db2x1bW4gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3RhYmxlL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE9GaWx0ZXJEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1maWx0ZXItZGVmaW5pdGlvbi50eXBlJztcbmltcG9ydCB7IE9Db2x1bW5EaXNwbGF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby1jb2x1bW4tZGlzcGxheS50eXBlJztcbmltcG9ydCB7IE9Db2x1bW5TZWFyY2hhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby1jb2x1bW4tc2VhcmNoYWJsZS50eXBlJztcbmltcG9ydCB7IE9UYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWNvbmZpZ3VyYXRpb24udHlwZSc7XG5pbXBvcnQgeyBPVGFibGVGaWx0ZXJzU3RhdHVzLCBPVGFibGVTdG9yZWRGaWx0ZXIgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWZpbHRlci1zdGF0dXMudHlwZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbXBvbmVudFN0YXRlU2VydmljZSB9IGZyb20gJy4vby1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi9vLXRhYmxlLWNvbXBvbmVudC1zdGF0ZS5jbGFzcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPVGFibGVDb21wb25lbnRTdGF0ZVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudFN0YXRlU2VydmljZTxPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzLCBPVGFibGVDb21wb25lbnQ+IHtcblxuICBpbml0aWFsaXplKGNvbXBvbmVudDogT1RhYmxlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zdGF0ZSA9IG5ldyBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzKCk7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZShjb21wb25lbnQpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVN0YXRlKHN0YXRlOiBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZVN0YXRlKHN0YXRlKTtcbiAgICBjb25zdCBpbml0aWFsQ29uZmlndXJhdGlvblJhd09iaiA9IHN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uIHx8IHt9O1xuICAgIHN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uID0gbmV3IE9UYWJsZUNvbXBvbmVudFN0YXRlQ2xhc3MoKTtcbiAgICBzdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zZXREYXRhKGluaXRpYWxDb25maWd1cmF0aW9uUmF3T2JqKTtcbiAgfVxuXG4gIHJlZnJlc2hTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvblN0YXRlKCk7XG4gIH1cblxuICBnZXREYXRhVG9TdG9yZSgpOiBhbnkge1xuICAgIGNvbnN0IGRhdGFUb1N0b3JlOiBhbnkgPSB7fTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzS2V5cyA9IFtcbiAgICAgICdzb3J0LWNvbHVtbnMnLFxuICAgICAgJ29Db2x1bW5zLWRpc3BsYXknLFxuICAgICAgJ2NvbHVtbnMtZmlsdGVyJyxcbiAgICAgICdxdWljay1maWx0ZXInLFxuICAgICAgJ3BhZ2UnLFxuICAgICAgJ3NlbGVjdGlvbicsXG4gICAgICAnaW5pdGlhbC1jb25maWd1cmF0aW9uJyxcbiAgICAgICdmaWx0ZXItY29sdW1ucycsXG4gICAgICAnZmlsdGVyLWNvbHVtbi1hY3RpdmUnLFxuICAgICAgJ2dyb3VwZWQtY29sdW1ucycsXG4gICAgICAnZ3JvdXBlZC1jb2x1bW4tdHlwZXMnLFxuICAgICAgJ3VzZXItc3RvcmVkLWZpbHRlcnMnLFxuICAgICAgJ3VzZXItc3RvcmVkLWNvbmZpZ3VyYXRpb25zJyxcbiAgICAgICdleHBhbmRhYmxlLXJvd3MnXG4gICAgXTtcbiAgICBPYmplY3QuYXNzaWduKGRhdGFUb1N0b3JlLCB0aGlzLmdldFRhYmxlUHJvcGVydGllc1RvU3RvcmUocHJvcGVydGllc0tleXMpKTtcbiAgICByZXR1cm4gZGF0YVRvU3RvcmU7XG4gIH1cblxuICBzdG9yZUZpbHRlcihmaWx0ZXI6IE9GaWx0ZXJEZWZpbml0aW9uKSB7XG4gICAgbGV0IG5ld0ZpbHRlcjogT1RhYmxlRmlsdGVyc1N0YXR1cyA9IHsgbmFtZTogZmlsdGVyLm5hbWUsIGRlc2NyaXB0aW9uOiBmaWx0ZXIuZGVzY3JpcHRpb24gfTtcbiAgICBjb25zdCBzdG9yZWRGaWx0ZXIgPSB7fVxuICAgIE9iamVjdC5hc3NpZ24oc3RvcmVkRmlsdGVyLCB0aGlzLmdldENvbHVtbkZpbHRlcnNTdGF0ZSgpKTtcbiAgICBPYmplY3QuYXNzaWduKHN0b3JlZEZpbHRlciwgdGhpcy5nZXRDb2x1bW5zUXVpY2tGaWx0ZXJTdGF0ZSgpKTtcbiAgICBPYmplY3QuYXNzaWduKHN0b3JlZEZpbHRlciwgdGhpcy5nZXRGaWx0ZXJCdWlsZGVyU3RhdGUoKSk7XG4gICAgbmV3RmlsdGVyWydzdG9yZWQtZmlsdGVyJ10gPSBzdG9yZWRGaWx0ZXIgYXMgT1RhYmxlU3RvcmVkRmlsdGVyO1xuICAgIHRoaXMuc3RhdGUuYWRkU3RvcmVkRmlsdGVyKG5ld0ZpbHRlcik7XG4gIH1cblxuICBzdG9yZUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbkFnczogT1RhYmxlQ29uZmlndXJhdGlvbiwgdGFibGVQcm9wZXJ0aWVzOiBhbnlbXSkge1xuICAgIGNvbnN0IG5ld0NvbmZpZ3VyYXRpb246IE9UYWJsZUNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICB0aGlzLmNvbXBvbmVudC5zdG9yZVBhZ2luYXRpb25TdGF0ZSA9IHRydWU7XG4gICAgY29uc3Qgc3RvcmVkQ29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0VGFibGVQcm9wZXJ0aWVzVG9TdG9yZSh0YWJsZVByb3BlcnRpZXMpO1xuICAgIHRoaXMuY29tcG9uZW50LnN0b3JlUGFnaW5hdGlvblN0YXRlID0gZmFsc2U7XG5cbiAgICBuZXdDb25maWd1cmF0aW9uWydzdG9yZWQtY29uZmlndXJhdGlvbiddID0gc3RvcmVkQ29uZmlndXJhdGlvbjtcbiAgICBPYmplY3QuYXNzaWduKG5ld0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb25BZ3MpO1xuICAgIG5ld0NvbmZpZ3VyYXRpb25bJ3N0b3JlZC1wcm9wZXJ0aWVzJ10gPSB0YWJsZVByb3BlcnRpZXM7XG5cbiAgICB0aGlzLnN0YXRlLmFkZFN0b3JlZENvbmZpZ3VyYXRpb24obmV3Q29uZmlndXJhdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VGFibGVQcm9wZXJ0aWVzVG9TdG9yZShwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IGFueSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHRoaXMuZ2V0VGFibGVQcm9wZXJ0eVRvU3RvcmUocHJvcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VGFibGVQcm9wZXJ0eVRvU3RvcmUocHJvcGVydHk6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IHJlc3VsdDogYW55ID0ge307XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgICAgY2FzZSAnc29ydC1jb2x1bW5zJzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRTb3J0U3RhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvQ29sdW1ucy1kaXNwbGF5JzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRDb2x1bW5zRGlzcGxheVN0YXRlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVpY2stZmlsdGVyJzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRDb2x1bW5zUXVpY2tGaWx0ZXJTdGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbHVtbnMtZmlsdGVyJzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJzU3RhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYWdlJzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRQYWdlU3RhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3Rpb24nOlxuICAgICAgICByZXN1bHRbJ3NlbGVjdGlvbiddID0gdGhpcy5nZXRTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luaXRpYWwtY29uZmlndXJhdGlvbic6XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0SW5pdGlhbENvbmZpZ3VyYXRpb25TdGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbHRlci1jb2x1bW4tYWN0aXZlJzpcbiAgICAgICAgcmVzdWx0WydmaWx0ZXItY29sdW1uLWFjdGl2ZSddID0gdGhpcy5jb21wb25lbnQuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbHRlci1jb2x1bW5zJzpcbiAgICAgICAgcmVzdWx0WydmaWx0ZXItY29sdW1ucyddID0gdGhpcy5jb21wb25lbnQuZmlsdGVyQ29sdW1ucztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdncm91cGVkLWNvbHVtbnMnOlxuICAgICAgICByZXN1bHRbJ2dyb3VwZWQtY29sdW1ucyddID0gdGhpcy5jb21wb25lbnQuZ3JvdXBlZENvbHVtbnNBcnJheTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdncm91cGVkLWNvbHVtbi10eXBlcyc6XG4gICAgICAgIHJlc3VsdFsnZ3JvdXBlZC1jb2x1bW4tdHlwZXMnXSA9IHRoaXMuY29tcG9uZW50Lmdyb3VwZWRDb2x1bW5UeXBlcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1c2VyLXN0b3JlZC1maWx0ZXJzJzpcbiAgICAgICAgcmVzdWx0Wyd1c2VyLXN0b3JlZC1maWx0ZXJzJ10gPSB0aGlzLnN0YXRlLnN0b3JlZEZpbHRlcnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXNlci1zdG9yZWQtY29uZmlndXJhdGlvbnMnOlxuICAgICAgICByZXN1bHRbJ3VzZXItc3RvcmVkLWNvbmZpZ3VyYXRpb25zJ10gPSB0aGlzLnN0YXRlLnN0b3JlZENvbmZpZ3VyYXRpb25zO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbHRlci1idWlsZGVyJzpcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmZpbHRlckJ1aWxkZXIpIHtcbiAgICAgICAgICByZXN1bHRbJ2ZpbHRlci1idWlsZGVyJ10gPSB0aGlzLmNvbXBvbmVudC5maWx0ZXJCdWlsZGVyLmdldEZpbHRlclZhbHVlcygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXhwYW5kYWJsZS1yb3dzJzpcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmlzQ29sdW1uRXhwYW5kYWJsZSgpKSB7XG4gICAgICAgICAgcmVzdWx0WydleHBhbmRhYmxlLXJvd3MnXSA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc0Rpc3BsYXlTdGF0ZSgpIHtcbiAgICBjb25zdCBvQ29sdW1uc0RhdGEgPSBbXTtcbiAgICB0aGlzLmNvbXBvbmVudC5vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCgob0NvbDogT0NvbHVtbikgPT4ge1xuICAgICAgb0NvbHVtbnNEYXRhLnB1c2goe1xuICAgICAgICBhdHRyOiBvQ29sLmF0dHIsXG4gICAgICAgIHZpc2libGU6IG9Db2wudmlzaWJsZSxcbiAgICAgICAgd2lkdGg6IG9Db2wuZ2V0V2lkdGhUb1N0b3JlKClcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAnb0NvbHVtbnMtZGlzcGxheSc6IG9Db2x1bW5zRGF0YSxcbiAgICAgICdzZWxlY3QtY29sdW1uLXZpc2libGUnOiB0aGlzLmNvbXBvbmVudC5vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb2x1bW5zUXVpY2tGaWx0ZXJTdGF0ZSgpIHtcbiAgICBjb25zdCB0YWJsZU9wdGlvbnMgPSB0aGlzLmNvbXBvbmVudC5vVGFibGVPcHRpb25zO1xuICAgIGNvbnN0IG9Db2x1bW5zRGF0YTogT0NvbHVtblNlYXJjaGFibGVbXSA9IFtdO1xuICAgIHRhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goKG9Db2w6IE9Db2x1bW4pID0+IHtcbiAgICAgIG9Db2x1bW5zRGF0YS5wdXNoKHtcbiAgICAgICAgYXR0cjogb0NvbC5hdHRyLFxuICAgICAgICBzZWFyY2hhYmxlOiBvQ29sLnNlYXJjaGFibGUsXG4gICAgICAgIHNlYXJjaGluZzogb0NvbC5zZWFyY2hpbmdcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAnb0NvbHVtbnMnOiBvQ29sdW1uc0RhdGEsXG4gICAgICAnZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJzogdGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUsXG4gICAgICAnZmlsdGVyJzogdGhpcy5jb21wb25lbnQub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQgPyB0aGlzLmNvbXBvbmVudC5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC52YWx1ZSA6ICcnXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRGaWx0ZXJCdWlsZGVyU3RhdGUoKTogYW55IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBpZiAodGhpcy5jb21wb25lbnQuZmlsdGVyQnVpbGRlcikge1xuICAgICAgbGV0IGZpbHRlckJ1aWxkZXIgPSB0aGlzLmNvbXBvbmVudC5maWx0ZXJCdWlsZGVyLmdldEZpbHRlclZhbHVlcygpO1xuICAgICAgaWYgKCFVdGlsLmlzT2JqZWN0RW1wdHkoZmlsdGVyQnVpbGRlcikpIHtcbiAgICAgICAgcmVzdWx0WydmaWx0ZXItYnVpbGRlci12YWx1ZXMnXSA9IGZpbHRlckJ1aWxkZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBnZXRDb2x1bW5GaWx0ZXJzU3RhdGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgaWYgKHRoaXMuY29tcG9uZW50LmRhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlRmlsdGVycyA9IHRoaXMuY29tcG9uZW50LmRhdGFTb3VyY2UuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCk7XG4gICAgICBpZiAoY29sdW1uVmFsdWVGaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0Wydjb2x1bW4tdmFsdWUtZmlsdGVycyddID0gY29sdW1uVmFsdWVGaWx0ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2VTdGF0ZSgpOiBhbnkge1xuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG5cbiAgICBpZiAodGhpcy5jb21wb25lbnQubWF0cGFnaW5hdG9yKSB7XG4gICAgICByZXN1bHRbJ3F1ZXJ5LXJvd3MnXSA9IHRoaXMuY29tcG9uZW50Lm1hdHBhZ2luYXRvci5wYWdlU2l6ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50LnN0YXRlLnF1ZXJ5Um93cykge1xuICAgICAgcmVzdWx0WydxdWVyeS1yb3dzJ10gPSB0aGlzLmNvbXBvbmVudC5zdGF0ZS5xdWVyeVJvd3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFsncXVlcnktcm93cyddID0gdGhpcy5jb21wb25lbnQub3JpZ2luYWxRdWVyeVJvd3M7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNvbXBvbmVudC5jdXJyZW50UGFnZSA+IDAgJiYgdGhpcy5jb21wb25lbnQuc3RvcmVQYWdpbmF0aW9uU3RhdGUpIHtcbiAgICAgIHJlc3VsdC5jdXJyZW50UGFnZSA9IHRoaXMuY29tcG9uZW50LmN1cnJlbnRQYWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQucGFnZWFibGUgJiYgdGhpcy5jb21wb25lbnQuc3RvcmVQYWdpbmF0aW9uU3RhdGUpIHtcbiAgICAgIHJlc3VsdC50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciA9IHRoaXMuY29tcG9uZW50LnN0YXRlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyO1xuICAgICAgcmVzdWx0LnF1ZXJ5UmVjb3JkT2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgICAgICh0aGlzLmNvbXBvbmVudC5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCAtIHRoaXMuY29tcG9uZW50LmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmxlbmd0aCksXG4gICAgICAgICh0aGlzLmNvbXBvbmVudC5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCAtIHRoaXMuY29tcG9uZW50LnF1ZXJ5Um93cylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2VsZWN0aW9uU3RhdGUoKTogYW55IHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBbXTtcbiAgICBpZiAodGhpcy5jb21wb25lbnQgJiYgdGhpcy5jb21wb25lbnQua2VlcFNlbGVjdGVkSXRlbXMpIHtcbiAgICAgIC8vIHN0b3Jpbmcgc2VsZWN0ZWQgaXRlbXMga2V5cyB2YWx1ZXNcbiAgICAgIGNvbnN0IHRhYmxlS2V5cyA9IHRoaXMuY29tcG9uZW50LmdldEtleXMoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50LmdldFNlbGVjdGVkSXRlbXMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0ge307XG4gICAgICAgIHRhYmxlS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgZGF0YVtrZXldID0gaXRlbVtrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2goZGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJbml0aWFsQ29uZmlndXJhdGlvblN0YXRlKCk6IGFueSB7XG4gICAgY29uc3Qgb0NvbHVtbnNEYXRhOiBPQ29sdW1uRGlzcGxheVtdID0gW107XG4gICAgVXRpbC5wYXJzZUFycmF5KHRoaXMuY29tcG9uZW50LnZpc2libGVDb2x1bW5zLCB0cnVlKS5mb3JFYWNoKChjb2x1bW5BdHRyOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBvQ29sID0gdGhpcy5jb21wb25lbnQuZ2V0T0NvbHVtbihjb2x1bW5BdHRyKTtcbiAgICAgIG9Db2x1bW5zRGF0YS5wdXNoKHtcbiAgICAgICAgYXR0cjogb0NvbC5hdHRyLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICB3aWR0aDogb0NvbC5kZWZpbml0aW9uID8gb0NvbC5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGggOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAnaW5pdGlhbC1jb25maWd1cmF0aW9uJzoge1xuICAgICAgICAnb0NvbHVtbnMtZGlzcGxheSc6IG9Db2x1bW5zRGF0YSxcbiAgICAgICAgJ3NvcnQtY29sdW1ucyc6IHRoaXMuY29tcG9uZW50LnNvcnRDb2x1bW5zLFxuICAgICAgICAnc2VsZWN0LWNvbHVtbi12aXNpYmxlJzogdGhpcy5jb21wb25lbnQub1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSxcbiAgICAgICAgJ2ZpbHRlci1jYXNlLXNlbnNpdGl2ZSc6IHRoaXMuY29tcG9uZW50LmZpbHRlckNhc2VTZW5zaXRpdmUsXG4gICAgICAgICdxdWVyeS1yb3dzJzogdGhpcy5jb21wb25lbnQub3JpZ2luYWxRdWVyeVJvd3MsXG4gICAgICAgICdmaWx0ZXItY29sdW1uLWFjdGl2ZS1ieS1kZWZhdWx0JzogdGhpcy5jb21wb25lbnQuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0LFxuICAgICAgICAnZmlsdGVyLWNvbHVtbnMnOiB0aGlzLmNvbXBvbmVudC5vcmlnaW5hbEZpbHRlckNvbHVtbnMsXG4gICAgICAgICdncm91cGVkLWNvbHVtbnMnOiB0aGlzLmNvbXBvbmVudC5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXlcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNvcnRTdGF0ZSgpIHtcbiAgICBjb25zdCBzb3J0Q29sdW1ucyA9IFtdO1xuICAgIHRoaXMuY29tcG9uZW50LnNvcnQ/LmdldFNvcnRDb2x1bW5zKCkuZm9yRWFjaChzb3J0RGF0YSA9PiB7XG4gICAgICBzb3J0Q29sdW1ucy5wdXNoKHNvcnREYXRhLmlkICsgQ29kZXMuQ09MVU1OU19BTElBU19TRVBBUkFUT1IgKyBzb3J0RGF0YS5kaXJlY3Rpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAnc29ydC1jb2x1bW5zJzogc29ydENvbHVtbnMuam9pbihDb2Rlcy5BUlJBWV9JTlBVVF9TRVBBUkFUT1IpXG4gICAgfTtcbiAgfVxufVxuXG5cbiJdfQ==