UNPKG

@clr/angular

Version:

Angular components for Clarity

160 lines (156 loc) 18.6 kB
/* * Copyright (c) 2016-2025 Broadcom. All Rights Reserved. * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. * This software is released under MIT license. * The full license information can be found in LICENSE in the root directory of this project. */ import { Component, ContentChild, inject, Injector } from '@angular/core'; import { ClrCommonStringsService } from '../../utils/i18n/common-strings.service'; import { NgControlService } from '../common/providers/ng-control.service'; import { ClrFileInputContainer } from './file-input-container'; import { selectFiles } from './file-input.helpers'; import { CLR_FILE_MESSAGES_TEMPLATE_CONTEXT } from './file-messages'; import { ClrFileMessagesTemplate, } from './file-messages-template'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../../icon/icon"; export class ClrFileList { constructor() { this.injector = inject(Injector); this.commonStrings = inject(ClrCommonStringsService); this.ngControlService = inject(NgControlService, { optional: true }); this.fileInputContainer = inject(ClrFileInputContainer, { optional: true }); if (!this.ngControlService || !this.fileInputContainer) { throw new Error('The clr-file-list component can only be used within a clr-file-input-container.'); } } get files() { if (!this.fileInputContainer.fileInput) { return []; } const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement; return Array.from(fileInputElement.files).sort((a, b) => a.name.localeCompare(b.name)); } getClearFileLabel(filename) { return this.commonStrings.parse(this.commonStrings.keys.clearFile, { FILE: filename, }); } clearFile(fileToRemove) { if (!this.fileInputContainer.fileInput) { return; } const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement; const files = Array.from(fileInputElement.files); const newFiles = files.filter(file => file !== fileToRemove); selectFiles(fileInputElement, newFiles); this.fileInputContainer.focusBrowseButton(); } createFileMessagesTemplateContext(file) { const fileInputErrors = this.ngControlService.control.errors || {}; const errors = { accept: fileInputErrors.accept?.find(error => error.name === file.name), minFileSize: fileInputErrors.minFileSize?.find(error => error.name === file.name), maxFileSize: fileInputErrors.maxFileSize?.find(error => error.name === file.name), }; const success = Object.values(errors).every(error => !error); return { $implicit: file, success, errors }; } createFileMessagesTemplateInjector(fileMessagesTemplateContext) { return Injector.create({ parent: this.injector, providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }], }); } } ClrFileList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileList, deps: [], target: i0.ɵɵFactoryTarget.Component }); ClrFileList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileList, selector: "clr-file-list", host: { properties: { "attr.role": "\"list\"", "class.clr-file-list": "true" } }, queries: [{ propertyName: "fileMessagesTemplate", first: true, predicate: ClrFileMessagesTemplate, descendants: true }], ngImport: i0, template: ` <ng-container *ngFor="let file of files"> <div *ngIf="createFileMessagesTemplateContext(file); let fileMessagesTemplateContext" role="listitem" class="clr-file-list-item" [ngClass]="{ 'clr-error': !fileMessagesTemplateContext.success, 'clr-success': fileMessagesTemplateContext.success }" > <div class="clr-file-label-and-status-icon"> <span class="label clr-file-label"> {{ file.name }} <button class="btn btn-sm btn-link-neutral btn-icon clr-file-clear-button" [attr.aria-label]="getClearFileLabel(file.name)" (click)="clearFile(file)" > <cds-icon shape="times"></cds-icon> </button> </span> <cds-icon class="clr-validate-icon" [attr.shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'" [attr.status]="fileMessagesTemplateContext.success ? 'success' : 'danger'" aria-hidden="true" ></cds-icon> </div> <ng-container *ngIf="fileMessagesTemplate" [ngTemplateOutlet]="fileMessagesTemplate.templateRef" [ngTemplateOutletContext]="fileMessagesTemplateContext" [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)" ></ng-container> </div> </ng-container> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileList, decorators: [{ type: Component, args: [{ selector: 'clr-file-list', template: ` <ng-container *ngFor="let file of files"> <div *ngIf="createFileMessagesTemplateContext(file); let fileMessagesTemplateContext" role="listitem" class="clr-file-list-item" [ngClass]="{ 'clr-error': !fileMessagesTemplateContext.success, 'clr-success': fileMessagesTemplateContext.success }" > <div class="clr-file-label-and-status-icon"> <span class="label clr-file-label"> {{ file.name }} <button class="btn btn-sm btn-link-neutral btn-icon clr-file-clear-button" [attr.aria-label]="getClearFileLabel(file.name)" (click)="clearFile(file)" > <cds-icon shape="times"></cds-icon> </button> </span> <cds-icon class="clr-validate-icon" [attr.shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'" [attr.status]="fileMessagesTemplateContext.success ? 'success' : 'danger'" aria-hidden="true" ></cds-icon> </div> <ng-container *ngIf="fileMessagesTemplate" [ngTemplateOutlet]="fileMessagesTemplate.templateRef" [ngTemplateOutletContext]="fileMessagesTemplateContext" [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)" ></ng-container> </div> </ng-container> `, host: { '[attr.role]': '"list"', '[class.clr-file-list]': 'true', }, }] }], ctorParameters: function () { return []; }, propDecorators: { fileMessagesTemplate: [{ type: ContentChild, args: [ClrFileMessagesTemplate] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvZm9ybXMvZmlsZS1pbnB1dC9maWxlLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsdUJBQXVCLEdBR3hCLE1BQU0sMEJBQTBCLENBQUM7Ozs7QUFpRGxDLE1BQU0sT0FBTyxXQUFXO0lBUXRCO1FBTGlCLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNoRCxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRSx1QkFBa0IsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUd0RixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsaUZBQWlGLENBQUMsQ0FBQztTQUNwRztJQUNILENBQUM7SUFF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VSxXQUFXO2tCQS9DdkIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q1Q7b0JBQ0QsSUFBSSxFQUFFO3dCQUNKLGFBQWEsRUFBRSxRQUFRO3dCQUN2Qix1QkFBdUIsRUFBRSxNQUFNO3FCQUNoQztpQkFDRjswRUFFMkQsb0JBQW9CO3NCQUE3RSxZQUFZO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBCcm9hZGNvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoZSB0ZXJtIFwiQnJvYWRjb21cIiByZWZlcnMgdG8gQnJvYWRjb20gSW5jLiBhbmQvb3IgaXRzIHN1YnNpZGlhcmllcy5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIGluamVjdCwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvbmctY29udHJvbC5zZXJ2aWNlJztcbmltcG9ydCB7IENsckZpbGVJbnB1dENvbnRhaW5lciB9IGZyb20gJy4vZmlsZS1pbnB1dC1jb250YWluZXInO1xuaW1wb3J0IHsgQ2xyRmlsZUxpc3RWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnLi9maWxlLWlucHV0LXZhbGlkYXRvci1lcnJvcnMnO1xuaW1wb3J0IHsgc2VsZWN0RmlsZXMgfSBmcm9tICcuL2ZpbGUtaW5wdXQuaGVscGVycyc7XG5pbXBvcnQgeyBDTFJfRklMRV9NRVNTQUdFU19URU1QTEFURV9DT05URVhUIH0gZnJvbSAnLi9maWxlLW1lc3NhZ2VzJztcbmltcG9ydCB7XG4gIENsckZpbGVNZXNzYWdlc1RlbXBsYXRlLFxuICBDbHJGaWxlTWVzc2FnZXNUZW1wbGF0ZUNvbnRleHQsXG4gIENsclNpbmdsZUZpbGVWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICcuL2ZpbGUtbWVzc2FnZXMtdGVtcGxhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZmlsZS1saXN0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWxlIG9mIGZpbGVzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiY3JlYXRlRmlsZU1lc3NhZ2VzVGVtcGxhdGVDb250ZXh0KGZpbGUpOyBsZXQgZmlsZU1lc3NhZ2VzVGVtcGxhdGVDb250ZXh0XCJcbiAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgY2xhc3M9XCJjbHItZmlsZS1saXN0LWl0ZW1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ2Nsci1lcnJvcic6ICFmaWxlTWVzc2FnZXNUZW1wbGF0ZUNvbnRleHQuc3VjY2VzcyxcbiAgICAgICAgICAnY2xyLXN1Y2Nlc3MnOiBmaWxlTWVzc2FnZXNUZW1wbGF0ZUNvbnRleHQuc3VjY2Vzc1xuICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsci1maWxlLWxhYmVsLWFuZC1zdGF0dXMtaWNvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgY2xyLWZpbGUtbGFiZWxcIj5cbiAgICAgICAgICAgIHt7IGZpbGUubmFtZSB9fVxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmstbmV1dHJhbCBidG4taWNvbiBjbHItZmlsZS1jbGVhci1idXR0b25cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldENsZWFyRmlsZUxhYmVsKGZpbGUubmFtZSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWxlKGZpbGUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGNkcy1pY29uIHNoYXBlPVwidGltZXNcIj48L2Nkcy1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPGNkcy1pY29uXG4gICAgICAgICAgICBjbGFzcz1cImNsci12YWxpZGF0ZS1pY29uXCJcbiAgICAgICAgICAgIFthdHRyLnNoYXBlXT1cImZpbGVNZXNzYWdlc1RlbXBsYXRlQ29udGV4dC5zdWNjZXNzID8gJ2NoZWNrLWNpcmNsZScgOiAnZXhjbGFtYXRpb24tY2lyY2xlJ1wiXG4gICAgICAgICAgICBbYXR0ci5zdGF0dXNdPVwiZmlsZU1lc3NhZ2VzVGVtcGxhdGVDb250ZXh0LnN1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZGFuZ2VyJ1wiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgID48L2Nkcy1pY29uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJmaWxlTWVzc2FnZXNUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsZU1lc3NhZ2VzVGVtcGxhdGUudGVtcGxhdGVSZWZcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJmaWxlTWVzc2FnZXNUZW1wbGF0ZUNvbnRleHRcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlRmlsZU1lc3NhZ2VzVGVtcGxhdGVJbmplY3RvcihmaWxlTWVzc2FnZXNUZW1wbGF0ZUNvbnRleHQpXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIucm9sZV0nOiAnXCJsaXN0XCInLFxuICAgICdbY2xhc3MuY2xyLWZpbGUtbGlzdF0nOiAndHJ1ZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckZpbGVMaXN0IHtcbiAgQENvbnRlbnRDaGlsZChDbHJGaWxlTWVzc2FnZXNUZW1wbGF0ZSkgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbGVNZXNzYWdlc1RlbXBsYXRlOiBDbHJGaWxlTWVzc2FnZXNUZW1wbGF0ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tb25TdHJpbmdzID0gaW5qZWN0KENsckNvbW1vblN0cmluZ3NTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZ0NvbnRyb2xTZXJ2aWNlID0gaW5qZWN0KE5nQ29udHJvbFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZUlucHV0Q29udGFpbmVyID0gaW5qZWN0KENsckZpbGVJbnB1dENvbnRhaW5lciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMubmdDb250cm9sU2VydmljZSB8fCAhdGhpcy5maWxlSW5wdXRDb250YWluZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNsci1maWxlLWxpc3QgY29tcG9uZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGEgY2xyLWZpbGUtaW5wdXQtY29udGFpbmVyLicpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZmlsZXMoKSB7XG4gICAgaWYgKCF0aGlzLmZpbGVJbnB1dENvbnRhaW5lci5maWxlSW5wdXQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlSW5wdXRFbGVtZW50ID0gdGhpcy5maWxlSW5wdXRDb250YWluZXIuZmlsZUlucHV0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dEVsZW1lbnQuZmlsZXMpLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsZWFyRmlsZUxhYmVsKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jb21tb25TdHJpbmdzLnBhcnNlKHRoaXMuY29tbW9uU3RyaW5ncy5rZXlzLmNsZWFyRmlsZSwge1xuICAgICAgRklMRTogZmlsZW5hbWUsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJGaWxlKGZpbGVUb1JlbW92ZTogRmlsZSkge1xuICAgIGlmICghdGhpcy5maWxlSW5wdXRDb250YWluZXIuZmlsZUlucHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUlucHV0RWxlbWVudCA9IHRoaXMuZmlsZUlucHV0Q29udGFpbmVyLmZpbGVJbnB1dC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGZpbGVJbnB1dEVsZW1lbnQuZmlsZXMpO1xuICAgIGNvbnN0IG5ld0ZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZSAhPT0gZmlsZVRvUmVtb3ZlKTtcblxuICAgIHNlbGVjdEZpbGVzKGZpbGVJbnB1dEVsZW1lbnQsIG5ld0ZpbGVzKTtcbiAgICB0aGlzLmZpbGVJbnB1dENvbnRhaW5lci5mb2N1c0Jyb3dzZUJ1dHRvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUZpbGVNZXNzYWdlc1RlbXBsYXRlQ29udGV4dChmaWxlOiBGaWxlKTogQ2xyRmlsZU1lc3NhZ2VzVGVtcGxhdGVDb250ZXh0IHtcbiAgICBjb25zdCBmaWxlSW5wdXRFcnJvcnM6IENsckZpbGVMaXN0VmFsaWRhdGlvbkVycm9ycyA9IHRoaXMubmdDb250cm9sU2VydmljZS5jb250cm9sLmVycm9ycyB8fCB7fTtcblxuICAgIGNvbnN0IGVycm9yczogQ2xyU2luZ2xlRmlsZVZhbGlkYXRpb25FcnJvcnMgPSB7XG4gICAgICBhY2NlcHQ6IGZpbGVJbnB1dEVycm9ycy5hY2NlcHQ/LmZpbmQoZXJyb3IgPT4gZXJyb3IubmFtZSA9PT0gZmlsZS5uYW1lKSxcbiAgICAgIG1pbkZpbGVTaXplOiBmaWxlSW5wdXRFcnJvcnMubWluRmlsZVNpemU/LmZpbmQoZXJyb3IgPT4gZXJyb3IubmFtZSA9PT0gZmlsZS5uYW1lKSxcbiAgICAgIG1heEZpbGVTaXplOiBmaWxlSW5wdXRFcnJvcnMubWF4RmlsZVNpemU/LmZpbmQoZXJyb3IgPT4gZXJyb3IubmFtZSA9PT0gZmlsZS5uYW1lKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3VjY2VzcyA9IE9iamVjdC52YWx1ZXMoZXJyb3JzKS5ldmVyeShlcnJvciA9PiAhZXJyb3IpO1xuXG4gICAgcmV0dXJuIHsgJGltcGxpY2l0OiBmaWxlLCBzdWNjZXNzLCBlcnJvcnMgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVGaWxlTWVzc2FnZXNUZW1wbGF0ZUluamVjdG9yKGZpbGVNZXNzYWdlc1RlbXBsYXRlQ29udGV4dDogQ2xyRmlsZU1lc3NhZ2VzVGVtcGxhdGVDb250ZXh0KSB7XG4gICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IENMUl9GSUxFX01FU1NBR0VTX1RFTVBMQVRFX0NPTlRFWFQsIHVzZVZhbHVlOiBmaWxlTWVzc2FnZXNUZW1wbGF0ZUNvbnRleHQgfV0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==