UNPKG

dynamic-mat-table

Version:

dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.

112 lines 16.2 kB
import { Injectable } from '@angular/core'; import { distinctUntilChanged } from 'rxjs/operators'; import { BehaviorSubject, Subject } from 'rxjs'; export class FixedSizeTableVirtualScrollStrategy { constructor() { this.length = 0; this.indexChange = new Subject(); this.stickyChange = new Subject(); this.scrollStrategyMode = 'fixed-size'; this.renderedRangeStream = new BehaviorSubject({ start: 0, end: 0 }); this.offsetChange = new BehaviorSubject(0); this.scrolledIndexChange = this.indexChange.pipe(distinctUntilChanged()); } get dataLength() { return this.length; } set dataLength(value) { this.length = value; this.onDataLengthChanged(); } ngOnDestroy() { this.eventsSubscription.unsubscribe(); } attach(viewport) { this.viewport = viewport; this.eventsSubscription = this.viewport.renderedRangeStream.subscribe(this.renderedRangeStream); this.onDataLengthChanged(); } detach() { this.indexChange.complete(); this.stickyChange.complete(); this.renderedRangeStream.complete(); } onContentScrolled() { this.updateContent(); } onDataLengthChanged() { if (this.viewport) { this.viewport.setTotalContentSize(this.dataLength * this.rowHeight + this.headerHeight + this.footerHeight); } this.updateContent(); } onContentRendered() { // no-op } onRenderedOffsetChanged() { // no-op } scrollToIndex(index, behavior) { // if (this.viewport) { // this.viewport.scrollToOffset( this.rowHeight * index , behavior); // } if (!this.viewport || !this.rowHeight) { return; } this.viewport.scrollToOffset((index - 1) * this.rowHeight + this.headerHeight); } setConfig(configs) { const { rowHeight, headerHeight, footerHeight, bufferMultiplier } = configs; if (this.rowHeight === rowHeight && this.headerHeight === headerHeight && this.footerHeight === footerHeight && this.bufferMultiplier === bufferMultiplier) { return; } this.rowHeight = rowHeight; this.headerHeight = headerHeight; this.footerHeight = footerHeight; this.bufferMultiplier = bufferMultiplier; this.onDataLengthChanged(); } // bug fixed some time viewport is zero height (i dont know why!) getViewportSize() { if (this.viewport.getViewportSize() === 0) { return this.viewport.elementRef.nativeElement.clientHeight + 52; } else { return this.viewport.getViewportSize(); } } updateContent() { if (!this.viewport || !this.rowHeight) { return; } let start = 0; let end = this.dataLength; if (this.scrollStrategyMode === 'none' && this.viewport.getRenderedRange().start === start && this.viewport.getRenderedRange().end === end) { return; } const scrollOffset = this.viewport.measureScrollOffset(); const amount = Math.ceil(this.getViewportSize() / this.rowHeight); const offset = Math.max(scrollOffset - this.headerHeight, 0); const buffer = Math.ceil(amount * this.bufferMultiplier); const skip = Math.round(offset / this.rowHeight); const index = Math.max(0, skip); if (this.scrollStrategyMode === 'fixed-size') { start = Math.max(0, index - buffer); end = Math.min(this.dataLength, index + amount + buffer); } const renderedOffset = start * this.rowHeight; this.viewport.setRenderedContentOffset(renderedOffset); this.viewport.setRenderedRange({ start, end }); this.indexChange.next(index); this.stickyChange.next(renderedOffset); this.offsetChange.next(offset); } } /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ FixedSizeTableVirtualScrollStrategy.decorators = [ { type: Injectable } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWQtc2l6ZS10YWJsZS12aXJ0dWFsLXNjcm9sbC1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2R5bmFtaWMtbWF0LXRhYmxlL3NyYy9saWIvY29yZXMvZml4ZWQtc2l6ZS10YWJsZS12aXJ0dWFsLXNjcm9sbC1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZWhELE1BQU0sT0FBTyxtQ0FBbUM7SUFEaEQ7UUFHVSxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBS1gsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3JDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUNyQyx1QkFBa0IsR0FBd0IsWUFBWSxDQUFDO1FBSXZELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFZLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN6RSxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRDLHdCQUFtQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQWlIN0UsQ0FBQztJQS9HQyxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEtBQWE7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVc7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QyxVQUFVLENBQUM7UUFFMUIsSUFBSyxJQUFJLENBQUMsa0JBQWtCLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEtBQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEtBQU0sR0FBRyxFQUFHO1lBQzlJLE9BQU87U0FDUjtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssWUFBWSxFQUFFO1lBQzVDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDcEMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsTUFBTSxjQUFjLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDaEMsQ0FBQzs7OztZQWpJRixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgTGlzdFJhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRTVlN0cmF0ZWd5Q29uZmlncyB7XHJcbiAgcm93SGVpZ2h0OiBudW1iZXI7XHJcbiAgaGVhZGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgZm9vdGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgYnVmZmVyTXVsdGlwbGllcjogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgZGVjbGFyZSB0eXBlIFRhYmxlU2Nyb2xsU3RyYXRlZ3kgPSAnZml4ZWQtc2l6ZScgfCAnbm9uZScgfCBudWxsO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRml4ZWRTaXplVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgaW1wbGVtZW50cyBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksIE9uRGVzdHJveSB7ICBcclxuICBwcml2YXRlIGV2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgbGVuZ3RoID0gMDtcclxuICBwcml2YXRlIHJvd0hlaWdodCE6IG51bWJlcjtcclxuICBwcml2YXRlIGhlYWRlckhlaWdodCE6IG51bWJlcjtcclxuICBwcml2YXRlIGZvb3RlckhlaWdodCE6IG51bWJlcjtcclxuICBwcml2YXRlIGJ1ZmZlck11bHRpcGxpZXIhOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBpbmRleENoYW5nZSA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuICBwdWJsaWMgc3RpY2t5Q2hhbmdlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xyXG4gIHB1YmxpYyBzY3JvbGxTdHJhdGVneU1vZGU6IFRhYmxlU2Nyb2xsU3RyYXRlZ3kgPSAnZml4ZWQtc2l6ZSc7XHJcblxyXG4gIHB1YmxpYyB2aWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xyXG5cclxuICBwdWJsaWMgcmVuZGVyZWRSYW5nZVN0cmVhbSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlzdFJhbmdlPih7c3RhcnQ6IDAsIGVuZDogMH0pO1xyXG4gIHB1YmxpYyBvZmZzZXRDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDApO1xyXG5cclxuICBwdWJsaWMgc2Nyb2xsZWRJbmRleENoYW5nZSA9IHRoaXMuaW5kZXhDaGFuZ2UucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuXHJcbiAgZ2V0IGRhdGFMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMubGVuZ3RoID0gdmFsdWU7XHJcbiAgICB0aGlzLm9uRGF0YUxlbmd0aENoYW5nZWQoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgeyAgICBcclxuICAgIHRoaXMuZXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXR0YWNoKHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcclxuICAgIHRoaXMuZXZlbnRzU3Vic2NyaXB0aW9uID0gdGhpcy52aWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLnN1YnNjcmliZSh0aGlzLnJlbmRlcmVkUmFuZ2VTdHJlYW0pO1xyXG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbmRleENoYW5nZS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5zdGlja3lDaGFuZ2UuY29tcGxldGUoKTtcclxuICAgIHRoaXMucmVuZGVyZWRSYW5nZVN0cmVhbS5jb21wbGV0ZSgpO1xyXG4gIH1cclxuIFxyXG4gIHB1YmxpYyBvbkNvbnRlbnRTY3JvbGxlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRGF0YUxlbmd0aENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy52aWV3cG9ydCkge1xyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNldFRvdGFsQ29udGVudFNpemUodGhpcy5kYXRhTGVuZ3RoICogdGhpcy5yb3dIZWlnaHQgKyB0aGlzLmhlYWRlckhlaWdodCArIHRoaXMuZm9vdGVySGVpZ2h0KTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29udGVudFJlbmRlcmVkKCk6IHZvaWQge1xyXG4gICAgLy8gbm8tb3BcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJlbmRlcmVkT2Zmc2V0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIC8vIG5vLW9wXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9JbmRleChpbmRleDogbnVtYmVyLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IpOiB2b2lkIHsgICAgXHJcbiAgICAvLyBpZiAodGhpcy52aWV3cG9ydCkge1xyXG4gICAgLy8gICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KCB0aGlzLnJvd0hlaWdodCAqIGluZGV4ICwgYmVoYXZpb3IpO1xyXG4gICAgLy8gfSAgICBcclxuICAgIGlmICghdGhpcy52aWV3cG9ydCB8fCAhdGhpcy5yb3dIZWlnaHQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldCgoaW5kZXggLSAxICkgKiB0aGlzLnJvd0hlaWdodCArIHRoaXMuaGVhZGVySGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnczogVFNWU3RyYXRlZ3lDb25maWdzKSB7XHJcbiAgICBjb25zdCB7cm93SGVpZ2h0LCBoZWFkZXJIZWlnaHQsIGZvb3RlckhlaWdodCwgYnVmZmVyTXVsdGlwbGllcn0gPSBjb25maWdzO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnJvd0hlaWdodCA9PT0gcm93SGVpZ2h0XHJcbiAgICAgICYmIHRoaXMuaGVhZGVySGVpZ2h0ID09PSBoZWFkZXJIZWlnaHRcclxuICAgICAgJiYgdGhpcy5mb290ZXJIZWlnaHQgPT09IGZvb3RlckhlaWdodFxyXG4gICAgICAmJiB0aGlzLmJ1ZmZlck11bHRpcGxpZXIgPT09IGJ1ZmZlck11bHRpcGxpZXJcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcclxuICAgIHRoaXMuaGVhZGVySGVpZ2h0ID0gaGVhZGVySGVpZ2h0O1xyXG4gICAgdGhpcy5mb290ZXJIZWlnaHQgPSBmb290ZXJIZWlnaHQ7XHJcbiAgICB0aGlzLmJ1ZmZlck11bHRpcGxpZXIgPSBidWZmZXJNdWx0aXBsaWVyO1xyXG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBidWcgZml4ZWQgc29tZSB0aW1lIHZpZXdwb3J0IGlzIHplcm8gaGVpZ2h0IChpIGRvbnQga25vdyB3aHkhKVxyXG4gIHB1YmxpYyBnZXRWaWV3cG9ydFNpemUoKSB7XHJcbiAgICBpZiAodGhpcy52aWV3cG9ydC5nZXRWaWV3cG9ydFNpemUoKSA9PT0gMCkgeyAgICAgIFxyXG4gICAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgNTI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3cG9ydC5nZXRWaWV3cG9ydFNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGVudCgpIHsgICAgXHJcbiAgICBpZiAoIXRoaXMudmlld3BvcnQgfHwgIXRoaXMucm93SGVpZ2h0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzdGFydCA9IDA7XHJcbiAgICBsZXQgZW5kID0gdGhpcy5kYXRhTGVuZ3RoOyAgIFxyXG5cclxuICAgIGlmICggdGhpcy5zY3JvbGxTdHJhdGVneU1vZGUgPT09ICdub25lJyAmJiB0aGlzLnZpZXdwb3J0LmdldFJlbmRlcmVkUmFuZ2UoKS5zdGFydCAgPT09IHN0YXJ0ICYmIHRoaXMudmlld3BvcnQuZ2V0UmVuZGVyZWRSYW5nZSgpLmVuZCAgPT09IGVuZCApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBcclxuXHJcbiAgICBjb25zdCBzY3JvbGxPZmZzZXQgPSB0aGlzLnZpZXdwb3J0Lm1lYXN1cmVTY3JvbGxPZmZzZXQoKTtcclxuICAgIGNvbnN0IGFtb3VudCA9IE1hdGguY2VpbCh0aGlzLmdldFZpZXdwb3J0U2l6ZSgpIC8gdGhpcy5yb3dIZWlnaHQpO1xyXG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoc2Nyb2xsT2Zmc2V0IC0gdGhpcy5oZWFkZXJIZWlnaHQsIDApOyAgICBcclxuICAgIGNvbnN0IGJ1ZmZlciA9IE1hdGguY2VpbChhbW91bnQgKiB0aGlzLmJ1ZmZlck11bHRpcGxpZXIpO1xyXG5cclxuICAgIGNvbnN0IHNraXAgPSBNYXRoLnJvdW5kKG9mZnNldCAvIHRoaXMucm93SGVpZ2h0KTtcclxuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5tYXgoMCwgc2tpcCk7ICAgIFxyXG4gICAgIFxyXG4gICAgaWYgKHRoaXMuc2Nyb2xsU3RyYXRlZ3lNb2RlID09PSAnZml4ZWQtc2l6ZScpIHtcclxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBpbmRleCAtIGJ1ZmZlcik7XHJcbiAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMuZGF0YUxlbmd0aCwgaW5kZXggKyBhbW91bnQgKyBidWZmZXIpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVuZGVyZWRPZmZzZXQgPSBzdGFydCAqIHRoaXMucm93SGVpZ2h0OyAgICBcclxuICAgIFxyXG4gICAgdGhpcy52aWV3cG9ydC5zZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQocmVuZGVyZWRPZmZzZXQpO1xyXG4gICAgdGhpcy52aWV3cG9ydC5zZXRSZW5kZXJlZFJhbmdlKHtzdGFydCwgZW5kfSk7ICAgIFxyXG4gICAgdGhpcy5pbmRleENoYW5nZS5uZXh0KGluZGV4KTtcclxuICAgIHRoaXMuc3RpY2t5Q2hhbmdlLm5leHQocmVuZGVyZWRPZmZzZXQpO1xyXG4gICAgdGhpcy5vZmZzZXRDaGFuZ2UubmV4dChvZmZzZXQpXHJcbiAgfVxyXG59XHJcbiJdfQ==