UNPKG

@transunion-ui/tablejs

Version:
215 lines 38 kB
import { Directive, Input } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./../../services/grid/grid.service"; export class HideColumnIfDirective { constructor(elementRef, gridService) { this.elementRef = elementRef; this.gridService = gridService; this._hideColumn = false; this.HIDDEN_COLUMN_CLASS = 'column-is-hidden'; this.showOffspringLimited = false; this.changeTriggeredBy = null; this.canHide = true; this.elementRef.nativeElement.hideColumnIf = this; } set tablejsHideColumnIf(hide) { const wasLimited = this.showOffspringLimited; const wasTriggeredBy = this.changeTriggeredBy; this.showOffspringLimited = false; this.changeTriggeredBy = null; const el = this.gridService.getParentTablejsGridDirective(this.elementRef.nativeElement); if (el !== null) { this.gridDirective = el['gridDirective']; const columnVisibilityChanged = this._hideColumn !== hide; if (!columnVisibilityChanged) { this.gridDirective.hiddenColumnChanges.next(null); return; } this._hideColumn = hide; const flattenedColumnHierarchy = this.gridDirective.getFlattenedHierarchy(); const currentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === this.gridDirective.getRelatedHeader(this.elementRef.nativeElement); })[0]; if (!wasTriggeredBy) { this.changeTriggeredBy = currentColumnHierarchy; } if (hide) { const lowestLevelColHierarchiesVisible = this.getLowestLevelColumnHierarchiesVisible(flattenedColumnHierarchy); const allLowestLevelColumnsHidden = lowestLevelColHierarchiesVisible.length === 0; if (allLowestLevelColumnsHidden || this.allColumnsShareTheSameAncestor(currentColumnHierarchy, lowestLevelColHierarchiesVisible, flattenedColumnHierarchy)) { this._hideColumn = false; this.gridDirective.hiddenColumnChanges.next(null); return; } this.gridDirective.getRelatedHeaders(this.elementRef.nativeElement).forEach((element) => { element.classList.add(this.HIDDEN_COLUMN_CLASS); }); this.hideAllOffspring(currentColumnHierarchy); if (this.allSiblingsAreHidden(currentColumnHierarchy, flattenedColumnHierarchy)) { this.setAllAncestors(currentColumnHierarchy, flattenedColumnHierarchy, true); } } else { this.gridDirective.getRelatedHeaders(this.elementRef.nativeElement).forEach((element) => { element.classList.remove(this.HIDDEN_COLUMN_CLASS); }); this.setAllAncestors(currentColumnHierarchy, flattenedColumnHierarchy, false); if (!wasLimited) { this.showAllOffspring(currentColumnHierarchy); } } const triggerHierarchy = !wasTriggeredBy ? currentColumnHierarchy : null; this.changeTriggeredBy = null; this.gridDirective.hiddenColumnChanges.next({ hierarchyColumn: currentColumnHierarchy, wasTriggeredByThisColumn: triggerHierarchy !== null, hidden: this._hideColumn === true }); } } get tablejsHideColumnIf() { return this._hideColumn; } getVisibleSiblingsByColumn(hierarchyList, level) { const visibleSiblings = hierarchyList.filter((hierarchy) => { return hierarchy.level === level && hierarchy.element.hideColumnIf.tablejsHideColumnIf === false; }); return visibleSiblings; } updateHeadersThatCanHide() { const flattenedColumnHierarchy = this.gridDirective.getFlattenedHierarchy(); for (let i = 0; i < flattenedColumnHierarchy.length; i++) { const columnHierarchy = flattenedColumnHierarchy[i]; const element = columnHierarchy.element; const hideColumnIf = element.hideColumnIf; hideColumnIf.canHide = true; } let visibleSiblings = this.getVisibleSiblingsByColumn(flattenedColumnHierarchy, 0); if (visibleSiblings.length === 1) { let solitarySibling = visibleSiblings[0]; solitarySibling.element.hideColumnIf.canHide = false; let subColumns = solitarySibling.subColumns; let count = 0; while (solitarySibling && subColumns.length !== 0) { visibleSiblings = this.getVisibleSiblingsByColumn(subColumns, ++count); solitarySibling = visibleSiblings.length === 1 ? visibleSiblings[0] : null; if (solitarySibling) { solitarySibling.element.hideColumnIf.canHide = false; subColumns = solitarySibling.subColumns; } } } } getLowestLevelColumnHierarchiesVisible(flattenedColumnHierarchy) { const lowestLevelColHierarchiesVisible = []; const sortedByLevelColumnHierarchy = flattenedColumnHierarchy.concat().sort((colHier1, colHier2) => { return colHier2.level - colHier1.level; }); const baseLevel = sortedByLevelColumnHierarchy[0].level; for (let i = 0; i < sortedByLevelColumnHierarchy.length; i++) { const hierarchy = sortedByLevelColumnHierarchy[i]; if (hierarchy.level !== baseLevel) { break; } if (!hierarchy.element.hideColumnIf.tablejsHideColumnIf) { lowestLevelColHierarchiesVisible.push(hierarchy); } } return lowestLevelColHierarchiesVisible; } allColumnsShareTheSameAncestor(commonAncestor, columnHierarchies, flattenedColumnHierarchy) { const hierarchiesWithCommonAncestor = []; for (let i = 0; i < columnHierarchies.length; i++) { const currentColumnHierarchy = columnHierarchies[i]; let parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === currentColumnHierarchy.parentColumn; })[0]; while (parentColumnHierarchy) { if (parentColumnHierarchy === commonAncestor) { hierarchiesWithCommonAncestor.push(currentColumnHierarchy); break; } const columnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === parentColumnHierarchy.element; })[0]; parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === columnHierarchy.parentColumn; })[0]; } } return columnHierarchies.length === hierarchiesWithCommonAncestor.length; } hideAllOffspring(columnHierarchy) { for (let i = 0; i < columnHierarchy.subColumns.length; i++) { const child = this.gridDirective.getRelatedHeader(columnHierarchy.subColumns[i].element); child.hideColumnIf.changeTriggeredBy = columnHierarchy; child.hideColumnIf.tablejsHideColumnIf = true; } } showAllOffspring(columnHierarchy) { for (let i = 0; i < columnHierarchy.subColumns.length; i++) { const child = this.gridDirective.getRelatedHeader(columnHierarchy.subColumns[i].element); child.hideColumnIf.changeTriggeredBy = columnHierarchy; child.hideColumnIf.tablejsHideColumnIf = false; child.hideColumnIf.canHide = true; } } allSiblingsAreHidden(columnHierarchy, flattenedColumnHierarchy) { let parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === columnHierarchy.parentColumn; })[0]; let hiddenSiblingCount = 0; let totalSiblings; if (parentColumnHierarchy) { totalSiblings = parentColumnHierarchy.subColumns.length; parentColumnHierarchy.subColumns.forEach((subColumn) => { if (this.gridDirective.getRelatedHeader(subColumn.element).hideColumnIf.tablejsHideColumnIf) { hiddenSiblingCount++; } }); } else { const topLevelSiblings = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.level === 0; }); totalSiblings = topLevelSiblings.length; for (let i = 0; i < topLevelSiblings.length; i++) { const topLevelSibling = topLevelSiblings[i]; if (this.gridDirective.getRelatedHeader(topLevelSibling.element).hideColumnIf.tablejsHideColumnIf) { hiddenSiblingCount++; } } } return hiddenSiblingCount === totalSiblings; } setAllAncestors(currentColumnHierarchy, flattenedColumnHierarchy, hidden) { let parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === currentColumnHierarchy.parentColumn; })[0]; const allSiblingsHidden = this.allSiblingsAreHidden(currentColumnHierarchy, flattenedColumnHierarchy); let parentSiblingsAreAllHidden = hidden ? allSiblingsHidden : true; while (parentColumnHierarchy && parentSiblingsAreAllHidden) { const parentElement = parentColumnHierarchy.element; parentElement.hideColumnIf.changeTriggeredBy = currentColumnHierarchy; parentElement.hideColumnIf.showOffspringLimited = true; parentElement.hideColumnIf.tablejsHideColumnIf = hidden; parentElement.hideColumnIf.canHide = true; const columnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === parentColumnHierarchy.element; })[0]; parentColumnHierarchy = flattenedColumnHierarchy.filter((hierarchy) => { return hierarchy.element === columnHierarchy.parentColumn; })[0]; } } ngOnDestroy() { this.elementRef.nativeElement.hideColumnIf = null; } } HideColumnIfDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HideColumnIfDirective, deps: [{ token: i0.ElementRef }, { token: i1.GridService }], target: i0.ɵɵFactoryTarget.Directive }); HideColumnIfDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.3", type: HideColumnIfDirective, selector: "[tablejsHideColumnIf], [tablejshidecolumnif], [tablejs-hide-column-if]", inputs: { tablejsHideColumnIf: "tablejsHideColumnIf" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HideColumnIfDirective, decorators: [{ type: Directive, args: [{ selector: '[tablejsHideColumnIf], [tablejshidecolumnif], [tablejs-hide-column-if]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.GridService }]; }, propDecorators: { tablejsHideColumnIf: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlkZS1jb2x1bW4taWYuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFibGVqcy9zcmMvbGliL2RpcmVjdGl2ZXMvaGlkZS1jb2x1bW4taWYvaGlkZS1jb2x1bW4taWYuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDOzs7QUFReEUsTUFBTSxPQUFPLHFCQUFxQjtJQTBPaEMsWUFBbUIsVUFBc0IsRUFBUyxXQUF3QjtRQUF2RCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUF4T2xFLGdCQUFXLEdBQStCLEtBQUssQ0FBQztRQUVqRCx3QkFBbUIsR0FBVyxrQkFBa0IsQ0FBQztRQUNqRCx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDdEMsc0JBQWlCLEdBQTRCLElBQUksQ0FBQztRQUNsRCxZQUFPLEdBQVksSUFBSSxDQUFDO1FBb085QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFuT0QsSUFBb0IsbUJBQW1CLENBQUMsSUFBZ0M7UUFFdEUsTUFBTSxVQUFVLEdBQVksSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3RELE1BQU0sY0FBYyxHQUE0QixJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFFdkUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBRTlCLE1BQU0sRUFBRSxHQUE2QixJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkgsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEs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Q0FBQyxDQUFDLFNBQTJCLEVBQUUsRUFBRTtnQkFDdEYsT0FBTyxTQUFTLENBQUMsT0FBTyxLQUFLLGVBQWUsQ0FBQyxZQUFZLENBQUM7WUFDNUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtJQUNILENBQUM7SUFNRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUNwRCxDQUFDOztrSEFoUFUscUJBQXFCO3NHQUFyQixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0VBQXdFO2lCQUNuRjsySEFVcUIsbUJBQW1CO3NCQUF0QyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQ29sdW1uSGllcmFyY2h5IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ludGVyZmFjZXMvaS1jb2x1bW4taGllcmFyY2h5JztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9ncmlkL2dyaWQuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi9ncmlkL2dyaWQuZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RhYmxlanNIaWRlQ29sdW1uSWZdLCBbdGFibGVqc2hpZGVjb2x1bW5pZl0sIFt0YWJsZWpzLWhpZGUtY29sdW1uLWlmXSdcbn0pXG5leHBvcnQgY2xhc3MgSGlkZUNvbHVtbklmRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9oaWRlQ29sdW1uOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCA9IGZhbHNlO1xuICBwcml2YXRlIGdyaWREaXJlY3RpdmU6IEdyaWREaXJlY3RpdmUgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBISURERU5fQ09MVU1OX0NMQVNTOiBzdHJpbmcgPSAnY29sdW1uLWlzLWhpZGRlbic7XG4gIHB1YmxpYyBzaG93T2Zmc3ByaW5nTGltaXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2hhbmdlVHJpZ2dlcmVkQnk6IElDb2x1bW5IaWVyYXJjaHkgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGNhbkhpZGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGFibGVqc0hpZGVDb2x1bW5JZihoaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIFxuICAgIGNvbnN0IHdhc0xpbWl0ZWQ6IGJvb2xlYW4gPSB0aGlzLnNob3dPZmZzcHJpbmdMaW1pdGVkO1xuICAgIGNvbnN0IHdhc1RyaWdnZXJlZEJ5OiBJQ29sdW1uSGllcmFyY2h5IHwgbnVsbCA9IHRoaXMuY2hhbmdlVHJpZ2dlcmVkQnk7XG5cbiAgICB0aGlzLnNob3dPZmZzcHJpbmdMaW1pdGVkID0gZmFsc2U7XG4gICAgdGhpcy5jaGFuZ2VUcmlnZ2VyZWRCeSA9IG51bGw7XG4gICAgXG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50IHwgYW55IHwgbnVsbCA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0UGFyZW50VGFibGVqc0dyaWREaXJlY3RpdmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGlmIChlbCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5ncmlkRGlyZWN0aXZlID0gZWxbJ2dyaWREaXJlY3RpdmUnXTtcblxuICAgICAgY29uc3QgY29sdW1uVmlzaWJpbGl0eUNoYW5nZWQ6IGJvb2xlYW4gPSB0aGlzLl9oaWRlQ29sdW1uICE9PSBoaWRlO1xuICAgICAgaWYgKCFjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCkge1xuICAgICAgICB0aGlzLmdyaWREaXJlY3RpdmUhLmhpZGRlbkNvbHVtbkNoYW5nZXMubmV4dChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9oaWRlQ29sdW1uID0gaGlkZTtcblxuICAgICAgY29uc3QgZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5ID0gdGhpcy5ncmlkRGlyZWN0aXZlIS5nZXRGbGF0dGVuZWRIaWVyYXJjaHkoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkgPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgICAgcmV0dXJuIGhpZXJhcmNoeS5lbGVtZW50ID09PSB0aGlzLmdyaWREaXJlY3RpdmUhLmdldFJlbGF0ZWRIZWFkZXIodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfSlbMF07XG5cbiAgICAgIGlmICghd2FzVHJpZ2dlcmVkQnkpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VUcmlnZ2VyZWRCeSA9IGN1cnJlbnRDb2x1bW5IaWVyYXJjaHk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoaWRlKSB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBsb3dlc3RMZXZlbENvbEhpZXJhcmNoaWVzVmlzaWJsZTogSUNvbHVtbkhpZXJhcmNoeVtdID0gdGhpcy5nZXRMb3dlc3RMZXZlbENvbHVtbkhpZXJhcmNoaWVzVmlzaWJsZShmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkpO1xuXG4gICAgICAgIGNvbnN0IGFsbExvd2VzdExldmVsQ29sdW1uc0hpZGRlbjogYm9vbGVhbiA9IGxvd2VzdExldmVsQ29sSGllcmFyY2hpZXNWaXNpYmxlLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKGFsbExvd2VzdExldmVsQ29sdW1uc0hpZGRlbiB8fCB0aGlzLmFsbENvbHVtbnNTaGFyZVRoZVNhbWVBbmNlc3RvcihjdXJyZW50Q29sdW1uSGllcmFyY2h5LCBsb3dlc3RMZXZlbENvbEhpZXJhcmNoaWVzVmlzaWJsZSwgZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5KSkge1xuICAgICAgICAgIHRoaXMuX2hpZGVDb2x1bW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmdyaWREaXJlY3RpdmUhLmhpZGRlbkNvbHVtbkNoYW5nZXMubmV4dChudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZ3JpZERpcmVjdGl2ZSEuZ2V0UmVsYXRlZEhlYWRlcnModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuSElEREVOX0NPTFVNTl9DTEFTUyk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5oaWRlQWxsT2Zmc3ByaW5nKGN1cnJlbnRDb2x1bW5IaWVyYXJjaHkpO1xuICAgICAgICBpZiAodGhpcy5hbGxTaWJsaW5nc0FyZUhpZGRlbihjdXJyZW50Q29sdW1uSGllcmFyY2h5LCBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgdGhpcy5zZXRBbGxBbmNlc3RvcnMoY3VycmVudENvbHVtbkhpZXJhcmNoeSwgZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ncmlkRGlyZWN0aXZlIS5nZXRSZWxhdGVkSGVhZGVycyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5ISURERU5fQ09MVU1OX0NMQVNTKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXRBbGxBbmNlc3RvcnMoY3VycmVudENvbHVtbkhpZXJhcmNoeSwgZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5LCBmYWxzZSk7XG4gICAgICAgIGlmICghd2FzTGltaXRlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd0FsbE9mZnNwcmluZyhjdXJyZW50Q29sdW1uSGllcmFyY2h5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgIFxuICAgICAgY29uc3QgdHJpZ2dlckhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSB8IG51bGwgPSAhd2FzVHJpZ2dlcmVkQnkgPyBjdXJyZW50Q29sdW1uSGllcmFyY2h5IDogbnVsbDtcbiAgICAgIHRoaXMuY2hhbmdlVHJpZ2dlcmVkQnkgPSBudWxsO1xuICAgICAgdGhpcy5ncmlkRGlyZWN0aXZlIS5oaWRkZW5Db2x1bW5DaGFuZ2VzLm5leHQoeyBoaWVyYXJjaHlDb2x1bW46IGN1cnJlbnRDb2x1bW5IaWVyYXJjaHksIHdhc1RyaWdnZXJlZEJ5VGhpc0NvbHVtbjogdHJpZ2dlckhpZXJhcmNoeSAhPT0gbnVsbCwgaGlkZGVuOiB0aGlzLl9oaWRlQ29sdW1uID09PSB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHRhYmxlanNIaWRlQ29sdW1uSWYoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9oaWRlQ29sdW1uO1xuICB9XG5cbiAgZ2V0VmlzaWJsZVNpYmxpbmdzQnlDb2x1bW4oaGllcmFyY2h5TGlzdDogSUNvbHVtbkhpZXJhcmNoeVtdLCBsZXZlbDogbnVtYmVyKTogSUNvbHVtbkhpZXJhcmNoeVtdIHtcbiAgICBjb25zdCB2aXNpYmxlU2libGluZ3M6IElDb2x1bW5IaWVyYXJjaHlbXSA9IGhpZXJhcmNoeUxpc3QuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgIHJldHVybiBoaWVyYXJjaHkubGV2ZWwgPT09IGxldmVsICYmIChoaWVyYXJjaHkuZWxlbWVudCBhcyBhbnkpLmhpZGVDb2x1bW5JZi50YWJsZWpzSGlkZUNvbHVtbklmID09PSBmYWxzZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmlzaWJsZVNpYmxpbmdzO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUhlYWRlcnNUaGF0Q2FuSGlkZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHlbXSA9IHRoaXMuZ3JpZERpcmVjdGl2ZSEuZ2V0RmxhdHRlbmVkSGllcmFyY2h5KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbHVtbkhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSA9IGZsYXR0ZW5lZENvbHVtbkhpZXJhcmNoeVtpXTtcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IGNvbHVtbkhpZXJhcmNoeS5lbGVtZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGhpZGVDb2x1bW5JZjogSGlkZUNvbHVtbklmRGlyZWN0aXZlID0gZWxlbWVudC5oaWRlQ29sdW1uSWY7XG4gICAgICBoaWRlQ29sdW1uSWYuY2FuSGlkZSA9IHRydWU7XG4gICAgfVxuICAgIGxldCB2aXNpYmxlU2libGluZ3M6IElDb2x1bW5IaWVyYXJjaHlbXSA9IHRoaXMuZ2V0VmlzaWJsZVNpYmxpbmdzQnlDb2x1bW4oZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5LCAwKTtcblxuICAgIGlmICh2aXNpYmxlU2libGluZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBsZXQgc29saXRhcnlTaWJsaW5nOiBJQ29sdW1uSGllcmFyY2h5IHwgbnVsbCA9IHZpc2libGVTaWJsaW5nc1swXTtcbiAgICAgIChzb2xpdGFyeVNpYmxpbmcuZWxlbWVudCBhcyBhbnkpLmhpZGVDb2x1bW5JZi5jYW5IaWRlID0gZmFsc2U7XG4gICAgICBsZXQgc3ViQ29sdW1uczogSUNvbHVtbkhpZXJhcmNoeVtdID0gIHNvbGl0YXJ5U2libGluZy5zdWJDb2x1bW5zO1xuICAgICAgbGV0IGNvdW50OiBudW1iZXIgPSAwO1xuICAgICAgd2hpbGUgKHNvbGl0YXJ5U2libGluZyAmJiBzdWJDb2x1bW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHZpc2libGVTaWJsaW5ncyA9IHRoaXMuZ2V0VmlzaWJsZVNpYmxpbmdzQnlDb2x1bW4oc3ViQ29sdW1ucywgKytjb3VudCk7XG4gICAgICAgICAgc29saXRhcnlTaWJsaW5nID0gdmlzaWJsZVNpYmxpbmdzLmxlbmd0aCA9PT0gMSA/IHZpc2libGVTaWJsaW5nc1swXSA6IG51bGw7XG4gICAgICAgICAgaWYgKHNvbGl0YXJ5U2libGluZykge1xuICAgICAgICAgICAgKHNvbGl0YXJ5U2libGluZy5lbGVtZW50IGFzIGFueSkuaGlkZUNvbHVtbklmLmNhbkhpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1YkNvbHVtbnMgPSBzb2xpdGFyeVNpYmxpbmcuc3ViQ29sdW1ucztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldExvd2VzdExldmVsQ29sdW1uSGllcmFyY2hpZXNWaXNpYmxlKGZsYXR0ZW5lZENvbHVtbkhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeVtdKTogSUNvbHVtbkhpZXJhcmNoeVtdIHtcblxuICAgIGNvbnN0IGxvd2VzdExldmVsQ29sSGllcmFyY2hpZXNWaXNpYmxlOiBJQ29sdW1uSGllcmFyY2h5W10gPSBbXTtcbiAgICBjb25zdCBzb3J0ZWRCeUxldmVsQ29sdW1uSGllcmFyY2h5OiBJQ29sdW1uSGllcmFyY2h5W10gPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuY29uY2F0KCkuc29ydCgoY29sSGllcjE6IElDb2x1bW5IaWVyYXJjaHksIGNvbEhpZXIyOiBJQ29sdW1uSGllcmFyY2h5KSA9PiB7XG4gICAgICByZXR1cm4gY29sSGllcjIubGV2ZWwgLSBjb2xIaWVyMS5sZXZlbDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGJhc2VMZXZlbDogbnVtYmVyID0gc29ydGVkQnlMZXZlbENvbHVtbkhpZXJhcmNoeVswXS5sZXZlbDtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEJ5TGV2ZWxDb2x1bW5IaWVyYXJjaHkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSA9IHNvcnRlZEJ5TGV2ZWxDb2x1bW5IaWVyYXJjaHlbaV07XG4gICAgICBpZiAoaGllcmFyY2h5LmxldmVsICE9PSBiYXNlTGV2ZWwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIShoaWVyYXJjaHkuZWxlbWVudCBhcyBhbnkpLmhpZGVDb2x1bW5JZi50YWJsZWpzSGlkZUNvbHVtbklmKSB7XG4gICAgICAgIGxvd2VzdExldmVsQ29sSGllcmFyY2hpZXNWaXNpYmxlLnB1c2goaGllcmFyY2h5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbG93ZXN0TGV2ZWxDb2xIaWVyYXJjaGllc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgYWxsQ29sdW1uc1NoYXJlVGhlU2FtZUFuY2VzdG9yKGNvbW1vbkFuY2VzdG9yOiBJQ29sdW1uSGllcmFyY2h5LCBjb2x1bW5IaWVyYXJjaGllczogSUNvbHVtbkhpZXJhcmNoeVtdLCBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHlbXSk6IGJvb2xlYW4ge1xuXG4gICAgY29uc3QgaGllcmFyY2hpZXNXaXRoQ29tbW9uQW5jZXN0b3I6IElDb2x1bW5IaWVyYXJjaHlbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uSGllcmFyY2hpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkgPSBjb2x1bW5IaWVyYXJjaGllc1tpXTtcbiAgICAgIGxldCBwYXJlbnRDb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkgfCBudWxsID0gZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5LmZpbHRlcigoaGllcmFyY2h5OiBJQ29sdW1uSGllcmFyY2h5KSA9PiB7XG4gICAgICAgIHJldHVybiBoaWVyYXJjaHkuZWxlbWVudCA9PT0gY3VycmVudENvbHVtbkhpZXJhcmNoeS5wYXJlbnRDb2x1bW47XG4gICAgICB9KVswXTtcblxuICAgICAgd2hpbGUgKHBhcmVudENvbHVtbkhpZXJhcmNoeSkge1xuICAgICAgICBpZiAocGFyZW50Q29sdW1uSGllcmFyY2h5ID09PSBjb21tb25BbmNlc3Rvcikge1xuICAgICAgICAgIGhpZXJhcmNoaWVzV2l0aENvbW1vbkFuY2VzdG9yLnB1c2goY3VycmVudENvbHVtbkhpZXJhcmNoeSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkgPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gaGllcmFyY2h5LmVsZW1lbnQgPT09IHBhcmVudENvbHVtbkhpZXJhcmNoeSEuZWxlbWVudDtcbiAgICAgICAgfSlbMF07XG4gICAgICAgIFxuICAgICAgICBwYXJlbnRDb2x1bW5IaWVyYXJjaHkgPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gaGllcmFyY2h5LmVsZW1lbnQgPT09IGNvbHVtbkhpZXJhcmNoeS5wYXJlbnRDb2x1bW47XG4gICAgICAgIH0pWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sdW1uSGllcmFyY2hpZXMubGVuZ3RoID09PSBoaWVyYXJjaGllc1dpdGhDb21tb25BbmNlc3Rvci5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaGlkZUFsbE9mZnNwcmluZyhjb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbkhpZXJhcmNoeS5zdWJDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZDogYW55ID0gdGhpcy5ncmlkRGlyZWN0aXZlIS5nZXRSZWxhdGVkSGVhZGVyKGNvbHVtbkhpZXJhcmNoeS5zdWJDb2x1bW5zW2ldLmVsZW1lbnQpO1xuICAgICAgY2hpbGQuaGlkZUNvbHVtbklmLmNoYW5nZVRyaWdnZXJlZEJ5ID0gY29sdW1uSGllcmFyY2h5O1xuICAgICAgY2hpbGQuaGlkZUNvbHVtbklmLnRhYmxlanNIaWRlQ29sdW1uSWYgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93QWxsT2Zmc3ByaW5nKGNvbHVtbkhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uSGllcmFyY2h5LnN1YkNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkOiBhbnkgPSB0aGlzLmdyaWREaXJlY3RpdmUhLmdldFJlbGF0ZWRIZWFkZXIoY29sdW1uSGllcmFyY2h5LnN1YkNvbHVtbnNbaV0uZWxlbWVudCk7XG4gICAgICBjaGlsZC5oaWRlQ29sdW1uSWYuY2hhbmdlVHJpZ2dlcmVkQnkgPSBjb2x1bW5IaWVyYXJjaHk7XG4gICAgICBjaGlsZC5oaWRlQ29sdW1uSWYudGFibGVqc0hpZGVDb2x1bW5JZiA9IGZhbHNlO1xuICAgICAgY2hpbGQuaGlkZUNvbHVtbklmLmNhbkhpZGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhbGxTaWJsaW5nc0FyZUhpZGRlbihjb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHksIGZsYXR0ZW5lZENvbHVtbkhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeVtdKTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmVudENvbHVtbkhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSB8IG51bGwgPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgIHJldHVybiBoaWVyYXJjaHkuZWxlbWVudCA9PT0gY29sdW1uSGllcmFyY2h5LnBhcmVudENvbHVtbjtcbiAgICB9KVswXTtcblxuICAgIGxldCBoaWRkZW5TaWJsaW5nQ291bnQ6IG51bWJlciA9IDA7XG4gICAgbGV0IHRvdGFsU2libGluZ3M6IG51bWJlcjtcblxuICAgIGlmIChwYXJlbnRDb2x1bW5IaWVyYXJjaHkpIHtcbiAgICAgIHRvdGFsU2libGluZ3MgPSBwYXJlbnRDb2x1bW5IaWVyYXJjaHkuc3ViQ29sdW1ucy5sZW5ndGg7XG4gICAgICBwYXJlbnRDb2x1bW5IaWVyYXJjaHkuc3ViQ29sdW1ucy5mb3JFYWNoKChzdWJDb2x1bW46IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZERpcmVjdGl2ZSEuZ2V0UmVsYXRlZEhlYWRlcihzdWJDb2x1bW4uZWxlbWVudCkuaGlkZUNvbHVtbklmLnRhYmxlanNIaWRlQ29sdW1uSWYpIHtcbiAgICAgICAgICBoaWRkZW5TaWJsaW5nQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcExldmVsU2libGluZ3M6IElDb2x1bW5IaWVyYXJjaHlbXSA9IGZsYXR0ZW5lZENvbHVtbkhpZXJhcmNoeS5maWx0ZXIoKGhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSkgPT4ge1xuICAgICAgICByZXR1cm4gaGllcmFyY2h5LmxldmVsID09PSAwO1xuICAgICAgfSk7XG4gICAgICB0b3RhbFNpYmxpbmdzID0gdG9wTGV2ZWxTaWJsaW5ncy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvcExldmVsU2libGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdG9wTGV2ZWxTaWJsaW5nOiBJQ29sdW1uSGllcmFyY2h5ID0gdG9wTGV2ZWxTaWJsaW5nc1tpXTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZERpcmVjdGl2ZSEuZ2V0UmVsYXRlZEhlYWRlcih0b3BMZXZlbFNpYmxpbmcuZWxlbWVudCkuaGlkZUNvbHVtbklmLnRhYmxlanNIaWRlQ29sdW1uSWYpIHtcbiAgICAgICAgICBoaWRkZW5TaWJsaW5nQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGlkZGVuU2libGluZ0NvdW50ID09PSB0b3RhbFNpYmxpbmdzO1xuICB9XG5cbiAgcHVibGljIHNldEFsbEFuY2VzdG9ycyhjdXJyZW50Q29sdW1uSGllcmFyY2h5OiBJQ29sdW1uSGllcmFyY2h5LCBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHlbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHBhcmVudENvbHVtbkhpZXJhcmNoeTogSUNvbHVtbkhpZXJhcmNoeSB8IG51bGwgPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgIHJldHVybiBoaWVyYXJjaHkuZWxlbWVudCA9PT0gY3VycmVudENvbHVtbkhpZXJhcmNoeS5wYXJlbnRDb2x1bW47XG4gICAgfSlbMF07XG5cbiAgICBjb25zdCBhbGxTaWJsaW5nc0hpZGRlbjogYm9vbGVhbiA9IHRoaXMuYWxsU2libGluZ3NBcmVIaWRkZW4oY3VycmVudENvbHVtbkhpZXJhcmNoeSwgZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5KTtcbiAgICBsZXQgcGFyZW50U2libGluZ3NBcmVBbGxIaWRkZW46IGJvb2xlYW4gPSBoaWRkZW4gPyBhbGxTaWJsaW5nc0hpZGRlbiA6IHRydWU7XG5cbiAgICB3aGlsZSAocGFyZW50Q29sdW1uSGllcmFyY2h5ICYmIHBhcmVudFNpYmxpbmdzQXJlQWxsSGlkZGVuKSB7XG4gICAgICBjb25zdCBwYXJlbnRFbGVtZW50OiBhbnkgPSBwYXJlbnRDb2x1bW5IaWVyYXJjaHkuZWxlbWVudCBhcyBhbnk7XG5cbiAgICAgIHBhcmVudEVsZW1lbnQuaGlkZUNvbHVtbklmLmNoYW5nZVRyaWdnZXJlZEJ5ID0gY3VycmVudENvbHVtbkhpZXJhcmNoeTtcbiAgICAgIHBhcmVudEVsZW1lbnQuaGlkZUNvbHVtbklmLnNob3dPZmZzcHJpbmdMaW1pdGVkID0gdHJ1ZTtcbiAgICAgIHBhcmVudEVsZW1lbnQuaGlkZUNvbHVtbklmLnRhYmxlanNIaWRlQ29sdW1uSWYgPSBoaWRkZW47XG4gICAgICBwYXJlbnRFbGVtZW50LmhpZGVDb2x1bW5JZi5jYW5IaWRlID0gdHJ1ZTtcbiAgICAgIFxuXG4gICAgICBjb25zdCBjb2x1bW5IaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkgPSBmbGF0dGVuZWRDb2x1bW5IaWVyYXJjaHkuZmlsdGVyKChoaWVyYXJjaHk6IElDb2x1bW5IaWVyYXJjaHkpID0+IHtcbiAgICAgICAgcmV0dXJuIGhpZXJhcmNoeS5lbGVtZW50ID09PSBwYXJlbnRDb2x1bW5IaWVyYXJjaHkhLmVsZW1lbnQ7XG4gICAgICB9KVswXTtcbiAgICAgIFxuICAgICAgcGFyZW50Q29sdW1uSGllcmFyY2h5ID0gZmxhdHRlbmVkQ29sdW1uSGllcmFyY2h5LmZpbHRlcigoaGllcmFyY2h5OiBJQ29sdW1uSGllcmFyY2h5KSA9PiB7XG4gICAgICAgIHJldHVybiBoaWVyYXJjaHkuZWxlbWVudCA9PT0gY29sdW1uSGllcmFyY2h5LnBhcmVudENvbHVtbjtcbiAgICAgIH0pWzBdOyAgICBcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHVibGljIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSkgeyBcbiAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmhpZGVDb2x1bW5JZiA9IHRoaXM7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5oaWRlQ29sdW1uSWYgPSBudWxsO1xuICB9XG5cbn1cbiJdfQ==