@lucasheight/kendo-grid-state
Version:
A helper library that implements a directive to manage grid state during session or between sessions for Progress Kendo UI for Angular Grid.
194 lines • 25 kB
JavaScript
import { Directive, Input, Output, EventEmitter, HostListener, } from "@angular/core";
import { Subscription } from "rxjs";
import * as i0 from "@angular/core";
import * as i1 from "@progress/kendo-angular-grid";
import * as i2 from "./StorageService";
export class GridStateDirective {
// Input provides external setting of expanded rows
get expandedRows() {
//this._expandedRows = (this.state && this.state.expandedRows) || [];
return this._expandedRows;
}
set expandedRows(val) {
const _combine = [];
//check if there are any persisted
const existing = (this.state && this.state.expandedRows) || [];
//combine initial with stored state
existing.forEach((el, idx) => {
_combine[idx] = el;
});
val.forEach((el, idx) => {
_combine[idx] = el;
});
this.state = Object.assign(this.state || {}, {
expandedRows: _combine,
});
this._expandedRows = _combine;
}
/**Session storage type: defaults to session */
constructor(grid, storageService) {
this.grid = grid;
this.storageService = storageService;
/**tracks subscriptions*/
this.subs = new Subscription();
/**tracks the expanded rows*/
this._expandedRows = [];
this.expandedRowsChange = new EventEmitter();
/**Emitter for when persisted state is ready*/
this.stateReady = new EventEmitter();
/**Emitter for when filter state is hydrated */
this.filterChange = new EventEmitter();
/**Emitter for when sort state is hydrated */
this.sortChange = new EventEmitter();
this.skip = 0;
/**Emitter for when skip state is hydrated */
this.skipChange = new EventEmitter();
/**Emitter for when group state is hydrated */
this.groupChange = new EventEmitter();
this.take = 10;
/**Emitter for when take state is hydrated */
this.takeChange = new EventEmitter();
this.colMapper = (cols) => {
const c = cols.map((m, idx) => ({
origIdx: idx,
orderIndex: m.orderIndex,
leafIndex: m.leafIndex,
hidden: m.hidden,
width: m.width,
title: m.title,
field: m.field,
}));
return c;
};
//bind the isDetailsExpanded callback
this.grid.isDetailExpanded = this.expander.bind(this);
}
expander(args) {
return this._expandedRows[args.index];
}
get key() {
const key = this.gridState;
return key;
}
/**Gets the IGridState object from storage */
get state() {
const raw = this.storageService.getItem(this.key);
const parsed = raw ? JSON.parse(raw) : raw;
return parsed;
}
/**Sets the IGridState object to storage */
set state(val) {
this.storageService.setItem(this.key, JSON.stringify(val));
}
get initState() {
return {
group: this.group,
skip: this.skip,
sort: this.sort,
filter: this.filter,
take: this.take,
};
}
ngOnInit() {
if (this.gridState == undefined || this.gridState == "") {
throw "gridState has not been set, this is required to be unique for each grid as it is used as the storage key";
}
// set expandedRows array to stored state or empty array
this._expandedRows = (this.state && this.state.expandedRows) || [];
this.expandedRowsChange.emit(this._expandedRows);
const merged = Object.assign(this.initState, this.state && this.state.state);
this.state = Object.assign(this.state || {}, {
state: merged,
});
setTimeout(() => {
this.skipChange.emit(merged.skip);
this.sortChange.emit(merged.sort);
this.takeChange.emit(merged.take);
this.groupChange.emit(merged.group);
this.filterChange.emit(merged.filter);
this.stateReady.emit(merged);
});
// handle the dataStateChange event
this.subs.add(this.grid.dataStateChange.subscribe((s) => {
this.state = Object.assign(this.state, { state: s });
}));
// handle the detailExpand Event
this.subs.add(this.grid.detailExpand.subscribe((e) => {
this.expandedRows[e.index] = true;
this.expandedRows = this._expandedRows;
this.expandedRowsChange.emit(this._expandedRows);
}));
// handle the detailCollapse Event
this.subs.add(this.grid.detailCollapse.subscribe((e) => {
this._expandedRows[e.index] = false;
this.expandedRows = this._expandedRows;
this.expandedRowsChange.emit(this._expandedRows);
}));
}
ngAfterContentInit() {
const existing = this.state.columns;
if (existing) {
const cols = this.grid.columns.toArray();
existing.forEach((e, i) => {
cols[i].hidden = e.hidden;
cols[i].orderIndex = e.orderIndex;
cols[i].leafIndex = e.leafIndex;
cols[i].width = e.width;
});
this.grid.columns.reset(cols);
}
}
unload(e) {
//this is only useful if input storage == local
this.saveState();
}
saveState() {
this.state = Object.assign(this.state || { state: this.initState, columns: [] }, {
columns: this.colMapper(this.grid.columns.toArray()),
});
}
ngOnDestroy() {
this.saveState();
this.subs.unsubscribe();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridStateDirective, deps: [{ token: i1.GridComponent }, { token: i2.StorageService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: GridStateDirective, selector: "kendo-grid[gridState]", inputs: { expandedRows: "expandedRows", filter: "filter", gridState: "gridState", sort: "sort", skip: "skip", group: "group", take: "take" }, outputs: { expandedRowsChange: "expandedRowsChange", stateReady: "stateReady", filterChange: "filterChange", sortChange: "sortChange", skipChange: "skipChange", groupChange: "groupChange", takeChange: "takeChange" }, host: { listeners: { "window:beforeunload": "unload($event)" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridStateDirective, decorators: [{
type: Directive,
args: [{
selector: "kendo-grid[gridState]",
}]
}], ctorParameters: () => [{ type: i1.GridComponent }, { type: i2.StorageService }], propDecorators: { expandedRows: [{
type: Input
}], expandedRowsChange: [{
type: Output
}], stateReady: [{
type: Output
}], filter: [{
type: Input
}], filterChange: [{
type: Output
}], gridState: [{
type: Input
}], sort: [{
type: Input
}], sortChange: [{
type: Output
}], skip: [{
type: Input
}], skipChange: [{
type: Output
}], group: [{
type: Input
}], groupChange: [{
type: Output
}], take: [{
type: Input
}], takeChange: [{
type: Output
}], unload: [{
type: HostListener,
args: ["window:beforeunload", ["$event"]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JpZFN0YXRlRGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMva2VuZG8tZ3JpZC1zdGF0ZS9zcmMvbGliL0dyaWRTdGF0ZURpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQWN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBT3BDLE1BQU0sT0FBTyxrQkFBa0I7SUFLN0IsbURBQW1EO0lBQ25ELElBQWEsWUFBWTtRQUN2QixxRUFBcUU7UUFDckUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxHQUFVO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixrQ0FBa0M7UUFDbEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELG1DQUFtQztRQUNuQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzNCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3RCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUU7WUFDM0MsWUFBWSxFQUFFLFFBQVE7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QUFPLEVBQUUsQ0FBQztTQUNyRCxDQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFCLENBQUM7K0dBakxVLGtCQUFrQjttR0FBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7aUJBQ2xDOytHQU9jLFlBQVk7c0JBQXhCLEtBQUs7Z0JBb0JJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFHTixZQUFZO3NCQURYLE1BQU07Z0JBR0UsU0FBUztzQkFBakIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRSxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFrSDBDLE1BQU07c0JBQXRELFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEhvc3RMaXN0ZW5lcixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIEdyaWRDb21wb25lbnQsXG4gIFJvd0FyZ3MsXG4gIERldGFpbEV4cGFuZEV2ZW50LFxuICBEZXRhaWxDb2xsYXBzZUV2ZW50LFxuICBEYXRhU3RhdGVDaGFuZ2VFdmVudCxcbiAgQ29sdW1uQmFzZSxcbn0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcbmltcG9ydCB7XG4gIENvbXBvc2l0ZUZpbHRlckRlc2NyaXB0b3IsXG4gIFNvcnREZXNjcmlwdG9yLFxuICBHcm91cERlc2NyaXB0b3IsXG59IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL0NvbHVtblwiO1xuaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gXCIuL0dyaWRTdGF0ZVwiO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tIFwiLi9TdG9yYWdlU2VydmljZVwiO1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcImtlbmRvLWdyaWRbZ3JpZFN0YXRlXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkU3RhdGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIC8qKnRyYWNrcyBzdWJzY3JpcHRpb25zKi9cbiAgcHJpdmF0ZSBzdWJzOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKnRyYWNrcyB0aGUgZXhwYW5kZWQgcm93cyovXG4gIHByaXZhdGUgX2V4cGFuZGVkUm93czogYW55W10gPSBbXTtcbiAgLy8gSW5wdXQgcHJvdmlkZXMgZXh0ZXJuYWwgc2V0dGluZyBvZiBleHBhbmRlZCByb3dzXG4gIEBJbnB1dCgpIGdldCBleHBhbmRlZFJvd3MoKTogYW55W10ge1xuICAgIC8vdGhpcy5fZXhwYW5kZWRSb3dzID0gKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5leHBhbmRlZFJvd3MpIHx8IFtdO1xuICAgIHJldHVybiB0aGlzLl9leHBhbmRlZFJvd3M7XG4gIH1cbiAgc2V0IGV4cGFuZGVkUm93cyh2YWw6IGFueVtdKSB7XG4gICAgY29uc3QgX2NvbWJpbmUgPSBbXTtcbiAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGVyc2lzdGVkXG4gICAgY29uc3QgZXhpc3RpbmcgPSAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLmV4cGFuZGVkUm93cykgfHwgW107XG4gICAgLy9jb21iaW5lIGluaXRpYWwgd2l0aCBzdG9yZWQgc3RhdGVcbiAgICBleGlzdGluZy5mb3JFYWNoKChlbCwgaWR4KSA9PiB7XG4gICAgICBfY29tYmluZVtpZHhdID0gZWw7XG4gICAgfSk7XG4gICAgdmFsLmZvckVhY2goKGVsLCBpZHgpID0+IHtcbiAgICAgIF9jb21iaW5lW2lkeF0gPSBlbDtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih0aGlzLnN0YXRlIHx8IHt9LCB7XG4gICAgICBleHBhbmRlZFJvd3M6IF9jb21iaW5lLFxuICAgIH0gYXMgSUdyaWRTdGF0ZSk7XG4gICAgdGhpcy5fZXhwYW5kZWRSb3dzID0gX2NvbWJpbmU7XG4gIH1cbiAgQE91dHB1dCgpIGV4cGFuZGVkUm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqRW1pdHRlciBmb3Igd2hlbiBwZXJzaXN0ZWQgc3RhdGUgaXMgcmVhZHkqL1xuICBAT3V0cHV0KCkgc3RhdGVSZWFkeTogRXZlbnRFbWl0dGVyPERhdGFTdGF0ZUNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgZmlsdGVyOiBDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yO1xuICAvKipFbWl0dGVyIGZvciB3aGVuIGZpbHRlciBzdGF0ZSBpcyBoeWRyYXRlZCAqL1xuICBAT3V0cHV0KClcbiAgZmlsdGVyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKmdyaWRTdGF0ZSBrZXk6IHJlcXVpcmVkKi9cbiAgQElucHV0KCkgZ3JpZFN0YXRlOiBzdHJpbmc7IC8va2V5XG4gIEBJbnB1dCgpIHNvcnQ6IEFycmF5PFNvcnREZXNjcmlwdG9yPjtcbiAgLyoqRW1pdHRlciBmb3Igd2hlbiBzb3J0IHN0YXRlIGlzIGh5ZHJhdGVkICovXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8U29ydERlc2NyaXB0b3I+PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKSBza2lwPzogbnVtYmVyID0gMDtcbiAgLyoqRW1pdHRlciBmb3Igd2hlbiBza2lwIHN0YXRlIGlzIGh5ZHJhdGVkICovXG4gIEBPdXRwdXQoKSBza2lwQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgZ3JvdXA/OiBBcnJheTxHcm91cERlc2NyaXB0b3I+O1xuICAvKipFbWl0dGVyIGZvciB3aGVuIGdyb3VwIHN0YXRlIGlzIGh5ZHJhdGVkICovXG4gIEBPdXRwdXQoKSBncm91cENoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PEdyb3VwRGVzY3JpcHRvcj4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHRha2U/OiBudW1iZXIgPSAxMDtcbiAgLyoqRW1pdHRlciBmb3Igd2hlbiB0YWtlIHN0YXRlIGlzIGh5ZHJhdGVkICovXG4gIEBPdXRwdXQoKSB0YWtlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqU2Vzc2lvbiBzdG9yYWdlIHR5cGU6IGRlZmF1bHRzIHRvIHNlc3Npb24gKi9cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdyaWQ6IEdyaWRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICkge1xuICAgIC8vYmluZCB0aGUgaXNEZXRhaWxzRXhwYW5kZWQgY2FsbGJhY2tcbiAgICB0aGlzLmdyaWQuaXNEZXRhaWxFeHBhbmRlZCA9IHRoaXMuZXhwYW5kZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kZXIoYXJnczogUm93QXJncyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9leHBhbmRlZFJvd3NbYXJncy5pbmRleF07XG4gIH1cbiAgcHJpdmF0ZSBnZXQga2V5KCkge1xuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5ncmlkU3RhdGU7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIC8qKkdldHMgdGhlIElHcmlkU3RhdGUgb2JqZWN0IGZyb20gc3RvcmFnZSAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IElHcmlkU3RhdGUge1xuICAgIGNvbnN0IHJhdzogc3RyaW5nID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRJdGVtKHRoaXMua2V5KTtcbiAgICBjb25zdCBwYXJzZWQgPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiByYXc7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuICAvKipTZXRzIHRoZSBJR3JpZFN0YXRlIG9iamVjdCB0byBzdG9yYWdlICovXG4gIHB1YmxpYyBzZXQgc3RhdGUodmFsOiBJR3JpZFN0YXRlKSB7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRJdGVtKHRoaXMua2V5LCBKU09OLnN0cmluZ2lmeSh2YWwpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGluaXRTdGF0ZSgpOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwOiB0aGlzLmdyb3VwLFxuICAgICAgc2tpcDogdGhpcy5za2lwLFxuICAgICAgc29ydDogdGhpcy5zb3J0LFxuICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlcixcbiAgICAgIHRha2U6IHRoaXMudGFrZSxcbiAgICB9O1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRTdGF0ZSA9PSB1bmRlZmluZWQgfHwgdGhpcy5ncmlkU3RhdGUgPT0gXCJcIikge1xuICAgICAgdGhyb3cgXCJncmlkU3RhdGUgaGFzIG5vdCBiZWVuIHNldCwgdGhpcyBpcyByZXF1aXJlZCB0byBiZSB1bmlxdWUgZm9yIGVhY2ggZ3JpZCBhcyBpdCBpcyB1c2VkIGFzIHRoZSBzdG9yYWdlIGtleVwiO1xuICAgIH1cblxuICAgIC8vIHNldCBleHBhbmRlZFJvd3MgYXJyYXkgdG8gc3RvcmVkIHN0YXRlIG9yIGVtcHR5IGFycmF5XG4gICAgdGhpcy5fZXhwYW5kZWRSb3dzID0gKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5leHBhbmRlZFJvd3MpIHx8IFtdO1xuICAgIHRoaXMuZXhwYW5kZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5kZWRSb3dzKTtcbiAgICBjb25zdCBtZXJnZWQ6IERhdGFTdGF0ZUNoYW5nZUV2ZW50ID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHRoaXMuaW5pdFN0YXRlLFxuICAgICAgdGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLnN0YXRlLFxuICAgICk7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24odGhpcy5zdGF0ZSB8fCB7fSwge1xuICAgICAgc3RhdGU6IG1lcmdlZCxcbiAgICB9IGFzIElHcmlkU3RhdGUpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5za2lwQ2hhbmdlLmVtaXQobWVyZ2VkLnNraXApO1xuICAgICAgdGhpcy5zb3J0Q2hhbmdlLmVtaXQobWVyZ2VkLnNvcnQpO1xuICAgICAgdGhpcy50YWtlQ2hhbmdlLmVtaXQobWVyZ2VkLnRha2UpO1xuICAgICAgdGhpcy5ncm91cENoYW5nZS5lbWl0KG1lcmdlZC5ncm91cCk7XG4gICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KG1lcmdlZC5maWx0ZXIpO1xuICAgICAgdGhpcy5zdGF0ZVJlYWR5LmVtaXQobWVyZ2VkKTtcbiAgICB9KTtcbiAgICAvLyBoYW5kbGUgdGhlIGRhdGFTdGF0ZUNoYW5nZSBldmVudFxuICAgIHRoaXMuc3Vicy5hZGQoXG4gICAgICB0aGlzLmdyaWQuZGF0YVN0YXRlQ2hhbmdlLnN1YnNjcmliZSgocykgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih0aGlzLnN0YXRlLCB7IHN0YXRlOiBzIH0gYXMgSUdyaWRTdGF0ZSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gaGFuZGxlIHRoZSBkZXRhaWxFeHBhbmQgRXZlbnRcbiAgICB0aGlzLnN1YnMuYWRkKFxuICAgICAgdGhpcy5ncmlkLmRldGFpbEV4cGFuZC5zdWJzY3JpYmUoKGU6IERldGFpbEV4cGFuZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzW2UuaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHBhbmRlZFJvd3MgPSB0aGlzLl9leHBhbmRlZFJvd3M7XG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5kZWRSb3dzKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gaGFuZGxlIHRoZSBkZXRhaWxDb2xsYXBzZSBFdmVudFxuICAgIHRoaXMuc3Vicy5hZGQoXG4gICAgICB0aGlzLmdyaWQuZGV0YWlsQ29sbGFwc2Uuc3Vic2NyaWJlKChlOiBEZXRhaWxDb2xsYXBzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkUm93c1tlLmluZGV4XSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV4cGFuZGVkUm93cyA9IHRoaXMuX2V4cGFuZGVkUm93cztcbiAgICAgICAgdGhpcy5leHBhbmRlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLl9leHBhbmRlZFJvd3MpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sTWFwcGVyID0gKGNvbHM6IENvbHVtbkJhc2VbXSk6IENvbHVtbltdID0+IHtcbiAgICBjb25zdCBjID0gY29scy5tYXAoXG4gICAgICAobSwgaWR4KSA9PlxuICAgICAgICAoe1xuICAgICAgICAgIG9yaWdJZHg6IGlkeCxcbiAgICAgICAgICBvcmRlckluZGV4OiBtLm9yZGVySW5kZXgsXG4gICAgICAgICAgbGVhZkluZGV4OiBtLmxlYWZJbmRleCxcbiAgICAgICAgICBoaWRkZW46IG0uaGlkZGVuLFxuICAgICAgICAgIHdpZHRoOiBtLndpZHRoLFxuICAgICAgICAgIHRpdGxlOiBtLnRpdGxlLFxuICAgICAgICAgIGZpZWxkOiAobSBhcyBhbnkpLmZpZWxkLFxuICAgICAgICB9KSBhcyBDb2x1bW4sXG4gICAgKTtcbiAgICByZXR1cm4gYztcbiAgfTtcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5zdGF0ZS5jb2x1bW5zO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY29uc3QgY29scyA9IHRoaXMuZ3JpZC5jb2x1bW5zLnRvQXJyYXkoKTtcbiAgICAgIGV4aXN0aW5nLmZvckVhY2goKGUsIGkpID0+IHtcbiAgICAgICAgY29sc1tpXS5oaWRkZW4gPSBlLmhpZGRlbjtcbiAgICAgICAgY29sc1tpXS5vcmRlckluZGV4ID0gZS5vcmRlckluZGV4O1xuICAgICAgICBjb2xzW2ldLmxlYWZJbmRleCA9IGUubGVhZkluZGV4O1xuICAgICAgICBjb2xzW2ldLndpZHRoID0gZS53aWR0aDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ncmlkLmNvbHVtbnMucmVzZXQoY29scyk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6YmVmb3JldW5sb2FkXCIsIFtcIiRldmVudFwiXSkgdW5sb2FkKGUpOiB2b2lkIHtcbiAgICAvL3RoaXMgaXMgb25seSB1c2VmdWwgaWYgaW5wdXQgc3RvcmFnZSA9PSBsb2NhbFxuICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSBzYXZlU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB0aGlzLnN0YXRlIHx8IHsgc3RhdGU6IHRoaXMuaW5pdFN0YXRlLCBjb2x1bW5zOiBbXSB9LFxuICAgICAge1xuICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbE1hcHBlcih0aGlzLmdyaWQuY29sdW1ucy50b0FycmF5KCkpLFxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==