UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

287 lines 18.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** @type {?} */ const noop = (/** * @return {?} */ () => { }); const ɵ0 = noop; export class FileUploader { constructor() { /** * Accessible text for the button that opens the upload window. * * Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service */ this.buttonText = 'Agregar archivo(s)'; /** * Type set for button */ this.buttonType = 'basic'; /** * Specify the types of files that the input should be able to receive */ this.accept = []; /** * Set to `false` to tell the component to only accept a single file on upload. * * Defaults to `true`. Accepts multiple files. */ this.multiple = true; /** * Set to `true` for a loading file uploader. */ this.skeleton = false; /** * Provides a unique id for the underlying <input> node */ this.fileUploaderId = `file-uploader-${FileUploader.fileUploaderCount}`; /** * The list of files that have been submitted to be uploaded */ this.files = new Set(); this.filesChange = new EventEmitter(); this.baseClass = true; this.onTouchedCallback = noop; this.onChangeCallback = noop; FileUploader.fileUploaderCount++; } /** * Specifies the property to be used as the return value to `ngModel` * @return {?} */ get value() { return this.files; } /** * @param {?} v * @return {?} */ set value(v) { if (v !== this.files) { this.files = v; this.onChangeCallback(v); } } /** * @return {?} */ onBlur() { this.onTouchedCallback(); } /** * Propagates the injected `value`. * @param {?} value * @return {?} */ writeValue(value) { if (value !== this.value) { this.files = value; } } /** * @return {?} */ onFilesAdded() { /** @type {?} */ const files = this.fileInput.nativeElement.files; if (!this.multiple) { this.files.clear(); } for (let file of files) { /** @type {?} */ const fileItem = { file, uploaded: false, state: 'edit', invalid: false, invalidText: '', }; this.files.add(fileItem); this.filesChange.emit(this.files); } this.value = this.files; } /** * @param {?} fileItem * @return {?} */ removeFile(fileItem) { this.files.delete(fileItem); this.fileInput.nativeElement.value = ''; this.filesChange.emit(this.files); } /** * Registers the injected function to control the touch use of the `FileUploader`. * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouchedCallback = fn; } /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChangeCallback = fn; } } /** * Counter used to create unique ids for file-uploader components */ FileUploader.fileUploaderCount = 0; FileUploader.decorators = [ { type: Component, args: [{ selector: 'suka-file-uploader', template: ` <ng-container *ngIf="!skeleton; else skeletonTemplate"> <label class="label">{{title}}</label> <div *ngIf="description" class="form__helper-text">{{description}}</div> <div class="file"> <button type="button" [sukaButton]="buttonType" (click)="fileInput.click()" [attr.for]="fileUploaderId" [size]="size"> {{buttonText}} </button> <input #fileInput type="file" class="file-input" [accept]="accept" [id]="fileUploaderId" [multiple]="multiple" tabindex="-1" (change)="onFilesAdded()"/> <div class="file-container"> <div *ngFor="let fileItem of files"> <suka-file [fileItem]="fileItem" (remove)="removeFile(fileItem)"></suka-file> <div *ngIf="fileItem.invalid" class="form-requirement"> {{fileItem.invalidText}} </div> </div> </div> </div> </ng-container> <ng-template #skeletonTemplate> <div class="skeleton__text" style="width: 100px"></div> <div class="skeleton__text" style="width: 225px"></div> <button sukaButton skeleton="true"></button> </ng-template> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: FileUploader, multi: true } ] }] } ]; /** @nocollapse */ FileUploader.ctorParameters = () => []; FileUploader.propDecorators = { buttonText: [{ type: Input }], buttonType: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], accept: [{ type: Input }], multiple: [{ type: Input }], skeleton: [{ type: Input }], size: [{ type: Input }], fileUploaderId: [{ type: Input }], fileInput: [{ type: ViewChild, args: ['fileInput', { static: false },] }], files: [{ type: Input }], filesChange: [{ type: Output }], baseClass: [{ type: HostBinding, args: ['class.file-uploader',] }] }; if (false) { /** * Counter used to create unique ids for file-uploader components * @type {?} */ FileUploader.fileUploaderCount; /** * Accessible text for the button that opens the upload window. * * Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service * @type {?} */ FileUploader.prototype.buttonText; /** * Type set for button * @type {?} */ FileUploader.prototype.buttonType; /** * Text set to the title * @type {?} */ FileUploader.prototype.title; /** * Text set to the description * @type {?} */ FileUploader.prototype.description; /** * Specify the types of files that the input should be able to receive * @type {?} */ FileUploader.prototype.accept; /** * Set to `false` to tell the component to only accept a single file on upload. * * Defaults to `true`. Accepts multiple files. * @type {?} */ FileUploader.prototype.multiple; /** * Set to `true` for a loading file uploader. * @type {?} */ FileUploader.prototype.skeleton; /** * Sets the size of the button. * @type {?} */ FileUploader.prototype.size; /** * Provides a unique id for the underlying <input> node * @type {?} */ FileUploader.prototype.fileUploaderId; /** * Maintains a reference to the view DOM element of the underlying <input> node * @type {?} */ FileUploader.prototype.fileInput; /** * The list of files that have been submitted to be uploaded * @type {?} */ FileUploader.prototype.files; /** @type {?} */ FileUploader.prototype.filesChange; /** @type {?} */ FileUploader.prototype.baseClass; /** * @type {?} * @protected */ FileUploader.prototype.onTouchedCallback; /** * @type {?} * @protected */ FileUploader.prototype.onChangeCallback; } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUk3QyxJQUFJOzs7QUFBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUE7O0FBa0RyQixNQUFNLE9BQU8sWUFBWTtJQTZEdkI7Ozs7OztRQW5EUyxlQUFVLEdBQUcsb0JBQW9CLENBQUM7Ozs7UUFJbEMsZUFBVSxHQUFvRSxPQUFPLENBQUM7Ozs7UUFZdEYsV0FBTSxHQUFHLEVBQUUsQ0FBQzs7Ozs7O1FBTVosYUFBUSxHQUFHLElBQUksQ0FBQzs7OztRQUloQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBUWpCLG1CQUFjLEdBQUcsaUJBQWlCLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOzs7O1FBUW5FLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBWSxDQUFDO1FBRTNCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVaLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFM0Msc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUErQixJQUFJLENBQUM7UUFHNUQsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFLRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFnQjtRQUN4QixJQUFJLENBQUMsS0FBSyxJ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QUVyRCx5Q0FBK0M7Ozs7O0lBQy9DLHdDQUE4RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEZpbGVJdGVtIH0gZnJvbSAnLi9maWxlLWl0ZW0uaW50ZXJmYWNlJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWZpbGUtdXBsb2FkZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b247IGVsc2Ugc2tlbGV0b25UZW1wbGF0ZVwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj57e3RpdGxlfX08L2xhYmVsPlxuICAgICAgPGRpdiAqbmdJZj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmb3JtX19oZWxwZXItdGV4dFwiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtzdWthQnV0dG9uXT1cImJ1dHRvblR5cGVcIlxuICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgW2F0dHIuZm9yXT1cImZpbGVVcGxvYWRlcklkXCJcbiAgICAgICAgICBbc2l6ZV09XCJzaXplXCI+XG4gICAgICAgICAge3tidXR0b25UZXh0fX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNmaWxlSW5wdXRcbiAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgY2xhc3M9XCJmaWxlLWlucHV0XCJcbiAgICAgICAgICBbYWNjZXB0XT1cImFjY2VwdFwiXG4gICAgICAgICAgW2lkXT1cImZpbGVVcGxvYWRlcklkXCJcbiAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlc0FkZGVkKClcIi8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGVJdGVtIG9mIGZpbGVzXCI+XG4gICAgICAgICAgICA8c3VrYS1maWxlIFtmaWxlSXRlbV09XCJmaWxlSXRlbVwiIChyZW1vdmUpPVwicmVtb3ZlRmlsZShmaWxlSXRlbSlcIj48L3N1a2EtZmlsZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWxlSXRlbS5pbnZhbGlkXCIgY2xhc3M9XCJmb3JtLXJlcXVpcmVtZW50XCI+XG4gICAgICAgICAgICAgIHt7ZmlsZUl0ZW0uaW52YWxpZFRleHR9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNza2VsZXRvblRlbXBsYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbl9fdGV4dFwiIHN0eWxlPVwid2lkdGg6IDIyNXB4XCI+PC9kaXY+XG4gICAgICA8YnV0dG9uIHN1a2FCdXR0b24gc2tlbGV0b249XCJ0cnVlXCI+PC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogRmlsZVVwbG9hZGVyLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZGVyIHtcbiAgLyoqXG4gICAqIENvdW50ZXIgdXNlZCB0byBjcmVhdGUgdW5pcXVlIGlkcyBmb3IgZmlsZS11cGxvYWRlciBjb21wb25lbnRzXG4gICAqL1xuICBzdGF0aWMgZmlsZVVwbG9hZGVyQ291bnQgPSAwO1xuICAvKipcbiAgICogQWNjZXNzaWJsZSB0ZXh0IGZvciB0aGUgYnV0dG9uIHRoYXQgb3BlbnMgdGhlIHVwbG9hZCB3aW5kb3cuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBgRklMRV9VUExPQURFUi5PUEVOYCB2YWx1ZSBmcm9tIHRoZSBpMThuIHNlcnZpY2VcbiAgICovXG4gIEBJbnB1dCgpIGJ1dHRvblRleHQgPSAnQWdyZWdhciBhcmNoaXZvKHMpJztcbiAgLyoqXG4gICAqIFR5cGUgc2V0IGZvciBidXR0b25cbiAgICovXG4gIEBJbnB1dCgpIGJ1dHRvblR5cGU6ICdwcmltYXJ5JyB8ICdiYXNpYycgfCAncGxhaW4nIHwgJ2Rlc3RydWN0aXZlJyB8ICdvdXRsaW5lX3doaXRlJyA9ICdiYXNpYyc7XG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgdGl0bGVcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB0eXBlcyBvZiBmaWxlcyB0aGF0IHRoZSBpbnB1dCBzaG91bGQgYmUgYWJsZSB0byByZWNlaXZlXG4gICAqL1xuICBASW5wdXQoKSBhY2NlcHQgPSBbXTtcbiAgLyoqXG4gICAqIFNldCB0byBgZmFsc2VgIHRvIHRlbGwgdGhlIGNvbXBvbmVudCB0byBvbmx5IGFjY2VwdCBhIHNpbmdsZSBmaWxlIG9uIHVwbG9hZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBBY2NlcHRzIG11bHRpcGxlIGZpbGVzLlxuICAgKi9cbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIGZpbGUgdXBsb2FkZXIuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgc2l6ZTogJ3NtJyB8ICdub3JtYWwnO1xuICAvKipcbiAgICogUHJvdmlkZXMgYSB1bmlxdWUgaWQgZm9yIHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gbm9kZVxuICAgKi9cbiAgQElucHV0KCkgZmlsZVVwbG9hZGVySWQgPSBgZmlsZS11cGxvYWRlci0ke0ZpbGVVcGxvYWRlci5maWxlVXBsb2FkZXJDb3VudH1gO1xuICAvKipcbiAgICogTWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IERPTSBlbGVtZW50IG9mIHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gbm9kZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0Jywge3N0YXRpYzogZmFsc2V9KSBmaWxlSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYmUgdXBsb2FkZWRcbiAgICovXG4gIEBJbnB1dCgpIGZpbGVzID0gbmV3IFNldDxGaWxlSXRlbT4oKTtcblxuICBAT3V0cHV0KCkgZmlsZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbGUtdXBsb2FkZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByb3RlY3RlZCBvbkNoYW5nZUNhbGxiYWNrOiAoXzogU2V0PEZpbGVJdGVtPikgPT4gdm9pZCA9IG5vb3A7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgRmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSB0byBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgdG8gYG5nTW9kZWxgXG4gICAqL1xuICBnZXQgdmFsdWUoKTogU2V0PEZpbGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZXM7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IFNldDxGaWxlSXRlbT4pIHtcbiAgICBpZiAodiAhPT0gdGhpcy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodik7XG4gICAgfVxuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIHRoZSBpbmplY3RlZCBgdmFsdWVgLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogU2V0PEZpbGVJdGVtPikge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsZXNBZGRlZCgpIHtcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXM7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmZpbGVzLmNsZWFyKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVJdGVtOiBGaWxlSXRlbSA9IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdXBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogJ2VkaXQnLFxuICAgICAgICBpbnZhbGlkOiBmYWxzZSxcbiAgICAgICAgaW52YWxpZFRleHQ6ICcnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsZXMuYWRkKGZpbGVJdGVtKTtcbiAgICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5maWxlcztcbiAgfVxuXG4gIHJlbW92ZUZpbGUoZmlsZUl0ZW0pIHtcbiAgICB0aGlzLmZpbGVzLmRlbGV0ZShmaWxlSXRlbSk7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGluamVjdGVkIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIHRvdWNoIHVzZSBvZiB0aGUgYEZpbGVVcGxvYWRlcmAuXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxufVxuIl19