UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

70 lines 17 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { DsfrFormSelectComponent } from '../../../forms/form-select'; import { newUniqueId } from '../../../shared'; import { DsfrI18nPipe } from '../../../shared/i18n/i18n.pipe'; import { DsfrPaginationComponent } from '../../pagination'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; /** * Composant pied de page du tableau * Contient trois éléments optionnel mais dans cet ordre : * - start: total de lignes, sélection du nombre de lignesn à afficher si pagination * - middle: composant de pagination commun dsfr-pagination * - end: template pour afficher des boutons d'actions agissant sur tout le tableau */ export class DsfrTableFooterComponent { constructor() { this.rowsPerPageChange = new EventEmitter(); // changement du nombre de lignes à afficher this.pageSelect = new EventEmitter(); // changement de page } /** @internal */ ngOnInit() { this.rowsPerPage = this.initialState?.rowsPerPage ?? (this.rowsPerPageOptions && this.rowsPerPageOptions[0] ? this.rowsPerPageOptions[0].value : 10); this.currentPage = this.initialState?.page ?? 1; this.selectId = newUniqueId(); } onPageSelect(pageNumber) { this.pageSelect.emit(pageNumber); } onChangerowsPerPage() { this.rowsPerPageChange.emit(this.rowsPerPage); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrTableFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrTableFooterComponent, isStandalone: true, selector: "dsfr-table-footer", inputs: { footerActionsTemplate: "footerActionsTemplate", showPagination: "showPagination", showFooterResult: "showFooterResult", footerResultsTemplate: "footerResultsTemplate", initialState: "initialState", totalElements: "totalElements", totalPage: "totalPage", currentPage: "currentPage", rowsPerPageOptions: "rowsPerPageOptions", emptyResultsMessage: "emptyResultsMessage", disabledRowsPerPage: "disabledRowsPerPage" }, outputs: { rowsPerPageChange: "rowsPerPageChange", pageSelect: "pageSelect" }, ngImport: i0, template: "<div class=\"fr-table__footer\">\n <!-- Nombre de r\u00E9sultats total -->\n <div class=\"fr-table__footer--start\">\n @if (showFooterResult) {\n <p class=\"fr-table__detail\">\n <!-- Afficher le nombre de r\u00E9sultat -->\n @if (footerResultsTemplate) {\n <ng-container *ngTemplateOutlet=\"footerResultsTemplate\"></ng-container>\n } @else {\n {{ totalElements }} {{ 'table.row' | dsfrI18n }}<ng-container *ngIf=\"totalElements > 1\">s</ng-container>\n }\n </p>\n }\n <!-- S\u00E9lection de la taille de page -->\n @if (rowsPerPageOptions && showPagination) {\n <dsfr-form-select\n [inputId]=\"selectId\"\n (change)=\"onChangerowsPerPage()\"\n [(ngModel)]=\"rowsPerPage\"\n [disabled]=\"disabledRowsPerPage\"\n [placeHolder]=\"'table.rowsPerPageLabel' | dsfrI18n\"\n [options]=\"rowsPerPageOptions\">\n <ng-container label\n ><span class=\"fr-sr-only\"> {{ 'table.rowsPerPageLabel' | dsfrI18n }}</span>\n </ng-container>\n </dsfr-form-select>\n }\n </div>\n <!-- Pagination -->\n @if (showPagination) {\n <div class=\"fr-table__footer--middle\">\n <dsfr-pagination\n [pageCount]=\"totalPage\"\n [currentPage]=\"currentPage\"\n (pageSelect)=\"onPageSelect($event)\"></dsfr-pagination>\n </div>\n }\n <!-- Boutons d'actions -->\n <div class=\"fr-table__footer--end\">\n <ng-container *ngTemplateOutlet=\"footerActionsTemplate\"></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsfrFormSelectComponent, selector: "dsfr-form-select", inputs: ["placeholder", "required", "ariaLabel", "ariaInvalid", "error", "valid", "message", "messageSeverity", "labelSrOnly", "placeHolder", "options", "compareWith"], outputs: ["selectChange"] }, { kind: "component", type: DsfrPaginationComponent, selector: "dsfr-pagination", inputs: ["pageCount", "currentPage", "previousOnly", "ariaLabel"], outputs: ["pageSelect", "pageSelectEvent", "backSelect", "backEvent"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrTableFooterComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-table-footer', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrFormSelectComponent, DsfrPaginationComponent, DsfrI18nPipe], template: "<div class=\"fr-table__footer\">\n <!-- Nombre de r\u00E9sultats total -->\n <div class=\"fr-table__footer--start\">\n @if (showFooterResult) {\n <p class=\"fr-table__detail\">\n <!-- Afficher le nombre de r\u00E9sultat -->\n @if (footerResultsTemplate) {\n <ng-container *ngTemplateOutlet=\"footerResultsTemplate\"></ng-container>\n } @else {\n {{ totalElements }} {{ 'table.row' | dsfrI18n }}<ng-container *ngIf=\"totalElements > 1\">s</ng-container>\n }\n </p>\n }\n <!-- S\u00E9lection de la taille de page -->\n @if (rowsPerPageOptions && showPagination) {\n <dsfr-form-select\n [inputId]=\"selectId\"\n (change)=\"onChangerowsPerPage()\"\n [(ngModel)]=\"rowsPerPage\"\n [disabled]=\"disabledRowsPerPage\"\n [placeHolder]=\"'table.rowsPerPageLabel' | dsfrI18n\"\n [options]=\"rowsPerPageOptions\">\n <ng-container label\n ><span class=\"fr-sr-only\"> {{ 'table.rowsPerPageLabel' | dsfrI18n }}</span>\n </ng-container>\n </dsfr-form-select>\n }\n </div>\n <!-- Pagination -->\n @if (showPagination) {\n <div class=\"fr-table__footer--middle\">\n <dsfr-pagination\n [pageCount]=\"totalPage\"\n [currentPage]=\"currentPage\"\n (pageSelect)=\"onPageSelect($event)\"></dsfr-pagination>\n </div>\n }\n <!-- Boutons d'actions -->\n <div class=\"fr-table__footer--end\">\n <ng-container *ngTemplateOutlet=\"footerActionsTemplate\"></ng-container>\n </div>\n</div>\n" }] }], propDecorators: { footerActionsTemplate: [{ type: Input }], showPagination: [{ type: Input }], showFooterResult: [{ type: Input }], footerResultsTemplate: [{ type: Input }], initialState: [{ type: Input }], totalElements: [{ type: Input }], totalPage: [{ type: Input }], currentPage: [{ type: Input }], rowsPerPageOptions: [{ type: Input }], emptyResultsMessage: [{ type: Input }], disabledRowsPerPage: [{ type: Input }], rowsPerPageChange: [{ type: Output }], pageSelect: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZm9vdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2NvbXBvbmVudC90YWJsZS1mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvY29tcG9uZW50L3RhYmxlLWZvb3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQUczRDs7Ozs7O0dBTUc7QUFRSCxNQUFNLE9BQU8sd0JBQXdCO0lBUHJDO1FBeUNZLHNCQUFpQixHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDLENBQUMsNENBQTRDO1FBQzFHLGVBQVUsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtLQXFCdkY7SUFoQkMsZ0JBQWdCO0lBQ1QsUUFBUTtRQUNiLElBQUksQ0FBQyxXQUFXO1lBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXO2dCQUM5QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVNLFlBQVksQ0FBQyxVQUFrQjtRQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7K0dBdkRVLHdCQUF3QjttR0FBeEIsd0JBQXdCLG9rQkN2QnJDLHNoREEwQ0EsMkNEckJZLFlBQVkseVNBQUUsV0FBVywrVkFBRSx1QkFBdUIsaVFBQUUsdUJBQXVCLGlNQUFFLFlBQVk7OzRGQUV4Rix3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0UsbUJBQW1CLGlCQUVkLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxZQUFZLENBQUM7OEJBSTNGLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHNmckZvcm1TZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mb3Jtcy9mb3JtLXNlbGVjdCc7XG5pbXBvcnQgeyBEc2ZyT3B0aW9uLCBuZXdVbmlxdWVJZCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZySTE4blBpcGUgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaTE4bi9pMThuLnBpcGUnO1xuaW1wb3J0IHsgRHNmclBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0aW9uJztcbmltcG9ydCB7IERzZnJUYWJsZVN0YXRlIH0gZnJvbSAnLi4vdGFibGUubW9kZWwnO1xuXG4vKipcbiAqIENvbXBvc2FudCBwaWVkIGRlIHBhZ2UgZHUgdGFibGVhdVxuICogQ29udGllbnQgdHJvaXMgw6lsw6ltZW50cyBvcHRpb25uZWwgbWFpcyBkYW5zIGNldCBvcmRyZSA6XG4gKiAtIHN0YXJ0OiB0b3RhbCBkZSBsaWduZXMsIHPDqWxlY3Rpb24gZHUgbm9tYnJlIGRlIGxpZ25lc24gw6AgYWZmaWNoZXIgc2kgcGFnaW5hdGlvblxuICogLSBtaWRkbGU6IGNvbXBvc2FudCBkZSBwYWdpbmF0aW9uIGNvbW11biBkc2ZyLXBhZ2luYXRpb25cbiAqIC0gZW5kOiB0ZW1wbGF0ZSBwb3VyIGFmZmljaGVyIGRlcyBib3V0b25zIGQnYWN0aW9ucyBhZ2lzc2FudCBzdXIgdG91dCBsZSB0YWJsZWF1XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItdGFibGUtZm9vdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWZvb3Rlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBEc2ZyRm9ybVNlbGVjdENvbXBvbmVudCwgRHNmclBhZ2luYXRpb25Db21wb25lbnQsIERzZnJJMThuUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJUYWJsZUZvb3RlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKiBUZW1wbGF0ZSBvcHRpb25uZWwgYWZmaWNoZXIgZGVzIGJvdXRvbnMgZCdhY3Rpb25zIGRhbnMgZm9vdGVyIGVuZCAqL1xuICBASW5wdXQoKSBmb290ZXJBY3Rpb25zVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKiBBZmZpY2hlciBsYSBwYWdpbmF0aW9uICovXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0aW9uOiBib29sZWFuO1xuXG4gIC8qKiBBZmZpY2hlciBsZSB0b3RhbCBkZSBsaWduZXMgKi9cbiAgQElucHV0KCkgc2hvd0Zvb3RlclJlc3VsdDogYm9vbGVhbjtcblxuICAvKiogTWVzc2FnZSBwZXJzb25uYWxpc8OpIHBvdXIgYWZmaWNoZXIgbGUgdG90YWwgZGUgbGlnbmVzICovXG4gIEBJbnB1dCgpIGZvb3RlclJlc3VsdHNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogRXRhdCBpbml0aWFsIHBvdXIgbGEgcGFnaW5hdGlvbiAqL1xuICBASW5wdXQoKSBpbml0aWFsU3RhdGU6IERzZnJUYWJsZVN0YXRlO1xuXG4gIC8qKiBOb21icmUgdG90YWwgZCfDqWzDqW1lbnRzICovXG4gIEBJbnB1dCgpIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcblxuICAvKiogTm9tYnJlIHRvdGFsIGRlIHBhZ2VzICovXG4gIEBJbnB1dCgpIHRvdGFsUGFnZTogbnVtYmVyO1xuXG4gIC8qKiBQYWdlIGFjdHVlbGxlIGFmZmljaMOpZSAoY29tbWVuY2Ugw6AgMSkgKi9cbiAgQElucHV0KCkgY3VycmVudFBhZ2U6IGFueTtcblxuICAvKiogT3B0aW9ucyBwb3VyIGxhIHPDqWxlY3Rpb24gZHUgbm9tYnJlIGRlIGxpZ25lcyDDoCBhZmZpY2hlciAqL1xuICBASW5wdXQoKSByb3dzUGVyUGFnZU9wdGlvbnM6IERzZnJPcHRpb25bXSB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIE1lc3NhZ2UgYWZmaWNow6kgZW4gY2FzIGRlIHRhYmxlYXUgdmlkZSAoJ0F1Y3VuIHLDqXN1bHRhdCcgcGFyIGTDqWZhdXQpICovXG4gIEBJbnB1dCgpIGVtcHR5UmVzdWx0c01lc3NhZ2U6IHN0cmluZztcblxuICAvKiogRMOpc2FjdGl2ZXIgbGEgc8OpbGVjdGlvbiBkdSBub21icmUgZGUgbGlnbmVzIMOgIGFmZmljaGVyICovXG4gIEBJbnB1dCgpIGRpc2FibGVkUm93c1BlclBhZ2U6IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpIHJvd3NQZXJQYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy8gY2hhbmdlbWVudCBkdSBub21icmUgZGUgbGlnbmVzIMOgIGFmZmljaGVyXG4gIEBPdXRwdXQoKSBwYWdlU2VsZWN0OiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy8gY2hhbmdlbWVudCBkZSBwYWdlXG5cbiAgcm93c1BlclBhZ2U6IG51bWJlcjsgLy8gY3VycmVudCBwYWdlIHNpemUgc2VsZWN0ZWRcbiAgc2VsZWN0SWQ6IHN0cmluZzsgLy8gaWQgZHUgc2VsZWN0IGRlIHRhaWxsZSBkZSBwYWdlXG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzUGVyUGFnZSA9XG4gICAgICB0aGlzLmluaXRpYWxTdGF0ZT8ucm93c1BlclBhZ2UgPz9cbiAgICAgICh0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucyAmJiB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSA/IHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdLnZhbHVlIDogMTApO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmluaXRpYWxTdGF0ZT8ucGFnZSA/PyAxO1xuICAgIHRoaXMuc2VsZWN0SWQgPSBuZXdVbmlxdWVJZCgpO1xuICB9XG5cbiAgcHVibGljIG9uUGFnZVNlbGVjdChwYWdlTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTZWxlY3QuZW1pdChwYWdlTnVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZXJvd3NQZXJQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMucm93c1BlclBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnJvd3NQZXJQYWdlKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZyLXRhYmxlX19mb290ZXJcIj5cbiAgPCEtLSBOb21icmUgZGUgcsOpc3VsdGF0cyB0b3RhbCAtLT5cbiAgPGRpdiBjbGFzcz1cImZyLXRhYmxlX19mb290ZXItLXN0YXJ0XCI+XG4gICAgQGlmIChzaG93Rm9vdGVyUmVzdWx0KSB7XG4gICAgICA8cCBjbGFzcz1cImZyLXRhYmxlX19kZXRhaWxcIj5cbiAgICAgICAgPCEtLSBBZmZpY2hlciBsZSBub21icmUgZGUgcsOpc3VsdGF0ICAtLT5cbiAgICAgICAgQGlmIChmb290ZXJSZXN1bHRzVGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyUmVzdWx0c1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIHt7IHRvdGFsRWxlbWVudHMgfX0ge3sgJ3RhYmxlLnJvdycgfCBkc2ZySTE4biB9fTxuZy1jb250YWluZXIgKm5nSWY9XCJ0b3RhbEVsZW1lbnRzID4gMVwiPnM8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC9wPlxuICAgIH1cbiAgICA8IS0tIFPDqWxlY3Rpb24gZGUgbGEgdGFpbGxlIGRlIHBhZ2UgIC0tPlxuICAgIEBpZiAocm93c1BlclBhZ2VPcHRpb25zICYmIHNob3dQYWdpbmF0aW9uKSB7XG4gICAgICA8ZHNmci1mb3JtLXNlbGVjdFxuICAgICAgICBbaW5wdXRJZF09XCJzZWxlY3RJZFwiXG4gICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2Vyb3dzUGVyUGFnZSgpXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dzUGVyUGFnZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFJvd3NQZXJQYWdlXCJcbiAgICAgICAgW3BsYWNlSG9sZGVyXT1cIid0YWJsZS5yb3dzUGVyUGFnZUxhYmVsJyB8IGRzZnJJMThuXCJcbiAgICAgICAgW29wdGlvbnNdPVwicm93c1BlclBhZ2VPcHRpb25zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGFiZWxcbiAgICAgICAgICA+PHNwYW4gY2xhc3M9XCJmci1zci1vbmx5XCI+IHt7ICd0YWJsZS5yb3dzUGVyUGFnZUxhYmVsJyB8IGRzZnJJMThuIH19PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZHNmci1mb3JtLXNlbGVjdD5cbiAgICB9XG4gIDwvZGl2PlxuICA8IS0tIFBhZ2luYXRpb24gIC0tPlxuICBAaWYgKHNob3dQYWdpbmF0aW9uKSB7XG4gICAgPGRpdiBjbGFzcz1cImZyLXRhYmxlX19mb290ZXItLW1pZGRsZVwiPlxuICAgICAgPGRzZnItcGFnaW5hdGlvblxuICAgICAgICBbcGFnZUNvdW50XT1cInRvdGFsUGFnZVwiXG4gICAgICAgIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgIChwYWdlU2VsZWN0KT1cIm9uUGFnZVNlbGVjdCgkZXZlbnQpXCI+PC9kc2ZyLXBhZ2luYXRpb24+XG4gICAgPC9kaXY+XG4gIH1cbiAgPCEtLSBCb3V0b25zIGQnYWN0aW9ucyAgLS0+XG4gIDxkaXYgY2xhc3M9XCJmci10YWJsZV9fZm9vdGVyLS1lbmRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyQWN0aW9uc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=