ng-cdk-table-virtual-scroll
Version:
Virtual scroll for for Angular Cdk Table
180 lines • 23.8 kB
JavaScript
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=