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).

125 lines 17.6 kB
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core'; import { 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; /** 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(changes) { if ([changes['label']]) this.label ||= this.i18n.t('upload.label'); // default if ([changes['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: "16.2.12", ngImport: i0, type: DsfrUploadComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrUploadComponent, selector: "dsfr-form-upload, dsfr-upload", inputs: { 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\" [for]=\"inputId\"\n >{{ label }}\n <span class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <input\n #inputFile\n class=\"fr-upload\"\n type=\"file\"\n [id]=\"inputId || null\"\n [name]=\"name || null\"\n [multiple]=\"multiple\"\n [attr.accept]=\"accept || null\"\n [disabled]=\"disabled\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n (change)=\"onFileChange($event)\"\n (cancel)=\"onCancel()\" />\n <p *ngIf=\"hasMessages()\" [id]=\"messagesGroupId\" class=\"fr-error-text\">\n {{ error }}\n </p>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", 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, }, ], template: "<div class=\"fr-upload-group\" [ngClass]=\"{ 'fr-input-group--error': error, 'fr-input-group--disabled': disabled }\">\n <label class=\"fr-label\" [for]=\"inputId\"\n >{{ label }}\n <span class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <input\n #inputFile\n class=\"fr-upload\"\n type=\"file\"\n [id]=\"inputId || null\"\n [name]=\"name || null\"\n [multiple]=\"multiple\"\n [attr.accept]=\"accept || null\"\n [disabled]=\"disabled\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n (change)=\"onFileChange($event)\"\n (cancel)=\"onCancel()\" />\n <p *ngIf=\"hasMessages()\" [id]=\"messagesGroupId\" class=\"fr-error-text\">\n {{ error }}\n </p>\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.I18nService }]; }, propDecorators: { inputFile: [{ type: ViewChild, args: ['inputFile', { static: true }] }], error: [{ type: Input }], multiple: [{ type: Input }], accept: [{ type: Input }], fileSelect: [{ type: Output }], fileCancel: [{ type: Output }], description: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLXVwbG9hZC91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2Zvcm0tdXBsb2FkL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBZSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFjakYsTUFBTSxPQUFPLG1CQUFvQixTQUFRLHVCQUE0QjtJQXlCbkUsWUFDbUIsU0FBb0IsRUFDcEIsV0FBdUIsRUFDdkIsSUFBaUI7UUFFbEMsS0FBSyxFQUFFLENBQUM7UUFKUyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLFNBQUksR0FBSixJQUFJLENBQWE7UUFwQnBDLHNEQUFzRDtRQUM3QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSzFCLGdFQUFnRTtRQUVoRSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUUxQyxnRUFBZ0U7UUFFaEUsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7SUFXMUMsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJ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O2tCQVovQixTQUFTOytCQUNFLCtCQUErQixpQkFFMUIsaUJBQWlCLENBQUMsSUFBSSxhQUMxQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7bUpBS0QsU0FBUztzQkFEUixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSS9CLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFJTixVQUFVO3NCQURULE1BQU07Z0JBS1AsVUFBVTtzQkFEVCxNQUFNO2dCQTBCTSxXQUFXO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbENvbXBvbmVudCwgSTE4blNlcnZpY2UsIG5ld1VuaXF1ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1mb3JtLXVwbG9hZCwgZHNmci11cGxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyVXBsb2FkQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJVcGxvYWRDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbENvbXBvbmVudDxhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQGludGVybmFsICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RmlsZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGlucHV0RmlsZTogRWxlbWVudFJlZjtcblxuICAvKiogVGV4dGUgZCdlcnJldXIuICovXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmc7XG5cbiAgLyoqIFBlcm1ldCBsJ2Fqb3V0IGRlIHBsdXNpZXVycyBmaWNoaWVycyDDoCBsYSBmb2lzLiAqL1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8qKiBTcMOpY2lmaWUgdW4gZmlsdHJlIHBvdXIgbGVzIHR5cGVzIGRlIGZpY2hpZXJzIHF1ZSBsJ3V0aWxpc2F0ZXVyIHBldXQgc8OpbGVjdGlvbm5lciAoYEBzaW5jZSAxLjkuMGApLiAqL1xuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZztcblxuICAvKiogRXbDqW5lbWVudCDDqW1pcyDDoCBsYSBzw6lsZWN0aW9uIGQndW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzLiAqL1xuICBAT3V0cHV0KClcbiAgZmlsZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqIEV2w6luZW1lbnQgw6ltaXMgbG9yc3F1ZSBsJ3V0aWxpc2F0ZXVyIGFubnVsZSBsYSBzw6lsZWN0aW9uLiAqL1xuICBAT3V0cHV0KClcbiAgZmlsZUNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBtZXNzYWdlc0dyb3VwSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBJMThuU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAoQHNpbmNlIDEuNC4wKSB1dGlsaXNlciBoaW50IMOgIGxhIHBsYWNlLiAqL1xuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5oaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIHBvdXIgbCd1cGxvYWQgKHByw6ljaXNlIGxlcyBjb250cmFpbnRlcyBhdSBuaXZlYXUgZHUgb3UgZGVzIGZpY2hpZXJzIGF0dGVuZHVzIDogZm9ybWF0LCBwb2lkcyBhdHRlbmR1cywgbm9tYnJlIGRlIGZpY2hpZXJzIHBvc3NpYmxl4oCmKS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgKEBzaW5jZSAxLjQuMCkgdXRpbGlzZXIgaGludCDDoCBsYSBwbGFjZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuaGludCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cmNoYXJnZSBwZXJtZXR0YW50IGRlIGfDqXJlciBsYSBtaXNlIMOgIGpvdXIgZHUgRE9NLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IGFueSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIGFmaW4gZGUgc2UgcHLDqW11bmlyIGRlcyBpbml0aWFsaXNhdGlvbnMgYXZlYyB1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyAodmlkZSBvdSBwYXMpIGlsIGZhdXQgcydhc3N1cmVyIGR1IHR5cGVcbiAgICAvLyBkJ2FyZ3VtZW50IHRyYW5zbWlzIGVuIGVudHLDqWUgZXQgZm9yY2VyIGxhIGNoYcOubmUgdmlkZSBsZSBjYXMgw6ljaMOpYW50XG4gICAgY29uc3QgaXNUeXBlRmlsZUxpc3QgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLmluY2x1ZGVzKEZpbGVMaXN0Lm5hbWUpO1xuICAgIGlmICghaXNUeXBlRmlsZUxpc3QpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIGlmICh0aGlzLmlucHV0RmlsZSkge1xuICAgICAgaWYgKGlzVHlwZUZpbGVMaXN0ICYmIHZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudCwgJ2ZpbGVzJywgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgJycpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LCAnZmlsZXMnLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5uYW1lID8/PSAnZmlsZS11cGxvYWQnOyAvLyAnZmlsZS11cGxvYWQnIGVzdCBsYSB2YWxldXIgc3RhdGlxdWUganVzcXUnZW4gMS4zXG4gICAgdGhpcy5tZXNzYWdlc0dyb3VwSWQgPSBuZXdVbmlxdWVJZCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKFtjaGFuZ2VzWydsYWJlbCddXSkgdGhpcy5sYWJlbCB8fD0gdGhpcy5pMThuLnQoJ3VwbG9hZC5sYWJlbCcpOyAvLyBkZWZhdWx0XG4gICAgaWYgKFtjaGFuZ2VzWydoaW50J11dKSB0aGlzLmhpbnQgfHw9IHRoaXMuaTE4bi50KCd1cGxvYWQuaGludCcpOyAvLyBkZWZhdWx0XG4gIH1cblxuICAvKipcbiAgICogUGVybWV0IGRlIHByb2dyYW1tYXRpcXVlbWVudCByw6lpbml0aWFsaXNlciBsZSBjaGFtcCBhcHLDqHMgdW5lIHPDqWxlY3Rpb24gZGUgZmljaGllcihzKS5cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb25DYW5jZWwoKSB7XG4gICAgdGhpcy5maWxlQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb25GaWxlQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IDxIVE1MSW5wdXRFbGVtZW50PmV2ZW50LnRhcmdldDtcbiAgICB0aGlzLnZhbHVlID0gdGFyZ2V0LmZpbGVzID8/IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy52YWx1ZSkgdGhpcy5maWxlU2VsZWN0LmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGhhc01lc3NhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3I7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmci11cGxvYWQtZ3JvdXBcIiBbbmdDbGFzc109XCJ7ICdmci1pbnB1dC1ncm91cC0tZXJyb3InOiBlcnJvciwgJ2ZyLWlucHV0LWdyb3VwLS1kaXNhYmxlZCc6IGRpc2FibGVkIH1cIj5cbiAgPGxhYmVsIGNsYXNzPVwiZnItbGFiZWxcIiBbZm9yXT1cImlucHV0SWRcIlxuICAgID57eyBsYWJlbCB9fVxuICAgIDxzcGFuIGNsYXNzPVwiZnItaGludC10ZXh0XCI+e3sgaGludCB9fTwvc3Bhbj5cbiAgPC9sYWJlbD5cbiAgPGlucHV0XG4gICAgI2lucHV0RmlsZVxuICAgIGNsYXNzPVwiZnItdXBsb2FkXCJcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgW2lkXT1cImlucHV0SWQgfHwgbnVsbFwiXG4gICAgW25hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgIFthdHRyLmFjY2VwdF09XCJhY2NlcHQgfHwgbnVsbFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImhhc01lc3NhZ2VzKCkgPyBtZXNzYWdlc0dyb3VwSWQgOiBudWxsXCJcbiAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsKClcIiAvPlxuICA8cCAqbmdJZj1cImhhc01lc3NhZ2VzKClcIiBbaWRdPVwibWVzc2FnZXNHcm91cElkXCIgY2xhc3M9XCJmci1lcnJvci10ZXh0XCI+XG4gICAge3sgZXJyb3IgfX1cbiAgPC9wPlxuPC9kaXY+XG4iXX0=