UNPKG

ng-cdk-table-virtual-scroll

Version:
180 lines 23.8 kB
import { __decorate } from "tslib"; import { AfterContentInit, ContentChild, Directive, forwardRef, Input, NgZone, OnChanges, OnDestroy, } from '@angular/core'; import { distinctUntilChanged, filter, map, switchMap, takeUntil, takeWhile, tap, } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling'; import { CdkTable } from '@angular/cdk/table'; import { TableVirtualScrollDataSource } from './table-data-source'; import { FixedSizeTableVirtualScrollStrategy } from './fixed-size-table-virtual-scroll-strategy'; export function _tableVirtualScrollDirectiveStrategyFactory(tableDir) { return tableDir.scrollStrategy; } var stickyHeaderSelector = '.cdk-header-row .cdk-table-sticky'; var stickyFooterSelector = '.cdk-footer-row .cdk-table-sticky'; var defaults = { rowHeight: 48, headerHeight: 56, headerEnabled: true, footerHeight: 48, footerEnabled: false, bufferMultiplier: 0.7, }; var TableItemSizeDirective = /** @class */ (function () { function TableItemSizeDirective(zone) { this.zone = zone; this.alive = true; // tslint:disable-next-line:no-input-rename this.rowHeight = defaults.rowHeight; this.headerEnabled = defaults.headerEnabled; this.headerHeight = defaults.headerHeight; this.footerEnabled = defaults.footerEnabled; this.footerHeight = defaults.footerHeight; this.bufferMultiplier = defaults.bufferMultiplier; this.scrollStrategy = new FixedSizeTableVirtualScrollStrategy(); this.dataSourceChanges = new Subject(); } TableItemSizeDirective_1 = TableItemSizeDirective; TableItemSizeDirective.prototype.ngOnDestroy = function () { this.alive = false; this.dataSourceChanges.complete(); }; TableItemSizeDirective.prototype.isAlive = function () { var _this = this; return function () { return _this.alive; }; }; TableItemSizeDirective.prototype.isStickyEnabled = function () { return (!!this.scrollStrategy.viewport && this.table['_headerRowDefs'] .map(function (def) { return def.sticky; }) .reduce(function (prevState, state) { return prevState && state; }, true)); }; TableItemSizeDirective.prototype.ngAfterContentInit = function () { var _this = this; var switchDataSourceOrigin = this.table['_switchDataSource']; this.table['_switchDataSource'] = function (dataSource) { switchDataSourceOrigin.call(_this.table, dataSource); _this.connectDataSource(dataSource); }; this.connectDataSource(this.table.dataSource); this.scrollStrategy.stickyChange .pipe(filter(function () { return _this.isStickyEnabled(); }), tap(function () { if (!_this.stickyPositions) { _this.initStickyPositions(); } }), takeWhile(this.isAlive())) .subscribe(function (stickyOffset) { _this.setSticky(stickyOffset); }); }; TableItemSizeDirective.prototype.connectDataSource = function (dataSource) { var _this = this; this.dataSourceChanges.next(); if (dataSource instanceof TableVirtualScrollDataSource) { dataSource.dataToRender$ .pipe(distinctUntilChanged(), takeUntil(this.dataSourceChanges), takeWhile(this.isAlive()), tap(function (data) { return (_this.scrollStrategy.dataLength = data.length); }), switchMap(function (data) { return _this.scrollStrategy.renderedRangeStream.pipe(map(function (_a) { var start = _a.start, end = _a.end; return typeof start !== 'number' || typeof end !== 'number' ? data : data.slice(start, end); })); })) .subscribe(function (data) { _this.zone.run(function () { dataSource.dataOfRange$.next(data); }); }); } else { throw new Error('[tvsItemSize] requires TableVirtualScrollDataSource be set as [dataSource] of [cdk-table]'); } }; TableItemSizeDirective.prototype.ngOnChanges = function () { var config = { rowHeight: +this.rowHeight || defaults.rowHeight, headerHeight: this.headerEnabled ? +this.headerHeight || defaults.headerHeight : 0, footerHeight: this.footerEnabled ? +this.footerHeight || defaults.footerHeight : 0, bufferMultiplier: +this.bufferMultiplier || defaults.bufferMultiplier, }; this.scrollStrategy.setConfig(config); }; TableItemSizeDirective.prototype.setSticky = function (offset) { var _this = this; this.scrollStrategy.viewport.elementRef.nativeElement .querySelectorAll(stickyHeaderSelector) .forEach(function (el) { var parent = el.parentElement; var baseOffset = 0; if (_this.stickyPositions.has(parent)) { baseOffset = _this.stickyPositions.get(parent); } el.style.top = baseOffset - offset + "px"; }); this.scrollStrategy.viewport.elementRef.nativeElement .querySelectorAll(stickyFooterSelector) .forEach(function (el) { var parent = el.parentElement; var baseOffset = 0; if (_this.stickyPositions.has(parent)) { baseOffset = _this.stickyPositions.get(parent); } el.style.bottom = -baseOffset + offset + "px"; }); }; TableItemSizeDirective.prototype.initStickyPositions = function () { var _this = this; this.stickyPositions = new Map(); this.scrollStrategy.viewport.elementRef.nativeElement .querySelectorAll(stickyHeaderSelector) .forEach(function (el) { var parent = el.parentElement; if (!_this.stickyPositions.has(parent)) { _this.stickyPositions.set(parent, parent.offsetTop); } }); }; var TableItemSizeDirective_1; TableItemSizeDirective.ctorParameters = function () { return [ { type: NgZone } ]; }; __decorate([ Input('tvsItemSize') ], TableItemSizeDirective.prototype, "rowHeight", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "headerEnabled", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "headerHeight", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "footerEnabled", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "footerHeight", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "bufferMultiplier", void 0); __decorate([ ContentChild(CdkTable, { static: false }) ], TableItemSizeDirective.prototype, "table", void 0); TableItemSizeDirective = TableItemSizeDirective_1 = __decorate([ Directive({ selector: 'cdk-virtual-scroll-viewport[tvsItemSize]', providers: [ { provide: VIRTUAL_SCROLL_STRATEGY, useFactory: _tableVirtualScrollDirectiveStrategyFactory, deps: [forwardRef(function () { return TableItemSizeDirective_1; })], }, ], }) ], TableItemSizeDirective); return TableItemSizeDirective; }()); export { TableItemSizeDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWNkay10YWJsZS12aXJ0dWFsLXNjcm9sbC8iLCJzb3VyY2VzIjpbImxpYi90YWJsZS1pdGVtLXNpemUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQW1CLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRWpHLE1BQU0sVUFBVSwyQ0FBMkMsQ0FDekQsUUFBZ0M7SUFFaEMsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxJQUFNLG9CQUFvQixHQUFHLG1DQUFtQyxDQUFDO0FBQ2pFLElBQU0sb0JBQW9CLEdBQUcsbUNBQW1DLENBQUM7QUFFakUsSUFBTSxRQUFRLEdBQUc7SUFDZixTQUFTLEVBQUUsRUFBRTtJQUNiLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGdCQUFnQixFQUFFLEdB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O29CQUN2RCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBTSxPQUFBLHdCQUFzQixFQUF0QixDQUFzQixDQUFDLENBQUM7aUJBQ2pEO2FBQ0Y7U0FDRixDQUFDO09BQ1csc0JBQXNCLENBMkpsQztJQUFELDZCQUFDO0NBQUEsQUEzSkQsSUEySkM7U0EzSlksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBEaXJlY3RpdmUsXHJcbiAgZm9yd2FyZFJlZixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcclxuICBmaWx0ZXIsXHJcbiAgbWFwLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YWtlVW50aWwsXHJcbiAgdGFrZVdoaWxlLFxyXG4gIHRhcCxcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgQ2RrSGVhZGVyUm93RGVmLCBDZGtUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90YWJsZSc7XHJcblxyXG5pbXBvcnQgeyBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlIH0gZnJvbSAnLi90YWJsZS1kYXRhLXNvdXJjZSc7XHJcbmltcG9ydCB7IEZpeGVkU2l6ZVRhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi9maXhlZC1zaXplLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXN0cmF0ZWd5JztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfdGFibGVWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlU3RyYXRlZ3lGYWN0b3J5KFxyXG4gIHRhYmxlRGlyOiBUYWJsZUl0ZW1TaXplRGlyZWN0aXZlXHJcbikge1xyXG4gIHJldHVybiB0YWJsZURpci5zY3JvbGxTdHJhdGVneTtcclxufVxyXG5cclxuY29uc3Qgc3RpY2t5SGVhZGVyU2VsZWN0b3IgPSAnLmNkay1oZWFkZXItcm93IC5jZGstdGFibGUtc3RpY2t5JztcclxuY29uc3Qgc3RpY2t5Rm9vdGVyU2VsZWN0b3IgPSAnLmNkay1mb290ZXItcm93IC5jZGstdGFibGUtc3RpY2t5JztcclxuXHJcbmNvbnN0IGRlZmF1bHRzID0ge1xyXG4gIHJvd0hlaWdodDogNDgsXHJcbiAgaGVhZGVySGVpZ2h0OiA1NixcclxuICBoZWFkZXJFbmFibGVkOiB0cnVlLFxyXG4gIGZvb3RlckhlaWdodDogNDgsXHJcbiAgZm9vdGVyRW5hYmxlZDogZmFsc2UsXHJcbiAgYnVmZmVyTXVsdGlwbGllcjogMC43LFxyXG59O1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRbdHZzSXRlbVNpemVdJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksXHJcbiAgICAgIHVzZUZhY3Rvcnk6IF90YWJsZVZpcnR1YWxTY3JvbGxEaXJlY3RpdmVTdHJhdGVneUZhY3RvcnksXHJcbiAgICAgIGRlcHM6IFtmb3J3YXJkUmVmKCgpID0+IFRhYmxlSXRlbVNpemVEaXJlY3RpdmUpXSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlSXRlbVNpemVEaXJlY3RpdmVcclxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxyXG4gIEBJbnB1dCgndHZzSXRlbVNpemUnKVxyXG4gIHJvd0hlaWdodCA9IGRlZmF1bHRzLnJvd0hlaWdodDtcclxuXHJcbiAgQElucHV0KClcclxuICBoZWFkZXJFbmFibGVkID0gZGVmYXVsdHMuaGVhZGVyRW5hYmxlZDtcclxuXHJcbiAgQElucHV0KClcclxuICBoZWFkZXJIZWlnaHQgPSBkZWZhdWx0cy5oZWFkZXJIZWlnaHQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZm9vdGVyRW5hYmxlZCA9IGRlZmF1bHRzLmZvb3RlckVuYWJsZWQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZm9vdGVySGVpZ2h0ID0gZGVmYXVsdHMuZm9vdGVySGVpZ2h0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGJ1ZmZlck11bHRpcGxpZXIgPSBkZWZhdWx0cy5idWZmZXJNdWx0aXBsaWVyO1xyXG5cclxuICBAQ29udGVudENoaWxkKENka1RhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICB0YWJsZTogQ2RrVGFibGU8YW55PjtcclxuXHJcbiAgc2Nyb2xsU3RyYXRlZ3kgPSBuZXcgRml4ZWRTaXplVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3koKTtcclxuXHJcbiAgZGF0YVNvdXJjZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIHN0aWNreVBvc2l0aW9uczogTWFwPEhUTUxFbGVtZW50LCBudW1iZXI+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmFsaXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2VDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQWxpdmUoKSB7XHJcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5hbGl2ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTdGlja3lFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgISF0aGlzLnNjcm9sbFN0cmF0ZWd5LnZpZXdwb3J0ICYmXHJcbiAgICAgICh0aGlzLnRhYmxlWydfaGVhZGVyUm93RGVmcyddIGFzIENka0hlYWRlclJvd0RlZltdKVxyXG4gICAgICAgIC5tYXAoKGRlZikgPT4gZGVmLnN0aWNreSlcclxuICAgICAgICAucmVkdWNlKChwcmV2U3RhdGUsIHN0YXRlKSA9PiBwcmV2U3RhdGUgJiYgc3RhdGUsIHRydWUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgY29uc3Qgc3dpdGNoRGF0YVNvdXJjZU9yaWdpbiA9IHRoaXMudGFibGVbJ19zd2l0Y2hEYXRhU291cmNlJ107XHJcbiAgICB0aGlzLnRhYmxlWydfc3dpdGNoRGF0YVNvdXJjZSddID0gKGRhdGFTb3VyY2U6IGFueSkgPT4ge1xyXG4gICAgICBzd2l0Y2hEYXRhU291cmNlT3JpZ2luLmNhbGwodGhpcy50YWJsZSwgZGF0YVNvdXJjZSk7XHJcbiAgICAgIHRoaXMuY29ubmVjdERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY29ubmVjdERhdGFTb3VyY2UodGhpcy50YWJsZS5kYXRhU291cmNlKTtcclxuXHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnN0aWNreUNoYW5nZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5pc1N0aWNreUVuYWJsZWQoKSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5zdGlja3lQb3NpdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0U3RpY2t5UG9zaXRpb25zKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFrZVdoaWxlKHRoaXMuaXNBbGl2ZSgpKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHN0aWNreU9mZnNldCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0U3RpY2t5KHN0aWNreU9mZnNldCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29ubmVjdERhdGFTb3VyY2UoZGF0YVNvdXJjZTogYW55KSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2VDaGFuZ2VzLm5leHQoKTtcclxuICAgIGlmIChkYXRhU291cmNlIGluc3RhbmNlb2YgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSkge1xyXG4gICAgICBkYXRhU291cmNlLmRhdGFUb1JlbmRlciRcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kYXRhU291cmNlQ2hhbmdlcyksXHJcbiAgICAgICAgICB0YWtlV2hpbGUodGhpcy5pc0FsaXZlKCkpLFxyXG4gICAgICAgICAgdGFwKChkYXRhKSA9PiAodGhpcy5zY3JvbGxTdHJhdGVneS5kYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgpKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCgoZGF0YSkgPT5cclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5yZW5kZXJlZFJhbmdlU3RyZWFtLnBpcGUoXHJcbiAgICAgICAgICAgICAgbWFwKCh7IHN0YXJ0LCBlbmQgfSkgPT5cclxuICAgICAgICAgICAgICAgIHR5cGVvZiBzdGFydCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGVuZCAhPT0gJ251bWJlcidcclxuICAgICAgICAgICAgICAgICAgPyBkYXRhXHJcbiAgICAgICAgICAgICAgICAgIDogZGF0YS5zbGljZShzdGFydCwgZW5kKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZS5kYXRhT2ZSYW5nZSQubmV4dChkYXRhKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdbdHZzSXRlbVNpemVdIHJlcXVpcmVzIFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2UgYmUgc2V0IGFzIFtkYXRhU291cmNlXSBvZiBbY2RrLXRhYmxlXSdcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICByb3dIZWlnaHQ6ICt0aGlzLnJvd0hlaWdodCB8fCBkZWZhdWx0cy5yb3dIZWlnaHQsXHJcbiAgICAgIGhlYWRlckhlaWdodDogdGhpcy5oZWFkZXJFbmFibGVkXHJcbiAgICAgICAgPyArdGhpcy5oZWFkZXJIZWlnaHQgfHwgZGVmYXVsdHMuaGVhZGVySGVpZ2h0XHJcbiAgICAgICAgOiAwLFxyXG4gICAgICBmb290ZXJIZWlnaHQ6IHRoaXMuZm9vdGVyRW5hYmxlZFxyXG4gICAgICAgID8gK3RoaXMuZm9vdGVySGVpZ2h0IHx8IGRlZmF1bHRzLmZvb3RlckhlaWdodFxyXG4gICAgICAgIDogMCxcclxuICAgICAgYnVmZmVyTXVsdGlwbGllcjogK3RoaXMuYnVmZmVyTXVsdGlwbGllciB8fCBkZWZhdWx0cy5idWZmZXJNdWx0aXBsaWVyLFxyXG4gICAgfTtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBzZXRTdGlja3kob2Zmc2V0KSB7XHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAucXVlcnlTZWxlY3RvckFsbChzdGlja3lIZWFkZXJTZWxlY3RvcilcclxuICAgICAgLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IGJhc2VPZmZzZXQgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLnN0aWNreVBvc2l0aW9ucy5oYXMocGFyZW50KSkge1xyXG4gICAgICAgICAgYmFzZU9mZnNldCA9IHRoaXMuc3RpY2t5UG9zaXRpb25zLmdldChwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbC5zdHlsZS50b3AgPSBgJHtiYXNlT2Zmc2V0IC0gb2Zmc2V0fXB4YDtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAucXVlcnlTZWxlY3RvckFsbChzdGlja3lGb290ZXJTZWxlY3RvcilcclxuICAgICAgLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IGJhc2VPZmZzZXQgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLnN0aWNreVBvc2l0aW9ucy5oYXMocGFyZW50KSkge1xyXG4gICAgICAgICAgYmFzZU9mZnNldCA9IHRoaXMuc3RpY2t5UG9zaXRpb25zLmdldChwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSBgJHstYmFzZU9mZnNldCArIG9mZnNldH1weGA7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3RpY2t5UG9zaXRpb25zKCkge1xyXG4gICAgdGhpcy5zdGlja3lQb3NpdGlvbnMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBudW1iZXI+KCk7XHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAucXVlcnlTZWxlY3RvckFsbChzdGlja3lIZWFkZXJTZWxlY3RvcilcclxuICAgICAgLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgICAgICBpZiAoIXRoaXMuc3RpY2t5UG9zaXRpb25zLmhhcyhwYXJlbnQpKSB7XHJcbiAgICAgICAgICB0aGlzLnN0aWNreVBvc2l0aW9ucy5zZXQocGFyZW50LCBwYXJlbnQub2Zmc2V0VG9wKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=