@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
145 lines • 19.4 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { IgxGridCellComponent } from '../cell.component';
import { GridBaseAPIService } from '../api.service';
import { ChangeDetectorRef, ElementRef, ChangeDetectionStrategy, Component, OnInit, HostListener, NgZone } from '@angular/core';
import { IgxGridSelectionService, IgxGridCRUDService } from '../selection/selection.service';
import { HammerGesturesManager } from '../../core/touch';
import { PlatformUtil } from '../../core/utils';
let IgxHierarchicalGridCellComponent = class IgxHierarchicalGridCellComponent extends IgxGridCellComponent {
constructor(selectionService, crudService, gridAPI, cdr, helement, zone, touchManager, platformUtil) {
super(selectionService, crudService, gridAPI, cdr, helement, zone, touchManager, platformUtil);
this.selectionService = selectionService;
this.crudService = crudService;
this.gridAPI = gridAPI;
this.cdr = cdr;
this.helement = helement;
this.zone = zone;
this.platformUtil = platformUtil;
}
ngOnInit() {
super.ngOnInit();
this._rootGrid = this._getRootGrid();
}
_getRootGrid() {
let currGrid = this.grid;
while (currGrid.parent) {
currGrid = currGrid.parent;
}
return currGrid;
}
// TODO: Extend the new selection service to avoid complete traversal
_clearAllHighlights() {
[this._rootGrid, ...this._rootGrid.getChildGrids(true)].forEach(grid => {
grid.selectionService.clear();
grid.selectionService.activeElement = null;
grid.nativeElement.classList.remove('igx-grid__tr--highlighted');
grid.highlightedRowID = null;
grid.cdr.markForCheck();
});
}
/**
* @hidden
* @internal
*/
onFocus(event) {
if (this.focused) {
return;
}
this._clearAllHighlights();
const currentElement = this.grid.nativeElement;
let parentGrid = this.grid;
let childGrid;
// add highligh to the current grid
if (this._rootGrid.id !== currentElement.id) {
currentElement.classList.add('igx-grid__tr--highlighted');
}
// add highligh to the current grid
while (this._rootGrid.id !== parentGrid.id) {
childGrid = parentGrid;
parentGrid = parentGrid.parent;
const parentRowID = parentGrid.hgridAPI.getParentRowId(childGrid);
parentGrid.highlightedRowID = parentRowID;
}
super.onFocus(event);
}
// TODO: Refactor
/**
* @hidden
* @internal
*/
dispatchEvent(event) {
const key = event.key.toLowerCase();
if (event.altKey && !this.row.added) {
const grid = this.gridAPI.grid;
const state = this.gridAPI.grid.hierarchicalState;
const collapse = this.row.expanded && (key === 'left' || key === 'arrowleft' || key === 'up' || key === 'arrowup');
const expand = !this.row.expanded && (key === 'right' || key === 'arrowright' || key === 'down' || key === 'arrowdown');
if (collapse) {
grid.hierarchicalState = state.filter(v => {
return v.rowID !== this.row.rowID;
});
}
else if (expand) {
state.push({ rowID: this.row.rowID });
grid.hierarchicalState = [...state];
}
if (expand || collapse) {
const rowID = this.cellID.rowID;
grid.cdr.detectChanges();
this.persistFocusedCell(rowID);
}
return;
}
super.dispatchEvent(event);
}
persistFocusedCell(rowID) {
requestAnimationFrame(() => {
// TODO: Test it out
const cell = this.gridAPI.get_cell_by_key(rowID, this.column.field);
if (cell) {
cell.nativeElement.focus();
}
});
}
};
IgxHierarchicalGridCellComponent.ctorParameters = () => [
{ type: IgxGridSelectionService },
{ type: IgxGridCRUDService },
{ type: GridBaseAPIService },
{ type: ChangeDetectorRef },
{ type: ElementRef },
{ type: NgZone },
{ type: HammerGesturesManager },
{ type: PlatformUtil }
];
__decorate([
HostListener('focus', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxHierarchicalGridCellComponent.prototype, "onFocus", null);
__decorate([
HostListener('keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxHierarchicalGridCellComponent.prototype, "dispatchEvent", null);
IgxHierarchicalGridCellComponent = __decorate([
Component({
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-hierarchical-grid-cell',
template: "<ng-template #defaultCell>\n <div igxTextHighlight style=\"pointer-events: none\" [cssClass]=\"highlightClass\" [activeCssClass]=\"activeHighlightClass\" [groupName]=\"gridID\"\n [value]=\"formatter ? formatter(value) : column.dataType === 'number' ? (value | igxdecimal: grid.locale) : column.dataType === 'date' ? (value | igxdate: grid.locale) : value\"\n [row]=\"rowData\" [column]=\"this.column.field\" [containerClass]=\"'igx-grid__td-text'\"\n class=\"igx-grid__td-text\">{{ formatter ? formatter(value) : column.dataType === 'number' ? (value | igxdecimal:\n grid.locale) : column.dataType === 'date' ? (value | igxdate: grid.locale) : value }}</div>\n</ng-template>\n<ng-template #inlineEditor let-cell=\"cell\">\n <ng-container *ngIf=\"column.dataType === 'string'\">\n <igx-input-group displayDensity=\"compact\">\n <input igxInput [value]=\"editValue\" (input)=\"editValue = $event.target.value\" [igxFocus]=\"focused\" />\n </igx-input-group>\n </ng-container>\n <ng-container *ngIf=\"column.dataType === 'number'\">\n <igx-input-group displayDensity=\"compact\">\n <input igxInput [value]=\"editValue\" (input)=\"editValue = $event.target.value\" [igxFocus]=\"focused\" type=\"number\">\n </igx-input-group>\n </ng-container>\n <ng-container *ngIf=\"column.dataType === 'boolean'\">\n <igx-checkbox (change)=\"editValue = $event.checked\" [value]=\"editValue\" [checked]=\"editValue\"\n [igxFocus]=\"focused\" [disableRipple]=\"true\"></igx-checkbox>\n </ng-container>\n <ng-container *ngIf=\"column.dataType === 'date'\">\n <igx-date-picker [style.width.%]=\"100\" [outlet]=\"grid.outletDirective\" mode=\"dropdown\"\n [locale]=\"grid.locale\" [(value)]=\"editValue\" [igxFocus]=\"focused\" [labelVisibility]=\"false\">\n </igx-date-picker>\n </ng-container>\n</ng-template>\n<ng-container *ngTemplateOutlet=\"template; context: context\">\n</ng-container>\n",
providers: [HammerGesturesManager]
}),
__metadata("design:paramtypes", [IgxGridSelectionService,
IgxGridCRUDService,
GridBaseAPIService,
ChangeDetectorRef,
ElementRef,
NgZone,
HammerGesturesManager,
PlatformUtil])
], IgxHierarchicalGridCellComponent);
export { IgxHierarchicalGridCellComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWNlbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtY2VsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUNyRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFTaEQsSUFBYSxnQ0FBZ0MsR0FBN0MsTUFBYSxnQ0FBaUMsU0FBUSxvQkFBb0I7SUFLdEUsWUFDYyxnQkFBeUMsRUFDekMsV0FBK0IsRUFDbEMsT0FBeUQsRUFDekQsR0FBc0IsRUFDckIsUUFBb0IsRUFDbEIsSUFBWSxFQUN0QixZQUFtQyxFQUN6QixZQUEwQjtRQUVoQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFUekYscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUN6QyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDbEMsWUFBTyxHQUFQLE9BQU8sQ0FBa0Q7UUFDekQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDckIs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QUksSUFBSSxFQUFFO2dCQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDOUI7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSixDQUFBOztZQXpHbUMsdUJBQXVCO1lBQzVCLGtCQUFrQjtZQUN6QixrQkFBa0I7WUFDdEIsaUJBQWlCO1lBQ1gsVUFBVTtZQUNaLE1BQU07WUFDUixxQkFBcUI7WUFDWCxZQUFZOztBQWtDeEM7SUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7K0RBdUJqQztBQVFEO0lBREMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztxQ0FDZixhQUFhOztxRUF1QmpDO0FBcEdRLGdDQUFnQztJQVA1QyxTQUFTLENBQUM7UUFDUCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtRQUMvQyxtQkFBbUIsRUFBRSxLQUFLO1FBQzFCLFFBQVEsRUFBRSw0QkFBNEI7UUFDdEMsaS9EQUF1QztRQUN2QyxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztLQUNyQyxDQUFDO3FDQU9rQyx1QkFBdUI7UUFDNUIsa0JBQWtCO1FBQ3pCLGtCQUFrQjtRQUN0QixpQkFBaUI7UUFDWCxVQUFVO1FBQ1osTUFBTTtRQUNSLHFCQUFxQjtRQUNYLFlBQVk7R0FiL0IsZ0NBQWdDLENBK0c1QztTQS9HWSxnQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJZ3hHcmlkQ2VsbENvbXBvbmVudCB9IGZyb20gJy4uL2NlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICAgICBPbkluaXQsIEhvc3RMaXN0ZW5lciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsIElneEdyaWRDUlVEU2VydmljZSB9IGZyb20gJy4uL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBIYW1tZXJHZXN0dXJlc01hbmFnZXIgfSBmcm9tICcuLi8uLi9jb3JlL3RvdWNoJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogJ2lneC1oaWVyYXJjaGljYWwtZ3JpZC1jZWxsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vLi4vY2VsbC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbSGFtbWVyR2VzdHVyZXNNYW5hZ2VyXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hIaWVyYXJjaGljYWxHcmlkQ2VsbENvbXBvbmVudCBleHRlbmRzIElneEdyaWRDZWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIC8vIHByb3RlY3RlZCBoU2VsZWN0aW9uO1xuICAgIHByb3RlY3RlZCBfcm9vdEdyaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHNlbGVjdGlvblNlcnZpY2U6IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY3J1ZFNlcnZpY2U6IElneEdyaWRDUlVEU2VydmljZSxcbiAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50PixcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgaGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHRvdWNoTWFuYWdlcjogSGFtbWVyR2VzdHVyZXNNYW5hZ2VyLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsOiBQbGF0Zm9ybVV0aWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzdXBlcihzZWxlY3Rpb25TZXJ2aWNlLCBjcnVkU2VydmljZSwgZ3JpZEFQSSwgY2RyLCBoZWxlbWVudCwgem9uZSwgdG91Y2hNYW5hZ2VyLCBwbGF0Zm9ybVV0aWwpO1xuICAgICAgICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuX3Jvb3RHcmlkID0gdGhpcy5fZ2V0Um9vdEdyaWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRSb290R3JpZCgpIHtcbiAgICAgICAgbGV0IGN1cnJHcmlkID0gdGhpcy5ncmlkO1xuICAgICAgICB3aGlsZSAoY3VyckdyaWQucGFyZW50KSB7XG4gICAgICAgICAgICBjdXJyR3JpZCA9IGN1cnJHcmlkLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyckdyaWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRXh0ZW5kIHRoZSBuZXcgc2VsZWN0aW9uIHNlcnZpY2UgdG8gYXZvaWQgY29tcGxldGUgdHJhdmVyc2FsXG4gICAgX2NsZWFyQWxsSGlnaGxpZ2h0cygpIHtcbiAgICAgICAgW3RoaXMuX3Jvb3RHcmlkLCAuLi50aGlzLl9yb290R3JpZC5nZXRDaGlsZEdyaWRzKHRydWUpXS5mb3JFYWNoKGdyaWQgPT4ge1xuICAgICAgICAgICAgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgICAgICAgICBncmlkLnNlbGVjdGlvblNlcnZpY2UuYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICBncmlkLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaWd4LWdyaWRfX3RyLS1oaWdobGlnaHRlZCcpO1xuICAgICAgICAgICAgZ3JpZC5oaWdobGlnaHRlZFJvd0lEID0gbnVsbDtcbiAgICAgICAgICAgIGdyaWQuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICAgIG9uRm9jdXMoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IHRoaXMuZ3JpZC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50R3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgbGV0IGNoaWxkR3JpZDtcbiAgICAgICAgLy8gYWRkIGhpZ2hsaWdoIHRvIHRoZSBjdXJyZW50IGdyaWRcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3RHcmlkLmlkICE9PSBjdXJyZW50RWxlbWVudC5pZCkge1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaWd4LWdyaWRfX3RyLS1oaWdobGlnaHRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGhpZ2hsaWdoIHRvIHRoZSBjdXJyZW50IGdyaWRcbiAgICAgICAgd2hpbGUgKHRoaXMuX3Jvb3RHcmlkLmlkICE9PSBwYXJlbnRHcmlkLmlkKSB7XG4gICAgICAgICAgICBjaGlsZEdyaWQgPSBwYXJlbnRHcmlkO1xuICAgICAgICAgICAgcGFyZW50R3JpZCA9IHBhcmVudEdyaWQucGFyZW50O1xuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRSb3dJRCA9IHBhcmVudEdyaWQuaGdyaWRBUEkuZ2V0UGFyZW50Um93SWQoY2hpbGRHcmlkKTtcbiAgICAgICAgICAgIHBhcmVudEdyaWQuaGlnaGxpZ2h0ZWRSb3dJRCA9IHBhcmVudFJvd0lEO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm9uRm9jdXMoZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFJlZmFjdG9yXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXRoaXMucm93LmFkZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkQVBJLmdyaWQ7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ3JpZEFQSS5ncmlkLmhpZXJhcmNoaWNhbFN0YXRlO1xuICAgICAgICAgICAgY29uc3QgY29sbGFwc2UgPSB0aGlzLnJvdy5leHBhbmRlZCAmJiAoa2V5ID09PSAnbGVmdCcgfHwga2V5ID09PSAnYXJyb3dsZWZ0JyB8fCBrZXkgPT09ICd1cCcgfHwga2V5ID09PSAnYXJyb3d1cCcpO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kID0gIXRoaXMucm93LmV4cGFuZGVkICYmIChrZXkgPT09ICdyaWdodCcgfHwga2V5ID09PSAnYXJyb3dyaWdodCcgfHwga2V5ID09PSAnZG93bicgfHwga2V5ID09PSAnYXJyb3dkb3duJyk7XG4gICAgICAgICAgICBpZiAoY29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICBncmlkLmhpZXJhcmNoaWNhbFN0YXRlID0gc3RhdGUuZmlsdGVyKHYgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5yb3dJRCAhPT0gdGhpcy5yb3cucm93SUQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnB1c2goeyByb3dJRDogdGhpcy5yb3cucm93SUQgfSk7XG4gICAgICAgICAgICAgICAgZ3JpZC5oaWVyYXJjaGljYWxTdGF0ZSA9IFsuLi5zdGF0ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwYW5kIHx8IGNvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SUQgPSB0aGlzLmNlbGxJRC5yb3dJRDtcbiAgICAgICAgICAgICAgICBncmlkLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJzaXN0Rm9jdXNlZENlbGwocm93SUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwZXJzaXN0Rm9jdXNlZENlbGwocm93SUQpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRlc3QgaXQgb3V0XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5ncmlkQVBJLmdldF9jZWxsX2J5X2tleShyb3dJRCwgdGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgICAgICBjZWxsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19