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
JavaScript
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==