UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

180 lines 37.3 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { SelectType } from '../../enums/select-type.enum'; import { PaginationType } from '../../enums/pagination-type.enum'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../select/select.component"; export class PaginationComponent { cdr; data = []; itemsPerPageOptions = [ { value: '10', label: '10' }, { value: '20', label: '20' }, { value: '30', label: '30' } ]; allPages = 1; itemsPerPage = 10; allItems = 0; currentPage = 1; type = PaginationType.Standard; // Valor padrão pageChange = new EventEmitter(); itemsPerPageChange = new EventEmitter(); displayedData = []; pagesArray = []; visiblePages = []; maxVisiblePages = 5; currentItemsPerPageValue = '10'; currentPageSelectValue = '1'; SelectType = SelectType; constructor(cdr) { this.cdr = cdr; } isStandardType() { return this.type === PaginationType.Standard; } isContextualType() { return this.type === PaginationType.Contextual; } ngOnInit() { this.updatePagesArray(); this.updatePaginationData(); this.currentItemsPerPageValue = this.itemsPerPage.toString(); this.currentPageSelectValue = this.currentPage.toString(); } ngOnChanges(changes) { if (changes['data'] || changes['itemsPerPage'] || changes['currentPage']) { this.updatePaginationData(); } if (changes['allPages']) { this.updatePagesArray(); } if (changes['currentPage']) { this.currentPageSelectValue = this.currentPage.toString(); } if (changes['itemsPerPage']) { this.currentItemsPerPageValue = this.itemsPerPage.toString(); } } updatePaginationData() { this.allItems = this.data.length; this.allPages = Math.ceil(this.allItems / this.itemsPerPage); this.currentPage = Math.min(this.currentPage, this.allPages || 1); this.updatePagesArray(); this.updateDisplayedData(); this.updateVisiblePages(); } updatePagesArray() { this.pagesArray = Array.from({ length: this.allPages }, (_, i) => ({ value: (i + 1).toString(), label: (i + 1).toString() })); } updateDisplayedData() { const startIndex = (this.currentPage - 1) * this.itemsPerPage; const endIndex = startIndex + this.itemsPerPage; this.displayedData = this.data.slice(startIndex, endIndex); this.cdr.detectChanges(); } updateVisiblePages() { this.visiblePages = []; if (this.allPages <= this.maxVisiblePages) { for (let i = 1; i <= this.allPages; i++) { this.visiblePages.push(i); } } else { this.visiblePages.push(1); let startPage = Math.max(2, this.currentPage - 1); let endPage = Math.min(this.allPages - 1, this.currentPage + 1); if (this.currentPage <= 3) endPage = 4; if (this.currentPage >= this.allPages - 2) startPage = this.allPages - 3; if (startPage > 2) this.visiblePages.push('...'); for (let i = startPage; i <= endPage; i++) { this.visiblePages.push(i); } if (endPage < this.allPages - 1) this.visiblePages.push('...'); this.visiblePages.push(this.allPages); } } changeItemsPerPage(selected) { if (selected && selected.length > 0) { const value = Number(selected[0].value); this.itemsPerPage = value; this.currentItemsPerPageValue = value.toString(); this.itemsPerPageChange.emit(value); this.currentPage = 1; this.currentPageSelectValue = '1'; this.pageChange.emit(1); this.allPages = Math.ceil(this.allItems / this.itemsPerPage); this.updatePagesArray(); this.updateDisplayedData(); this.updateVisiblePages(); } } goToPage(selection) { let selectedPage; if (typeof selection === 'number' || typeof selection === 'string') { selectedPage = Number(selection); } else if (Array.isArray(selection) && selection.length > 0) { selectedPage = Number(selection[0].value); } else { return; } if (selectedPage >= 1 && selectedPage <= this.allPages) { this.currentPage = selectedPage; this.currentPageSelectValue = selectedPage.toString(); this.pageChange.emit(this.currentPage); this.updateDisplayedData(); this.updateVisiblePages(); } } prevPage() { if (this.currentPage > 1) { this.currentPage--; this.currentPageSelectValue = this.currentPage.toString(); this.pageChange.emit(this.currentPage); this.updateDisplayedData(); this.updateVisiblePages(); } } nextPage() { if (this.currentPage < this.allPages) { this.currentPage++; this.currentPageSelectValue = this.currentPage.toString(); this.pageChange.emit(this.currentPage); this.updateDisplayedData(); this.updateVisiblePages(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaginationComponent, selector: "cfc-pagination", inputs: { data: "data", itemsPerPageOptions: "itemsPerPageOptions", allPages: "allPages", itemsPerPage: "itemsPerPage", allItems: "allItems", currentPage: "currentPage", type: "type" }, outputs: { pageChange: "pageChange", itemsPerPageChange: "itemsPerPageChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"part pages-part d-flex justify-content-center\" *ngIf=\"isStandardType()\">\r\n <ul class=\"pagination-items\">\r\n <li>\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"Voltar p\u00E1gina\" (click)=\"prevPage()\" [disabled]=\"currentPage === 1\">\r\n <i class=\"fas fa-angle-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n </li>\r\n\r\n <li *ngFor=\"let page of visiblePages\">\r\n <button class=\"br-button circle\"\r\n type=\"button\"\r\n [class.active]=\"page === currentPage\"\r\n (click)=\"goToPage(page)\">\r\n <span *ngIf=\"page !== '...'\">{{ page }}</span>\r\n <span *ngIf=\"page === '...'\">...</span>\r\n </button>\r\n </li>\r\n\r\n <li>\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"P\u00E1gina seguinte\" (click)=\"nextPage()\" [disabled]=\"currentPage === allPages\">\r\n <i class=\"fas fa-angle-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </li>\r\n </ul>\r\n</div>\r\n\r\n<ng-container *ngIf=\"isContextualType()\">\r\n <nav class=\"br-pagination\" aria-label=\"pagina\u00E7\u00E3o\" [attr.data-total]=\"allItems\"\r\n [attr.data-current]=\"currentPage\" [attr.data-per-page]=\"itemsPerPage\">\r\n <div class=\"part\">\r\n <div class=\"pagination-per-page\">\r\n <p class=\"mx-3 mb-0 d-flex align-items-center\" style=\"font-size: 14px; font-weight: 400;\">\r\n Exibir\r\n </p>\r\n <cfc-select\r\n style=\"max-width: 80px;\"\r\n id=\"pagination-per-page\"\r\n [options]=\"itemsPerPageOptions\"\r\n [showSearchIcon]=\"false\"\r\n [multiSelect]=\"false\"\r\n [placeholder]=\"itemsPerPage.toString()\"\r\n [type]=\"SelectType.pagination\"\r\n (onChange)=\"changeItemsPerPage($event)\">\r\n </cfc-select>\r\n </div>\r\n\r\n <div class=\"divider-vertical\"></div>\r\n\r\n <div class=\"pagination-information d-sm-flex\">\r\n {{ currentPage }} - {{ allPages }} de {{ allItems }} itens\r\n </div>\r\n </div>\r\n\r\n <div class=\"part\">\r\n <div class=\"pagination-per-page pagination-select-wrapper\">\r\n <p class=\"mr-3 mb-0 d-flex align-items-center\" style=\"font-size: 14px; font-weight: 400;\">\r\n P\u00E1gina\r\n </p>\r\n <cfc-select\r\n style=\"max-width: 80px;\"\r\n ariaLabel=\"Exibir P\u00E1gina\"\r\n id=\"go-to-selection\"\r\n [options]=\"pagesArray\"\r\n [showSearchIcon]=\"false\"\r\n [multiSelect]=\"false\"\r\n [placeholder]=\"currentPage.toString()\"\r\n [type]=\"SelectType.pagination\"\r\n (onChange)=\"goToPage($event)\">\r\n </cfc-select>\r\n </div>\r\n\r\n <div class=\"divider-vertical\"></div>\r\n\r\n <div class=\"pagination-arrows ml-auto ml-sm-0 mr-1\">\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"Voltar p\u00E1gina\" (click)=\"prevPage()\" [disabled]=\"currentPage === 1\">\r\n <i class=\"fas fa-angle-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"P\u00E1gina seguinte\" (click)=\"nextPage()\" [disabled]=\"currentPage === allPages\">\r\n <i class=\"fas fa-angle-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </nav>\r\n</ng-container>\r\n", styles: [".br-pagination{flex-wrap:wrap;width:100%;display:flex;align-items:center;justify-content:space-between}.part{display:flex;align-items:center;padding:10px 20px}.pagination-items{display:flex;list-style:none;padding:0;margin:0}.pagination-items li{margin:0 2px}.pagination-items .br-button.circle{width:36px;height:36px;border-radius:50%;padding:0;display:flex;align-items:center;justify-content:center;font-size:14px}.pagination-items .br-button.circle.active{background-color:var(--primary, #1351b4);color:#fff}.pages-part{margin:0 0 10px;padding:0;flex:1 1 auto;justify-content:center}@media (max-width: 1024px){.br-pagination{flex-direction:column}.part{width:100%;justify-content:center}}@media (max-width: 576px){.pages-part{display:none!important}}.divider-vertical{width:.5px;height:40px;background-color:#ccc;margin:0 20px}::ng-deep .br-pagination ul{display:flex;flex-direction:column!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SelectComponent, selector: "cfc-select", inputs: ["options", "id", "label", "placeholder", "labelInline", "multiSelect", "feedbackMessage", "feedbackState", "showSearchIcon", "showSelectAll", "required", "ariaLabel", "ariaDescribedBy", "disabled", "type"], outputs: ["onChange", "onOpen", "onClose"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-pagination', template: "<div class=\"part pages-part d-flex justify-content-center\" *ngIf=\"isStandardType()\">\r\n <ul class=\"pagination-items\">\r\n <li>\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"Voltar p\u00E1gina\" (click)=\"prevPage()\" [disabled]=\"currentPage === 1\">\r\n <i class=\"fas fa-angle-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n </li>\r\n\r\n <li *ngFor=\"let page of visiblePages\">\r\n <button class=\"br-button circle\"\r\n type=\"button\"\r\n [class.active]=\"page === currentPage\"\r\n (click)=\"goToPage(page)\">\r\n <span *ngIf=\"page !== '...'\">{{ page }}</span>\r\n <span *ngIf=\"page === '...'\">...</span>\r\n </button>\r\n </li>\r\n\r\n <li>\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"P\u00E1gina seguinte\" (click)=\"nextPage()\" [disabled]=\"currentPage === allPages\">\r\n <i class=\"fas fa-angle-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </li>\r\n </ul>\r\n</div>\r\n\r\n<ng-container *ngIf=\"isContextualType()\">\r\n <nav class=\"br-pagination\" aria-label=\"pagina\u00E7\u00E3o\" [attr.data-total]=\"allItems\"\r\n [attr.data-current]=\"currentPage\" [attr.data-per-page]=\"itemsPerPage\">\r\n <div class=\"part\">\r\n <div class=\"pagination-per-page\">\r\n <p class=\"mx-3 mb-0 d-flex align-items-center\" style=\"font-size: 14px; font-weight: 400;\">\r\n Exibir\r\n </p>\r\n <cfc-select\r\n style=\"max-width: 80px;\"\r\n id=\"pagination-per-page\"\r\n [options]=\"itemsPerPageOptions\"\r\n [showSearchIcon]=\"false\"\r\n [multiSelect]=\"false\"\r\n [placeholder]=\"itemsPerPage.toString()\"\r\n [type]=\"SelectType.pagination\"\r\n (onChange)=\"changeItemsPerPage($event)\">\r\n </cfc-select>\r\n </div>\r\n\r\n <div class=\"divider-vertical\"></div>\r\n\r\n <div class=\"pagination-information d-sm-flex\">\r\n {{ currentPage }} - {{ allPages }} de {{ allItems }} itens\r\n </div>\r\n </div>\r\n\r\n <div class=\"part\">\r\n <div class=\"pagination-per-page pagination-select-wrapper\">\r\n <p class=\"mr-3 mb-0 d-flex align-items-center\" style=\"font-size: 14px; font-weight: 400;\">\r\n P\u00E1gina\r\n </p>\r\n <cfc-select\r\n style=\"max-width: 80px;\"\r\n ariaLabel=\"Exibir P\u00E1gina\"\r\n id=\"go-to-selection\"\r\n [options]=\"pagesArray\"\r\n [showSearchIcon]=\"false\"\r\n [multiSelect]=\"false\"\r\n [placeholder]=\"currentPage.toString()\"\r\n [type]=\"SelectType.pagination\"\r\n (onChange)=\"goToPage($event)\">\r\n </cfc-select>\r\n </div>\r\n\r\n <div class=\"divider-vertical\"></div>\r\n\r\n <div class=\"pagination-arrows ml-auto ml-sm-0 mr-1\">\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"Voltar p\u00E1gina\" (click)=\"prevPage()\" [disabled]=\"currentPage === 1\">\r\n <i class=\"fas fa-angle-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button class=\"br-button circle\" type=\"button\" aria-label=\"P\u00E1gina seguinte\" (click)=\"nextPage()\" [disabled]=\"currentPage === allPages\">\r\n <i class=\"fas fa-angle-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </nav>\r\n</ng-container>\r\n", styles: [".br-pagination{flex-wrap:wrap;width:100%;display:flex;align-items:center;justify-content:space-between}.part{display:flex;align-items:center;padding:10px 20px}.pagination-items{display:flex;list-style:none;padding:0;margin:0}.pagination-items li{margin:0 2px}.pagination-items .br-button.circle{width:36px;height:36px;border-radius:50%;padding:0;display:flex;align-items:center;justify-content:center;font-size:14px}.pagination-items .br-button.circle.active{background-color:var(--primary, #1351b4);color:#fff}.pages-part{margin:0 0 10px;padding:0;flex:1 1 auto;justify-content:center}@media (max-width: 1024px){.br-pagination{flex-direction:column}.part{width:100%;justify-content:center}}@media (max-width: 576px){.pages-part{display:none!important}}.divider-vertical{width:.5px;height:40px;background-color:#ccc;margin:0 20px}::ng-deep .br-pagination ul{display:flex;flex-direction:column!important}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { data: [{ type: Input }], itemsPerPageOptions: [{ type: Input }], allPages: [{ type: Input }], itemsPerPage: [{ type: Input }], allItems: [{ type: Input }], currentPage: [{ type: Input }], type: [{ type: Input }], pageChange: [{ type: Output }], itemsPerPageChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFPbEUsTUFBTSxPQUFPLG1CQUFtQjtJQTBCVjtJQXpCWCxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBQ2pCLG1CQUFtQixHQUFHO1FBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzVCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzVCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzdCLENBQUM7SUFDTyxRQUFRLEdBQVcsQ0FBQyxDQUFDO0lBQ3JCLFlBQVksR0FBVyxFQUFFLENBQUM7SUFDMUIsUUFBUSxHQUFXLENBQUMsQ0FBQztJQUNyQixXQUFXLEdBQVcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksR0FBbUIsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFFLGVBQWU7SUFFL0QsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFDeEMsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUUxRCxhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQzFCLFVBQVUsR0FBVSxFQUFFLENBQUM7SUFDdkIsWUFBWSxHQUF3QixFQUFFLENBQUM7SUFDdkMsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUVwQix3QkFBd0IsR0FBVyxJQUFJLENBQUM7SUFDeEMsc0JBQXNCLEdBQVcsR0FBRyxDQUFDO0lBRXJDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFFeEIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO0lBRTlDLGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxVQUFVLENBQUM7SUFDakQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakUsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUN6QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1NBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM5RCxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNoRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQztnQkFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUM7Z0JBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLElBQUksU0FBUyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakQsS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWU7UUFDaEMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXhCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxTQUFjO1FBQ3JCLElBQUksWUFBb0IsQ0FBQztRQUV6QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuRSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7WUFDaEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO3dHQWpLVSxtQkFBbUI7NEZBQW5CLG1CQUFtQixzVkNUaEMsODhHQW9GQTs7NEZEM0VhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7c0ZBS2pCLElBQUk7c0JBQVosS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNlbGVjdFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9zZWxlY3QtdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgUGFnaW5hdGlvblR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9wYWdpbmF0aW9uLXR5cGUuZW51bSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1wYWdpbmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlT3B0aW9ucyA9IFtcclxuICAgIHsgdmFsdWU6ICcxMCcsIGxhYmVsOiAnMTAnIH0sXHJcbiAgICB7IHZhbHVlOiAnMjAnLCBsYWJlbDogJzIwJyB9LFxyXG4gICAgeyB2YWx1ZTogJzMwJywgbGFiZWw6ICczMCcgfVxyXG4gIF07XHJcbiAgQElucHV0KCkgYWxsUGFnZXM6IG51bWJlciA9IDE7XHJcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcclxuICBASW5wdXQoKSBhbGxJdGVtczogbnVtYmVyID0gMDtcclxuICBASW5wdXQoKSBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcclxuICBASW5wdXQoKSB0eXBlOiBQYWdpbmF0aW9uVHlwZSA9IFBhZ2luYXRpb25UeXBlLlN0YW5kYXJkOyAgLy8gVmFsb3IgcGFkcsOjb1xyXG5cclxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBpdGVtc1BlclBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgZGlzcGxheWVkRGF0YTogYW55W10gPSBbXTtcclxuICBwYWdlc0FycmF5OiBhbnlbXSA9IFtdO1xyXG4gIHZpc2libGVQYWdlczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdO1xyXG4gIG1heFZpc2libGVQYWdlcyA9IDU7XHJcblxyXG4gIGN1cnJlbnRJdGVtc1BlclBhZ2VWYWx1ZTogc3RyaW5nID0gJzEwJztcclxuICBjdXJyZW50UGFnZVNlbGVjdFZhbHVlOiBzdHJpbmcgPSAnMSc7XHJcblxyXG4gIFNlbGVjdFR5cGUgPSBTZWxlY3RUeXBlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIGlzU3RhbmRhcmRUeXBlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gUGFnaW5hdGlvblR5cGUuU3RhbmRhcmQ7XHJcbiAgfVxyXG5cclxuICBpc0NvbnRleHR1YWxUeXBlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gUGFnaW5hdGlvblR5cGUuQ29udGV4dHVhbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVQYWdlc0FycmF5KCk7XHJcbiAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25EYXRhKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRJdGVtc1BlclBhZ2VWYWx1ZSA9IHRoaXMuaXRlbXNQZXJQYWdlLnRvU3RyaW5nKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlU2VsZWN0VmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2l0ZW1zUGVyUGFnZSddIHx8IGNoYW5nZXNbJ2N1cnJlbnRQYWdlJ10pIHtcclxuICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydhbGxQYWdlcyddKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnZXNBcnJheSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydjdXJyZW50UGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTZWxlY3RWYWx1ZSA9IHRoaXMuY3VycmVudFBhZ2UudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydpdGVtc1BlclBhZ2UnXSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRJdGVtc1BlclBhZ2VWYWx1ZSA9IHRoaXMuaXRlbXNQZXJQYWdlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25EYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGxJdGVtcyA9IHRoaXMuZGF0YS5sZW5ndGg7XHJcbiAgICB0aGlzLmFsbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuYWxsSXRlbXMgLyB0aGlzLml0ZW1zUGVyUGFnZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gTWF0aC5taW4odGhpcy5jdXJyZW50UGFnZSwgdGhpcy5hbGxQYWdlcyB8fCAxKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVBhZ2VzQXJyYXkoKTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheWVkRGF0YSgpO1xyXG4gICAgdGhpcy51cGRhdGVWaXNpYmxlUGFnZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUGFnZXNBcnJheSgpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZXNBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuYWxsUGFnZXMgfSwgKF8sIGkpID0+ICh7XHJcbiAgICAgIHZhbHVlOiAoaSArIDEpLnRvU3RyaW5nKCksXHJcbiAgICAgIGxhYmVsOiAoaSArIDEpLnRvU3RyaW5nKClcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheWVkRGF0YSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5pdGVtc1BlclBhZ2U7XHJcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyB0aGlzLml0ZW1zUGVyUGFnZTtcclxuICAgIHRoaXMuZGlzcGxheWVkRGF0YSA9IHRoaXMuZGF0YS5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVQYWdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMudmlzaWJsZVBhZ2VzID0gW107XHJcbiAgICBpZiAodGhpcy5hbGxQYWdlcyA8PSB0aGlzLm1heFZpc2libGVQYWdlcykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLmFsbFBhZ2VzOyBpKyspIHtcclxuICAgICAgICB0aGlzLnZpc2libGVQYWdlcy5wdXNoKGkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZpc2libGVQYWdlcy5wdXNoKDEpO1xyXG4gICAgICBsZXQgc3RhcnRQYWdlID0gTWF0aC5tYXgoMiwgdGhpcy5jdXJyZW50UGFnZSAtIDEpO1xyXG4gICAgICBsZXQgZW5kUGFnZSA9IE1hdGgubWluKHRoaXMuYWxsUGFnZXMgLSAxLCB0aGlzLmN1cnJlbnRQYWdlICsgMSk7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDw9IDMpIGVuZFBhZ2UgPSA0O1xyXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+PSB0aGlzLmFsbFBhZ2VzIC0gMikgc3RhcnRQYWdlID0gdGhpcy5hbGxQYWdlcyAtIDM7XHJcbiAgICAgIGlmIChzdGFydFBhZ2UgPiAyKSB0aGlzLnZpc2libGVQYWdlcy5wdXNoKCcuLi4nKTtcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFnZTsgaSA8PSBlbmRQYWdlOyBpKyspIHtcclxuICAgICAgICB0aGlzLnZpc2libGVQYWdlcy5wdXNoKGkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbmRQYWdlIDwgdGhpcy5hbGxQYWdlcyAtIDEpIHRoaXMudmlzaWJsZVBhZ2VzLnB1c2goJy4uLicpO1xyXG4gICAgICB0aGlzLnZpc2libGVQYWdlcy5wdXNoKHRoaXMuYWxsUGFnZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlSXRlbXNQZXJQYWdlKHNlbGVjdGVkOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIoc2VsZWN0ZWRbMF0udmFsdWUpO1xyXG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLmN1cnJlbnRJdGVtc1BlclBhZ2VWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgIHRoaXMuaXRlbXNQZXJQYWdlQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG5cclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTZWxlY3RWYWx1ZSA9ICcxJztcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoMSk7XHJcblxyXG4gICAgICB0aGlzLmFsbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuYWxsSXRlbXMgLyB0aGlzLml0ZW1zUGVyUGFnZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnZXNBcnJheSgpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXllZERhdGEoKTtcclxuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlUGFnZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9QYWdlKHNlbGVjdGlvbjogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgc2VsZWN0ZWRQYWdlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09ICdudW1iZXInIHx8IHR5cGVvZiBzZWxlY3Rpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHNlbGVjdGVkUGFnZSA9IE51bWJlcihzZWxlY3Rpb24pO1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGlvbikgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgc2VsZWN0ZWRQYWdlID0gTnVtYmVyKHNlbGVjdGlvblswXS52YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkUGFnZSA+PSAxICYmIHNlbGVjdGVkUGFnZSA8PSB0aGlzLmFsbFBhZ2VzKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBzZWxlY3RlZFBhZ2U7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTZWxlY3RWYWx1ZSA9IHNlbGVjdGVkUGFnZS50b1N0cmluZygpO1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRQYWdlKTtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5ZWREYXRhKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZVBhZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmV2UGFnZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLS07XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTZWxlY3RWYWx1ZSA9IHRoaXMuY3VycmVudFBhZ2UudG9TdHJpbmcoKTtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5jdXJyZW50UGFnZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheWVkRGF0YSgpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVQYWdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmV4dFBhZ2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA8IHRoaXMuYWxsUGFnZXMpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSsrO1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlU2VsZWN0VmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKCk7XHJcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuY3VycmVudFBhZ2UpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXllZERhdGEoKTtcclxuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlUGFnZXMoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInBhcnQgcGFnZXMtcGFydCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwiaXNTdGFuZGFyZFR5cGUoKVwiPlxyXG4gIDx1bCBjbGFzcz1cInBhZ2luYXRpb24taXRlbXNcIj5cclxuICAgIDxsaT5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJyLWJ1dHRvbiBjaXJjbGVcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIlZvbHRhciBww6FnaW5hXCIgKGNsaWNrKT1cInByZXZQYWdlKClcIiBbZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IDFcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hbmdsZS1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbGk+XHJcblxyXG4gICAgPGxpICpuZ0Zvcj1cImxldCBwYWdlIG9mIHZpc2libGVQYWdlc1wiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnItYnV0dG9uIGNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJwYWdlID09PSBjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9QYWdlKHBhZ2UpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWdlICE9PSAnLi4uJ1wiPnt7IHBhZ2UgfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWdlID09PSAnLi4uJ1wiPi4uLjwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2xpPlxyXG5cclxuICAgIDxsaT5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJyLWJ1dHRvbiBjaXJjbGVcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIlDDoWdpbmEgc2VndWludGVcIiAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gYWxsUGFnZXNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hbmdsZS1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2xpPlxyXG4gIDwvdWw+XHJcbjwvZGl2PlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQ29udGV4dHVhbFR5cGUoKVwiPlxyXG4gIDxuYXYgY2xhc3M9XCJici1wYWdpbmF0aW9uXCIgYXJpYS1sYWJlbD1cInBhZ2luYcOnw6NvXCIgW2F0dHIuZGF0YS10b3RhbF09XCJhbGxJdGVtc1wiXHJcbiAgICAgICBbYXR0ci5kYXRhLWN1cnJlbnRdPVwiY3VycmVudFBhZ2VcIiBbYXR0ci5kYXRhLXBlci1wYWdlXT1cIml0ZW1zUGVyUGFnZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhcnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRpb24tcGVyLXBhZ2VcIj5cclxuICAgICAgICA8cCBjbGFzcz1cIm14LTMgbWItMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7XCI+XHJcbiAgICAgICAgICBFeGliaXJcclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPGNmYy1zZWxlY3RcclxuICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA4MHB4O1wiXHJcbiAgICAgICAgICBpZD1cInBhZ2luYXRpb24tcGVyLXBhZ2VcIlxyXG4gICAgICAgICAgW29wdGlvbnNdPVwiaXRlbXNQZXJQYWdlT3B0aW9uc1wiXHJcbiAgICAgICAgICBbc2hvd1NlYXJjaEljb25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW211bHRpU2VsZWN0XT1cImZhbHNlXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJpdGVtc1BlclBhZ2UudG9TdHJpbmcoKVwiXHJcbiAgICAgICAgICBbdHlwZV09XCJTZWxlY3RUeXBlLnBhZ2luYXRpb25cIlxyXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cImNoYW5nZUl0ZW1zUGVyUGFnZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9jZmMtc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLXZlcnRpY2FsXCI+PC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1pbmZvcm1hdGlvbiBkLXNtLWZsZXhcIj5cclxuICAgICAgICB7eyBjdXJyZW50UGFnZSB9fSAtIHt7IGFsbFBhZ2VzIH19IGRlIHt7IGFsbEl0ZW1zIH19IGl0ZW5zXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInBhcnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRpb24tcGVyLXBhZ2UgcGFnaW5hdGlvbi1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwibXItMyBtYi0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDtcIj5cclxuICAgICAgICAgIFDDoWdpbmFcclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPGNmYy1zZWxlY3RcclxuICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA4MHB4O1wiXHJcbiAgICAgICAgICBhcmlhTGFiZWw9XCJFeGliaXIgUMOhZ2luYVwiXHJcbiAgICAgICAgICBpZD1cImdvLXRvLXNlbGVjdGlvblwiXHJcbiAgICAgICAgICBbb3B0aW9uc109XCJwYWdlc0FycmF5XCJcclxuICAgICAgICAgIFtzaG93U2VhcmNoSWNvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbbXVsdGlTZWxlY3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImN1cnJlbnRQYWdlLnRvU3RyaW5nKClcIlxyXG4gICAgICAgICAgW3R5cGVdPVwiU2VsZWN0VHlwZS5wYWdpbmF0aW9uXCJcclxuICAgICAgICAgIChvbkNoYW5nZSk9XCJnb1RvUGFnZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9jZmMtc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLXZlcnRpY2FsXCI+PC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1hcnJvd3MgbWwtYXV0byBtbC1zbS0wIG1yLTFcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnItYnV0dG9uIGNpcmNsZVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiVm9sdGFyIHDDoWdpbmFcIiAoY2xpY2spPVwicHJldlBhZ2UoKVwiIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYW5nbGUtbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnItYnV0dG9uIGNpcmNsZVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiUMOhZ2luYSBzZWd1aW50ZVwiIChjbGljayk9XCJuZXh0UGFnZSgpXCIgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSBhbGxQYWdlc1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYW5nbGUtcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uYXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=