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.
113 lines • 19.8 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { PageEvent } from '@angular/material/paginator';
export class PaginationComponent {
constructor() {
this.pageChange = new EventEmitter();
this.id = new Date().getTime();
this.pageIndex = 1;
this.previousPageIndex = null;
this.dir = 'rtl';
this.pageSize = 10;
this.previousLabel = 'Previous';
this.nextLabel = 'Next';
this.firstLabel = 'Go first';
this.lastLabel = 'Go Last';
this.length = 0;
this.pageSizeOptions = [5, 10, 50, 100];
}
ngOnChanges(changes) {
if (changes.pageIndex) {
this.pageIndex = changes.pageIndex.currentValue + 1;
}
if (changes.pageSizeOptions && !changes.pageSizeOptions.currentValue.includes(this.pageSize) && changes.pageSizeOptions.currentValue.length > 0) {
this.pageSize = changes.pageSizeOptions.currentValue[0];
}
if (changes.pageIndex && this.pageCount < changes.pageIndex.currentValue) {
this.pageIndex = this.pageCount;
}
}
get pageCount() {
var _a;
if (this.pageSize === 0) {
return 1;
}
return Math.ceil(((_a = this.length) !== null && _a !== void 0 ? _a : 1) / this.pageSize);
}
ngOnInit() {
}
goFirst() {
this.pageIndex = 1;
this.emit();
}
goLast() {
this.pageIndex = this.pageCount;
this.emit();
}
next() {
if (this.pageIndex < this.pageCount) {
this.pageIndex++;
this.emit();
}
}
previous() {
if (this.pageIndex > 1) {
this.pageIndex--;
this.emit();
}
}
goToPage(event) {
if (event.target.value > 0 && event.target.value <= this.pageCount) {
this.pageIndex = event.target.value;
}
else if (event.target.value > this.pageCount) {
this.pageIndex = this.pageCount;
}
else if (event.target.value < 1) {
this.pageIndex = 1;
}
this.emit();
}
reset(event) {
this.pageIndex = 1;
this.emit();
}
emit() {
const data = new PageEvent();
data.pageIndex = (+this.pageIndex) - 1;
data.length = +this.length;
data.pageSize = +this.pageSize;
data.previousPageIndex = +this.previousPageIndex;
this.pageChange.emit(data);
}
}
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
PaginationComponent.decorators = [
{ type: Component, args: [{
selector: 'pagination',
template: "<div [dir]=\"dir\" class=\"paginator-root\">\r\n <div class=\"total-items\">\r\n <div class=\"total-items-box\">\r\n Total items: \r\n <span>\r\n {{length??0}}\r\n </span>\r\n </div>\r\n </div>\r\n \r\n \r\n <div class=\"paginator-root-arrowBox\">\r\n <div [matTooltip]=\"firstLabel\">\r\n <button (click)=\"goFirst()\" [class.disable]=\"pageIndex<=1\" [dir]=\"dir\"\r\n [disabled]=\"pageIndex===1\"\r\n class=\"paginator-root-goFirst\">\r\n </button>\r\n </div>\r\n\r\n <div [matTooltip]=\"previousLabel\">\r\n <button (click)=\"previous()\" [class.disable]=\"pageIndex<=1\" [dir]=\"dir\" [disabled]=\"pageIndex===1\"\r\n class=\"paginator-root-previous\">\r\n </button>\r\n </div>\r\n\r\n <div class=\"paginator-root-activePage\">\r\n <input (change)=\"goToPage($event)\" [max]=\"pageCount\" [ngModel]=\"pageIndex\" min=\"1\" type=\"number\">\r\n <span>/</span> \r\n <span>{{pageCount}}</span>\r\n </div>\r\n <div [matTooltip]=\"nextLabel\">\r\n <button (click)=\"next()\" [class.disable]=\"pageIndex>=pageCount\" [dir]=\"dir\" [disabled]=\"pageIndex===pageCount\"\r\n class=\"paginator-root-next\">\r\n </button>\r\n </div>\r\n <div [matTooltip]=\"lastLabel\">\r\n <button (click)=\"goLast()\" [class.disable]=\"pageIndex>=pageCount\" [dir]=\"dir\" [disabled]=\"pageIndex===pageCount\"\r\n class=\"paginator-root-goLast\">\r\n </button>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"pageSizeOptions.length>0\" [dir]=\"dir\" class=\"paginator-root-pageSize\">\r\n <select [(ngModel)]=\"pageSize\" (ngModelChange)=\"reset($event)\">\r\n <ng-container *ngFor=\"let item of pageSizeOptions\">\r\n <option [value]=\"item\">{{item}}</option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n</div>\r\n",
styles: [".paginator-root{display:flex;flex-direction:row;align-items:center;justify-content:center;flex-wrap:wrap;padding:0 10px}.paginator-root-arrowBox{display:flex;align-items:center;justify-content:center;flex-wrap:nowrap}@media only screen and (max-width: 500px){.paginator-root-arrowBox{width:100%}}@media only screen and (max-width: 300px){.paginator-root-arrowBox{flex-wrap:wrap}}.paginator-root-goFirst{cursor:pointer;background:transparent;border-color:transparent;display:flex;flex-direction:row;align-items:center;justify-content:center;width:1.8rem;height:1.8rem;padding:.2rem}@media only screen and (max-width: 300px){.paginator-root-goFirst{order:2}}.paginator-root-goFirst[dir=rtl]{transform:rotate(180deg)}.paginator-root-goFirst:after{content:\"\";position:absolute;border-bottom:.2rem solid rgba(0,0,0,.54);border-left:.2rem solid rgba(0,0,0,.54);width:8px;height:8px;transform:rotate(225deg);border-radius:.2rem;margin-right:14px;transform:rotate(45deg)}.paginator-root-goFirst:after:hover:before{border-color:#1890ff}.paginator-root-goFirst:after:hover:after{border-color:#1890ff}.paginator-root-goFirst:before{content:\"\";position:absolute;border-bottom:.2rem solid rgba(0,0,0,.54);border-left:.2rem solid rgba(0,0,0,.54);width:8px;height:8px;transform:rotate(225deg);border-radius:.2rem;transform:rotate(45deg)}.paginator-root-goFirst:before:hover:before{border-color:#1890ff}.paginator-root-goFirst:before:hover:after{border-color:#1890ff}.paginator-root-goFirst:hover:before{border-color:#1890ff}.paginator-root-goFirst:hover:after{border-color:#1890ff}.paginator-root-previous{cursor:pointer;background:transparent;border-color:transparent;display:flex;flex-direction:row;align-items:center;justify-content:center;width:1.8rem;height:1.8rem;padding:.2rem;margin-left:.5rem}@media only screen and (max-width: 300px){.paginator-root-previous{order:2}}.paginator-root-previous:after{content:\"\";position:absolute;border-bottom:.2rem solid rgba(0,0,0,.54);border-left:.2rem solid rgba(0,0,0,.54);width:8px;height:8px;transform:rotate(225deg);border-radius:.2rem;transform:rotate(45deg)}.paginator-root-previous:after:hover:before{border-color:#1890ff}.paginator-root-previous:after:hover:after{border-color:#1890ff}.paginator-root-previous:hover:after{border-color:#1890ff}.paginator-root-previous[dir=rtl]{transform:rotate(180deg)}.paginator-root-activePage{display:flex;flex-direction:row;align-items:center;justify-content:center;height:2rem;margin-left:1.5rem;margin-right:1.5rem;outline:1px solid transparent}.paginator-root-activePage input::-webkit-outer-spin-button,.paginator-root-activePage input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.paginator-root-activePage input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield;text-align:center;height:26px;padding:0!important;box-sizing:border-box}.paginator-root-activePage input[type=number]:hover{border-color:#1890ff;border-radius:.2rem}.paginator-root-activePage input[type=number]:focus{outline:1px solid #1890ff;border-color:#1890ff;border-radius:.2rem}@media only screen and (max-width: 300px){.paginator-root-activePage{order:1;width:100%;margin:0}}.paginator-root-next{cursor:pointer;background:transparent;border-color:transparent;display:flex;flex-direction:row;align-items:center;justify-content:center;width:1.8rem;height:1.8rem;padding:.2rem;margin-right:.5rem}@media only screen and (max-width: 300px){.paginator-root-next{order:2}}.paginator-root-next:after{content:\"\";position:absolute;border-bottom:.2rem solid rgba(0,0,0,.54);border-left:.2rem solid rgba(0,0,0,.54);width:8px;height:8px;transform:rotate(225deg);border-radius:.2rem}.paginator-root-next:after:hover:before{border-color:#1890ff}.paginator-root-next:after:hover:after{border-color:#1890ff}.paginator-root-next:hover:after{border-color:#1890ff}.paginator-root-next[dir=rtl]{transform:rotate(180deg)}.paginator-root-goLast{cursor:pointer;background:transparent;border-color:transparent;display:flex;flex-direction:row;align-items:center;justify-content:center;width:1.8rem;height:1.8rem;padding:.2rem}.paginator-root-goLast:after{content:\"\";position:absolute;border-bottom:.2rem solid rgba(0,0,0,.54);border-left:.2rem solid rgba(0,0,0,.54);width:8px;height:8px;transform:rotate(225deg);border-radius:.2rem;margin-right:14px}.paginator-root-goLast:after:hover:before{border-color:#1890ff}.paginator-root-goLast:after:hover:after{border-color:#1890ff}.paginator-root-goLast:before{content:\"\";position:absolute;border-bottom:.2rem solid rgba(0,0,0,.54);border-left:.2rem solid rgba(0,0,0,.54);width:8px;height:8px;transform:rotate(225deg);border-radius:.2rem}.paginator-root-goLast:before:hover:before{border-color:#1890ff}.paginator-root-goLast:before:hover:after{border-color:#1890ff}@media only screen and (max-width: 300px){.paginator-root-goLast{order:2}}.paginator-root-goLast[dir=rtl]{transform:rotate(180deg)}.paginator-root-goLast:hover:before{border-color:#1890ff}.paginator-root-goLast:hover:after{border-color:#1890ff}.paginator-root-pageSize{display:flex;align-items:center;height:2rem}.paginator-root-pageSize[dir=rtl]{margin-right:1.5rem}@media only screen and (max-width: 500px){.paginator-root-pageSize[dir=rtl]{margin-right:0}}.paginator-root-pageSize[dir=ltr]{margin-left:1.5rem}@media only screen and (max-width: 500px){.paginator-root-pageSize[dir=ltr]{margin-left:0}}.paginator-root-pageSize select{padding-right:10px;padding-left:10px;border-radius:.2rem;height:26px}.paginator-root-pageSize select:hover{outline:1px solid #1890ff;border:1px solid #1890ff;border-radius:.2rem}.paginator-root-pageSize select:focus{outline:1px solid #1890ff;border:1px solid #1890ff;border-radius:.2rem}@media only screen and (max-width: 500px){.paginator-root-pageSize{margin-top:10px;order:3}.paginator-root-pageSize select{padding-right:2.4rem;padding-left:2.4rem}}@media only screen and (max-width: 300px){.paginator-root-pageSize select{width:100%}}.total-items{display:flex;justify-content:center;align-items:center;font-size:14px}@media only screen and (max-width: 900px){.total-items{width:100%;margin-top:10px}}.total-items-box{background:white;border:1px solid #767676FF;border-radius:2px;padding:2px 5px}.total-items-box span{font-weight:450}.disable{cursor:not-allowed}.disable *{border-color:#0000008a!important}\n"]
},] }
];
/**
* @type {function(): !Array<(null|{
* type: ?,
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
* })>}
* @nocollapse
*/
PaginationComponent.ctorParameters = () => [];
/** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
PaginationComponent.propDecorators = {
pageChange: [{ type: Output, args: ['page',] }],
pageIndex: [{ type: Input }],
previousPageIndex: [{ type: Input }],
dir: [{ type: Input }],
pageSize: [{ type: Input }],
previousLabel: [{ type: Input }],
nextLabel: [{ type: Input }],
firstLabel: [{ type: Input }],
lastLabel: [{ type: Input }],
length: [{ type: Input }],
pageSizeOptions: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLW1hdC10YWJsZS9zcmMvbGliL21vZHVsZXMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFdkcsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBT3RELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUI7UUFIZ0IsZUFBVSxHQUE0QixJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ3BGLE9BQUUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBbUJqQixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFDeEMsUUFBRyxHQUFrQixLQUFLLENBQUM7UUFDM0IsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGtCQUFhLEdBQUcsVUFBVSxDQUFDO1FBQzNCLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbkIsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxvQkFBZSxHQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUF6QnRELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxPQUFPLENBQUMsZUFBZSxJQUFJLENB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QUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOzs7O1lBaEdGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsbTZEQUEwQzs7YUFFM0M7Ozs7Ozs7Ozs7Ozt5QkFFRSxNQUFNLFNBQUMsTUFBTTt3QkFvQmIsS0FBSztnQ0FDTCxLQUFLO2tCQUNMLEtBQUs7dUJBQ0wsS0FBSzs0QkFDTCxLQUFLO3dCQUNMLEtBQUs7eUJBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7OEJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtQYWdlQ29uZmlnTW9kZWx9IGZyb20gJy4vcGFnZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQge1BhZ2VFdmVudH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGFnaW5hdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BhZ2luYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBAT3V0cHV0KCdwYWdlJykgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcclxuICBpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnBhZ2VJbmRleCkge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IGNoYW5nZXMucGFnZUluZGV4LmN1cnJlbnRWYWx1ZSArIDE7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5wYWdlU2l6ZU9wdGlvbnMgJiYgIWNoYW5nZXMucGFnZVNpemVPcHRpb25zLmN1cnJlbnRWYWx1ZS5pbmNsdWRlcyh0aGlzLnBhZ2VTaXplXHJcbiAgICApICYmIGNoYW5nZXMucGFnZVNpemVPcHRpb25zLmN1cnJlbnRWYWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSBjaGFuZ2VzLnBhZ2VTaXplT3B0aW9ucy5jdXJyZW50VmFsdWVbMF07XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5wYWdlSW5kZXggJiYgdGhpcy5wYWdlQ291bnQgPCBjaGFuZ2VzLnBhZ2VJbmRleC5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLnBhZ2VDb3VudDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBASW5wdXQoKSBwYWdlSW5kZXg6IG51bWJlciA9IDE7XHJcbiAgQElucHV0KCkgcHJldmlvdXNQYWdlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRpcjogJ3J0bCcgfCAnbHRyJyA9ICdydGwnO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gMTA7XHJcbiAgQElucHV0KCkgcHJldmlvdXNMYWJlbCA9ICdQcmV2aW91cyc7XHJcbiAgQElucHV0KCkgbmV4dExhYmVsID0gJ05leHQnO1xyXG4gIEBJbnB1dCgpIGZpcnN0TGFiZWwgPSAnR28gZmlyc3QnO1xyXG4gIEBJbnB1dCgpIGxhc3RMYWJlbCA9ICdHbyBMYXN0JztcclxuICBASW5wdXQoKSBsZW5ndGggPSAwO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDUwLCAxMDBdO1xyXG5cclxuXHJcbiAgZ2V0IHBhZ2VDb3VudCgpIHtcclxuICAgIGlmICh0aGlzLnBhZ2VTaXplID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE1hdGguY2VpbCgodGhpcy5sZW5ndGggPz8gMSkgLyB0aGlzLnBhZ2VTaXplKSA7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIGdvRmlyc3QoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGdvTGFzdCgpIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5wYWdlQ291bnQ7XHJcbiAgICB0aGlzLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG5leHQoKSB7XHJcbiAgICBpZiAodGhpcy5wYWdlSW5kZXghIDwgdGhpcy5wYWdlQ291bnQpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXghKys7XHJcbiAgICAgIHRoaXMuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJldmlvdXMoKSB7XHJcbiAgICBpZiAodGhpcy5wYWdlSW5kZXghID4gMSkge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCEtLTtcclxuICAgICAgdGhpcy5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnb1RvUGFnZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID4gMCAmJiBldmVudC50YXJnZXQudmFsdWUgPD0gdGhpcy5wYWdlQ291bnQpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA+IHRoaXMucGFnZUNvdW50KSB7XHJcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5wYWdlQ291bnQ7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA8IDEpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICByZXNldChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmVtaXQoKTtcclxuICB9XHJcblxyXG5cclxuICBlbWl0KCkge1xyXG4gICAgY29uc3QgZGF0YTogUGFnZUV2ZW50ID0gbmV3IFBhZ2VFdmVudCgpO1xyXG4gICAgZGF0YS5wYWdlSW5kZXggPSAoK3RoaXMucGFnZUluZGV4KSAtIDE7XHJcbiAgICBkYXRhLmxlbmd0aCA9ICt0aGlzLmxlbmd0aDtcclxuICAgIGRhdGEucGFnZVNpemUgPSArdGhpcy5wYWdlU2l6ZTtcclxuICAgIGRhdGEucHJldmlvdXNQYWdlSW5kZXggPSArdGhpcy5wcmV2aW91c1BhZ2VJbmRleDtcclxuICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KGRhdGEpO1xyXG4gIH1cclxufVxyXG4iXX0=