@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).
112 lines • 26.3 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
import { DsfrSizeConst, newUniqueId } from '../../shared';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
import * as i3 from "../button/button.component";
export class DsfrModalComponent {
/** @internal */
constructor(i18n, elemRef, renderer2) {
this.i18n = i18n;
this.elemRef = elemRef;
this.renderer2 = renderer2;
/** Le tableau des actions à positionner dans le dialogue modal. */
// TODO Ne faudrait-il pas homogénéiser avec les tuiles et les cartes ?
this.actions = [];
/** Permet de ne pas fermer la modale automatiquement lorsqu'une action est exécutée. */
this.autoCloseOnAction = true;
/**
* Le mode de contrôle vous permet, le cas échéant, de maintenir la capacité de la modale à être pilotée
* programmatiquement en absence de bouton de contrôle.
*
* @since 1.8.0
*/
this.controlMode = 'button';
/** Signale l'ouverture de la modal. */
this.disclose = new EventEmitter();
/** Signale la fermeture de la modal. */
this.conceal = new EventEmitter();
this._size = DsfrSizeConst.MD;
this._unlisten = [];
this.updateSizeClasses();
}
get size() {
return this._size;
}
/**
* La taille de la modale.
* Valeurs possibles : `SM` (pour small), `MD` (pour medium), `LG` (pour large).
*/
set size(newSize) {
this._size = newSize;
this.updateSizeClasses();
}
ngOnInit() {
this.dialogId ??= newUniqueId();
this.titleElementId = newUniqueId();
}
ngAfterViewInit() {
this._unlisten.push(this.renderer2.listen(this.dsfrModal.nativeElement, 'dsfr.conceal', () => {
this.conceal.emit();
}), this.renderer2.listen(this.dsfrModal.nativeElement, 'dsfr.disclose', () => {
this.disclose.emit();
}));
}
ngOnDestroy() {
this._unlisten.forEach((unlistenFunc) => unlistenFunc());
}
/**
* Permet de déclencher programmatiquement l'ouverture de la modale.
*/
open() {
dsfr(this.dsfrModal.nativeElement).modal.disclose();
}
/**
* Permet de déclencher programmatiquement la fermeture de la modale.
*/
close() {
dsfr(this.dsfrModal.nativeElement).modal.conceal();
}
/** @internal */
performAction(action) {
if (action.callback) {
action.callback();
}
}
updateSizeClasses() {
this.sizeClasses = {
'fr-col-12': true,
'fr-col-md-4': this.size === DsfrSizeConst.SM,
'fr-col-md-8 fr-col-lg-6': this.size === DsfrSizeConst.MD,
'fr-col-md-8': this.size === DsfrSizeConst.LG,
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrModalComponent, deps: [{ token: i1.I18nService }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrModalComponent, selector: "dsfr-modal", inputs: { dialogId: "dialogId", titleModal: "titleModal", headingLevel: "headingLevel", actions: "actions", autoCloseOnAction: "autoCloseOnAction", controlMode: "controlMode", size: "size" }, outputs: { disclose: "disclose", conceal: "conceal" }, viewQueries: [{ propertyName: "dsfrModal", first: true, predicate: ["dsfrModal"], descendants: true }], ngImport: i0, template: "<button\n *ngIf=\"controlMode === 'dynamic'\"\n type=\"button\"\n style=\"display: none\"\n data-fr-opened=\"false\"\n [attr.aria-controls]=\"dialogId\"\n disabled\n hidden></button>\n<dialog [attr.aria-labelledby]=\"titleElementId\" [id]=\"dialogId\" class=\"fr-modal\" #dsfrModal>\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div [ngClass]=\"sizeClasses\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn fr-btn--close\"\n [title]=\"i18n.t('modal.ariaLabel')\"\n [attr.aria-controls]=\"dialogId\">\n {{ i18n.t('commons.close') }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <!-- pas d'utilisation du composant edu-heading car H1 pr\u00E9sent -->\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchDefault [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h1>\n <h2 *ngSwitchCase=\"'H2'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h2>\n <h3 *ngSwitchCase=\"'H3'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h3>\n <h4 *ngSwitchCase=\"'H4'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h4>\n <h5 *ngSwitchCase=\"'H5'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h5>\n <h6 *ngSwitchCase=\"'H6'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h6>\n </ng-container>\n <ng-content></ng-content>\n </div>\n <div class=\"fr-modal__footer\" *ngIf=\"actions && actions.length > 0\">\n <div\n class=\"fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left\">\n <dsfr-button\n *ngFor=\"let action of actions\"\n [ariaControls]=\"autoCloseOnAction ? dialogId : ''\"\n [ariaLabel]=\"action.ariaLabel ?? ''\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [type]=\"action.type ?? 'submit'\"\n [tooltipMessage]=\"action.tooltipMessage ?? ''\"\n [disabled]=\"action.disabled ?? false\"\n [uppercase]=\"action.uppercase ?? false\"\n [variant]=\"action.variant ?? 'primary'\"\n (click)=\"performAction(action)\">\n </dsfr-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n\n<ng-template #headingLevelTitle> </ng-template>\n", styles: [".fr-modal{z-index:0}.fr-modal--opened{z-index:99999}.uppercase{text-transform:uppercase}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "size", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "ariaControls", "customClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrModalComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-modal', encapsulation: ViewEncapsulation.None, template: "<button\n *ngIf=\"controlMode === 'dynamic'\"\n type=\"button\"\n style=\"display: none\"\n data-fr-opened=\"false\"\n [attr.aria-controls]=\"dialogId\"\n disabled\n hidden></button>\n<dialog [attr.aria-labelledby]=\"titleElementId\" [id]=\"dialogId\" class=\"fr-modal\" #dsfrModal>\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div [ngClass]=\"sizeClasses\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn fr-btn--close\"\n [title]=\"i18n.t('modal.ariaLabel')\"\n [attr.aria-controls]=\"dialogId\">\n {{ i18n.t('commons.close') }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <!-- pas d'utilisation du composant edu-heading car H1 pr\u00E9sent -->\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchDefault [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h1>\n <h2 *ngSwitchCase=\"'H2'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h2>\n <h3 *ngSwitchCase=\"'H3'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h3>\n <h4 *ngSwitchCase=\"'H4'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h4>\n <h5 *ngSwitchCase=\"'H5'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h5>\n <h6 *ngSwitchCase=\"'H6'\" [id]=\"titleElementId\" class=\"fr-modal__title\">\n <span class=\"fr-icon-arrow-right-line fr-fi--lg\" aria-hidden=\"true\"></span>{{ titleModal }}\n </h6>\n </ng-container>\n <ng-content></ng-content>\n </div>\n <div class=\"fr-modal__footer\" *ngIf=\"actions && actions.length > 0\">\n <div\n class=\"fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left\">\n <dsfr-button\n *ngFor=\"let action of actions\"\n [ariaControls]=\"autoCloseOnAction ? dialogId : ''\"\n [ariaLabel]=\"action.ariaLabel ?? ''\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [type]=\"action.type ?? 'submit'\"\n [tooltipMessage]=\"action.tooltipMessage ?? ''\"\n [disabled]=\"action.disabled ?? false\"\n [uppercase]=\"action.uppercase ?? false\"\n [variant]=\"action.variant ?? 'primary'\"\n (click)=\"performAction(action)\">\n </dsfr-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n\n<ng-template #headingLevelTitle> </ng-template>\n", styles: [".fr-modal{z-index:0}.fr-modal--opened{z-index:99999}.uppercase{text-transform:uppercase}\n"] }]
}], ctorParameters: function () { return [{ type: i1.I18nService }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { dialogId: [{
type: Input
}], titleModal: [{
type: Input
}], headingLevel: [{
type: Input
}], actions: [{
type: Input
}], autoCloseOnAction: [{
type: Input
}], controlMode: [{
type: Input
}], disclose: [{
type: Output
}], conceal: [{
type: Output
}], dsfrModal: [{
type: ViewChild,
args: ['dsfrModal']
}], size: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBOEIsYUFBYSxFQUFlLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7QUFXbkcsTUFBTSxPQUFPLGtCQUFrQjtJQW9EN0IsZ0JBQWdCO0lBQ2hCLFlBQ1MsSUFBaUIsRUFDaEIsT0FBbUIsRUFDbkIsU0FBb0I7UUFGckIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNoQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGNBQVMsR0FBVCxTQUFTLENBQVc7UUExQzlCLG1FQUFtRTtRQUNuRSx1RUFBdUU7UUFDOUQsWUFBTyxHQUFzQixFQUFFLENBQUM7UUFFekMsd0ZBQXdGO1FBQy9FLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUVsQzs7Ozs7V0FLRztRQUNNLGdCQUFXLEdBQXlCLFFBQVEsQ0FBQztRQUV0RCx1Q0FBdUM7UUFDN0IsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFOUMsd0NBQXdDO1FBQzlCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBZXJDLFVBQUssR0FBYSxhQUFhLENBQUMsRUFBRSxDQUFDO1FBRW5DLGNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBUXJDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWEsSUFBSSxDQUFDLE9BQWlCO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUU7WUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFO1lBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsYUFBYSxDQUFDLE1BQXVCO1FBQ25DLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNuQixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsV0FBVyxFQUFFLElBQUk7WUFDakIsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLEVBQUU7WUFDN0MseUJBQXlCLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsRUFBRTtZQUN6RCxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsRUFBRTtTQUM5QyxDQUFDO0lBQ0osQ0FBQzsrR0ExSFUsa0JBQWtCO21HQUFsQixrQkFBa0IsaVpDeEIvQixvN0dBdUVBOzs0RkQvQ2Esa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLFlBQVksaUJBR1AsaUJBQWlCLENBQUMsSUFBSTttSkFJNUIsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxVQUFVO3NCQUFsQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFRRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU07Z0JBR0csT0FBTztzQkFBaEIsTUFBTTtnQkFHaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQWlDVCxJQUFJO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckhlYWRpbmdMZXZlbCwgRHNmclNpemUsIERzZnJTaXplQ29uc3QsIEkxOG5TZXJ2aWNlLCBuZXdVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyTW9kYWxBY3Rpb24gfSBmcm9tICcuL21vZGFsLWFjdGlvbi5tb2RlbCc7XG5cbmRlY2xhcmUgZnVuY3Rpb24gZHNmcihlbGVtOiBIVE1MRWxlbWVudCk6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIERzZnJNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwnw6lsw6ltZW50IDxkaWFsb2c+LiAqL1xuICBASW5wdXQoKSBkaWFsb2dJZDogc3RyaW5nO1xuXG4gIC8qKiBUaXRyZSBkZSBsYSBtb2RhbC4gKi9cbiAgLy8gVE9ETyBoZWFkaW5nID9cbiAgQElucHV0KCkgdGl0bGVNb2RhbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMZSBuaXZlYXUgZGUgdGl0cmUgZGV2YW50IMOqdHJlIHV0aWxpc8OpICh0YWcgYGgxYCBwYXIgZMOpZmF1dCkuXG4gICAqIENldHRlIGJhbGlzZSBuZSBwcm9kdWl0IHBhcyBkZSBzdHlsZSwgbWFpcyBkZSBsYSBzdHJ1Y3R1cmUuXG4gICAqL1xuICBASW5wdXQoKSBoZWFkaW5nTGV2ZWw6IERzZnJIZWFkaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIExlIHRhYmxlYXUgZGVzIGFjdGlvbnMgw6AgcG9zaXRpb25uZXIgZGFucyBsZSBkaWFsb2d1ZSBtb2RhbC4gKi9cbiAgLy8gVE9ETyBOZSBmYXVkcmFpdC1pbCBwYXMgaG9tb2fDqW7DqWlzZXIgYXZlYyBsZXMgdHVpbGVzIGV0IGxlcyBjYXJ0ZXMgP1xuICBASW5wdXQoKSBhY3Rpb25zOiBEc2ZyTW9kYWxBY3Rpb25bXSA9IFtdO1xuXG4gIC8qKiBQZXJtZXQgZGUgbmUgcGFzIGZlcm1lciBsYSBtb2RhbGUgYXV0b21hdGlxdWVtZW50IGxvcnNxdSd1bmUgYWN0aW9uIGVzdCBleMOpY3V0w6llLiAqL1xuICBASW5wdXQoKSBhdXRvQ2xvc2VPbkFjdGlvbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIExlIG1vZGUgZGUgY29udHLDtGxlIHZvdXMgcGVybWV0LCBsZSBjYXMgw6ljaMOpYW50LCAgZGUgbWFpbnRlbmlyIGxhIGNhcGFjaXTDqSBkZSBsYSBtb2RhbGUgw6Agw6p0cmUgcGlsb3TDqWVcbiAgICogcHJvZ3JhbW1hdGlxdWVtZW50IGVuIGFic2VuY2UgZGUgYm91dG9uIGRlIGNvbnRyw7RsZS5cbiAgICpcbiAgICogQHNpbmNlIDEuOC4wXG4gICAqL1xuICBASW5wdXQoKSBjb250cm9sTW9kZTogJ2J1dHRvbicgfCAnZHluYW1pYycgPSAnYnV0dG9uJztcblxuICAvKiogU2lnbmFsZSBsJ291dmVydHVyZSBkZSBsYSBtb2RhbC4gKi9cbiAgQE91dHB1dCgpIGRpc2Nsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBTaWduYWxlIGxhIGZlcm1ldHVyZSBkZSBsYSBtb2RhbC4gKi9cbiAgQE91dHB1dCgpIGNvbmNlYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBAVmlld0NoaWxkKCdkc2ZyTW9kYWwnKSBkc2ZyTW9kYWw6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwnw6lsw6ltZW50IHRlbmFudCB0aXRyZSBkZXNjcmlwdGlmIGR1IGRpYWxvZ3VlIG1vZGFsLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRpdGxlRWxlbWVudElkOiBzdHJpbmc7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzaXplQ2xhc3NlczogeyBba2xhc3M6IHN0cmluZ106IGJvb2xlYW4gfTtcblxuICBwcml2YXRlIF9zaXplOiBEc2ZyU2l6ZSA9IERzZnJTaXplQ29uc3QuTUQ7XG5cbiAgcHJpdmF0ZSBfdW5saXN0ZW46IHsgKCk6IHZvaWQgfVtdID0gW107XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaTE4bjogSTE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXG4gICkge1xuICAgIHRoaXMudXBkYXRlU2l6ZUNsYXNzZXMoKTtcbiAgfVxuXG4gIGdldCBzaXplKCk6IERzZnJTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYSB0YWlsbGUgZGUgbGEgbW9kYWxlLlxuICAgKiBWYWxldXJzIHBvc3NpYmxlcyA6IGBTTWAgKHBvdXIgc21hbGwpLCBgTURgIChwb3VyIG1lZGl1bSksIGBMR2AgKHBvdXIgbGFyZ2UpLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNpemUobmV3U2l6ZTogRHNmclNpemUpIHtcbiAgICB0aGlzLl9zaXplID0gbmV3U2l6ZTtcbiAgICB0aGlzLnVwZGF0ZVNpemVDbGFzc2VzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRpYWxvZ0lkID8/PSBuZXdVbmlxdWVJZCgpO1xuICAgIHRoaXMudGl0bGVFbGVtZW50SWQgPSBuZXdVbmlxdWVJZCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3VubGlzdGVuLnB1c2goXG4gICAgICB0aGlzLnJlbmRlcmVyMi5saXN0ZW4odGhpcy5kc2ZyTW9kYWwubmF0aXZlRWxlbWVudCwgJ2RzZnIuY29uY2VhbCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5jb25jZWFsLmVtaXQoKTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5yZW5kZXJlcjIubGlzdGVuKHRoaXMuZHNmck1vZGFsLm5hdGl2ZUVsZW1lbnQsICdkc2ZyLmRpc2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nsb3NlLmVtaXQoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl91bmxpc3Rlbi5mb3JFYWNoKCh1bmxpc3RlbkZ1bmMpID0+IHVubGlzdGVuRnVuYygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgZMOpY2xlbmNoZXIgcHJvZ3JhbW1hdGlxdWVtZW50IGwnb3V2ZXJ0dXJlIGRlIGxhIG1vZGFsZS5cbiAgICovXG4gIG9wZW4oKSB7XG4gICAgZHNmcih0aGlzLmRzZnJNb2RhbC5uYXRpdmVFbGVtZW50KS5tb2RhbC5kaXNjbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1ldCBkZSBkw6ljbGVuY2hlciBwcm9ncmFtbWF0aXF1ZW1lbnQgbGEgZmVybWV0dXJlIGRlIGxhIG1vZGFsZS5cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGRzZnIodGhpcy5kc2ZyTW9kYWwubmF0aXZlRWxlbWVudCkubW9kYWwuY29uY2VhbCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwZXJmb3JtQWN0aW9uKGFjdGlvbjogRHNmck1vZGFsQWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKGFjdGlvbi5jYWxsYmFjaykge1xuICAgICAgYWN0aW9uLmNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaXplQ2xhc3NlcygpIHtcbiAgICB0aGlzLnNpemVDbGFzc2VzID0ge1xuICAgICAgJ2ZyLWNvbC0xMic6IHRydWUsXG4gICAgICAnZnItY29sLW1kLTQnOiB0aGlzLnNpemUgPT09IERzZnJTaXplQ29uc3QuU00sXG4gICAgICAnZnItY29sLW1kLTggZnItY29sLWxnLTYnOiB0aGlzLnNpemUgPT09IERzZnJTaXplQ29uc3QuTUQsXG4gICAgICAnZnItY29sLW1kLTgnOiB0aGlzLnNpemUgPT09IERzZnJTaXplQ29uc3QuTEcsXG4gICAgfTtcbiAgfVxufVxuIiwiPGJ1dHRvblxuICAqbmdJZj1cImNvbnRyb2xNb2RlID09PSAnZHluYW1pYydcIlxuICB0eXBlPVwiYnV0dG9uXCJcbiAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcbiAgZGF0YS1mci1vcGVuZWQ9XCJmYWxzZVwiXG4gIFthdHRyLmFyaWEtY29udHJvbHNdPVwiZGlhbG9nSWRcIlxuICBkaXNhYmxlZFxuICBoaWRkZW4+PC9idXR0b24+XG48ZGlhbG9nIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aXRsZUVsZW1lbnRJZFwiIFtpZF09XCJkaWFsb2dJZFwiIGNsYXNzPVwiZnItbW9kYWxcIiAjZHNmck1vZGFsPlxuICA8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyIGZyLWNvbnRhaW5lci0tZmx1aWQgZnItY29udGFpbmVyLW1kXCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLWdyaWQtcm93IGZyLWdyaWQtcm93LS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2l6ZUNsYXNzZXNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZyLW1vZGFsX19ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZyLW1vZGFsX19oZWFkZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnItYnRuIGZyLWJ0bi0tY2xvc2VcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiaTE4bi50KCdtb2RhbC5hcmlhTGFiZWwnKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiZGlhbG9nSWRcIj5cbiAgICAgICAgICAgICAge3sgaTE4bi50KCdjb21tb25zLmNsb3NlJykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1tb2RhbF9fY29udGVudFwiPlxuICAgICAgICAgICAgPCEtLSBwYXMgZCd1dGlsaXNhdGlvbiBkdSBjb21wb3NhbnQgZWR1LWhlYWRpbmcgY2FyIEgxIHByw6lzZW50IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaGVhZGluZ0xldmVsXCI+XG4gICAgICAgICAgICAgIDxoMSAqbmdTd2l0Y2hEZWZhdWx0IFtpZF09XCJ0aXRsZUVsZW1lbnRJZFwiIGNsYXNzPVwiZnItbW9kYWxfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmci1pY29uLWFycm93LXJpZ2h0LWxpbmUgZnItZmktLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPnt7IHRpdGxlTW9kYWwgfX1cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPGgyICpuZ1N3aXRjaENhc2U9XCInSDInXCIgW2lkXT1cInRpdGxlRWxlbWVudElkXCIgY2xhc3M9XCJmci1tb2RhbF9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZyLWljb24tYXJyb3ctcmlnaHQtbGluZSBmci1maS0tbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+e3sgdGl0bGVNb2RhbCB9fVxuICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICA8aDMgKm5nU3dpdGNoQ2FzZT1cIidIMydcIiBbaWRdPVwidGl0bGVFbGVtZW50SWRcIiBjbGFzcz1cImZyLW1vZGFsX190aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnItaWNvbi1hcnJvdy1yaWdodC1saW5lIGZyLWZpLS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj57eyB0aXRsZU1vZGFsIH19XG4gICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgIDxoNCAqbmdTd2l0Y2hDYXNlPVwiJ0g0J1wiIFtpZF09XCJ0aXRsZUVsZW1lbnRJZFwiIGNsYXNzPVwiZnItbW9kYWxfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmci1pY29uLWFycm93LXJpZ2h0LWxpbmUgZnItZmktLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPnt7IHRpdGxlTW9kYWwgfX1cbiAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgPGg1ICpuZ1N3aXRjaENhc2U9XCInSDUnXCIgW2lkXT1cInRpdGxlRWxlbWVudElkXCIgY2xhc3M9XCJmci1tb2RhbF9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZyLWljb24tYXJyb3ctcmlnaHQtbGluZSBmci1maS0tbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+e3sgdGl0bGVNb2RhbCB9fVxuICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICA8aDYgKm5nU3dpdGNoQ2FzZT1cIidINidcIiBbaWRdPVwidGl0bGVFbGVtZW50SWRcIiBjbGFzcz1cImZyLW1vZGFsX190aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnItaWNvbi1hcnJvdy1yaWdodC1saW5lIGZyLWZpLS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj57eyB0aXRsZU1vZGFsIH19XG4gICAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2Zvb3RlclwiICpuZ0lmPVwiYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmci1idG5zLWdyb3VwIGZyLWJ0bnMtZ3JvdXAtLXJpZ2h0IGZyLWJ0bnMtZ3JvdXAtLWlubGluZS1yZXZlcnNlIGZyLWJ0bnMtZ3JvdXAtLWlubGluZS1sZyBmci1idG5zLWdyb3VwLS1pY29uLWxlZnRcIj5cbiAgICAgICAgICAgICAgPGRzZnItYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zXCJcbiAgICAgICAgICAgICAgICBbYXJpYUNvbnRyb2xzXT1cImF1dG9DbG9zZU9uQWN0aW9uID8gZGlhbG9nSWQgOiAnJ1wiXG4gICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJhY3Rpb24uYXJpYUxhYmVsID8/ICcnXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImFjdGlvbi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYWN0aW9uLnR5cGUgPz8gJ3N1Ym1pdCdcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJhY3Rpb24udG9vbHRpcE1lc3NhZ2UgPz8gJydcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFt1cHBlcmNhc2VdPVwiYWN0aW9uLnVwcGVyY2FzZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwiYWN0aW9uLnZhcmlhbnQgPz8gJ3ByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGVyZm9ybUFjdGlvbihhY3Rpb24pXCI+XG4gICAgICAgICAgICAgIDwvZHNmci1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2RpYWxvZz5cblxuPG5nLXRlbXBsYXRlICNoZWFkaW5nTGV2ZWxUaXRsZT4gPC9uZy10ZW1wbGF0ZT5cbiJdfQ==