@nova-ui/bits
Version:
SolarWinds Nova Framework
136 lines • 20.5 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { DataSource } from "@angular/cdk/collections";
import { Injectable } from "@angular/core";
import _cloneDeep from "lodash/cloneDeep";
import _forEach from "lodash/forEach";
import isEqual from "lodash/isEqual";
import isNil from "lodash/isNil";
import { BehaviorSubject, Subject } from "rxjs";
import * as i0 from "@angular/core";
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export class DataSourceService extends DataSource {
constructor() {
super(); // in future dataSource in cdk may have some constructor.
this.dataSubject = new BehaviorSubject([]); // in general we do not have data at this point - that's why empty array
this.outputsSubject = new Subject(); // some empty state
this.dataFieldsConfig = {
dataFields$: new BehaviorSubject([]),
};
}
set componentTree(components) {
this._components = components;
}
registerComponent(components) {
this._components = {
...this._components,
...components,
};
}
deregisterComponent(componentKey) {
delete this._components?.[componentKey];
}
connect(collectionViewer) {
return this.dataSubject.asObservable();
}
disconnect(collectionViewer) {
this.dataSubject.complete();
}
async applyFilters() {
// store a copy of the filters to avoid altering the stored values by reference
const filters = _cloneDeep(this.getFilters());
this.beforeApplyFilters(filters);
await this.afterApplyFilters(filters);
}
getFilter(componentName) {
const filter = this._components[componentName];
if (!filter) {
throw new Error(`Invalid filter name '${componentName}' requested; available filter names are: ${Object.keys(this._components)}`);
}
return filter?.componentInstance?.getFilters();
}
getFilters() {
const filters = {};
// Merge current filters
_forEach(this._components, (node, componentName) => {
filters[componentName] =
this.getFilter(componentName);
});
return filters;
}
get monitoredFilters() {
const filters = [];
_forEach(this._components, (node, componentName) => {
if (node.componentInstance?.detectFilterChanges === true) {
filters.push(componentName);
}
});
return filters;
}
// check if a specific filter changed
filterChanged(filterName, currentFilterValue) {
// retrieve provided value if provided, otherwise get a fresh one
const filterValue = (currentFilterValue ?? this.getFilter(filterName))
?.value;
return (!isNil(filterValue) &&
this._previousFilters &&
!isEqual(filterValue, this._previousFilters[filterName]?.value));
}
// checks if any of the filters specified by name have changed from the previous evaluation
filtersChanged(filters, ...filterNames) {
for (let i = 0; i < filterNames.length; i++) {
const filterName = filterNames[i];
if (this.filterChanged(filterName, filters[filterName])) {
return true;
}
}
return false;
}
computeFiltersChange(filters) {
return this.filtersChanged(filters, ...this.monitoredFilters);
}
beforeApplyFilters(filters) { }
async afterApplyFilters(filters) {
this.outputsSubject.next(await this.getFilteredData(filters));
this._previousFilters = this.getFilters();
}
shouldResetFilters(filters) {
const filtersChanged = this.computeFiltersChange(filters);
if (filtersChanged) {
this.resetFilters(filters);
}
return filtersChanged;
}
resetFilters(filters) {
_forEach(filters, (node, key) => {
const filter = this._components[key].componentInstance;
if (filter?.resetFilter) {
filter.resetFilter();
node.value = filter.getFilters().value;
}
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceService, decorators: [{
type: Injectable
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kYXRhLXNvdXJjZS9kYXRhLXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQW9CLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQWE1RCw2REFBNkQ7QUFDN0QsTUFBTSxPQUFnQixpQkFJcEIsU0FBUSxVQUFhO0lBU25CO1FBQ0ksS0FBSyxFQUFFLENBQUMsQ0FBQyx5REFBeUQ7UUFDbEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLHdFQUF3RTtRQUN6SCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUMsQ0FBQyxtQkFBbUI7UUFDN0QsSUFBSSxDQUFDLGdCQUFnQixHQUFH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Q0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztZQUN2RCxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQzFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQXZLaUIsaUJBQWlCO21IQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRnRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXdlciwgRGF0YVNvdXJjZSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IF9jbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcbmltcG9ydCBfZm9yRWFjaCBmcm9tIFwibG9kYXNoL2ZvckVhY2hcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJsb2Rhc2gvaXNFcXVhbFwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7XG4gICAgSURhdGFGaWVsZCxcbiAgICBJRGF0YUZpZWxkc0NvbmZpZyxcbiAgICBJRmlsdGVyLFxuICAgIElGaWx0ZXJpbmdPdXRwdXRzLFxuICAgIElGaWx0ZXJpbmdQYXJ0aWNpcGFudCxcbiAgICBJRmlsdGVyaW5nUGFydGljaXBhbnRzLFxuICAgIElGaWx0ZXJzLFxufSBmcm9tIFwiLi9wdWJsaWMtYXBpXCI7XG5cbkBJbmplY3RhYmxlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhU291cmNlU2VydmljZTxcbiAgICBULFxuICAgIEYgZXh0ZW5kcyBJRmlsdGVycyA9IElGaWx0ZXJzLFxuICAgIEQgPSBhbnlcbj4gZXh0ZW5kcyBEYXRhU291cmNlPFQ+IHtcbiAgICBwdWJsaWMgZGF0YVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxUW10+O1xuICAgIHB1YmxpYyBvdXRwdXRzU3ViamVjdDogU3ViamVjdDxJRmlsdGVyaW5nT3V0cHV0cz47XG4gICAgcHVibGljIGRhdGFGaWVsZHNDb25maWc6IElEYXRhRmllbGRzQ29uZmlnO1xuXG4gICAgcHJvdGVjdGVkIF9wcmV2aW91c0ZpbHRlcnM6IEY7XG5cbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudHM6IElGaWx0ZXJpbmdQYXJ0aWNpcGFudHM7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTsgLy8gaW4gZnV0dXJlIGRhdGFTb3VyY2UgaW4gY2RrIG1heSBoYXZlIHNvbWUgY29uc3RydWN0b3IuXG4gICAgICAgIHRoaXMuZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pOyAvLyBpbiBnZW5lcmFsIHdlIGRvIG5vdCBoYXZlIGRhdGEgYXQgdGhpcyBwb2ludCAtIHRoYXQncyB3aHkgZW1wdHkgYXJyYXlcbiAgICAgICAgdGhpcy5vdXRwdXRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTsgLy8gc29tZSBlbXB0eSBzdGF0ZVxuICAgICAgICB0aGlzLmRhdGFGaWVsZHNDb25maWcgPSB7XG4gICAgICAgICAgICBkYXRhRmllbGRzJDogbmV3IEJlaGF2aW9yU3ViamVjdDxJRGF0YUZpZWxkW10+KFtdKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvbXBvbmVudFRyZWUoY29tcG9uZW50czogSUZpbHRlcmluZ1BhcnRpY2lwYW50cykge1xuICAgICAgICB0aGlzLl9jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50czogSUZpbHRlcmluZ1BhcnRpY2lwYW50cyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb21wb25lbnRzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fY29tcG9uZW50cyxcbiAgICAgICAgICAgIC4uLmNvbXBvbmVudHMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGRlcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBvbmVudHM/Lltjb21wb25lbnRLZXldO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRGaWx0ZXJlZERhdGEoZmlsdGVyczogRik6IFByb21pc2U8SUZpbHRlcmluZ091dHB1dHM+O1xuXG4gICAgcHVibGljIGNvbm5lY3QoXG4gICAgICAgIGNvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXJcbiAgICApOiBPYnNlcnZhYmxlPFRbXSB8IFJlYWRvbmx5QXJyYXk8VD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBmaWx0ZXJzIHRvIGF2b2lkIGFsdGVyaW5nIHRoZSBzdG9yZWQgdmFsdWVzIGJ5IHJlZmVyZW5jZVxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gX2Nsb25lRGVlcCh0aGlzLmdldEZpbHRlcnMoKSk7XG5cbiAgICAgICAgdGhpcy5iZWZvcmVBcHBseUZpbHRlcnMoZmlsdGVycyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJBcHBseUZpbHRlcnMoZmlsdGVycyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbHRlcihcbiAgICAgICAgY29tcG9uZW50TmFtZToga2V5b2YgSUZpbHRlcmluZ1BhcnRpY2lwYW50c1xuICAgICk6IEYgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9jb21wb25lbnRzW2NvbXBvbmVudE5hbWVdO1xuICAgICAgICBpZiAoIWZpbHRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIGZpbHRlciBuYW1lICcke2NvbXBvbmVudE5hbWV9JyByZXF1ZXN0ZWQ7IGF2YWlsYWJsZSBmaWx0ZXIgbmFtZXMgYXJlOiAke09iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzXG4gICAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcj8uY29tcG9uZW50SW5zdGFuY2U/LmdldEZpbHRlcnMoKSBhcyBGO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXJzKCk6IEYge1xuICAgICAgICBjb25zdCBmaWx0ZXJzOiBGID0ge30gYXMgRjtcblxuICAgICAgICAvLyBNZXJnZSBjdXJyZW50IGZpbHRlcnNcbiAgICAgICAgX2ZvckVhY2goXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzLFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIG5vZGU6IElGaWx0ZXJpbmdQYXJ0aWNpcGFudCxcbiAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lOiBrZXlvZiBJRmlsdGVyaW5nUGFydGljaXBhbnRzXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAoZmlsdGVycyBhcyBJRmlsdGVycylbY29tcG9uZW50TmFtZV0gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZpbHRlcihjb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vbml0b3JlZEZpbHRlcnMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIF9mb3JFYWNoKFxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50cyxcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBub2RlOiBJRmlsdGVyaW5nUGFydGljaXBhbnQsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZToga2V5b2YgSUZpbHRlcmluZ1BhcnRpY2lwYW50c1xuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29tcG9uZW50SW5zdGFuY2U/LmRldGVjdEZpbHRlckNoYW5nZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKGNvbXBvbmVudE5hbWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcnM7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgYSBzcGVjaWZpYyBmaWx0ZXIgY2hhbmdlZFxuICAgIHB1YmxpYyBmaWx0ZXJDaGFuZ2VkKFxuICAgICAgICBmaWx0ZXJOYW1lOiBrZXlvZiBJRmlsdGVyaW5nUGFydGljaXBhbnRzLFxuICAgICAgICBjdXJyZW50RmlsdGVyVmFsdWU/OiBJRmlsdGVyPGFueT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgLy8gcmV0cmlldmUgcHJvdmlkZWQgdmFsdWUgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBnZXQgYSBmcmVzaCBvbmVcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSAoY3VycmVudEZpbHRlclZhbHVlID8/IHRoaXMuZ2V0RmlsdGVyKGZpbHRlck5hbWUpKVxuICAgICAgICAgICAgPy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICFpc05pbChmaWx0ZXJWYWx1ZSkgJiZcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzRmlsdGVycyAmJlxuICAgICAgICAgICAgIWlzRXF1YWwoZmlsdGVyVmFsdWUsIHRoaXMuX3ByZXZpb3VzRmlsdGVyc1tmaWx0ZXJOYW1lXT8udmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2tzIGlmIGFueSBvZiB0aGUgZmlsdGVycyBzcGVjaWZpZWQgYnkgbmFtZSBoYXZlIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgZXZhbHVhdGlvblxuICAgIHB1YmxpYyBmaWx0ZXJzQ2hhbmdlZChcbiAgICAgICAgZmlsdGVyczogRixcbiAgICAgICAgLi4uZmlsdGVyTmFtZXM6IChrZXlvZiBJRmlsdGVyaW5nUGFydGljaXBhbnRzKVtdXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlck5hbWUgPSBmaWx0ZXJOYW1lc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlckNoYW5nZWQoZmlsdGVyTmFtZSwgZmlsdGVyc1tmaWx0ZXJOYW1lXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcHV0ZUZpbHRlcnNDaGFuZ2UoZmlsdGVyczogRik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzQ2hhbmdlZChmaWx0ZXJzLCAuLi50aGlzLm1vbml0b3JlZEZpbHRlcnMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBiZWZvcmVBcHBseUZpbHRlcnMoZmlsdGVyczogRik6IHZvaWQge31cblxuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlckFwcGx5RmlsdGVycyhmaWx0ZXJzOiBGKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub3V0cHV0c1N1YmplY3QubmV4dChhd2FpdCB0aGlzLmdldEZpbHRlcmVkRGF0YShmaWx0ZXJzKSk7XG5cbiAgICAgICAgdGhpcy5fcHJldmlvdXNGaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNob3VsZFJlc2V0RmlsdGVycyhmaWx0ZXJzOiBGKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNDaGFuZ2VkID0gdGhpcy5jb21wdXRlRmlsdGVyc0NoYW5nZShmaWx0ZXJzKTtcbiAgICAgICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJzQ2hhbmdlZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzZXRGaWx0ZXJzKGZpbHRlcnM6IEYpOiB2b2lkIHtcbiAgICAgICAgX2ZvckVhY2goZmlsdGVycywgKG5vZGUsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5fY29tcG9uZW50c1trZXldLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKGZpbHRlcj8ucmVzZXRGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIucmVzZXRGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gZmlsdGVyLmdldEZpbHRlcnMoKS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19