@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
54 lines • 18.5 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, inject, input, Input, Output, ViewEncapsulation, } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { DsfrI18nPipe, DsfrI18nService, DsfrTagModule } from '@edugouvfr/ngx-dsfr';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@edugouvfr/ngx-dsfr";
export class SelectInputLabelComponent {
constructor() {
/** Nombre max. d'options sélectionnées affichées */
this.maxDisplayOptions = 5;
/** Clic sur toutes les options en mode tag supprimable. */
this.clearAllOptionsSelect = new EventEmitter();
/** Clic sur une option en mode tag supprimable. */
this.clearOptionSelect = new EventEmitter();
/** @internal liste des options sélectionnées */
this.selectedOptions = input([]);
this.i18n = inject(DsfrI18nService);
}
/** @internal */
getLabelKeyOptionsSelected() {
return this.selectedOptions().length === 1 ? 'multiselect.selected' : 'multiselect.selectedPlural';
}
/** Clic sur un tag représentant toutes les options */
clearAllOptions() {
this.clearAllOptionsSelect.emit();
}
/** Clic sur une option en mode tag supprimable. */
clearOption(event, opt) {
event.preventDefault();
this.clearOptionSelect.emit({ nativeEvent: event, option: opt });
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SelectInputLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SelectInputLabelComponent, isStandalone: true, selector: "edu-select-input-label", inputs: { placeHolder: { classPropertyName: "placeHolder", publicName: "placeHolder", isSignal: false, isRequired: false, transformFunction: null }, maxDisplayOptions: { classPropertyName: "maxDisplayOptions", publicName: "maxDisplayOptions", isSignal: false, isRequired: false, transformFunction: null }, maxDisplayOptionsTemplate: { classPropertyName: "maxDisplayOptionsTemplate", publicName: "maxDisplayOptionsTemplate", isSignal: false, isRequired: false, transformFunction: null }, selectedOptionTemplate: { classPropertyName: "selectedOptionTemplate", publicName: "selectedOptionTemplate", isSignal: false, isRequired: false, transformFunction: null }, clearableOptions: { classPropertyName: "clearableOptions", publicName: "clearableOptions", isSignal: false, isRequired: false, transformFunction: null }, selectedOptions: { classPropertyName: "selectedOptions", publicName: "selectedOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clearAllOptionsSelect: "clearAllOptionsSelect", clearOptionSelect: "clearOptionSelect" }, ngImport: i0, template: "<div role=\"status\" aria-live=\"polite\">\n @if (selectedOptions().length && selectedOptions().length > 0) {\n @if (selectedOptions().length <= maxDisplayOptions) {\n @if (clearableOptions) {\n <!-- Template tags -->\n <ul class=\"fr-tags-group\">\n @for (opt of selectedOptions(); track opt; let i = $index) {\n <li>\n <dsfr-tag\n [mode]=\"'deletable'\"\n [label]=\"opt.label\"\n [small]=\"true\"\n [ariaLabel]=\"('multiselect.deleteTag' | dsfrI18n) + ' ' + opt.label\"\n (click)=\"clearOption($event, opt)\"></dsfr-tag>\n </li>\n }\n </ul>\n } @else {\n @for (opt of selectedOptions(); track opt; let last = $last; let i = $index) {\n <!-- Afficher chaque option s\u00E9lectionn\u00E9e, slot ou template d\u00E9fault -->\n <ng-container\n *ngTemplateOutlet=\"\n selectedOptionTemplate || defaultselectedOptionTemplate;\n context: { $implicit: opt, index: i, last: last }\n \"></ng-container>\n }\n }\n } @else {\n @if (clearableOptions) {\n <!-- Un tag pour toutes les options -->\n <dsfr-tag\n [mode]=\"'deletable'\"\n [ariaLabel]=\"'multiselect.unselectAll' | dsfrI18n\"\n [label]=\"selectedOptions()!.length + ' ' + (getLabelKeyOptionsSelected() | dsfrI18n)\"\n [small]=\"true\"\n (click)=\"clearAllOptions()\"></dsfr-tag>\n } @else {\n <!-- Affichager x options s\u00E9lectionn\u00E9es, slot ou template default -->\n <ng-container\n *ngTemplateOutlet=\"\n maxDisplayOptionsTemplate || defaultmaxDisplayOptionsTemplate;\n context: { $implicit: selectedOptions() }\n \"></ng-container>\n }\n }\n } @else {\n <!-- Aucune option s\u00E9lectionn\u00E9e -->\n <span> {{ placeHolder ?? ('multiselect.selectOption' | dsfrI18n) }}</span>\n }\n</div>\n\n<!-- Template par d\u00E9faut afficher x options s\u00E9lectionn\u00E9es -->\n<ng-template #defaultmaxDisplayOptionsTemplate>\n <span> {{ selectedOptions()!.length }} {{ getLabelKeyOptionsSelected() | dsfrI18n }} </span>\n</ng-template>\n\n<!-- Template par d\u00E9faut affichage de chaque valeur -->\n<ng-template #defaultselectedOptionTemplate let-opt let-last=\"last\">\n <span>{{ opt.label }}<ng-container *ngIf=\"!last\">, </ng-container></span>\n</ng-template>\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: "ngmodule", type: DsfrTagModule }, { kind: "component", type: i2.DsfrTagComponent, selector: "dsfr-tag", inputs: ["tagId", "customClass", "disabled", "icon", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkExtras", "selected", "small", "tooltipMessage", "ariaLabel", "mode", "id", "routerLink"], outputs: ["tagSelect"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SelectInputLabelComponent, decorators: [{
type: Component,
args: [{ selector: 'edu-select-input-label', encapsulation: ViewEncapsulation.None, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, DsfrTagModule, DsfrI18nPipe], template: "<div role=\"status\" aria-live=\"polite\">\n @if (selectedOptions().length && selectedOptions().length > 0) {\n @if (selectedOptions().length <= maxDisplayOptions) {\n @if (clearableOptions) {\n <!-- Template tags -->\n <ul class=\"fr-tags-group\">\n @for (opt of selectedOptions(); track opt; let i = $index) {\n <li>\n <dsfr-tag\n [mode]=\"'deletable'\"\n [label]=\"opt.label\"\n [small]=\"true\"\n [ariaLabel]=\"('multiselect.deleteTag' | dsfrI18n) + ' ' + opt.label\"\n (click)=\"clearOption($event, opt)\"></dsfr-tag>\n </li>\n }\n </ul>\n } @else {\n @for (opt of selectedOptions(); track opt; let last = $last; let i = $index) {\n <!-- Afficher chaque option s\u00E9lectionn\u00E9e, slot ou template d\u00E9fault -->\n <ng-container\n *ngTemplateOutlet=\"\n selectedOptionTemplate || defaultselectedOptionTemplate;\n context: { $implicit: opt, index: i, last: last }\n \"></ng-container>\n }\n }\n } @else {\n @if (clearableOptions) {\n <!-- Un tag pour toutes les options -->\n <dsfr-tag\n [mode]=\"'deletable'\"\n [ariaLabel]=\"'multiselect.unselectAll' | dsfrI18n\"\n [label]=\"selectedOptions()!.length + ' ' + (getLabelKeyOptionsSelected() | dsfrI18n)\"\n [small]=\"true\"\n (click)=\"clearAllOptions()\"></dsfr-tag>\n } @else {\n <!-- Affichager x options s\u00E9lectionn\u00E9es, slot ou template default -->\n <ng-container\n *ngTemplateOutlet=\"\n maxDisplayOptionsTemplate || defaultmaxDisplayOptionsTemplate;\n context: { $implicit: selectedOptions() }\n \"></ng-container>\n }\n }\n } @else {\n <!-- Aucune option s\u00E9lectionn\u00E9e -->\n <span> {{ placeHolder ?? ('multiselect.selectOption' | dsfrI18n) }}</span>\n }\n</div>\n\n<!-- Template par d\u00E9faut afficher x options s\u00E9lectionn\u00E9es -->\n<ng-template #defaultmaxDisplayOptionsTemplate>\n <span> {{ selectedOptions()!.length }} {{ getLabelKeyOptionsSelected() | dsfrI18n }} </span>\n</ng-template>\n\n<!-- Template par d\u00E9faut affichage de chaque valeur -->\n<ng-template #defaultselectedOptionTemplate let-opt let-last=\"last\">\n <span>{{ opt.label }}<ng-container *ngIf=\"!last\">, </ng-container></span>\n</ng-template>\n" }]
}], propDecorators: { placeHolder: [{
type: Input
}], maxDisplayOptions: [{
type: Input
}], maxDisplayOptionsTemplate: [{
type: Input
}], selectedOptionTemplate: [{
type: Input
}], clearableOptions: [{
type: Input
}], clearAllOptionsSelect: [{
type: Output
}], clearOptionSelect: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWlucHV0LWxhYmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWV4dC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL3NlbGVjdC1pbnB1dC1sYWJlbC9zZWxlY3QtaW5wdXQtbGFiZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvc2VsZWN0LWlucHV0LWxhYmVsL3NlbGVjdC1pbnB1dC1sYWJlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBVW5GLE1BQU0sT0FBTyx5QkFBeUI7SUFSdEM7UUFZRSxvREFBb0Q7UUFDM0Msc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBVy9CLDJEQUEyRDtRQUNqRCwwQkFBcUIsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6RSxtREFBbUQ7UUFDekMsc0JBQWlCLEdBQXNELElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEcsZ0RBQWdEO1FBQ2hELG9CQUFlLEdBQUcsS0FBSyxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXpCLFNBQUksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7S0FpQjFDO0lBZkMsaUJBQWlCO0lBQ1YsMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQztJQUNyRyxDQUFDO0lBRUQsc0RBQXNEO0lBQy9DLGVBQWU7UUFDcEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxtREFBbUQ7SUFDNUMsV0FBVyxDQUFDLEtBQVksRUFBRSxHQUFRO1FBQ3ZDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDOytHQXpDVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw0bkNDdkJ0QyxvOUVBNERBLDJDRHZDWSxZQUFZLHlTQUFFLFdBQVcsOEJBQUUsYUFBYSw2VkFBRSxZQUFZOzs0RkFFckQseUJBQXlCO2tCQVJyQyxTQUFTOytCQUNFLHdCQUF3QixpQkFFbkIsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUM7OEJBSXhELFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFHRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdJLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEc2ZySTE4blBpcGUsIERzZnJJMThuU2VydmljZSwgRHNmclRhZ01vZHVsZSB9IGZyb20gJ0BlZHVnb3V2ZnIvbmd4LWRzZnInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdlZHUtc2VsZWN0LWlucHV0LWxhYmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC1pbnB1dC1sYWJlbC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHNmclRhZ01vZHVsZSwgRHNmckkxOG5QaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0SW5wdXRMYWJlbENvbXBvbmVudCB7XG4gIC8qKiBQbGFjZWhvbGRlciBwb3VyIGxlIGNoYW1wIGRlIHPDqWxlY3Rpb24gKi9cbiAgQElucHV0KCkgcGxhY2VIb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogTm9tYnJlIG1heC4gZCdvcHRpb25zIHPDqWxlY3Rpb25uw6llcyBhZmZpY2jDqWVzICovXG4gIEBJbnB1dCgpIG1heERpc3BsYXlPcHRpb25zID0gNTtcblxuICAvKiogVGVtcGxhdGUgcG91ciBsJ2Vuc2VtYmxlIGRlcyB2YWxldXJzIHPDqWxlY3Rpb25uw6llcyBsb3JzcXVlIG1heERpc3BsYXlPcHRpb25zIGVzdCBhdHRlaW50ICovXG4gIEBJbnB1dCgpIG1heERpc3BsYXlPcHRpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqIFRlbXBsYXRlIHBvdXIgY2hhcXVlIHZhbGV1ciBzw6lsZWN0aW9ubsOpZSAqL1xuICBASW5wdXQoKSBzZWxlY3RlZE9wdGlvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKiBMZXMgb3B0aW9ucyBzw6lsZWN0aW9ubsOpZXMgc29udCBhZmZpY2jDqWVzIHNvdXMgZm9ybWUgZGUgdGFncyBzdXBwcmltYWJsZXMgKi9cbiAgQElucHV0KCkgY2xlYXJhYmxlT3B0aW9uczogYm9vbGVhbjtcblxuICAvKiogQ2xpYyBzdXIgdG91dGVzIGxlcyBvcHRpb25zIGVuIG1vZGUgdGFnIHN1cHByaW1hYmxlLiAqL1xuICBAT3V0cHV0KCkgY2xlYXJBbGxPcHRpb25zU2VsZWN0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIENsaWMgc3VyIHVuZSBvcHRpb24gZW4gbW9kZSB0YWcgc3VwcHJpbWFibGUuICovXG4gIEBPdXRwdXQoKSBjbGVhck9wdGlvblNlbGVjdDogRXZlbnRFbWl0dGVyPHsgbmF0aXZlRXZlbnQ6IEV2ZW50OyBvcHRpb246IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKiogQGludGVybmFsIGxpc3RlIGRlcyBvcHRpb25zIHPDqWxlY3Rpb25uw6llcyAqL1xuICBzZWxlY3RlZE9wdGlvbnMgPSBpbnB1dDxhbnlbXT4oW10pO1xuXG4gIHByb3RlY3RlZCBpMThuID0gaW5qZWN0KERzZnJJMThuU2VydmljZSk7XG5cbiAgLyoqICBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGdldExhYmVsS2V5T3B0aW9uc1NlbGVjdGVkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb25zKCkubGVuZ3RoID09PSAxID8gJ211bHRpc2VsZWN0LnNlbGVjdGVkJyA6ICdtdWx0aXNlbGVjdC5zZWxlY3RlZFBsdXJhbCc7XG4gIH1cblxuICAvKiogQ2xpYyBzdXIgdW4gdGFnIHJlcHLDqXNlbnRhbnQgdG91dGVzIGxlcyBvcHRpb25zICovXG4gIHB1YmxpYyBjbGVhckFsbE9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbE9wdGlvbnNTZWxlY3QuZW1pdCgpO1xuICB9XG5cbiAgLyoqIENsaWMgc3VyIHVuZSBvcHRpb24gZW4gbW9kZSB0YWcgc3VwcHJpbWFibGUuICovXG4gIHB1YmxpYyBjbGVhck9wdGlvbihldmVudDogRXZlbnQsIG9wdDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNsZWFyT3B0aW9uU2VsZWN0LmVtaXQoeyBuYXRpdmVFdmVudDogZXZlbnQsIG9wdGlvbjogb3B0IH0pO1xuICB9XG59XG4iLCI8ZGl2IHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgQGlmIChzZWxlY3RlZE9wdGlvbnMoKS5sZW5ndGggJiYgc2VsZWN0ZWRPcHRpb25zKCkubGVuZ3RoID4gMCkge1xuICAgIEBpZiAoc2VsZWN0ZWRPcHRpb25zKCkubGVuZ3RoIDw9IG1heERpc3BsYXlPcHRpb25zKSB7XG4gICAgICBAaWYgKGNsZWFyYWJsZU9wdGlvbnMpIHtcbiAgICAgICAgPCEtLSBUZW1wbGF0ZSB0YWdzIC0tPlxuICAgICAgICA8dWwgY2xhc3M9XCJmci10YWdzLWdyb3VwXCI+XG4gICAgICAgICAgQGZvciAob3B0IG9mIHNlbGVjdGVkT3B0aW9ucygpOyB0cmFjayBvcHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxkc2ZyLXRhZ1xuICAgICAgICAgICAgICAgIFttb2RlXT1cIidkZWxldGFibGUnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwib3B0LmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCIoJ211bHRpc2VsZWN0LmRlbGV0ZVRhZycgfCBkc2ZySTE4bikgKyAnICcgKyBvcHQubGFiZWxcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhck9wdGlvbigkZXZlbnQsIG9wdClcIj48L2RzZnItdGFnPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgQGZvciAob3B0IG9mIHNlbGVjdGVkT3B0aW9ucygpOyB0cmFjayBvcHQ7IGxldCBsYXN0ID0gJGxhc3Q7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgPCEtLSBBZmZpY2hlciBjaGFxdWUgb3B0aW9uIHPDqWxlY3Rpb25uw6llLCBzbG90IG91IHRlbXBsYXRlIGTDqWZhdWx0IC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uVGVtcGxhdGUgfHwgZGVmYXVsdHNlbGVjdGVkT3B0aW9uVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiBvcHQsIGluZGV4OiBpLCBsYXN0OiBsYXN0IH1cbiAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKGNsZWFyYWJsZU9wdGlvbnMpIHtcbiAgICAgICAgPCEtLSBVbiB0YWcgcG91ciB0b3V0ZXMgbGVzIG9wdGlvbnMgLS0+XG4gICAgICAgIDxkc2ZyLXRhZ1xuICAgICAgICAgIFttb2RlXT1cIidkZWxldGFibGUnXCJcbiAgICAgICAgICBbYXJpYUxhYmVsXT1cIidtdWx0aXNlbGVjdC51bnNlbGVjdEFsbCcgfCBkc2ZySTE4blwiXG4gICAgICAgICAgW2xhYmVsXT1cInNlbGVjdGVkT3B0aW9ucygpIS5sZW5ndGggKyAnICcgKyAoZ2V0TGFiZWxLZXlPcHRpb25zU2VsZWN0ZWQoKSB8IGRzZnJJMThuKVwiXG4gICAgICAgICAgW3NtYWxsXT1cInRydWVcIlxuICAgICAgICAgIChjbGljayk9XCJjbGVhckFsbE9wdGlvbnMoKVwiPjwvZHNmci10YWc+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPCEtLSBBZmZpY2hhZ2VyIHggb3B0aW9ucyBzw6lsZWN0aW9ubsOpZXMsIHNsb3Qgb3UgdGVtcGxhdGUgZGVmYXVsdCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBtYXhEaXNwbGF5T3B0aW9uc1RlbXBsYXRlIHx8IGRlZmF1bHRtYXhEaXNwbGF5T3B0aW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHNlbGVjdGVkT3B0aW9ucygpIH1cbiAgICAgICAgICBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIDwhLS0gQXVjdW5lIG9wdGlvbiBzw6lsZWN0aW9ubsOpZSAtLT5cbiAgICA8c3Bhbj4ge3sgcGxhY2VIb2xkZXIgPz8gKCdtdWx0aXNlbGVjdC5zZWxlY3RPcHRpb24nIHwgZHNmckkxOG4pIH19PC9zcGFuPlxuICB9XG48L2Rpdj5cblxuPCEtLSAgVGVtcGxhdGUgcGFyIGTDqWZhdXQgYWZmaWNoZXIgeCBvcHRpb25zIHPDqWxlY3Rpb25uw6llcyAgLS0+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRtYXhEaXNwbGF5T3B0aW9uc1RlbXBsYXRlPlxuICA8c3Bhbj4ge3sgc2VsZWN0ZWRPcHRpb25zKCkhLmxlbmd0aCB9fSB7eyBnZXRMYWJlbEtleU9wdGlvbnNTZWxlY3RlZCgpIHwgZHNmckkxOG4gfX0gPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUZW1wbGF0ZSBwYXIgZMOpZmF1dCBhZmZpY2hhZ2UgZGUgY2hhcXVlIHZhbGV1ciAtLT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdHNlbGVjdGVkT3B0aW9uVGVtcGxhdGUgbGV0LW9wdCBsZXQtbGFzdD1cImxhc3RcIj5cbiAgPHNwYW4+e3sgb3B0LmxhYmVsIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj48L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuIl19