@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).
134 lines • 19.9 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DefaultControlComponent, newUniqueId } from '../../shared';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
export class DsfrUploadComponent extends DefaultControlComponent {
constructor(_renderer, _elementRef, i18n) {
super();
this._renderer = _renderer;
this._elementRef = _elementRef;
this.i18n = i18n;
/**
* Cache le label visuellement en le laissant disponible aux lecteurs d'écran.
*/
this.labelSrOnly = false;
/** Permet l'ajout de plusieurs fichiers à la fois. */
this.multiple = false;
/** Evénement émis à la sélection d'un ou plusieurs fichiers. */
this.fileSelect = new EventEmitter();
/** Evénement émis lorsque l'utilisateur annule la sélection. */
this.fileCancel = new EventEmitter();
}
/** @deprecated (since 1.4.0) utiliser hint à la place. */
get description() {
return this.hint;
}
/**
* Description pour l'upload (précise les contraintes au niveau du ou des fichiers attendus : format, poids attendus, nombre de fichiers possible…).
*
* @deprecated (since 1.4.0) utiliser hint à la place.
*
* @internal
*/
set description(value) {
this.hint = value;
}
/**
* Surcharge permettant de gérer la mise à jour du DOM.
*
* @internal
*/
writeValue(value) {
// afin de se prémunir des initialisations avec une chaîne de caractères (vide ou pas) il faut s'assurer du type
// d'argument transmis en entrée et forcer la chaîne vide le cas échéant
const isTypeFileList = Object.prototype.toString.call(value).includes(FileList.name);
if (!isTypeFileList) {
value = '';
}
super.writeValue(value);
if (this.inputFile) {
if (isTypeFileList && value?.length) {
this._renderer.setProperty(this.inputFile.nativeElement, 'files', value);
}
else {
this._renderer.setProperty(this.inputFile.nativeElement, 'value', '');
this._renderer.setProperty(this.inputFile.nativeElement, 'files', null);
}
}
}
/** @internal */
ngOnInit() {
super.ngOnInit();
this.name ??= 'file-upload'; // 'file-upload' est la valeur statique jusqu'en 1.3
this.messagesGroupId = newUniqueId();
}
/** @internal */
ngOnChanges({ label, hint }) {
if (label)
this.label ||= this.i18n.t('upload.label'); // default
if (hint)
this.hint ||= this.i18n.t('upload.hint'); // default
}
/**
* Permet de programmatiquement réinitialiser le champ après une sélection de fichier(s).
*/
reset() {
this.inputFile.nativeElement.value = '';
}
/** @internal */
onCancel() {
this.fileCancel.emit();
}
/** @internal */
onFileChange(event) {
const target = event.target;
this.value = target.files ?? undefined;
if (this.value)
this.fileSelect.emit(this.value);
}
/** @internal */
hasMessages() {
return !!this.error;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrUploadComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.DsfrI18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrUploadComponent, isStandalone: true, selector: "dsfr-form-upload, dsfr-upload", inputs: { labelSrOnly: "labelSrOnly", ariaInvalid: "ariaInvalid", error: "error", multiple: "multiple", accept: "accept", description: "description" }, outputs: { fileSelect: "fileSelect", fileCancel: "fileCancel" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrUploadComponent),
multi: true,
},
], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"fr-upload-group\" [ngClass]=\"{ 'fr-input-group--error': error, 'fr-input-group--disabled': disabled }\">\n <label class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" [for]=\"inputId\"\n >{{ label }}\n <span class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <!--\n On bind \u00E0 la fois la propri\u00E9t\u00E9 et l'attribut 'name' pour contourner le bug suivant: https://github.com/angular/angular/issues/11757\n cf. issue#360\n -->\n <input\n #inputFile\n class=\"fr-upload\"\n type=\"file\"\n [id]=\"inputId || null\"\n [name]=\"name || null\"\n [attr.name]=\"name || null\"\n [multiple]=\"multiple\"\n [attr.accept]=\"accept || null\"\n [disabled]=\"disabled\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n (change)=\"onFileChange($event)\"\n (cancel)=\"onCancel()\" />\n @if (hasMessages()) {\n <p [id]=\"messagesGroupId\" class=\"fr-error-text\">\n {{ error }}\n </p>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrUploadComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-form-upload, dsfr-upload', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrUploadComponent),
multi: true,
},
], standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"fr-upload-group\" [ngClass]=\"{ 'fr-input-group--error': error, 'fr-input-group--disabled': disabled }\">\n <label class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" [for]=\"inputId\"\n >{{ label }}\n <span class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <!--\n On bind \u00E0 la fois la propri\u00E9t\u00E9 et l'attribut 'name' pour contourner le bug suivant: https://github.com/angular/angular/issues/11757\n cf. issue#360\n -->\n <input\n #inputFile\n class=\"fr-upload\"\n type=\"file\"\n [id]=\"inputId || null\"\n [name]=\"name || null\"\n [attr.name]=\"name || null\"\n [multiple]=\"multiple\"\n [attr.accept]=\"accept || null\"\n [disabled]=\"disabled\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n (change)=\"onFileChange($event)\"\n (cancel)=\"onCancel()\" />\n @if (hasMessages()) {\n <p [id]=\"messagesGroupId\" class=\"fr-error-text\">\n {{ error }}\n </p>\n }\n</div>\n" }]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DsfrI18nService }], propDecorators: { inputFile: [{
type: ViewChild,
args: ['inputFile', { static: true }]
}], labelSrOnly: [{
type: Input
}], ariaInvalid: [{
type: Input
}], error: [{
type: Input
}], multiple: [{
type: Input
}], accept: [{
type: Input
}], fileSelect: [{
type: Output
}], fileCancel: [{
type: Output
}], description: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLXVwbG9hZC91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2Zvcm0tdXBsb2FkL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFtQixXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFnQnJGLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSx1QkFBNEI7SUF1Q25FLFlBQ21CLFNBQW9CLEVBQ3BCLFdBQXVCLEVBQ3ZCLElBQXFCO1FBRXRDLEtBQUssRUFBRSxDQUFDO1FBSlMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFpQjtRQXJDeEM7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQVU3QixzREFBc0Q7UUFDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQVMxQixnRUFBZ0U7UUFFaEUsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFFMUMsZ0VBQWdFO1FBRWhFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO0lB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VyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDRMQzVCSCx5aUNBNkJBLDJDRENZLFlBQVksNEhBQUUsV0FBVzs7NEZBRXhCLG1CQUFtQjtrQkFkL0IsU0FBUzsrQkFDRSwrQkFBK0IsaUJBRTFCLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGLGNBQ1csSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztxSUFLcEMsU0FBUztzQkFEUixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTS9CLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxNQUFNO3NCQUFkLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFVBQVU7c0JBRFQsTUFBTTtnQkEwQk0sV0FBVztzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbENvbXBvbmVudCwgRHNmckkxOG5TZXJ2aWNlLCBuZXdVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZm9ybS11cGxvYWQsIGRzZnItdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHNmclVwbG9hZENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJVcGxvYWRDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbENvbXBvbmVudDxhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQGludGVybmFsICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RmlsZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGlucHV0RmlsZTogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQ2FjaGUgbGUgbGFiZWwgdmlzdWVsbGVtZW50IGVuIGxlIGxhaXNzYW50IGRpc3BvbmlibGUgYXV4IGxlY3RldXJzIGQnw6ljcmFuLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxTck9ubHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWpvdXRlciBsJ2F0dHJpYnV0ICdhcmlhLWludmFsaWQnIHN1ciBsZSBjaGFtcCBkZSBmb3JtdWxhaXJlLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUludmFsaWQ6IHN0cmluZztcblxuICAvKiogVGV4dGUgZCdlcnJldXIuICovXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmc7XG5cbiAgLyoqIFBlcm1ldCBsJ2Fqb3V0IGRlIHBsdXNpZXVycyBmaWNoaWVycyDDoCBsYSBmb2lzLiAqL1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcMOpY2lmaWUgdW4gZmlsdHJlIHBvdXIgbGVzIHR5cGVzIGRlIGZpY2hpZXJzIHF1ZSBsJ3V0aWxpc2F0ZXVyIHBldXQgc8OpbGVjdGlvbm5lci5cbiAgICpcbiAgICogQHNpbmNlIDEuOS4wXG4gICAqL1xuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZztcblxuICAvKiogRXbDqW5lbWVudCDDqW1pcyDDoCBsYSBzw6lsZWN0aW9uIGQndW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzLiAqL1xuICBAT3V0cHV0KClcbiAgZmlsZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqIEV2w6luZW1lbnQgw6ltaXMgbG9yc3F1ZSBsJ3V0aWxpc2F0ZXVyIGFubnVsZSBsYSBzw6lsZWN0aW9uLiAqL1xuICBAT3V0cHV0KClcbiAgZmlsZUNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBtZXNzYWdlc0dyb3VwSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBEc2ZySTE4blNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuNC4wKSB1dGlsaXNlciBoaW50IMOgIGxhIHBsYWNlLiAqL1xuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5oaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIHBvdXIgbCd1cGxvYWQgKHByw6ljaXNlIGxlcyBjb250cmFpbnRlcyBhdSBuaXZlYXUgZHUgb3UgZGVzIGZpY2hpZXJzIGF0dGVuZHVzIDogZm9ybWF0LCBwb2lkcyBhdHRlbmR1cywgbm9tYnJlIGRlIGZpY2hpZXJzIHBvc3NpYmxl4oCmKS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuNC4wKSB1dGlsaXNlciBoaW50IMOgIGxhIHBsYWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5oaW50ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU3VyY2hhcmdlIHBlcm1ldHRhbnQgZGUgZ8OpcmVyIGxhIG1pc2Ugw6Agam91ciBkdSBET00uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogYW55IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gYWZpbiBkZSBzZSBwcsOpbXVuaXIgZGVzIGluaXRpYWxpc2F0aW9ucyBhdmVjIHVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzICh2aWRlIG91IHBhcykgaWwgZmF1dCBzJ2Fzc3VyZXIgZHUgdHlwZVxuICAgIC8vIGQnYXJndW1lbnQgdHJhbnNtaXMgZW4gZW50csOpZSBldCBmb3JjZXIgbGEgY2hhw65uZSB2aWRlIGxlIGNhcyDDqWNow6lhbnRcbiAgICBjb25zdCBpc1R5cGVGaWxlTGlzdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuaW5jbHVkZXMoRmlsZUxpc3QubmFtZSk7XG4gICAgaWYgKCFpc1R5cGVGaWxlTGlzdCkge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9XG4gICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuaW5wdXRGaWxlKSB7XG4gICAgICBpZiAoaXNUeXBlRmlsZUxpc3QgJiYgdmFsdWU/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LCAnZmlsZXMnLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCAnJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQsICdmaWxlcycsIG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLm5hbWUgPz89ICdmaWxlLXVwbG9hZCc7IC8vICdmaWxlLXVwbG9hZCcgZXN0IGxhIHZhbGV1ciBzdGF0aXF1ZSBqdXNxdSdlbiAxLjNcbiAgICB0aGlzLm1lc3NhZ2VzR3JvdXBJZCA9IG5ld1VuaXF1ZUlkKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5nT25DaGFuZ2VzKHsgbGFiZWwsIGhpbnQgfTogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChsYWJlbCkgdGhpcy5sYWJlbCB8fD0gdGhpcy5pMThuLnQoJ3VwbG9hZC5sYWJlbCcpOyAvLyBkZWZhdWx0XG4gICAgaWYgKGhpbnQpIHRoaXMuaGludCB8fD0gdGhpcy5pMThuLnQoJ3VwbG9hZC5oaW50Jyk7IC8vIGRlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgcHJvZ3JhbW1hdGlxdWVtZW50IHLDqWluaXRpYWxpc2VyIGxlIGNoYW1wIGFwcsOocyB1bmUgc8OpbGVjdGlvbiBkZSBmaWNoaWVyKHMpLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGVDYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xuICAgIHRoaXMudmFsdWUgPSB0YXJnZXQuZmlsZXMgPz8gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLmZpbGVTZWxlY3QuZW1pdCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaGFzTWVzc2FnZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvcjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZyLXVwbG9hZC1ncm91cFwiIFtuZ0NsYXNzXT1cInsgJ2ZyLWlucHV0LWdyb3VwLS1lcnJvcic6IGVycm9yLCAnZnItaW5wdXQtZ3JvdXAtLWRpc2FibGVkJzogZGlzYWJsZWQgfVwiPlxuICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIFtuZ0NsYXNzXT1cInsgJ2ZyLXNyLW9ubHknOiBsYWJlbFNyT25seSB9XCIgW2Zvcl09XCJpbnB1dElkXCJcbiAgICA+e3sgbGFiZWwgfX1cbiAgICA8c3BhbiBjbGFzcz1cImZyLWhpbnQtdGV4dFwiPnt7IGhpbnQgfX08L3NwYW4+XG4gIDwvbGFiZWw+XG4gIDwhLS1cbiAgICAgIE9uIGJpbmQgw6AgbGEgZm9pcyBsYSBwcm9wcmnDqXTDqSBldCBsJ2F0dHJpYnV0ICduYW1lJyBwb3VyIGNvbnRvdXJuZXIgbGUgYnVnIHN1aXZhbnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzExNzU3XG4gICAgICBjZi4gaXNzdWUjMzYwXG4gICAgICAtLT5cbiAgPGlucHV0XG4gICAgI2lucHV0RmlsZVxuICAgIGNsYXNzPVwiZnItdXBsb2FkXCJcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgW2lkXT1cImlucHV0SWQgfHwgbnVsbFwiXG4gICAgW25hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWUgfHwgbnVsbFwiXG4gICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICBbYXR0ci5hY2NlcHRdPVwiYWNjZXB0IHx8IG51bGxcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJoYXNNZXNzYWdlcygpID8gbWVzc2FnZXNHcm91cElkIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImFyaWFJbnZhbGlkIHx8IG51bGxcIlxuICAgIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgIChjYW5jZWwpPVwib25DYW5jZWwoKVwiIC8+XG4gIEBpZiAoaGFzTWVzc2FnZXMoKSkge1xuICAgIDxwIFtpZF09XCJtZXNzYWdlc0dyb3VwSWRcIiBjbGFzcz1cImZyLWVycm9yLXRleHRcIj5cbiAgICAgIHt7IGVycm9yIH19XG4gICAgPC9wPlxuICB9XG48L2Rpdj5cbiJdfQ==