UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

108 lines 14.6 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core'; import { PaginationItemType } from './pagination.model'; import * as i0 from "@angular/core"; import * as i1 from "./pagination.builder"; import * as i2 from "@angular/router"; import * as i3 from "@angular/common"; /** * The `PaginationComponent` is a generic component that is used for * all lists in Spartacus that require pagination. The component supports * all common features, which can be configured or hidden by CSS. */ export class PaginationComponent { constructor(paginationBuilder, activatedRoute) { this.paginationBuilder = paginationBuilder; this.activatedRoute = activatedRoute; this.viewPageEvent = new EventEmitter(); this.pages = []; } get pagination() { return this._pagination; } set pagination(value) { this._pagination = value; this.render(value); } render(pagination) { if (!pagination) { return; } this.pages = this.paginationBuilder.paginate(pagination.totalPages, pagination.currentPage); } /** * Format aria-label based on pagination item type. * * @param label string * @param type PaginationItemType * @returns string */ getAriaLabel(label, type) { // Convert 'Start' to First, and 'End' to Last for a more natural screen read. type = type === PaginationItemType.START ? PaginationItemType.FIRST : type; type = type === PaginationItemType.END ? PaginationItemType.LAST : type; return type === PaginationItemType.PAGE ? `${type} ${label}` : `${type} ${PaginationItemType.PAGE}`; } /** * Indicates whether the given item is the current item. * * @param item PaginationItem * @returns boolean */ isCurrent(item) { return (item.type === PaginationItemType.PAGE && item.number === this.pagination.currentPage); } /** * Indicates whether the pagination item is inactive. This is used * to disabled a link or set the tabindex to `-1`. * * Defaults to true * * @param item PaginationItem * @returns returns -1 in case of a disabled */ isInactive(item) { return (!item.hasOwnProperty('number') || item.number === this.pagination.currentPage); } getQueryParams(item) { const queryParams = Object.assign({}, this.activatedRoute.snapshot.queryParams); if (this.queryParam && item.number < this.pagination.totalPages && !this.isCurrent(item)) { queryParams[this.queryParam] = item.number; } // omit the page number from the query parameters in case it's the default // to clean up the experience and avoid unnecessary polluting of the URL if (queryParams[this.queryParam] === this.defaultPage) { delete queryParams[this.queryParam]; } return queryParams; } pageChange(page) { this.viewPageEvent.emit(page.number); } } PaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PaginationComponent, deps: [{ token: i1.PaginationBuilder }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); PaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: PaginationComponent, selector: "cx-pagination", inputs: { pageRoute: "pageRoute", queryParam: "queryParam", defaultPage: "defaultPage", pagination: "pagination" }, outputs: { viewPageEvent: "viewPageEvent" }, ngImport: i0, template: "<a\n *ngFor=\"let item of pages\"\n [class]=\"item.type\"\n [class.disabled]=\"isInactive(item)\"\n [class.current]=\"isCurrent(item)\"\n [routerLink]=\"pageRoute\"\n [queryParams]=\"getQueryParams(item)\"\n [tabIndex]=\"isInactive(item) ? -1 : 0\"\n (click)=\"pageChange(item)\"\n [attr.aria-label]=\"getAriaLabel(item.label, item.type)\"\n>\n {{ item.label }}\n</a>\n", directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PaginationComponent, decorators: [{ type: Component, args: [{ selector: 'cx-pagination', templateUrl: './pagination.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.PaginationBuilder }, { type: i2.ActivatedRoute }]; }, propDecorators: { pageRoute: [{ type: Input }], queryParam: [{ type: Input }], defaultPage: [{ type: Input }], pagination: [{ type: Input }], viewPageEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL2xpc3QtbmF2aWdhdGlvbi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9zaGFyZWQvY29tcG9uZW50cy9saXN0LW5hdmlnYXRpb24vcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7QUFFeEU7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyxtQkFBbUI7SUEwQjlCLFlBQ1UsaUJBQW9DLEVBQ3BDLGNBQThCO1FBRDlCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBTjlCLGtCQUFhLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFM0UsVUFBSyxHQUFxQixFQUFFLENBQUM7SUFLMUIsQ0FBQztJQWZKLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBYSxVQUFVLENBQUMsS0FBc0I7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBV1MsTUFBTSxDQUFDLFVBQTJCO1FBQzFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQzFDLFVBQVUsQ0FBQyxVQUFVLEVBQ3JCLFVBQVUsQ0FBQyxXQUFXLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUF3QjtRQUNsRCw4RUFBOEU7UUFDOUUsSUFBSSxHQUFHLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNFLElBQUksR0FBRyxJQUFJLEtBQUssa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RSxPQUFPLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxJQUFJO1lBQ3JDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDcEIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixPQUFPLENBQ0wsSUFBSSxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxJQUFJO1lBQ3JDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxVQUFVLENBQUMsSUFBb0I7UUFDN0IsT0FBTyxDQUNMLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDOUIsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FDNUMsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBb0I7UUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDL0IsRUFBRSxFQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDekMsQ0FBQztRQUNGLElBQ0UsSUFBSSxDQUFDLFVBQVU7WUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVTtZQUN4QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ3JCO1lBQ0EsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzVDO1FBQ0QsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQW9CO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDOztnSEE1R1UsbUJBQW1CO29HQUFuQixtQkFBbUIsc05DdEJoQyw2WEFhQTsyRkRTYSxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFdBQVcsRUFBRSw2QkFBNkI7b0JBQzFDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDtxSUFHVSxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBQYWdpbmF0aW9uTW9kZWwgfSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3BhZ2luYXRpb24uYnVpbGRlcic7XG5pbXBvcnQgeyBQYWdpbmF0aW9uSXRlbSwgUGFnaW5hdGlvbkl0ZW1UeXBlIH0gZnJvbSAnLi9wYWdpbmF0aW9uLm1vZGVsJztcblxuLyoqXG4gKiBUaGUgYFBhZ2luYXRpb25Db21wb25lbnRgIGlzIGEgZ2VuZXJpYyBjb21wb25lbnQgdGhhdCBpcyB1c2VkIGZvclxuICogYWxsIGxpc3RzIGluIFNwYXJ0YWN1cyB0aGF0IHJlcXVpcmUgcGFnaW5hdGlvbi4gVGhlIGNvbXBvbmVudCBzdXBwb3J0c1xuICogYWxsIGNvbW1vbiBmZWF0dXJlcywgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgb3IgaGlkZGVuIGJ5IENTUy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3gtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25Db21wb25lbnQge1xuICAvKiogVGhlIChvcHRpb25hbCkgcGFnZVJvdXRlIHVzZWQgZm9yIHRoZSBhbmNob3IgbGlua3MgY3JlYXRlZCBpbiB0aGUgcGFnaW5hdGlvbiAgICovXG4gIEBJbnB1dCgpIHBhZ2VSb3V0ZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgKG9wdGlvbmFsKSBxdWVyeSBwYXJhbWV0ZXIgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIHBhZ2Ugcm91dGUuICAqL1xuICBASW5wdXQoKSBxdWVyeVBhcmFtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW5ldmVyIHRoZXJlJ3MgYSBkZWZhdWx0IHBhZ2Ugc3BlY2lmaWVkLCB0aGUgcm91dGluZyBsb2dpY1xuICAgKiB3aWxsIG9taXQgdGhlIHBhZ2UgbnVtYmVyIGluIHJvdXRlTGluayBvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgQElucHV0KCkgZGVmYXVsdFBhZ2U7XG5cbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbk1vZGVsO1xuICBnZXQgcGFnaW5hdGlvbigpOiBQYWdpbmF0aW9uTW9kZWwge1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uO1xuICB9XG4gIEBJbnB1dCgpIHNldCBwYWdpbmF0aW9uKHZhbHVlOiBQYWdpbmF0aW9uTW9kZWwpIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5yZW5kZXIodmFsdWUpO1xuICB9XG5cbiAgQE91dHB1dCgpIHZpZXdQYWdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcGFnZXM6IFBhZ2luYXRpb25JdGVtW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhZ2luYXRpb25CdWlsZGVyOiBQYWdpbmF0aW9uQnVpbGRlcixcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHt9XG5cbiAgcHJvdGVjdGVkIHJlbmRlcihwYWdpbmF0aW9uOiBQYWdpbmF0aW9uTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIXBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYWdlcyA9IHRoaXMucGFnaW5hdGlvbkJ1aWxkZXIucGFnaW5hdGUoXG4gICAgICBwYWdpbmF0aW9uLnRvdGFsUGFnZXMsXG4gICAgICBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYXJpYS1sYWJlbCBiYXNlZCBvbiBwYWdpbmF0aW9uIGl0ZW0gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIGxhYmVsIHN0cmluZ1xuICAgKiBAcGFyYW0gdHlwZSBQYWdpbmF0aW9uSXRlbVR5cGVcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBnZXRBcmlhTGFiZWwobGFiZWw6IHN0cmluZywgdHlwZTogUGFnaW5hdGlvbkl0ZW1UeXBlKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0ICdTdGFydCcgdG8gRmlyc3QsIGFuZCAnRW5kJyB0byBMYXN0IGZvciBhIG1vcmUgbmF0dXJhbCBzY3JlZW4gcmVhZC5cbiAgICB0eXBlID0gdHlwZSA9PT0gUGFnaW5hdGlvbkl0ZW1UeXBlLlNUQVJUID8gUGFnaW5hdGlvbkl0ZW1UeXBlLkZJUlNUIDogdHlwZTtcbiAgICB0eXBlID0gdHlwZSA9PT0gUGFnaW5hdGlvbkl0ZW1UeXBlLkVORCA/IFBhZ2luYXRpb25JdGVtVHlwZS5MQVNUIDogdHlwZTtcbiAgICByZXR1cm4gdHlwZSA9PT0gUGFnaW5hdGlvbkl0ZW1UeXBlLlBBR0VcbiAgICAgID8gYCR7dHlwZX0gJHtsYWJlbH1gXG4gICAgICA6IGAke3R5cGV9ICR7UGFnaW5hdGlvbkl0ZW1UeXBlLlBBR0V9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBpcyB0aGUgY3VycmVudCBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gaXRlbSBQYWdpbmF0aW9uSXRlbVxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBpc0N1cnJlbnQoaXRlbTogUGFnaW5hdGlvbkl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXRlbS50eXBlID09PSBQYWdpbmF0aW9uSXRlbVR5cGUuUEFHRSAmJlxuICAgICAgaXRlbS5udW1iZXIgPT09IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBhZ2luYXRpb24gaXRlbSBpcyBpbmFjdGl2ZS4gVGhpcyBpcyB1c2VkXG4gICAqIHRvIGRpc2FibGVkIGEgbGluayBvciBzZXQgdGhlIHRhYmluZGV4IHRvIGAtMWAuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWVcbiAgICpcbiAgICogQHBhcmFtIGl0ZW0gUGFnaW5hdGlvbkl0ZW1cbiAgICogQHJldHVybnMgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGEgZGlzYWJsZWRcbiAgICovXG4gIGlzSW5hY3RpdmUoaXRlbTogUGFnaW5hdGlvbkl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIWl0ZW0uaGFzT3duUHJvcGVydHkoJ251bWJlcicpIHx8XG4gICAgICBpdGVtLm51bWJlciA9PT0gdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXG4gICAgKTtcbiAgfVxuXG4gIGdldFF1ZXJ5UGFyYW1zKGl0ZW06IFBhZ2luYXRpb25JdGVtKTogUGFyYW1zIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHRoaXMucXVlcnlQYXJhbSAmJlxuICAgICAgaXRlbS5udW1iZXIgPCB0aGlzLnBhZ2luYXRpb24udG90YWxQYWdlcyAmJlxuICAgICAgIXRoaXMuaXNDdXJyZW50KGl0ZW0pXG4gICAgKSB7XG4gICAgICBxdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5UGFyYW1dID0gaXRlbS5udW1iZXI7XG4gICAgfVxuICAgIC8vIG9taXQgdGhlIHBhZ2UgbnVtYmVyIGZyb20gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gY2FzZSBpdCdzIHRoZSBkZWZhdWx0XG4gICAgLy8gdG8gY2xlYW4gdXAgdGhlIGV4cGVyaWVuY2UgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHBvbGx1dGluZyBvZiB0aGUgVVJMXG4gICAgaWYgKHF1ZXJ5UGFyYW1zW3RoaXMucXVlcnlQYXJhbV0gPT09IHRoaXMuZGVmYXVsdFBhZ2UpIHtcbiAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5UGFyYW1dO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlQYXJhbXM7XG4gIH1cblxuICBwYWdlQ2hhbmdlKHBhZ2U6IFBhZ2luYXRpb25JdGVtKTogdm9pZCB7XG4gICAgdGhpcy52aWV3UGFnZUV2ZW50LmVtaXQocGFnZS5udW1iZXIpO1xuICB9XG59XG4iLCI8YVxuICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYWdlc1wiXG4gIFtjbGFzc109XCJpdGVtLnR5cGVcIlxuICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNJbmFjdGl2ZShpdGVtKVwiXG4gIFtjbGFzcy5jdXJyZW50XT1cImlzQ3VycmVudChpdGVtKVwiXG4gIFtyb3V0ZXJMaW5rXT1cInBhZ2VSb3V0ZVwiXG4gIFtxdWVyeVBhcmFtc109XCJnZXRRdWVyeVBhcmFtcyhpdGVtKVwiXG4gIFt0YWJJbmRleF09XCJpc0luYWN0aXZlKGl0ZW0pID8gLTEgOiAwXCJcbiAgKGNsaWNrKT1cInBhZ2VDaGFuZ2UoaXRlbSlcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEFyaWFMYWJlbChpdGVtLmxhYmVsLCBpdGVtLnR5cGUpXCJcbj5cbiAge3sgaXRlbS5sYWJlbCB9fVxuPC9hPlxuIl19