@angular-generic-table/core
Version:
A generic table component for Angular
149 lines (148 loc) • 17.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { GenericTableComponent } from './generic-table.component';
var GtPaginationComponent = /** @class */ (function () {
function GtPaginationComponent() {
this.ready = false;
}
Object.defineProperty(GtPaginationComponent.prototype, "genericTable", {
get: /**
* @return {?}
*/
function () {
return this._genericTable;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
if (value) {
value.gtEvent.subscribe(function (res) {
if (res.name === 'gt-info' && res.value.pageTotal > 0) {
_this.ready = true;
}
});
}
this._genericTable = value;
},
enumerable: true,
configurable: true
});
GtPaginationComponent.decorators = [
{ type: Component, args: [{
selector: 'gt-pagination',
template: "<nav class=\"gt-pagination\" aria-label=\"Table navigation\" *ngIf=\"genericTable && genericTable.gtInfo && ready && genericTable.gtData?.length > 0\" [ngClass]=\"{'no-data':genericTable.gtInfo.pageTotal === 0}\">\n <ul class=\"pagination\" [ngClass]=\"gtClasses\">\n <li class=\"page-item\" [ngClass]=\"{'disabled' : genericTable.gtInfo.pageCurrent === 1 || genericTable.loading }\"><a class=\"page-link\" href=\"javascript:void(0);\" (click)=\"genericTable.gtInfo.pageCurrent > 1 && genericTable.previousPage()\" [attr.aria-label]=\"genericTable.gtTexts.paginatePrevious\"><span aria-hidden=\"true\">«</span><span class=\"sr-only\">{{genericTable.gtTexts.paginatePrevious}}</span></a></li>\n <li class=\"page-item\" [ngClass]=\"{'disabled' : genericTable.loading && genericTable.gtInfo.pageCurrent !== page, 'active' : genericTable.gtInfo.pageCurrent === page }\" *ngFor=\"let page of genericTable.gtInfo.pageTotal | gtPaginationPipe:genericTable.gtInfo.pageCurrent\"><a class=\"page-link\" [tabindex]=\"page === true ? -1:0\" href=\"javascript:void(0);\" (click)=\"page === true ? '':genericTable.goToPage(page)\">{{page === true ? '…':page}}</a></li>\n <li class=\"page-item\" [ngClass]=\"{'disabled' : genericTable.gtInfo.pageCurrent === genericTable.gtInfo.pageTotal || genericTable.loading }\"><a class=\"page-link gt-link\" href=\"javascript:void(0);\" (click)=\"genericTable.gtInfo.pageCurrent !== genericTable.gtInfo.pageTotal && genericTable.nextPage()\" [attr.aria-label]=\"genericTable.gtTexts.paginateNext\"><span aria-hidden=\"true\">»</span><span class=\"sr-only\">{{genericTable.gtTexts.paginateNext}}</span></a></li>\n </ul>\n </nav>\n ",
styles: ['.gt-link {cursor: pointer;}']
},] },
];
/** @nocollapse */
GtPaginationComponent.propDecorators = {
"genericTable": [{ type: Input },],
"gtClasses": [{ type: Input },],
};
return GtPaginationComponent;
}());
export { GtPaginationComponent };
function GtPaginationComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
GtPaginationComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
GtPaginationComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
GtPaginationComponent.propDecorators;
/** @type {?} */
GtPaginationComponent.prototype._genericTable;
/** @type {?} */
GtPaginationComponent.prototype.gtClasses;
/** @type {?} */
GtPaginationComponent.prototype.ready;
}
import { Pipe } from '@angular/core';
var PaginationPipe = /** @class */ (function () {
function PaginationPipe() {
}
/**
* @param {?} totalPages
* @param {?} currentPage
* @return {?}
*/
PaginationPipe.prototype.transform = /**
* @param {?} totalPages
* @param {?} currentPage
* @return {?}
*/
function (totalPages, currentPage) {
if (totalPages === 0) {
return [1];
}
var /** @type {?} */ pagination = []; // create new empty array for pagination
var /** @type {?} */ siblings = 2; // sibling elements ie. number of elements on each side of current page
var /** @type {?} */ paginationLength = totalPages < siblings * 2 + 1 ? totalPages : siblings * 2 + 1; // number of elements in pagination array
var /** @type {?} */ start = currentPage <= siblings ? 1 : currentPage - siblings; // starting position for array
var /** @type {?} */ modifier = totalPages - (currentPage + siblings) <= 0
? totalPages - (currentPage + siblings)
: 0; // modifier for pagination values
var /** @type {?} */ modifiedPosition = start + modifier <= 0 ? 1 : start + modifier;
// push pages to pagination array
for (var /** @type {?} */ i = 0; i < paginationLength; i++) {
pagination.push(modifiedPosition + i);
}
// if first page is not included in pagination...
if (pagination.indexOf(1) === -1) {
// ...check if second page is in pagination...
if (pagination.indexOf(2) === -1) {
// ...if not check if total number of pages equals seven and number of siblings are two...
if (totalPages === 7 && siblings === 2) {
// ...add second page and don't convert page number to ellipsis
pagination.unshift(2);
}
else {
// ...if not, use this placeholder for ellipsis instead of actual page number
pagination[0] = true;
}
}
// ...add first page as first array item
pagination.unshift(1);
}
else if (totalPages > paginationLength) {
// if first page is included add extra page to keep number of items consistent
pagination.splice(paginationLength, 0, paginationLength + 1);
}
// check if last page is included in pagination...
if (pagination.indexOf(totalPages) === -1) {
// ...if not, page next to last should either show ellipsis or actual page number for the page
pagination[pagination.length - 1] =
pagination[pagination.length - 1] === totalPages - 1
? totalPages - 1
: true;
// ...add last page to pagination
pagination.push(totalPages);
}
return pagination;
};
PaginationPipe.decorators = [
{ type: Pipe, args: [{
name: 'gtPaginationPipe'
},] },
];
return PaginationPipe;
}());
export { PaginationPipe };
function PaginationPipe_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
PaginationPipe.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
PaginationPipe.ctorParameters;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3QtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYW5ndWxhci1nZW5lcmljLXRhYmxlL2NvcmUvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2d0LXBhZ2luYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O3FCQWlDbEQsS0FBSzs7SUFsQnBCLHNCQUFJLCtDQUFZOzs7O1FBQWhCO1lBQ0MsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDMUI7Ozs7O2tCQUdnQixLQUFzQzs7WUFDdEQsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDWCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFDLEdBQVE7b0JBQ2hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZELEtBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO3FCQUNsQjtpQkFDRCxDQUFDLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzs7O09BWDNCOztnQkFmRCxTQUFTLFNBQUM7b0JBQ1YsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSwwcERBT047b0JBQ0osTUFBTSxFQUFFLENBQUMsNkJBQTZCLENBQUM7aUJBQ3ZDOzs7O2lDQU1DLEtBQUs7OEJBYUwsS0FBSzs7Z0NBakNQOztTQWVhLHFCQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJsQyxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0lBTW5ELGtDQUFT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ZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHZW5lcmljVGFibGVDb21wb25lbnQgfSBmcm9tICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnZ3QtcGFnaW5hdGlvbicsXG5cdHRlbXBsYXRlOiBgPG5hdiBjbGFzcz1cImd0LXBhZ2luYXRpb25cIiBhcmlhLWxhYmVsPVwiVGFibGUgbmF2aWdhdGlvblwiICpuZ0lmPVwiZ2VuZXJpY1RhYmxlICYmIGdlbmVyaWNUYWJsZS5ndEluZm8gJiYgcmVhZHkgJiYgZ2VuZXJpY1RhYmxlLmd0RGF0YT8ubGVuZ3RoID4gMFwiIFtuZ0NsYXNzXT1cInsnbm8tZGF0YSc6Z2VuZXJpY1RhYmxlLmd0SW5mby5wYWdlVG90YWwgPT09IDB9XCI+XG4gIDx1bCBjbGFzcz1cInBhZ2luYXRpb25cIiBbbmdDbGFzc109XCJndENsYXNzZXNcIj5cbiAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6IGdlbmVyaWNUYWJsZS5ndEluZm8ucGFnZUN1cnJlbnQgPT09IDEgfHwgZ2VuZXJpY1RhYmxlLmxvYWRpbmcgfVwiPjxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiAoY2xpY2spPVwiZ2VuZXJpY1RhYmxlLmd0SW5mby5wYWdlQ3VycmVudCA+IDEgJiYgZ2VuZXJpY1RhYmxlLnByZXZpb3VzUGFnZSgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJnZW5lcmljVGFibGUuZ3RUZXh0cy5wYWdpbmF0ZVByZXZpb3VzXCI+PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JmxhcXVvOzwvc3Bhbj48c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57e2dlbmVyaWNUYWJsZS5ndFRleHRzLnBhZ2luYXRlUHJldmlvdXN9fTwvc3Bhbj48L2E+PC9saT5cbiAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6IGdlbmVyaWNUYWJsZS5sb2FkaW5nICYmIGdlbmVyaWNUYWJsZS5ndEluZm8ucGFnZUN1cnJlbnQgIT09IHBhZ2UsICdhY3RpdmUnIDogZ2VuZXJpY1RhYmxlLmd0SW5mby5wYWdlQ3VycmVudCA9PT0gcGFnZSB9XCIgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgZ2VuZXJpY1RhYmxlLmd0SW5mby5wYWdlVG90YWwgfCBndFBhZ2luYXRpb25QaXBlOmdlbmVyaWNUYWJsZS5ndEluZm8ucGFnZUN1cnJlbnRcIj48YSBjbGFzcz1cInBhZ2UtbGlua1wiIFt0YWJpbmRleF09XCJwYWdlID09PSB0cnVlID8gLTE6MFwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgKGNsaWNrKT1cInBhZ2UgPT09IHRydWUgPyAnJzpnZW5lcmljVGFibGUuZ29Ub1BhZ2UocGFnZSlcIj57e3BhZ2UgPT09IHRydWUgPyAnJmhlbGxpcDsnOnBhZ2V9fTwvYT48L2xpPlxuICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnIDogZ2VuZXJpY1RhYmxlLmd0SW5mby5wYWdlQ3VycmVudCA9PT0gZ2VuZXJpY1RhYmxlLmd0SW5mby5wYWdlVG90YWwgfHwgZ2VuZXJpY1RhYmxlLmxvYWRpbmcgfVwiPjxhIGNsYXNzPVwicGFnZS1saW5rIGd0LWxpbmtcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIChjbGljayk9XCJnZW5lcmljVGFibGUuZ3RJbmZvLnBhZ2VDdXJyZW50ICE9PSBnZW5lcmljVGFibGUuZ3RJbmZvLnBhZ2VUb3RhbCAmJiBnZW5lcmljVGFibGUubmV4dFBhZ2UoKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2VuZXJpY1RhYmxlLmd0VGV4dHMucGFnaW5hdGVOZXh0XCI+PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnJhcXVvOzwvc3Bhbj48c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57e2dlbmVyaWNUYWJsZS5ndFRleHRzLnBhZ2luYXRlTmV4dH19PC9zcGFuPjwvYT48L2xpPlxuICA8L3VsPlxuICA8L25hdj5cbiAgICBgLFxuXHRzdHlsZXM6IFsnLmd0LWxpbmsge2N1cnNvcjogcG9pbnRlcjt9J11cbn0pXG5leHBvcnQgY2xhc3MgR3RQYWdpbmF0aW9uQ29tcG9uZW50IHtcblx0Z2V0IGdlbmVyaWNUYWJsZSgpOiBHZW5lcmljVGFibGVDb21wb25lbnQ8YW55LCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5fZ2VuZXJpY1RhYmxlO1xuXHR9XG5cblx0QElucHV0KClcblx0c2V0IGdlbmVyaWNUYWJsZSh2YWx1ZTogR2VuZXJpY1RhYmxlQ29tcG9uZW50PGFueSwgYW55Pikge1xuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0dmFsdWUuZ3RFdmVudC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChyZXMubmFtZSA9PT0gJ2d0LWluZm8nICYmIHJlcy52YWx1ZS5wYWdlVG90YWwgPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5yZWFkeSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLl9nZW5lcmljVGFibGUgPSB2YWx1ZTtcblx0fVxuXG5cdHByaXZhdGUgX2dlbmVyaWNUYWJsZTogR2VuZXJpY1RhYmxlQ29tcG9uZW50PGFueSwgYW55Pjtcblx0QElucHV0KCkgZ3RDbGFzc2VzOiBzdHJpbmc7XG5cdHB1YmxpYyByZWFkeSA9IGZhbHNlO1xufVxuaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AUGlwZSh7XG5cdG5hbWU6ICdndFBhZ2luYXRpb25QaXBlJ1xufSlcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXHR0cmFuc2Zvcm0odG90YWxQYWdlczogbnVtYmVyLCBjdXJyZW50UGFnZTogbnVtYmVyKTogQXJyYXk8YW55PiB7XG5cdFx0aWYgKHRvdGFsUGFnZXMgPT09IDApIHtcblx0XHRcdHJldHVybiBbMV07XG5cdFx0fVxuXHRcdGNvbnN0IHBhZ2luYXRpb246IEFycmF5PGFueT4gPSBbXTsgLy8gY3JlYXRlIG5ldyBlbXB0eSBhcnJheSBmb3IgcGFnaW5hdGlvblxuXHRcdGNvbnN0IHNpYmxpbmdzID0gMjsgLy8gc2libGluZyBlbGVtZW50cyBpZS4gbnVtYmVyIG9mIGVsZW1lbnRzIG9uIGVhY2ggc2lkZSBvZiBjdXJyZW50IHBhZ2Vcblx0XHRjb25zdCBwYWdpbmF0aW9uTGVuZ3RoID1cblx0XHRcdHRvdGFsUGFnZXMgPCBzaWJsaW5ncyAqIDIgKyAxID8gdG90YWxQYWdlcyA6IHNpYmxpbmdzICogMiArIDE7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiBwYWdpbmF0aW9uIGFycmF5XG5cdFx0Y29uc3Qgc3RhcnQgPSBjdXJyZW50UGFnZSA8PSBzaWJsaW5ncyA/IDEgOiBjdXJyZW50UGFnZSAtIHNpYmxpbmdzOyAvLyBzdGFydGluZyBwb3NpdGlvbiBmb3IgYXJyYXlcblx0XHRjb25zdCBtb2RpZmllciA9XG5cdFx0XHR0b3RhbFBhZ2VzIC0gKGN1cnJlbnRQYWdlICsgc2libGluZ3MpIDw9IDBcblx0XHRcdFx0PyB0b3RhbFBhZ2VzIC0gKGN1cnJlbnRQYWdlICsgc2libGluZ3MpXG5cdFx0XHRcdDogMDsgLy8gbW9kaWZpZXIgZm9yIHBhZ2luYXRpb24gdmFsdWVzXG5cdFx0Y29uc3QgbW9kaWZpZWRQb3NpdGlvbiA9IHN0YXJ0ICsgbW9kaWZpZXIgPD0gMCA/IDEgOiBzdGFydCArIG1vZGlmaWVyO1xuXG5cdFx0Ly8gcHVzaCBwYWdlcyB0byBwYWdpbmF0aW9uIGFycmF5XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYWdpbmF0aW9uTGVuZ3RoOyBpKyspIHtcblx0XHRcdHBhZ2luYXRpb24ucHVzaChtb2RpZmllZFBvc2l0aW9uICsgaSk7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgZmlyc3QgcGFnZSBpcyBub3QgaW5jbHVkZWQgaW4gcGFnaW5hdGlvbi4uLlxuXHRcdGlmIChwYWdpbmF0aW9uLmluZGV4T2YoMSkgPT09IC0xKSB7XG5cdFx0XHQvLyAuLi5jaGVjayBpZiBzZWNvbmQgcGFnZSBpcyBpbiBwYWdpbmF0aW9uLi4uXG5cdFx0XHRpZiAocGFnaW5hdGlvbi5pbmRleE9mKDIpID09PSAtMSkge1xuXHRcdFx0XHQvLyAuLi5pZiBub3QgY2hlY2sgaWYgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGVxdWFscyBzZXZlbiBhbmQgbnVtYmVyIG9mIHNpYmxpbmdzIGFyZSB0d28uLi5cblx0XHRcdFx0aWYgKHRvdGFsUGFnZXMgPT09IDcgJiYgc2libGluZ3MgPT09IDIpIHtcblx0XHRcdFx0XHQvLyAuLi5hZGQgc2Vjb25kIHBhZ2UgYW5kIGRvbid0IGNvbnZlcnQgcGFnZSBudW1iZXIgdG8gZWxsaXBzaXNcblx0XHRcdFx0XHRwYWdpbmF0aW9uLnVuc2hpZnQoMik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gLi4uaWYgbm90LCB1c2UgdGhpcyBwbGFjZWhvbGRlciBmb3IgZWxsaXBzaXMgaW5zdGVhZCBvZiBhY3R1YWwgcGFnZSBudW1iZXJcblx0XHRcdFx0XHRwYWdpbmF0aW9uWzBdID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gLi4uYWRkIGZpcnN0IHBhZ2UgYXMgZmlyc3QgYXJyYXkgaXRlbVxuXHRcdFx0cGFnaW5hdGlvbi51bnNoaWZ0KDEpO1xuXHRcdH0gZWxzZSBpZiAodG90YWxQYWdlcyA+IHBhZ2luYXRpb25MZW5ndGgpIHtcblx0XHRcdC8vIGlmIGZpcnN0IHBhZ2UgaXMgaW5jbHVkZWQgYWRkIGV4dHJhIHBhZ2UgdG8ga2VlcCBudW1iZXIgb2YgaXRlbXMgY29uc2lzdGVudFxuXHRcdFx0cGFnaW5hdGlvbi5zcGxpY2UocGFnaW5hdGlvbkxlbmd0aCwgMCwgcGFnaW5hdGlvbkxlbmd0aCArIDEpO1xuXHRcdH1cblx0XHQvLyBjaGVjayBpZiBsYXN0IHBhZ2UgaXMgaW5jbHVkZWQgaW4gcGFnaW5hdGlvbi4uLlxuXHRcdGlmIChwYWdpbmF0aW9uLmluZGV4T2YodG90YWxQYWdlcykgPT09IC0xKSB7XG5cdFx0XHQvLyAuLi5pZiBub3QsIHBhZ2UgbmV4dCB0byBsYXN0IHNob3VsZCBlaXRoZXIgc2hvdyBlbGxpcHNpcyBvciBhY3R1YWwgcGFnZSBudW1iZXIgZm9yIHRoZSBwYWdlXG5cdFx0XHRwYWdpbmF0aW9uW3BhZ2luYXRpb24ubGVuZ3RoIC0gMV0gPVxuXHRcdFx0XHRwYWdpbmF0aW9uW3BhZ2luYXRpb24ubGVuZ3RoIC0gMV0gPT09IHRvdGFsUGFnZXMgLSAxXG5cdFx0XHRcdFx0PyB0b3RhbFBhZ2VzIC0gMVxuXHRcdFx0XHRcdDogdHJ1ZTtcblxuXHRcdFx0Ly8gLi4uYWRkIGxhc3QgcGFnZSB0byBwYWdpbmF0aW9uXG5cdFx0XHRwYWdpbmF0aW9uLnB1c2godG90YWxQYWdlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhZ2luYXRpb247XG5cdH1cbn1cbiJdfQ==