angular-material-datatransfer-lib
Version:
A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.
89 lines • 20 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/components/main.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { DatatransferFacade } from '../facades/datatransfer.facade';
import { ConfigService } from '../services/config.service';
import { PaginationService } from '../services/pagination.service';
import { DatatransferStore } from '../stores/datatransfer.store';
export class MainComponent {
/**
* @param {?} datatransferStore
* @param {?} paginationService
*/
constructor(datatransferStore, paginationService) {
this.datatransferStore = datatransferStore;
this.paginationService = paginationService;
this.config = ConfigService.settings;
this.uploadProgress = this.datatransferStore.uploadProgress;
this.downloadProgress = this.datatransferStore.downloadProgress;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.init();
}
/**
* @private
* @return {?}
*/
init() {
if (this.config.core.showUploadDropzone) {
/** @type {?} */
const dropzoneElement = document.getElementById('amd-dropzone-component');
if (dropzoneElement) {
dropzoneElement.addEventListener('click', this.datatransferFacade.openBrowseDialog.bind(this.datatransferFacade), false);
this.datatransferFacade.assignUploadDrop(dropzoneElement);
}
}
else {
if (typeof this.config.core.uploadBrowseElementId !== 'undefined') {
/** @type {?} */
const uploadBrowseElement = document.getElementById(this.config.core.uploadBrowseElementId);
if (uploadBrowseElement) {
uploadBrowseElement.addEventListener('click', this.datatransferFacade.openBrowseDialog.bind(this.datatransferFacade), false);
}
}
if (typeof this.config.core.uploadDropElementId !== 'undefined') {
/** @type {?} */
const uploadDropElement = document.getElementById(this.config.core.uploadDropElementId);
if (uploadDropElement) {
this.datatransferFacade.assignUploadDrop(uploadDropElement);
}
}
}
}
}
MainComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'amd-main',
template: "<div class=\"amd-font\">\r\n <div *ngIf=\"config.core.showUploadDropzone\">\r\n <amd-dropzone></amd-dropzone>\r\n </div>\r\n\r\n <div fxLayout=\"row\" fxLayout.lt-sm=\"column\" style=\"margin-bottom: 10px\">\r\n <div fxFlex>\r\n <button class=\"amd-mr-1\" mat-raised-button *ngIf=\"datatransferFacade.showStartButton()\"\r\n (click)=\"datatransferFacade.startAll()\">\r\n <mat-icon>play_arrow</mat-icon> Start\r\n </button>\r\n <button class=\"amd-mr-1\" mat-raised-button *ngIf=\"datatransferFacade.showPauseButton()\"\r\n (click)=\"datatransferFacade.pauseAll()\">\r\n <mat-icon>pause</mat-icon> Pause\r\n </button>\r\n <button class=\"amd-mr-1\" mat-raised-button *ngIf=\"datatransferFacade.showRemoveButton()\"\r\n (click)=\"datatransferFacade.removeAll()\">\r\n <mat-icon>close</mat-icon> Remove all\r\n </button>\r\n <button class=\"amd-mr-1\" mat-raised-button *ngIf=\"datatransferFacade.showRetryButton()\"\r\n (click)=\"datatransferFacade.retryAll()\">\r\n <mat-icon>refresh</mat-icon> Retry ({{datatransferStore.failedCount}})\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"datatransferFacade.export('CSV')\">\r\n <span>CSV</span>\r\n </button>\r\n <button mat-menu-item (click)=\"datatransferFacade.export('JSON')\">\r\n <span>JSON</span>\r\n </button>\r\n </mat-menu>\r\n <button mat-raised-button *ngIf=\"datatransferFacade.showExportButton()\" [matMenuTriggerFor]=\"exportMenu\">\r\n Export\r\n <mat-icon>expand_more</mat-icon>\r\n </button>\r\n <mat-checkbox *ngIf=\"datatransferFacade.showPreprocessingCheckbox()\"\r\n [(ngModel)]=\"config.core.preprocessHashChecked\" style=\"margin-left: 10px;\">\r\n Preprocessing <span *ngIf=\"datatransferFacade.showPreprocessingTooltip()\"\r\n class=\"amd-vertical-align-middle\" [matTooltip]=\"config.core.preprocessHashTooltipContent\"\r\n matTooltipPosition=\"right\">\r\n <mat-icon>info_outline</mat-icon>\r\n </span>\r\n </mat-checkbox>\r\n </div>\r\n <div fxFlex=\"70px\" fxFlex.lt-sm=\"0px\">\r\n </div>\r\n <div fxFlex>\r\n <div *ngIf=\"uploadProgress.percent > 0\">\r\n <amd-progress [progressContainer]=\"uploadProgress\"></amd-progress>\r\n </div>\r\n <div *ngIf=\"downloadProgress.percent > 0\">\r\n <amd-progress [progressContainer]=\"downloadProgress\"></amd-progress>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"amd-container\">\r\n <div fxLayout=\"row\" class=\"amd-container-header\" style=\"align-items: center;\">\r\n <div fxFlex=\"40px\">\r\n <mat-checkbox (change)=\"datatransferFacade.toggleVisible($event.checked)\"></mat-checkbox>\r\n </div>\r\n <div fxFlex=\"50%\" fxFlex.lt-sm=\"100%\">\r\n Filename\r\n </div>\r\n <div fxFlex=\"50%\" style=\"padding-left: 40px;\" fxHide.lt-sm>\r\n Progress\r\n </div>\r\n <div fxFlex=\"20px\">\r\n <mat-menu #batchItemMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"datatransferFacade.removeSelected()\">\r\n <mat-icon>close</mat-icon>\r\n <span>Remove</span>\r\n </button>\r\n </mat-menu>\r\n <button mat-icon-button [matMenuTriggerFor]=\"batchItemMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <ng-template ngFor let-item [ngForOf]=\"paginationService.paginatedItems\" let-i=\"index\">\r\n <div *ngIf=\"datatransferFacade.showPath(paginationService.paginatedItems, i)\">\r\n <div fxLayout=\"row\" class=\"amd-container-headline\">\r\n <div fxFlex class=\"amd-container-headline-item\">\r\n <div class=\"amd-container-headline-item-entry\">\r\n <div fxFlex=\"40px\">\r\n <mat-icon>folder_open</mat-icon>\r\n </div>\r\n <div fxFlex>\r\n <span>\r\n <b>{{item.displayPath}}</b>\r\n </span>\r\n <button mat-icon-button (click)=\"datatransferFacade.openEditPathDialog(item)\"\r\n *ngIf=\"datatransferFacade.showEditDialog(item)\">\r\n <mat-icon aria-label=\"Edit path\">edit</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayout.lt-sm=\"column\" class=\"amd-container-row\"\r\n [ngClass]=\"{'selected': item.isSelected}\">\r\n <div fxFlex class=\"amd-container-row-item\">\r\n <div class=\"amd-container-row-item-entry\">\r\n <div fxFlex=\"40px\">\r\n <mat-checkbox [(ngModel)]=\"item.isSelected\"></mat-checkbox>\r\n </div>\r\n <div fxFlex=\"100%\">\r\n <div matTooltip=\"{{item.name}}\" matTooltipPosition=\"above\">\r\n <span>{{item.name}}</span>\r\n <button mat-icon-button (click)=\"datatransferFacade.openEditFilenameDialog(item)\"\r\n *ngIf=\"datatransferFacade.showEditDialog(item)\">\r\n <mat-icon aria-label=\"Edit filename\">edit</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex class=\"amd-container-row-item\">\r\n <div class=\"amd-container-row-item-entry\">\r\n <div fxFlex=\"40px\" matTooltip=\"{{item.preprocessContainer.percent}}%\"\r\n *ngIf=\"datatransferFacade.showSpinner(item); else showStatusClass\">\r\n <mat-progress-spinner *ngIf=\"item.preprocessContainer.percent > 0\" [diameter]=\"20\"\r\n mode=\"determinate\" [value]=\"item.preprocessContainer.percent\"></mat-progress-spinner>\r\n </div>\r\n <ng-template #showStatusClass>\r\n <div fxFlex=\"40px\">\r\n <mat-icon>{{datatransferFacade.getStatusClass(item.status)}}</mat-icon>\r\n </div>\r\n </ng-template>\r\n <div fxFlex=\"100%\">\r\n <div *ngIf=\"datatransferFacade.showProgressbar(item); else showStatusBlock\">\r\n <div class=\"amd-container-row-item-entry-stats\">\r\n <div fxFlex=\"25%\" fxFlex.lt-md=\"50%\">\r\n {{item.progressContainer.displayBitrate}}\r\n </div>\r\n <div fxFlex=\"25%\" fxHide.lt-md style=\"text-align: center\">\r\n {{item.progressContainer.displayTimeLeft}}\r\n </div>\r\n <div fxFlex=\"25%\" fxHide.lt-md style=\"text-align: center\">\r\n {{item.progressContainer.percent}}%\r\n </div>\r\n <div fxFlex=\"25%\" fxFlex.lt-md=\"50%\" style=\"text-align: right\">\r\n {{item.progressContainer.loadedSizeContainer.displaySize}} /\r\n {{item.sizeContainer.displaySize}}\r\n {{item.sizeContainer.displayUnit}}\r\n </div>\r\n </div>\r\n <mat-progress-bar *ngIf=\"item.progressContainer.total > 0\" color=\"primary\"\r\n mode=\"determinate\" [value]=\"item.progressContainer.percent\">\r\n </mat-progress-bar>\r\n </div>\r\n <ng-template #showStatusBlock>\r\n {{item.getStatusName()}} ({{item.sizeContainer.displaySize}}\r\n {{item.sizeContainer.displayUnit}})\r\n <div *ngIf=\"!!item.message\">\r\n <small>{{datatransferFacade.parseMessage(item)}}</small>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div fxFlex=\"20px\">\r\n <mat-menu #itemMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"datatransferFacade.retryItem(item)\"\r\n *ngIf=\"datatransferFacade.showRetryButtonByItem(item)\">\r\n <mat-icon>refresh</mat-icon>\r\n <span>Retry</span>\r\n </button>\r\n <button mat-menu-item (click)=\"datatransferFacade.removeItem(item)\">\r\n <mat-icon>close</mat-icon>\r\n <span>Remove</span>\r\n </button>\r\n </mat-menu>\r\n <button mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <div style=\"font-size: 12px; margin-top: 20px; text-align: right;\">\r\n <amd-pagination [paginationService]=\"paginationService\"></amd-pagination>\r\n </div>\r\n</div>"
}] }
];
/** @nocollapse */
MainComponent.ctorParameters = () => [
{ type: DatatransferStore },
{ type: PaginationService }
];
MainComponent.propDecorators = {
datatransferFacade: [{ type: Input }]
};
if (false) {
/** @type {?} */
MainComponent.prototype.datatransferFacade;
/** @type {?} */
MainComponent.prototype.config;
/** @type {?} */
MainComponent.prototype.uploadProgress;
/** @type {?} */
MainComponent.prototype.downloadProgress;
/** @type {?} */
MainComponent.prototype.datatransferStore;
/** @type {?} */
MainComponent.prototype.paginationService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW1hdGVyaWFsLWRhdGF0cmFuc2Zlci1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9tYWluLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFPakUsTUFBTSxPQUFPLGFBQWE7Ozs7O0lBU3hCLFlBQW1CLGlCQUFvQyxFQUFTLGlCQUFvQztRQUFqRixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQVMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNsRyxJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDO1FBQzVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7SUFDbEUsQ0FBQzs7OztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDOzs7OztJQUVPLElBQUk7UUFDVixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFOztrQkFDakMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUM7WUFDekUsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7YUFBTTtZQUNMLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxXQUFXLEVBQUU7O3NCQUMzRCxtQkFBbUIsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2dCQUMzRixJQUFJLG1CQUFtQixFQUFFO29CQUN2QixtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDOUg7YUFDRjtZQUNELElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxXQUFXLEVBQUU7O3NCQUN6RCxpQkFBaUIsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2dCQUN2RixJQUFJLGlCQUFpQixFQUFFO29CQUNyQixJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDN0Q7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7O1lBN0NGLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLHNyVkFBb0M7YUFDckM7Ozs7WUFOUSxpQkFBaUI7WUFEakIsaUJBQWlCOzs7aUNBVXZCLEtBQUs7Ozs7SUFBTiwyQ0FDdUM7O0lBRXZDLCtCQUFtQjs7SUFDbkIsdUNBQW1DOztJQUNuQyx5Q0FBcUM7O0lBRXpCLDBDQUEyQzs7SUFBRSwwQ0FBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElBcHBDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvYXBwLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGF0cmFuc2ZlckZhY2FkZSB9IGZyb20gJy4uL2ZhY2FkZXMvZGF0YXRyYW5zZmVyLmZhY2FkZSc7XHJcbmltcG9ydCB7IElQcm9ncmVzc0NvbnRhaW5lciB9IGZyb20gJy4uL21vZGVscy9wcm9ncmVzcy1jb250YWluZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGF0cmFuc2ZlclN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL2RhdGF0cmFuc2Zlci5zdG9yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdhbWQtbWFpbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21haW4uY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYWluQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZGF0YXRyYW5zZmVyRmFjYWRlOiBEYXRhdHJhbnNmZXJGYWNhZGU7XHJcblxyXG4gIGNvbmZpZzogSUFwcENvbmZpZztcclxuICB1cGxvYWRQcm9ncmVzczogSVByb2dyZXNzQ29udGFpbmVyO1xyXG4gIGRvd25sb2FkUHJvZ3Jlc3M6IElQcm9ncmVzc0NvbnRhaW5lcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGRhdGF0cmFuc2ZlclN0b3JlOiBEYXRhdHJhbnNmZXJTdG9yZSwgcHVibGljIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSkge1xyXG4gICAgdGhpcy5jb25maWcgPSBDb25maWdTZXJ2aWNlLnNldHRpbmdzO1xyXG4gICAgdGhpcy51cGxvYWRQcm9ncmVzcyA9IHRoaXMuZGF0YXRyYW5zZmVyU3RvcmUudXBsb2FkUHJvZ3Jlc3M7XHJcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MgPSB0aGlzLmRhdGF0cmFuc2ZlclN0b3JlLmRvd25sb2FkUHJvZ3Jlc3M7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5jb3JlLnNob3dVcGxvYWREcm9wem9uZSkge1xyXG4gICAgICBjb25zdCBkcm9wem9uZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW1kLWRyb3B6b25lLWNvbXBvbmVudCcpO1xyXG4gICAgICBpZiAoZHJvcHpvbmVFbGVtZW50KSB7XHJcbiAgICAgICAgZHJvcHpvbmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kYXRhdHJhbnNmZXJGYWNhZGUub3BlbkJyb3dzZURpYWxvZy5iaW5kKHRoaXMuZGF0YXRyYW5zZmVyRmFjYWRlKSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZGF0YXRyYW5zZmVyRmFjYWRlLmFzc2lnblVwbG9hZERyb3AoZHJvcHpvbmVFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5jb3JlLnVwbG9hZEJyb3dzZUVsZW1lbnRJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBjb25zdCB1cGxvYWRCcm93c2VFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb25maWcuY29yZS51cGxvYWRCcm93c2VFbGVtZW50SWQpO1xyXG4gICAgICAgIGlmICh1cGxvYWRCcm93c2VFbGVtZW50KSB7XHJcbiAgICAgICAgICB1cGxvYWRCcm93c2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kYXRhdHJhbnNmZXJGYWNhZGUub3BlbkJyb3dzZURpYWxvZy5iaW5kKHRoaXMuZGF0YXRyYW5zZmVyRmFjYWRlKSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmNvcmUudXBsb2FkRHJvcEVsZW1lbnRJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBjb25zdCB1cGxvYWREcm9wRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY29uZmlnLmNvcmUudXBsb2FkRHJvcEVsZW1lbnRJZCk7XHJcbiAgICAgICAgaWYgKHVwbG9hZERyb3BFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGF0cmFuc2ZlckZhY2FkZS5hc3NpZ25VcGxvYWREcm9wKHVwbG9hZERyb3BFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==