@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
189 lines • 26.2 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { ElementRef, NgZone, ChangeDetectorRef, IterableDiffers, ViewContainerRef, Inject, ComponentFactoryResolver, Optional, Input, ViewChild, TemplateRef, Directive } from '@angular/core';
import { IgxGridBaseDirective, IgxGridTransaction } from '../grid-base.directive';
import { GridBaseAPIService } from '../api.service';
import { IgxFilteringService } from '../filtering/grid-filtering.service';
import { DisplayDensityToken } from '../../core/displayDensity';
import { IgxSummaryOperand } from '../summaries/grid-summary';
import { IgxOverlayService, IgxTransactionService, Transaction, TransactionService, State } from '../../services/index';
import { DOCUMENT } from '@angular/common';
import { IgxHierarchicalGridNavigationService } from './hierarchical-grid-navigation.service';
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
import { IgxGridSelectionService, IgxGridCRUDService } from '../selection/selection.service';
import { IgxColumnResizingService } from '../resizing/resizing.service';
import { IgxColumnGroupComponent } from '../columns/column-group.component';
import { IgxColumnComponent } from '../columns/column.component';
export const IgxHierarchicalTransactionServiceFactory = {
provide: IgxGridTransaction,
useFactory: hierarchicalTransactionServiceFactory
};
export function hierarchicalTransactionServiceFactory() {
return new IgxTransactionService();
}
let IgxHierarchicalGridBaseDirective = class IgxHierarchicalGridBaseDirective extends IgxGridBaseDirective {
constructor(selectionService, crudService, colResizingService, gridAPI, transactionFactory, elementRef, zone, document, cdr, resolver, differs, viewRef, navigation, filteringService, overlayService, summaryService, _displayDensityOptions) {
super(selectionService, crudService, colResizingService, gridAPI, transactionFactory, elementRef, zone, document, cdr, resolver, differs, viewRef, navigation, filteringService, overlayService, summaryService, _displayDensityOptions);
this.selectionService = selectionService;
this.colResizingService = colResizingService;
this.transactionFactory = transactionFactory;
this.document = document;
this.overlayService = overlayService;
this.summaryService = summaryService;
this._displayDensityOptions = _displayDensityOptions;
this.showExpandAll = false;
this._expandChildren = false;
this.hgridAPI = gridAPI;
}
/**
* @hidden
*/
get maxLevelHeaderDepth() {
if (this._maxLevelHeaderDepth === null) {
this._maxLevelHeaderDepth = this.columnList.reduce((acc, col) => Math.max(acc, col.level), 0);
}
return this._maxLevelHeaderDepth;
}
/**
* @hidden
*/
get outlet() {
return this.rootGrid ? this.rootGrid.outletDirective : this.outletDirective;
}
/**
* @hidden
*/
createColumnsList(cols) {
const columns = [];
const topLevelCols = this.onlyTopLevel(cols);
topLevelCols.forEach((col) => {
const ref = this._createColumn(col);
ref.changeDetectorRef.detectChanges();
columns.push(ref.instance);
});
const result = flatten(columns);
this.columnList.reset(result);
this.columnList.notifyOnChanges();
this.initPinning();
}
_createColumn(col) {
let ref;
if (col instanceof IgxColumnGroupComponent) {
ref = this._createColGroupComponent(col);
}
else {
ref = this._createColComponent(col);
}
return ref;
}
_createColGroupComponent(col) {
const factoryGroup = this.resolver.resolveComponentFactory(IgxColumnGroupComponent);
const ref = this.viewRef.createComponent(factoryGroup, null, this.viewRef.injector);
ref.changeDetectorRef.detectChanges();
factoryGroup.inputs.forEach((input) => {
const propName = input.propName;
ref.instance[propName] = col[propName];
});
if (col.children.length > 0) {
const newChildren = [];
col.children.forEach(child => {
const newCol = this._createColumn(child).instance;
newCol.parent = ref.instance;
newChildren.push(newCol);
});
ref.instance.children.reset(newChildren);
ref.instance.children.notifyOnChanges();
}
return ref;
}
_createColComponent(col) {
const factoryColumn = this.resolver.resolveComponentFactory(IgxColumnComponent);
const ref = this.viewRef.createComponent(factoryColumn, null, this.viewRef.injector);
factoryColumn.inputs.forEach((input) => {
const propName = input.propName;
if (!(col[propName] instanceof IgxSummaryOperand)) {
ref.instance[propName] = col[propName];
}
else {
ref.instance[propName] = col[propName].constructor;
}
});
return ref;
}
getGridsForIsland(rowIslandID) {
return this.hgridAPI.getChildGridsForRowIsland(rowIslandID);
}
getChildGrid(path) {
if (!path) {
return;
}
return this.hgridAPI.getChildGrid(path);
}
};
IgxHierarchicalGridBaseDirective.ctorParameters = () => [
{ type: IgxGridSelectionService },
{ type: IgxGridCRUDService },
{ type: IgxColumnResizingService },
{ type: GridBaseAPIService },
{ type: undefined, decorators: [{ type: Inject, args: [IgxGridTransaction,] }] },
{ type: ElementRef },
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: ChangeDetectorRef },
{ type: ComponentFactoryResolver },
{ type: IterableDiffers },
{ type: ViewContainerRef },
{ type: IgxHierarchicalGridNavigationService },
{ type: IgxFilteringService },
{ type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] },
{ type: IgxGridSummaryService },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
];
__decorate([
Input(),
__metadata("design:type", Boolean)
], IgxHierarchicalGridBaseDirective.prototype, "expandChildren", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxHierarchicalGridBaseDirective.prototype, "hasChildrenKey", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxHierarchicalGridBaseDirective.prototype, "showExpandAll", void 0);
__decorate([
ViewChild('dragIndicatorIconBase', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxHierarchicalGridBaseDirective.prototype, "dragIndicatorIconBase", void 0);
IgxHierarchicalGridBaseDirective = __decorate([
Directive({
selector: '[igxHierarchicalGridBase]'
}),
__param(4, Inject(IgxGridTransaction)),
__param(7, Inject(DOCUMENT)),
__param(14, Inject(IgxOverlayService)),
__param(16, Optional()), __param(16, Inject(DisplayDensityToken)),
__metadata("design:paramtypes", [IgxGridSelectionService,
IgxGridCRUDService,
IgxColumnResizingService,
GridBaseAPIService, Object, ElementRef,
NgZone, Object, ChangeDetectorRef,
ComponentFactoryResolver,
IterableDiffers,
ViewContainerRef,
IgxHierarchicalGridNavigationService,
IgxFilteringService,
IgxOverlayService,
IgxGridSummaryService, Object])
], IgxHierarchicalGridBaseDirective);
export { IgxHierarchicalGridBaseDirective };
function flatten(arr) {
let result = [];
arr.forEach(el => {
result.push(el);
if (el.children) {
result = result.concat(flatten(el.children.toArray()));
}
});
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQtYmFzZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2hpZXJhcmNoaWNhbC1ncmlkL2hpZXJhcmNoaWNhbC1ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUNWLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTdGLE9BQU8sRUFBRSx3QkFBd0IsRUFB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TUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFFekIsWUFBQSxRQUFRLEVBQUUsQ0FBQSxFQUFFLFlBQUEsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7cUNBaEJmLHVCQUF1QjtRQUNuQyxrQkFBa0I7UUFDSix3QkFBd0I7UUFDMUMsa0JBQWtCLFVBRWYsVUFBVTtRQUNoQixNQUFNLFVBRVAsaUJBQWlCO1FBQ1osd0JBQXdCO1FBQ3pCLGVBQWU7UUFDZixnQkFBZ0I7UUFDYixvQ0FBb0M7UUFDOUIsbUJBQW1CO1FBQ2dCLGlCQUFpQjtRQUMvQyxxQkFBcUI7R0FyRXZDLGdDQUFnQyxDQW9LNUM7U0FwS1ksZ0NBQWdDO0FBc0s3QyxTQUFTLE9BQU8sQ0FBQyxHQUFVO0lBQ3ZCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVoQixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDYixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDMUQ7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEVsZW1lbnRSZWYsXG4gICAgTmdab25lLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEluamVjdCxcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgT3B0aW9uYWwsXG4gICAgSW5wdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIERpcmVjdGl2ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlLCBJZ3hHcmlkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hSb3dJc2xhbmRDb21wb25lbnQgfSBmcm9tICcuL3Jvdy1pc2xhbmQuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuIH0gZnJvbSAnLi4vLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQgeyBJZ3hTdW1tYXJ5T3BlcmFuZCB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnknO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UsIElneFRyYW5zYWN0aW9uU2VydmljZSwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uU2VydmljZSwgU3RhdGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbmRleCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL2hpZXJhcmNoaWNhbC1ncmlkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsIElneEdyaWRDUlVEU2VydmljZSB9IGZyb20gJy4uL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQgfSBmcm9tICcuL2NoaWxkLWdyaWQtcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSBmcm9tICcuLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneENvbHVtbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCBJZ3hIaWVyYXJjaGljYWxUcmFuc2FjdGlvblNlcnZpY2VGYWN0b3J5ID0ge1xuICAgIHByb3ZpZGU6IElneEdyaWRUcmFuc2FjdGlvbixcbiAgICB1c2VGYWN0b3J5OiBoaWVyYXJjaGljYWxUcmFuc2FjdGlvblNlcnZpY2VGYWN0b3J5XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaGllcmFyY2hpY2FsVHJhbnNhY3Rpb25TZXJ2aWNlRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gbmV3IElneFRyYW5zYWN0aW9uU2VydmljZSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYXRoU2VnbWVudCB7XG4gICAgcm93SUQ6IGFueTtcbiAgICByb3dJc2xhbmRLZXk6IHN0cmluZztcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SGllcmFyY2hpY2FsR3JpZEJhc2VdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZSBleHRlbmRzIElneEdyaWRCYXNlRGlyZWN0aXZlIHtcbiAgICBwdWJsaWMgcm9vdEdyaWQ7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBleHBhbmRDaGlsZHJlbjogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhhc0NoaWxkcmVuS2V5OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93RXhwYW5kQWxsID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IG1heExldmVsSGVhZGVyRGVwdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhMZXZlbEhlYWRlckRlcHRoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhMZXZlbEhlYWRlckRlcHRoID0gdGhpcy5jb2x1bW5MaXN0LnJlZHVjZSgoYWNjLCBjb2wpID0+IE1hdGgubWF4KGFjYywgY29sLmxldmVsKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGg7XG4gICAgfVxuXG4gICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IG91dGxldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdEdyaWQgPyB0aGlzLnJvb3RHcmlkLm91dGxldERpcmVjdGl2ZSA6IHRoaXMub3V0bGV0RGlyZWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGdyaWRBUEk6IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJlbnRJc2xhbmQ6IElneFJvd0lzbGFuZENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAqL1xuICAgIHB1YmxpYyBjaGlsZFJvdzogSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50O1xuXG4gICAgcHJvdGVjdGVkIF9leHBhbmRDaGlsZHJlbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RyYWdJbmRpY2F0b3JJY29uQmFzZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvbkJhc2U6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlbGVjdGlvblNlcnZpY2U6IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBjcnVkU2VydmljZTogSWd4R3JpZENSVURTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29sUmVzaXppbmdTZXJ2aWNlOiBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgQEluamVjdChJZ3hHcmlkVHJhbnNhY3Rpb24pIHByb3RlY3RlZCB0cmFuc2FjdGlvbkZhY3Rvcnk6IFRyYW5zYWN0aW9uU2VydmljZTxUcmFuc2FjdGlvbiwgU3RhdGU+LFxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICB6b25lOiBOZ1pvbmUsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHB1YmxpYyBkb2N1bWVudCxcbiAgICAgICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgICAgICB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBuYXZpZ2F0aW9uOiBJZ3hIaWVyYXJjaGljYWxHcmlkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByb3RlY3RlZCBvdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBzdW1tYXJ5U2VydmljZTogSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByb3RlY3RlZCBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgc2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgICAgIGNydWRTZXJ2aWNlLFxuICAgICAgICAgICAgY29sUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICAgICAgZ3JpZEFQSSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uRmFjdG9yeSxcbiAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICB6b25lLFxuICAgICAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgICAgICBjZHIsXG4gICAgICAgICAgICByZXNvbHZlcixcbiAgICAgICAgICAgIGRpZmZlcnMsXG4gICAgICAgICAgICB2aWV3UmVmLFxuICAgICAgICAgICAgbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgICAgICBvdmVybGF5U2VydmljZSxcbiAgICAgICAgICAgIHN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICAgICAgX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuaGdyaWRBUEkgPSA8SWd4SGllcmFyY2hpY2FsR3JpZEFQSVNlcnZpY2U+Z3JpZEFQSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUNvbHVtbnNMaXN0KGNvbHM6IEFycmF5PGFueT4pIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuICAgICAgICBjb25zdCB0b3BMZXZlbENvbHMgPSB0aGlzLm9ubHlUb3BMZXZlbChjb2xzKTtcbiAgICAgICAgdG9wTGV2ZWxDb2xzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gdGhpcy5fY3JlYXRlQ29sdW1uKGNvbCk7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuKGNvbHVtbnMpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVzZXQocmVzdWx0KTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0Lm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgICAgICB0aGlzLmluaXRQaW5uaW5nKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVDb2x1bW4oY29sKSB7XG4gICAgICAgIGxldCByZWY7XG4gICAgICAgIGlmIChjb2wgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCkge1xuICAgICAgICAgICAgcmVmID0gdGhpcy5fY3JlYXRlQ29sR3JvdXBDb21wb25lbnQoY29sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZiA9IHRoaXMuX2NyZWF0ZUNvbENvbXBvbmVudChjb2wpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVDb2xHcm91cENvbXBvbmVudChjb2w6IElneENvbHVtbkdyb3VwQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGZhY3RvcnlHcm91cCA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uR3JvdXBDb21wb25lbnQpO1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLnZpZXdSZWYuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnlHcm91cCwgbnVsbCwgdGhpcy52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgZmFjdG9yeUdyb3VwLmlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBpbnB1dC5wcm9wTmFtZTtcbiAgICAgICAgICAgICg8YW55PnJlZi5pbnN0YW5jZSlbcHJvcE5hbWVdID0gKDxhbnk+Y29sKVtwcm9wTmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29sLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NoaWxkcmVuID0gW107XG4gICAgICAgICAgICBjb2wuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29sID0gdGhpcy5fY3JlYXRlQ29sdW1uKGNoaWxkKS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBuZXdDb2wucGFyZW50ID0gcmVmLmluc3RhbmNlO1xuICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobmV3Q29sKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgKDxJZ3hDb2x1bW5Hcm91cENvbXBvbmVudD5yZWYuaW5zdGFuY2UpLmNoaWxkcmVuLnJlc2V0KG5ld0NoaWxkcmVuKTtcbiAgICAgICAgICAgICg8SWd4Q29sdW1uR3JvdXBDb21wb25lbnQ+cmVmLmluc3RhbmNlKS5jaGlsZHJlbi5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY3JlYXRlQ29sQ29tcG9uZW50KGNvbCkge1xuICAgICAgICBjb25zdCBmYWN0b3J5Q29sdW1uID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Db21wb25lbnQpO1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLnZpZXdSZWYuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnlDb2x1bW4sIG51bGwsIHRoaXMudmlld1JlZi5pbmplY3Rvcik7XG4gICAgICAgIGZhY3RvcnlDb2x1bW4uaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IGlucHV0LnByb3BOYW1lO1xuICAgICAgICAgICAgaWYgKCEoKDxhbnk+Y29sKVtwcm9wTmFtZV0gaW5zdGFuY2VvZiBJZ3hTdW1tYXJ5T3BlcmFuZCkpIHtcbiAgICAgICAgICAgICAgICAoPGFueT5yZWYuaW5zdGFuY2UpW3Byb3BOYW1lXSA9ICg8YW55PmNvbClbcHJvcE5hbWVdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAoPGFueT5yZWYuaW5zdGFuY2UpW3Byb3BOYW1lXSA9IGNvbFtwcm9wTmFtZV0uY29uc3RydWN0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRHcmlkc0ZvcklzbGFuZChyb3dJc2xhbmRJRDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhncmlkQVBJLmdldENoaWxkR3JpZHNGb3JSb3dJc2xhbmQocm93SXNsYW5kSUQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDaGlsZEdyaWQocGF0aDogQXJyYXk8SVBhdGhTZWdtZW50Pikge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oZ3JpZEFQSS5nZXRDaGlsZEdyaWQocGF0aCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuKGFycjogYW55W10pIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG5cbiAgICBhcnIuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVsKTtcbiAgICAgICAgaWYgKGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGZsYXR0ZW4oZWwuY2hpbGRyZW4udG9BcnJheSgpKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIl19