@wavemaker/app-ng-runtime 11.8.3-next.27383 → 11.8.3-next.27384
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- app-ng-runtime/components/input/file-upload/bundles/index.umd.js +14 -3
- app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +15 -4
- app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +14 -3
- app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/file-upload/file-upload.component.d.ts +1 -0
- app-ng-runtime/package.json +1 -1
|
@@ -268,7 +268,7 @@
|
|
|
268
268
|
const ctx_r1 = i0__namespace.ɵɵnextContext();
|
|
269
269
|
i0__namespace.ɵɵproperty("ngStyle", i0__namespace.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
|
|
270
270
|
i0__namespace.ɵɵadvance();
|
|
271
|
-
i0__namespace.ɵɵproperty("ngForOf", ctx_r1.selectedFiles);
|
|
271
|
+
i0__namespace.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
|
|
272
272
|
} }
|
|
273
273
|
function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
|
|
274
274
|
i0__namespace.ɵɵelementStart(0, "li", 26)(1, "div", 27);
|
|
@@ -405,6 +405,7 @@
|
|
|
405
405
|
* @param $files
|
|
406
406
|
*/
|
|
407
407
|
onSelectEventCall($event, $files) {
|
|
408
|
+
this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
|
|
408
409
|
this.selectedFiles = $files;
|
|
409
410
|
setTimeout(() => {
|
|
410
411
|
this.invokeEventCallback('select', {
|
|
@@ -427,7 +428,12 @@
|
|
|
427
428
|
}
|
|
428
429
|
/*this function to clear the specified file. if argument is not provided, it clears the complete list */
|
|
429
430
|
clear(fileObj) {
|
|
430
|
-
|
|
431
|
+
if (this.multiple) {
|
|
432
|
+
this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
|
|
436
|
+
}
|
|
431
437
|
}
|
|
432
438
|
/*this function to set the class names for clear icon */
|
|
433
439
|
setClearIconClass(classValue) {
|
|
@@ -474,6 +480,10 @@
|
|
|
474
480
|
file.status = progressObj.status;
|
|
475
481
|
if (progressObj.errMsg) {
|
|
476
482
|
file.errMsg = progressObj.errMsg;
|
|
483
|
+
this.invokeEventCallback('error', {
|
|
484
|
+
$event,
|
|
485
|
+
files: file
|
|
486
|
+
});
|
|
477
487
|
}
|
|
478
488
|
}
|
|
479
489
|
}
|
|
@@ -571,6 +581,7 @@
|
|
|
571
581
|
this.app = app;
|
|
572
582
|
this.onSelectEvt = onSelectEvt;
|
|
573
583
|
this.selectedFiles = [];
|
|
584
|
+
this.multipleSelectedFiles = [];
|
|
574
585
|
this.selectedFolders = [];
|
|
575
586
|
this.fileTransfers = {};
|
|
576
587
|
this.caption = 'Upload';
|
|
@@ -646,7 +657,7 @@
|
|
|
646
657
|
type: i0.Component,
|
|
647
658
|
args: [{ selector: '[wmFileUpload]', providers: [
|
|
648
659
|
i3.provideAsWidgetRef(FileUploadComponent)
|
|
649
|
-
], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of selectedFiles\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
|
|
660
|
+
], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of (multiple ? multipleSelectedFiles : selectedFiles)\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
|
|
650
661
|
}], () => [{ type: i0__namespace.Injector }, { type: i1__namespace.App }, { type: undefined, decorators: [{
|
|
651
662
|
type: i0.Attribute,
|
|
652
663
|
args: ['select.event']
|
|
@@ -219,7 +219,7 @@ function FileUploadComponent_ul_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
219
219
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
220
220
|
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
|
|
221
221
|
i0.ɵɵadvance();
|
|
222
|
-
i0.ɵɵproperty("ngForOf", ctx_r1.selectedFiles);
|
|
222
|
+
i0.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
|
|
223
223
|
} }
|
|
224
224
|
function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
|
|
225
225
|
i0.ɵɵelementStart(0, "li", 26)(1, "div", 27);
|
|
@@ -356,6 +356,7 @@ export class FileUploadComponent extends StylableComponent {
|
|
|
356
356
|
* @param $files
|
|
357
357
|
*/
|
|
358
358
|
onSelectEventCall($event, $files) {
|
|
359
|
+
this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
|
|
359
360
|
this.selectedFiles = $files;
|
|
360
361
|
setTimeout(() => {
|
|
361
362
|
this.invokeEventCallback('select', {
|
|
@@ -378,7 +379,12 @@ export class FileUploadComponent extends StylableComponent {
|
|
|
378
379
|
}
|
|
379
380
|
/*this function to clear the specified file. if argument is not provided, it clears the complete list */
|
|
380
381
|
clear(fileObj) {
|
|
381
|
-
|
|
382
|
+
if (this.multiple) {
|
|
383
|
+
this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
|
|
387
|
+
}
|
|
382
388
|
}
|
|
383
389
|
/*this function to set the class names for clear icon */
|
|
384
390
|
setClearIconClass(classValue) {
|
|
@@ -425,6 +431,10 @@ export class FileUploadComponent extends StylableComponent {
|
|
|
425
431
|
file.status = progressObj.status;
|
|
426
432
|
if (progressObj.errMsg) {
|
|
427
433
|
file.errMsg = progressObj.errMsg;
|
|
434
|
+
this.invokeEventCallback('error', {
|
|
435
|
+
$event,
|
|
436
|
+
files: file
|
|
437
|
+
});
|
|
428
438
|
}
|
|
429
439
|
}
|
|
430
440
|
}
|
|
@@ -522,6 +532,7 @@ export class FileUploadComponent extends StylableComponent {
|
|
|
522
532
|
this.app = app;
|
|
523
533
|
this.onSelectEvt = onSelectEvt;
|
|
524
534
|
this.selectedFiles = [];
|
|
535
|
+
this.multipleSelectedFiles = [];
|
|
525
536
|
this.selectedFolders = [];
|
|
526
537
|
this.fileTransfers = {};
|
|
527
538
|
this.caption = 'Upload';
|
|
@@ -597,7 +608,7 @@ export class FileUploadComponent extends StylableComponent {
|
|
|
597
608
|
type: Component,
|
|
598
609
|
args: [{ selector: '[wmFileUpload]', providers: [
|
|
599
610
|
provideAsWidgetRef(FileUploadComponent)
|
|
600
|
-
], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of selectedFiles\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
|
|
611
|
+
], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of (multiple ? multipleSelectedFiles : selectedFiles)\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
|
|
601
612
|
}], () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
|
|
602
613
|
type: Attribute,
|
|
603
614
|
args: ['select.event']
|
|
@@ -608,4 +619,4 @@ export class FileUploadComponent extends StylableComponent {
|
|
|
608
619
|
type: Optional
|
|
609
620
|
}] }], null); })();
|
|
610
621
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileUploadComponent, { className: "FileUploadComponent", filePath: "file-upload.component.ts", lineNumber: 27 }); })();
|
|
611
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN4RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7OztJQUxoTCxBQURKLDhCQUFzRSxhQUMwSDtJQUE3QixBQUF0QyxBQUFyRiw0S0FBUywwQkFBbUIsS0FBQywyS0FBb0UsOEJBQXVCLEtBQUUsbUtBQVMseUJBQWtCLEtBQUU7SUFDdkws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TSxDQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELFdBQVc7UUFDUCxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxRQUFRLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxRQUFRLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQztvRkE3V1EsbUJBQW1CLHdGQXFWNEIsY0FBYyx3QkFBOEIsa0JBQWtCO29FQXJWN0csbUJBQW1CLDBFQUxqQjtnQkFDUCxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQzthQUMxQztZQ3ZCTCw4QkFBd0M7WUF1RXBDLEFBcENBLEFBTEEsQUFmQSxBQWJBLHFFQUFzRSx3REFha0IsNkRBZXNDLHFEQUtBLHFEQW9DZ0U7WUFlbE0saUJBQU07O1lBcEZrQyxjQUFnQztZQUFoQyx5REFBZ0M7WUFhL0IsY0FBaUQ7WUFBakQsOEVBQWlEO1lBZTdFLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUtvRSxjQUE4QjtZQUE5QixtREFBOEI7WUFvQ2dDLGNBQWdDO1lBQWhDLHFEQUFnQzs7O2lGRDdDbEwsbUJBQW1CO2NBUi9CLFNBQVM7MkJBQ0ksZ0JBQWdCLGFBRWY7b0JBQ1Asa0JBQWtCLHFCQUFxQjtpQkFDMUM7O3NCQXdWNkMsU0FBUzt1QkFBQyxjQUFjOztzQkFBdUIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7O2tGQXJWeEgsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBBdHRyaWJ1dGUsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBcHAsIERhdGFTb3VyY2UsIGdldFdtUHJvamVjdFByb3BlcnRpZXMsIGlzQXVkaW9GaWxlLCBpc0ltYWdlRmlsZSwgaXNWaWRlb0ZpbGV9IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7cHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL2ZpbGUtdXBsb2FkLnByb3BzJztcbmltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIHRvTG93ZXJ9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtZmlsZXVwbG9hZCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1maWxldXBsb2FkJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t3bUZpbGVVcGxvYWRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRmlsZVVwbG9hZENvbXBvbmVudClcbiAgICBdXG59KVxuXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgc2VsZWN0ZWRGaWxlczogYW55ID0gW107XG4gICAgc2VsZWN0ZWRGb2xkZXJzOiBhbnkgPSBbXTtcbiAgICBwcm9ncmVzc09ic2VydmFibGU7XG4gICAgbmFtZTtcbiAgICBoaW50O1xuICAgIG11bHRpcGxlO1xuICAgIGZpbGVUcmFuc2ZlcnMgPSB7fTtcbiAgICBjYXB0aW9uID0gJ1VwbG9hZCc7XG4gICAgZm9ybU5hbWUgPSAnJztcbiAgICBtYXhmaWxlc2l6ZTtcbiAgICBjbGVhcmljb25jbGFzcztcbiAgICBjbGVhcmljb25oaW50O1xuICAgIHNlbGVjdGVkVXBsb2FkVHlwZVBhdGg7XG4gICAgREVGQVVMVF9DQVBUSU9OUyA9IHtcbiAgICAgICAgTVVMVElQTEVfU0VMRUNUOiAnRHJvcCB5b3VyIGZpbGVzIGhlcmUuJyxcbiAgICAgICAgU0VMRUNUOiAnU2VsZWN0J1xuICAgIH07XG4gICAgREVWSUNFX0NPTlRFTlRUWVBFUyA9IHtcbiAgICAgICAgSU1BR0U6ICdpbWFnZScsXG4gICAgICAgIFZJREVPOiAndmlkZW8nLFxuICAgICAgICBBVURJTzogJ2F1ZGlvJyxcbiAgICAgICAgRklMRVM6ICdmaWxlcydcbiAgICB9O1xuICAgIEZJTEVTSVpFX01CID0gMTA0ODU3NjtcbiAgICB3aWRnZXRQcm9wcztcbiAgICBfaXNNb2JpbGVUeXBlO1xuICAgIF9pc0NvcmRvdmE7XG4gICAgLy8gcGFyZW50UHJlZmFiU2NvcGUgPSBlbGVtZW50LmNsb3Nlc3QoJy5hcHAtcHJlZmFiJykuaXNvbGF0ZVNjb3BlKCksXG4gICAgQ09OU1RBTlRfRklMRV9TRVJWSUNFID0gJ0ZpbGVTZXJ2aWNlJztcbiAgICB1cGxvYWREYXRhID0ge1xuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIHVwbG9hZFBhdGg6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucztcbiAgICBkZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMgPSB0aGlzLmFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucy5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKS5tYXAoaXRlbSA9PiBpdGVtLmVuZHNXaXRoKCcvKicpID8gaXRlbSA6IGAuJHtpdGVtfWApO1xuICAgIGNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCcqLyonKSA/ICcnIDogdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgZGF0YXNvdXJjZTtcbiAgICBmaWxlVXBsb2FkTWVzc2FnZSA9ICdEcm9wIHlvdXIgZmlsZXMgaGVyZSBvciBjbGljayBoZXJlIHRvIGJyb3dzZSc7XG4gICAgdXBsb2FkZWRGaWxlcyA9IHtcbiAgICAgICAgZmlsZU5hbWU6ICcnLFxuICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgbGVuZ3RoOiAnJyxcbiAgICAgICAgc3RhdHVzOiAnJ1xuICAgIH07XG4gICAgaGlnaGxpZ2h0RHJvcEFyZWE7XG4gICAgLypfaGFzT25TdWNjZXNzRXZ0ID0gV00uaXNEZWZpbmVkKGF0dHJzLm9uU3VjY2Vzcyk7XG4gICAgIF9oYXNPbkVycm9yRXZ0ID0gV00uaXNEZWZpbmVkKGF0dHJzLm9uRXJyb3IpOyovXG5cbiAgICAvLyBDaGVja2luZyBpZiB0aGUgc2VsZWN0ZWQgZmlsZSBpcyB2YWxpZCBmb3IgdGhlIGNob29zZW4gZmlsdGVyIHR5cGVcbiAgICBpc1ZhbGlkRmlsZShmaWxlbmFtZSwgY29udGVudHR5cGUsIGV4dGVuc2lvbk5hbWUsIGlzTW9iaWxlVHlwZSkge1xuICAgICAgICBsZXQgaXNWYWxpZCwgY29udGVudFR5cGVzO1xuXG4gICAgICAgIGlmICghY29udGVudHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRUeXBlcyA9IHRvTG93ZXIoY29udGVudHR5cGUpLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2ltYWdlLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnaW1hZ2UnKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNJbWFnZUZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIGltYWdlIGFuZCB1c2VyIHVwbG9hZHMgaW1hZ2UgaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnYXVkaW8vKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdhdWRpbycpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc0F1ZGlvRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgYXVkaW8vKiBhbmQgdXNlciB1cGxvYWRzIGF1ZGlvIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ3ZpZGVvLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAndmlkZW8nKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNWaWRlb0ZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIHZpZGVvLyogYW5kIHVzZXIgdXBsb2FkcyB2aWRlbyBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qY29udGVudCB0eXBlIGFuZCB0aGUgdXBsb2FkZWQgZmlsZSBleHRlbnNpb24gc2hvdWxkIGJlIHNhbWUqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnLicgKyB0b0xvd2VyKGV4dGVuc2lvbk5hbWUpKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgLyogdGhpcyByZXR1cm4gdGhlIGFycmF5IG9mIGZpbGVzIHdoaWNoIGFyZSBoYXZpbmcgdGhlIGZpbGUgc2l6ZSBub3QgbW9yZSB0aGFuIG1heGZpbGVzaXplIGFuZCBmaWx0ZXJzIGJhc2VkIG9uIGNvbnRlbnR0eXBlICovXG4gICAgZ2V0VmFsaWRGaWxlcygkZmlsZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBlcnJvckZpbGVzID0gW107XG4gICAgICAgIGNvbnN0IE1BWEZJTEVVUExPQURfU0laRSA9IHBhcnNlRmxvYXQodGhpcy5tYXhmaWxlc2l6ZSkgKiB0aGlzLkZJTEVTSVpFX01CIHx8IHRoaXMuRklMRVNJWkVfTUI7XG4gICAgICAgIGNvbnN0IE1BWF9GSUxFX1VQTE9BRF9GT1JNQVRURURfU0laRSA9ICh0aGlzLm1heGZpbGVzaXplIHx8ICcxJykgKyAnTUInO1xuXG4gICAgICAgIC8vIGlmIGNvbnRlbnR0eXBlIGlzIGZpbGVzIGZvciBtb2JpbGUgcHJvamVjdHMuXG4gICAgICAgIGlmICh0aGlzLmNob29zZUZpbHRlciA9PT0gdGhpcy5ERVZJQ0VfQ09OVEVOVFRZUEVTLkZJTEVTKSB7XG4gICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaCgkZmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAvKiBjaGVjayBmb3IgdGhlIGZpbGUgY29udGVudCB0eXBlIGJlZm9yZSB1cGxvYWRpbmcgKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkRmlsZShmaWxlLm5hbWUsIHRoaXMuY2hvb3NlRmlsdGVyLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oZmlsZS5uYW1lKSwgdGhpcy5faXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX0ZJTEVfRVhURU5USU9OX1ZBTElEQVRJT05fTUVTU0FHRX0gJHt0aGlzLmNob29zZUZpbHRlcn1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGaWxlcygnSU5WQUxJRF9GSUxFX0VYVEVOU0lPTicsIG1zZywgZmlsZSwgZXJyb3JGaWxlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IE1BWEZJTEVVUExPQURfU0laRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX0ZJTEVfRVhDRUVEX1ZBTElEQVRJT05fTUVTU0FHRX0gJHtNQVhfRklMRV9VUExPQURfRk9STUFUVEVEX1NJWkV9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yRmlsZXMoJ0lOVkFMSURfRklMRV9TSVpFJywgbXNnLCBmaWxlLCBlcnJvckZpbGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWRGaWxlczogdmFsaWRGaWxlcyxcbiAgICAgICAgICAgIGVycm9yRmlsZXM6IGVycm9yRmlsZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvckZpbGVzKGtleSwgbXNnLCBmaWxlLCBlcnJvckZpbGVzKSB7XG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVycm9yIGNhbGxiYWNrIGV4aXN0IG9yIG5vdC4gSWYgaXQgZXhpc3RzIHRoZW4gZG9udCBzaG93IHRhb3N0ZXIgbWVzc2FnZVxuICAgICAgICBpZiAoIXRoaXMuaGFzRXZlbnRDYWxsYmFjaygnZXJyb3InKSkge1xuICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5QXBwKG1zZywgJ0Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1zZ1xuICAgICAgICB9O1xuICAgICAgICBmaWxlLmVycm9yID0gZXJyb3I7XG4gICAgICAgIGVycm9yRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvKk92ZXJ3cml0ZSB0aGUgY2FwdGlvbiBvbmx5IGlmIHRoZXkgYXJlIGRlZmF1bHQqL1xuICAgIGdldENhcHRpb24oY2FwdGlvbiwgaXNNdWx0aXBsZSwgaXNNb2JpbGVUeXBlKSB7XG4gICAgICAgIGlmIChpbmNsdWRlcyh0aGlzLkRFRkFVTFRfQ0FQVElPTlMsIGNhcHRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNNdWx0aXBsZSAmJiAhaXNNb2JpbGVUeXBlID8gdGhpcy5ERUZBVUxUX0NBUFRJT05TLk1VTFRJUExFX1NFTEVDVCA6IHRoaXMuREVGQVVMVF9DQVBUSU9OUy5TRUxFQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHRpb247XG4gICAgfVxuXG4gICAgdXBsb2FkVXJsID0gJ3NlcnZpY2VzJztcblxuICAgIC8qIGNoYW5nZSBzZXJ2ZXIgcGF0aCBiYXNlZCBvbiB1c2VyIG9wdGlvbiAqL1xuICAgIGNoYW5nZVNlcnZlclVwbG9hZFBhdGgocGF0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXBsb2FkVHlwZVBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIC8qIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlsZWV4dGVuc2lvbiAqL1xuICAgIGdldEZpbGVFeHRlbnNpb24oZmlsZU5hbWUpIHtcbiAgICAgICAgaWYgKGZpbGVOYW1lICYmIGluY2x1ZGVzKGZpbGVOYW1lLCAnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHNlbGVjdCBFdmVudFxuICAgICAqIEBwYXJhbSAkZXZlbnRcbiAgICAgKiBAcGFyYW0gJGZpbGVzXG4gICAgICovXG4gICAgb25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gJGZpbGVzO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEZpbGVzOiAkZmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RHJvcEFyZWEgPSB0cnVlO1xuXG4gICAgICAgIC8vVGhlIGZpbGUgdXBsb2FkIHdpZGdldCB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIG51bGwgdG8gcmV1cGxvYWQgdGhlIHNhbWUgZmlsZS5cbiAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuZmlsZS1pbnB1dCcpWzBdLnZhbHVlID0gbnVsbDtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGZpbGVwaWNrZXIgaXMgbm90IHRoZXJlIG9uIHRoZSB3aW5kb3csIHJlbW92ZSB0aGUgZHJvcHpvbmUgaGlnaGxpZ2h0XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZGlzYWJsZURyb3Bab25lLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGRpc2FibGVEcm9wWm9uZSgpIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHREcm9wQXJlYSA9IGZhbHNlO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmRpc2FibGVEcm9wWm9uZSk7XG4gICAgfVxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGNsZWFyIHRoZSBzcGVjaWZpZWQgZmlsZS4gaWYgYXJndW1lbnQgaXMgbm90IHByb3ZpZGVkLCBpdCBjbGVhcnMgdGhlIGNvbXBsZXRlIGxpc3QgICovXG4gICAgY2xlYXIoZmlsZU9iaikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSAoZmlsZU9iaikgPyB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlICE9PSBmaWxlT2JqKSA6IFtdO1xuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGNsYXNzIG5hbWVzIGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uQ2xhc3MoY2xhc3NWYWx1ZSkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmNsYXNzID0gY2xhc3NWYWx1ZTtcbiAgICB9XG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaGludCBmb3IgY2xlYXIgaWNvbiAqL1xuICAgIHNldENsZWFySWNvbkhpbnQoaGludCkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmhpbnQgPSBoaW50O1xuICAgIH1cblxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGFwcGVuZCB1cGxvYWQgc3RhdHVzIGRvbSBlbGVtZW50cyB0byB3aWRnZXQgKi9cbiAgICBvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgbGV0IGJlZm9yZVNlbGVjdFZhbDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmdldFZhbGlkRmlsZXMoJGZpbGVzKTtcbiAgICAgICAgJGZpbGVzID0gZmlsZXMudmFsaWRGaWxlcztcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcHJldmlvdXNseSB0cmllZCB1cGxvYWRpbmcgZm9sZGVycyB1c2luZyBkcm9wLCBhbmQgdGhlbiB1cGxvYWRpbmcgdXNpbmcgY2xpY2sgbWV0aG9kIHdlIGNsZWFyIHRoZSBmb2xkZXJzIGRvbVxuICAgICAgICBpZiAoJGV2ZW50LnR5cGUgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIGVycm9yIGNhbGxiYWNrIGV2ZW50IGlmIGFueSBpbnZhbGlkIGZpbGUgZm91bmQuXG4gICAgICAgIGlmICghaXNFbXB0eShmaWxlcy5lcnJvckZpbGVzKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLmVycm9yRmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIGlmIHRoZXJlIGFyZSB2YWxpZCBmaWxlcyBlbHNlIG5vIGNhbGwgaXMgbWFkZVxuICAgICAgICBpZiAoJGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX0JFRk9SRV9TRUxFQ1RcbiAgICAgICAgICAgIGJlZm9yZVNlbGVjdFZhbCA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBmaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuX3Byb2dyZXNzT2JzZXJ2YWJsZSA9IHRoaXMucHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgocHJvZ3Jlc3NPYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnNlbGVjdGVkRmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5uYW1lID09PSBwcm9ncmVzc09iai5maWxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBwcm9ncmVzc09iai5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gcHJvZ3Jlc3NPYmouc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NPYmouZXJyTXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVyck1zZyA9IHByb2dyZXNzT2JqLmVyck1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiZWZvcmVTZWxlY3RWYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX1NFTEVDVFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChQcmV2ZW50IGZpbGUgZnJvbSBiZWluZyBvcGVuZWQpXG4gICAgZHJhZ092ZXJIYW5kbGVyKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgY2FsbCB0aGUgb25GaWxlU2VsZWN0IGZ1bmN0aW9uXG4gICAgb25GaWxlRHJvcCgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBsaXN0T2ZGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlc0RhdGEgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zO1xuICAgICAgICBpZiAoZmlsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXJJdGVtTGlzdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBmaWxlKHMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBmaWxlcyBhbmQgcHVzaCB0aGVtIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNEYXRhW2ldLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mRmlsZXMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdGVkIGl0ZW0gaXMgZGlyZWN0b3J5IHB1c2ggdGhlIGZvbGRlciBlbGVtZW50IGludG8gYW4gYXJyYXkgYW5kIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSBieSBhZGRpbmcgdG8gZG9tXG4gICAgICAgICAgICAgICAgZWxzZSBpZihmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzLnB1c2goZmlsZXNEYXRhW2ldLmdldEFzRmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdCgkZXZlbnQsIGxpc3RPZkZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdPdmVyQ2IoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5hZGRDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgZHJvcENiKCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnI2Ryb3B6b25lJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodC1kcm9wLWJveCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgZmlsZSBzZWxlY3Qgd2luZG93LCB3aGVuIGNsaWNrZWQgYW55d2hlcmUgb24gdGhlIGZpbGUgdXBsb2FkIHdpZGdldCBpbiBjYXNlIG9mIG11bHRpIHNlbGVjdFxuICAgIHRyaWdnZXJGaWxlU2VsZWN0KCkge1xuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBmaWxlIHVwbG9hZCByZXF1ZXN0XG4gICAgICogQHBhcmFtICRmaWxlLCB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgdG8gYmUgYWJvcnRlZFxuICAgICAqL1xuICAgIGFib3J0RmlsZVVwbG9hZCgkZmlsZSkge1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5DQU5DRUwsICRmaWxlKTtcbiAgICB9XG5cbiAgICBpc01pbWVUeXBlKGZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdpbWFnZS8qJykgJiYgaXNJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgICB8fCAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2F1ZGlvLyonKSAmJiBpc0F1ZGlvRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygndmlkZW8vKicpICYmIGlzVmlkZW9GaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eSAqL1xuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpIHtcbiAgICAgICAgLypNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHN0eWxlcyBvciBwcm9wZXJ0aWVzIGFuZCBhY2NvcmRpbmdseSBoYW5kbGluZyByZXNwZWN0aXZlIGNoYW5nZXMuKi9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZHBhdGgnOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gU3Jpbml2YXM6IHdoeSBkbyB3ZSBuZWVkIHVwbG9hZHBhdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZlclVwbG9hZFBhdGgobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29udGVudHR5cGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gbnYuc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhpdGVtKSB8fCB0aGlzLmlzTWltZVR5cGUoaXRlbSkpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5jaG9vc2VGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTmFtZSA9IHRoaXMubmFtZSArICh0aGlzLm11bHRpcGxlID8gJy1tdWx0aXBsZS1maWxldXBsb2FkJyA6ICctc2luZ2xlLWZpbGV1cGxvYWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLmdldENhcHRpb24odGhpcy5jYXB0aW9uLCB0aGlzLm11bHRpcGxlLCB0aGlzLl9pc01vYmlsZVR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZXVwbG9hZG1lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZE1lc3NhZ2UgPSBudjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBBdHRyaWJ1dGUoJ3NlbGVjdC5ldmVudCcpIHB1YmxpYyBvblNlbGVjdEV2dCwgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0KTtcbiAgICAgICAgLy8gc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIC8vIGFkZGluZywgZHJhZ292ZXIgYW5kIGRyb3Agb24gdGhlIGRvY3VtZW50IGFzIHdoZW4gZmlsZSBpcyBkcmFnZ2VkIG9uIHRvIHRoZSBwYWdlIGhpZ2hsaWdodCB0aGUgZHJvcHpvbmVzIGFuZCByZW1vdmUgaGlnaGxpZ2h0IG9uIGZpbGUgZHJvcFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ092ZXJDYi5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIGFkZGluZyBtb3VzZWxlYXZlIGV2bnQgdG8gcmVtb3ZlIGhpZ2hsaWdodCB3aGVuIGZpbGUgaXMgZHJvcHBlZCBvdXRzaWRlIHRoZSB3aW5kb3dcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3R5bGVyKCB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFwcC1idXR0b24sIC5kcm9wLWJveCcpLCB0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdPdmVyQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhcHAtZmlsZXVwbG9hZFwiIGluaXQtd2lkZ2V0PlxuICAgIDwhLS0gZHJhZyBhbmQgZHJvcCBmaWxlcyBVSSBpbiB3ZWIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1tdWx0aS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc01vYmlsZVR5cGUgJiYgbXVsdGlwbGVcIj5cbiAgICAgICAgPGRpdiBpZD1cImRyb3B6b25lXCIgY2xhc3M9XCJkcm9wLWJveFwiIChjbGljayk9XCJ0cmlnZ2VyRmlsZVNlbGVjdCgpXCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCIgKGRyYWdvdmVyKT1cImRyYWdPdmVySGFuZGxlcigkZXZlbnQpO1wiIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KTtcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtpbm5lckh0bWxdPVwiY2FwdGlvblwiIGNsYXNzPVwiY2FwdGlvblwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpbGUtaW5wdXRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImhpbnQgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzXCIgKm5nSWY9XCJtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiIG11bHRpcGxlID5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cImFwcC1hbmNob3JcIj57e2ZpbGVVcGxvYWRNZXNzYWdlfX08L2E+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc2luZ2xlIGZpbGUgdXBsb2FkIGluIHdlYiBhbmQgc2luZ2xlICwgbXVsdGlwbGUgZmlsZSB1cGxvYWQgVUkgaW4gbW9iaWxlIHJ1bm1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zaW5nbGUtZmlsZS11cGxvYWRcIiAqbmdJZj1cIiFfaXNDb3Jkb3ZhICYmICghbXVsdGlwbGUgfHwgX2lzTW9iaWxlVHlwZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1idXR0b24td3JhcHBlclwiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBzdXBwb3J0IGZvciBmaWxlIHVwbG9hZCBpbiBNb2JpbGVhcHAgaW4gaXRzIHJ1bm1vZGUgKFdlYikgLS0+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIm11bHRpcGxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2FjY2VwdF09XCJjaG9vc2VGaWx0ZXJcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgbXVsdGlwbGU+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIiFtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZHJvcHpvbmVcIiBmb2N1cy10YXJnZXQgY2xhc3M9XCJhcHAtYnV0dG9uIGJ0biBidG4tZGVmYXVsdFwiIFtuZ0NsYXNzXT1cInsnaGlnaGxpZ2h0LWRyb3AtYm94JyA6IGhpZ2hsaWdodERyb3BBcmVhfVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtZmlsZXMtdXBsb2FkLXN0YXR1cyBzaW5nbGVcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZSBBcHBsaWNhdGlvbiAoZGV2aWNlKSAtLT5cbiAgICA8YnV0dG9uICpuZ0lmPVwiX2lzQ29yZG92YVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cIm9wZW5GaWxlU2VsZWN0b3IoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIGxpc3Qgb2Ygc2VsZWN0ZWRmaWxlcyBVSSAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGZpbGUtdXBsb2FkXCIgW25nU3R5bGVdPVwie2hlaWdodDogZmlsZWxpc3RoZWlnaHQsIG92ZXJmbG93OiBvdmVyZmxvd31cIiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiID5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZnQgb2Ygc2VsZWN0ZWRGaWxlc1wiPlxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGZpbGUtdXBsb2FkLXN0YXR1c1wiICpuZ0lmPVwiZnQuc3RhdHVzICE9PSAnYWJvcnQnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhIHVwbG9hZC1maWxlLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWxlZnQgbWVkaWEtbWlkZGxlIGZpbGUtaWNvbiB7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSkgfCBmaWxlSWNvbkNsYXNzfX1cIiB0aXRsZT1cInt7Z2V0RmlsZUV4dGVuc2lvbihmdC5uYW1lKX19XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1ib2R5IG1lZGlhLW1pZGRsZSBmaWxlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZC10aXRsZVwiPnt7ZnQubmFtZX19PC9sYWJlbD48YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZXNpemVcIiAqbmdJZj1cImZ0LmZpbGVMZW5ndGggICE9PSAwXCI+e3tmdC5zaXplIHwgZmlsZXNpemU6MH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCIgKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdvblByb2dyZXNzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN0cmlwZWQgcHJvZ3Jlc3MtYmFyLWluZm9cIiBbbmdTdHlsZV09XCJ7d2lkdGg6IChmdC5wcm9ncmVzcyArJyUnKX1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcycgfHwgZnQuc3RhdHVzID09PSAncXVldWVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXRyYW5zcGFyZW50IGZpbGUtdXBsb2FkLXN0b3BcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFib3J0RmlsZVVwbG9hZChmdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIndpIHdpLWNsb3NlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnc3VjY2VzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWljb24ge3tmdC5zdGF0dXMgfCBzdGF0ZUNsYXNzIH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNsZWFyaWNvbmNsYXNzICE9PSAnJyAmJiBmdC5zdGF0dXMgIT09ICdvblByb2dyZXNzJ1wiIGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwiY2xlYXIoZnQpXCIgY2xhc3M9XCJidG4gYnRuLXRyYW5zcGFyZW50IGJ0bi1kZWZhdWx0IHN0YXR1cy1pY29uXCIgdGl0bGU9XCJ7e2NsZWFyaWNvbmhpbnR9fVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7Y2xlYXJpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiAgKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdlcnJvcidcIiB0aXRsZT1cInt7ZnQuZXJyTXNnIHx8IHRoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRklMRV9VUExPQURfRkFJTEVEfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWljb24ge3tmdC5zdGF0dXMgfCBzdGF0ZUNsYXNzIH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvdWw+XG4gICAgPCEtLSBsaXN0IG9mIHNlbGVjdGVkZm9sZGVycyBVSSB0byBzaG93IHRoZSBlcnJvciBpbiB0aXRsZSAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGZpbGUtdXBsb2FkXCIgW25nU3R5bGVdPVwie2hlaWdodDogZmlsZWxpc3RoZWlnaHQsIG92ZXJmbG93OiBvdmVyZmxvd31cIiB0aXRsZT1cInt7dGhpcy5hcHBMb2NhbGUuTUVTU0FHRV9GT0xERVJfVVBMT0FEU19OT1RfQUxMT1dFRH19XCIgKm5nSWY9XCJzZWxlY3RlZEZvbGRlcnMubGVuZ3RoID4gMFwiID5cbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBmdCBvZiBzZWxlY3RlZEZvbGRlcnNcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWxlZnQgbWVkaWEtbWlkZGxlIGZpbGUtaWNvbiBmYSBmYS1mb2xkZXItb1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1ib2R5IG1lZGlhLW1pZGRsZSBmaWxlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ1cGxvYWRkZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1cGxvYWQtdGl0bGVcIj57e2Z0Lm5hbWV9fTwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWljb24gIHdpIHdpLWNhbmNlbCB0ZXh0LWRhbmdlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgIDwvdWw+XG48L2Rpdj5cbiJdfQ==
|
|
622
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN4RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7OztJQUxoTCxBQURKLDhCQUFzRSxhQUMwSDtJQUE3QixBQUF0QyxBQUFyRiw0S0FBUywwQkFBbUIsS0FBQywyS0FBb0UsOEJBQXVCLEtBQUUsbUtBQVMseUJBQWtCLEtBQUU7SUFDdkws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d0M7WUF1RXBDLEFBcENBLEFBTEEsQUFmQSxBQWJBLHFFQUFzRSx3REFha0IsNkRBZXNDLHFEQUtBLHFEQW9DZ0U7WUFlbE0saUJBQU07O1lBcEZrQyxjQUFnQztZQUFoQyx5REFBZ0M7WUFhL0IsY0FBaUQ7WUFBakQsOEVBQWlEO1lBZTdFLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUtvRSxjQUE4QjtZQUE5QixtREFBOEI7WUFvQ2dDLGNBQWdDO1lBQWhDLHFEQUFnQzs7O2lGRDdDbEwsbUJBQW1CO2NBUi9CLFNBQVM7MkJBQ0ksZ0JBQWdCLGFBRWY7b0JBQ1Asa0JBQWtCLHFCQUFxQjtpQkFDMUM7O3NCQWtXNkMsU0FBUzt1QkFBQyxjQUFjOztzQkFBdUIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7O2tGQS9WeEgsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBBdHRyaWJ1dGUsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBcHAsIERhdGFTb3VyY2UsIGdldFdtUHJvamVjdFByb3BlcnRpZXMsIGlzQXVkaW9GaWxlLCBpc0ltYWdlRmlsZSwgaXNWaWRlb0ZpbGV9IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7cHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL2ZpbGUtdXBsb2FkLnByb3BzJztcbmltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIHRvTG93ZXJ9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtZmlsZXVwbG9hZCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1maWxldXBsb2FkJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t3bUZpbGVVcGxvYWRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRmlsZVVwbG9hZENvbXBvbmVudClcbiAgICBdXG59KVxuXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgc2VsZWN0ZWRGaWxlczogYW55ID0gW107XG4gICAgbXVsdGlwbGVTZWxlY3RlZEZpbGVzOiBhbnkgPSBbXTtcbiAgICBzZWxlY3RlZEZvbGRlcnM6IGFueSA9IFtdO1xuICAgIHByb2dyZXNzT2JzZXJ2YWJsZTtcbiAgICBuYW1lO1xuICAgIGhpbnQ7XG4gICAgbXVsdGlwbGU7XG4gICAgZmlsZVRyYW5zZmVycyA9IHt9O1xuICAgIGNhcHRpb24gPSAnVXBsb2FkJztcbiAgICBmb3JtTmFtZSA9ICcnO1xuICAgIG1heGZpbGVzaXplO1xuICAgIGNsZWFyaWNvbmNsYXNzO1xuICAgIGNsZWFyaWNvbmhpbnQ7XG4gICAgc2VsZWN0ZWRVcGxvYWRUeXBlUGF0aDtcbiAgICBERUZBVUxUX0NBUFRJT05TID0ge1xuICAgICAgICBNVUxUSVBMRV9TRUxFQ1Q6ICdEcm9wIHlvdXIgZmlsZXMgaGVyZS4nLFxuICAgICAgICBTRUxFQ1Q6ICdTZWxlY3QnXG4gICAgfTtcbiAgICBERVZJQ0VfQ09OVEVOVFRZUEVTID0ge1xuICAgICAgICBJTUFHRTogJ2ltYWdlJyxcbiAgICAgICAgVklERU86ICd2aWRlbycsXG4gICAgICAgIEFVRElPOiAnYXVkaW8nLFxuICAgICAgICBGSUxFUzogJ2ZpbGVzJ1xuICAgIH07XG4gICAgRklMRVNJWkVfTUIgPSAxMDQ4NTc2O1xuICAgIHdpZGdldFByb3BzO1xuICAgIF9pc01vYmlsZVR5cGU7XG4gICAgX2lzQ29yZG92YTtcbiAgICAvLyBwYXJlbnRQcmVmYWJTY29wZSA9IGVsZW1lbnQuY2xvc2VzdCgnLmFwcC1wcmVmYWInKS5pc29sYXRlU2NvcGUoKSxcbiAgICBDT05TVEFOVF9GSUxFX1NFUlZJQ0UgPSAnRmlsZVNlcnZpY2UnO1xuICAgIHVwbG9hZERhdGEgPSB7XG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdXBsb2FkUGF0aDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBhbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnMgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zO1xuICAgIGRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucyA9IHRoaXMuYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpLm1hcChpdGVtID0+IGl0ZW0uZW5kc1dpdGgoJy8qJykgPyBpdGVtIDogYC4ke2l0ZW19YCk7XG4gICAgY2hvb3NlRmlsdGVyID0gdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJyovKicpID8gJycgOiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucztcbiAgICBkYXRhc291cmNlO1xuICAgIGZpbGVVcGxvYWRNZXNzYWdlID0gJ0Ryb3AgeW91ciBmaWxlcyBoZXJlIG9yIGNsaWNrIGhlcmUgdG8gYnJvd3NlJztcbiAgICB1cGxvYWRlZEZpbGVzID0ge1xuICAgICAgICBmaWxlTmFtZTogJycsXG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgICBsZW5ndGg6ICcnLFxuICAgICAgICBzdGF0dXM6ICcnXG4gICAgfTtcbiAgICBoaWdobGlnaHREcm9wQXJlYTtcbiAgICAvKl9oYXNPblN1Y2Nlc3NFdnQgPSBXTS5pc0RlZmluZWQoYXR0cnMub25TdWNjZXNzKTtcbiAgICAgX2hhc09uRXJyb3JFdnQgPSBXTS5pc0RlZmluZWQoYXR0cnMub25FcnJvcik7Ki9cblxuICAgIC8vIENoZWNraW5nIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIHZhbGlkIGZvciB0aGUgY2hvb3NlbiBmaWx0ZXIgdHlwZVxuICAgIGlzVmFsaWRGaWxlKGZpbGVuYW1lLCBjb250ZW50dHlwZSwgZXh0ZW5zaW9uTmFtZSwgaXNNb2JpbGVUeXBlKSB7XG4gICAgICAgIGxldCBpc1ZhbGlkLCBjb250ZW50VHlwZXM7XG5cbiAgICAgICAgaWYgKCFjb250ZW50dHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudFR5cGVzID0gdG9Mb3dlcihjb250ZW50dHlwZSkuc3BsaXQoJywnKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnaW1hZ2UvKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdpbWFnZScpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc0ltYWdlRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgaW1hZ2UgYW5kIHVzZXIgdXBsb2FkcyBpbWFnZSBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdhdWRpby8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2F1ZGlvJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzQXVkaW9GaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyBhdWRpby8qIGFuZCB1c2VyIHVwbG9hZHMgYXVkaW8gaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAndmlkZW8vKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICd2aWRlbycpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc1ZpZGVvRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgdmlkZW8vKiBhbmQgdXNlciB1cGxvYWRzIHZpZGVvIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLypjb250ZW50IHR5cGUgYW5kIHRoZSB1cGxvYWRlZCBmaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUgc2FtZSovXG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICcuJyArIHRvTG93ZXIoZXh0ZW5zaW9uTmFtZSkpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICAvKiB0aGlzIHJldHVybiB0aGUgYXJyYXkgb2YgZmlsZXMgd2hpY2ggYXJlIGhhdmluZyB0aGUgZmlsZSBzaXplIG5vdCBtb3JlIHRoYW4gbWF4ZmlsZXNpemUgYW5kIGZpbHRlcnMgYmFzZWQgb24gY29udGVudHR5cGUgKi9cbiAgICBnZXRWYWxpZEZpbGVzKCRmaWxlcykge1xuICAgICAgICBjb25zdCB2YWxpZEZpbGVzID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yRmlsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTUFYRklMRVVQTE9BRF9TSVpFID0gcGFyc2VGbG9hdCh0aGlzLm1heGZpbGVzaXplKSAqIHRoaXMuRklMRVNJWkVfTUIgfHwgdGhpcy5GSUxFU0laRV9NQjtcbiAgICAgICAgY29uc3QgTUFYX0ZJTEVfVVBMT0FEX0ZPUk1BVFRFRF9TSVpFID0gKHRoaXMubWF4ZmlsZXNpemUgfHwgJzEnKSArICdNQic7XG5cbiAgICAgICAgLy8gaWYgY29udGVudHR5cGUgaXMgZmlsZXMgZm9yIG1vYmlsZSBwcm9qZWN0cy5cbiAgICAgICAgaWYgKHRoaXMuY2hvb3NlRmlsdGVyID09PSB0aGlzLkRFVklDRV9DT05URU5UVFlQRVMuRklMRVMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKCRmaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgIC8qIGNoZWNrIGZvciB0aGUgZmlsZSBjb250ZW50IHR5cGUgYmVmb3JlIHVwbG9hZGluZyAqL1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRGaWxlKGZpbGUubmFtZSwgdGhpcy5jaG9vc2VGaWx0ZXIsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbihmaWxlLm5hbWUpLCB0aGlzLl9pc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5hcHBMb2NhbGUuTEFCRUxfRklMRV9FWFRFTlRJT05fVkFMSURBVElPTl9NRVNTQUdFfSAke3RoaXMuY2hvb3NlRmlsdGVyfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvckZpbGVzKCdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJywgbXNnLCBmaWxlLCBlcnJvckZpbGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZS5zaXplID4gTUFYRklMRVVQTE9BRF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5hcHBMb2NhbGUuTEFCRUxfRklMRV9FWENFRURfVkFMSURBVElPTl9NRVNTQUdFfSAke01BWF9GSUxFX1VQTE9BRF9GT1JNQVRURURfU0laRX1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGaWxlcygnSU5WQUxJRF9GSUxFX1NJWkUnLCBtc2csIGZpbGUsIGVycm9yRmlsZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZEZpbGVzOiB2YWxpZEZpbGVzLFxuICAgICAgICAgICAgZXJyb3JGaWxlczogZXJyb3JGaWxlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yRmlsZXMoa2V5LCBtc2csIGZpbGUsIGVycm9yRmlsZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXJyb3IgY2FsbGJhY2sgZXhpc3Qgb3Igbm90LiBJZiBpdCBleGlzdHMgdGhlbiBkb250IHNob3cgdGFvc3RlciBtZXNzYWdlXG4gICAgICAgIGlmICghdGhpcy5oYXNFdmVudENhbGxiYWNrKCdlcnJvcicpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnlBcHAobXNnLCAnRXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgbWVzc2FnZTogbXNnXG4gICAgICAgIH07XG4gICAgICAgIGZpbGUuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgZXJyb3JGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cblxuICAgIC8qT3ZlcndyaXRlIHRoZSBjYXB0aW9uIG9ubHkgaWYgdGhleSBhcmUgZGVmYXVsdCovXG4gICAgZ2V0Q2FwdGlvbihjYXB0aW9uLCBpc011bHRpcGxlLCBpc01vYmlsZVR5cGUpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzKHRoaXMuREVGQVVMVF9DQVBUSU9OUywgY2FwdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBpc011bHRpcGxlICYmICFpc01vYmlsZVR5cGUgPyB0aGlzLkRFRkFVTFRfQ0FQVElPTlMuTVVMVElQTEVfU0VMRUNUIDogdGhpcy5ERUZBVUxUX0NBUFRJT05TLlNFTEVDVDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdGlvbjtcbiAgICB9XG5cbiAgICB1cGxvYWRVcmwgPSAnc2VydmljZXMnO1xuXG4gICAgLyogY2hhbmdlIHNlcnZlciBwYXRoIGJhc2VkIG9uIHVzZXIgb3B0aW9uICovXG4gICAgY2hhbmdlU2VydmVyVXBsb2FkUGF0aChwYXRoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVcGxvYWRUeXBlUGF0aCA9IHBhdGg7XG4gICAgfVxuXG4gICAgLyogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaWxlZXh0ZW5zaW9uICovXG4gICAgZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZSkge1xuICAgICAgICBpZiAoZmlsZU5hbWUgJiYgaW5jbHVkZXMoZmlsZU5hbWUsICcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZmlsZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgc2VsZWN0IEV2ZW50XG4gICAgICogQHBhcmFtICRldmVudFxuICAgICAqIEBwYXJhbSAkZmlsZXNcbiAgICAgKi9cbiAgICBvblNlbGVjdEV2ZW50Q2FsbCgkZXZlbnQsICRmaWxlcykge1xuICAgICAgICB0aGlzLm11bHRpcGxlU2VsZWN0ZWRGaWxlcyA9IHRoaXMubXVsdGlwbGUgPyBbLi4udGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMsIC4uLiRmaWxlc10gOiAkZmlsZXM7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICQuZXh0ZW5kKCRldmVudC4kZmlsZXMgfHwge30sICRmaWxlcyksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25GaWxlRWxlbUNsaWNrKCRldmVudCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodERyb3BBcmVhID0gdHJ1ZTtcblxuICAgICAgICAvL1RoZSBmaWxlIHVwbG9hZCB3aWRnZXQgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIHRvIHJldXBsb2FkIHRoZSBzYW1lIGZpbGUuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZpbGUtaW5wdXQnKVswXS52YWx1ZSA9IG51bGw7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBmaWxlcGlja2VyIGlzIG5vdCB0aGVyZSBvbiB0aGUgd2luZG93LCByZW1vdmUgdGhlIGRyb3B6b25lIGhpZ2hsaWdodFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmRpc2FibGVEcm9wWm9uZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlRHJvcFpvbmUoKSB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RHJvcEFyZWEgPSBmYWxzZTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5kaXNhYmxlRHJvcFpvbmUpO1xuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBjbGVhciB0aGUgc3BlY2lmaWVkIGZpbGUuIGlmIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZCwgaXQgY2xlYXJzIHRoZSBjb21wbGV0ZSBsaXN0ICAqL1xuICAgIGNsZWFyKGZpbGVPYmopIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlICE9PSBmaWxlT2JqKSA6IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5zZWxlY3RlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZSAhPT0gZmlsZU9iaikgOiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGNsYXNzIG5hbWVzIGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uQ2xhc3MoY2xhc3NWYWx1ZSkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmNsYXNzID0gY2xhc3NWYWx1ZTtcbiAgICB9XG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaGludCBmb3IgY2xlYXIgaWNvbiAqL1xuICAgIHNldENsZWFySWNvbkhpbnQoaGludCkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmhpbnQgPSBoaW50O1xuICAgIH1cblxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGFwcGVuZCB1cGxvYWQgc3RhdHVzIGRvbSBlbGVtZW50cyB0byB3aWRnZXQgKi9cbiAgICBvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgbGV0IGJlZm9yZVNlbGVjdFZhbDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmdldFZhbGlkRmlsZXMoJGZpbGVzKTtcbiAgICAgICAgJGZpbGVzID0gZmlsZXMudmFsaWRGaWxlcztcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcHJldmlvdXNseSB0cmllZCB1cGxvYWRpbmcgZm9sZGVycyB1c2luZyBkcm9wLCBhbmQgdGhlbiB1cGxvYWRpbmcgdXNpbmcgY2xpY2sgbWV0aG9kIHdlIGNsZWFyIHRoZSBmb2xkZXJzIGRvbVxuICAgICAgICBpZiAoJGV2ZW50LnR5cGUgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIGVycm9yIGNhbGxiYWNrIGV2ZW50IGlmIGFueSBpbnZhbGlkIGZpbGUgZm91bmQuXG4gICAgICAgIGlmICghaXNFbXB0eShmaWxlcy5lcnJvckZpbGVzKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLmVycm9yRmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIGlmIHRoZXJlIGFyZSB2YWxpZCBmaWxlcyBlbHNlIG5vIGNhbGwgaXMgbWFkZVxuICAgICAgICBpZiAoJGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX0JFRk9SRV9TRUxFQ1RcbiAgICAgICAgICAgIGJlZm9yZVNlbGVjdFZhbCA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBmaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuX3Byb2dyZXNzT2JzZXJ2YWJsZSA9IHRoaXMucHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgocHJvZ3Jlc3NPYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnNlbGVjdGVkRmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5uYW1lID09PSBwcm9ncmVzc09iai5maWxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBwcm9ncmVzc09iai5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gcHJvZ3Jlc3NPYmouc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NPYmouZXJyTXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVyck1zZyA9IHByb2dyZXNzT2JqLmVyck1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiZWZvcmVTZWxlY3RWYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX1NFTEVDVFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChQcmV2ZW50IGZpbGUgZnJvbSBiZWluZyBvcGVuZWQpXG4gICAgZHJhZ092ZXJIYW5kbGVyKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgY2FsbCB0aGUgb25GaWxlU2VsZWN0IGZ1bmN0aW9uXG4gICAgb25GaWxlRHJvcCgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBsaXN0T2ZGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlc0RhdGEgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zO1xuICAgICAgICBpZiAoZmlsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXJJdGVtTGlzdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBmaWxlKHMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBmaWxlcyBhbmQgcHVzaCB0aGVtIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNEYXRhW2ldLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mRmlsZXMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdGVkIGl0ZW0gaXMgZGlyZWN0b3J5IHB1c2ggdGhlIGZvbGRlciBlbGVtZW50IGludG8gYW4gYXJyYXkgYW5kIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSBieSBhZGRpbmcgdG8gZG9tXG4gICAgICAgICAgICAgICAgZWxzZSBpZihmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzLnB1c2goZmlsZXNEYXRhW2ldLmdldEFzRmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdCgkZXZlbnQsIGxpc3RPZkZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdPdmVyQ2IoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5hZGRDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgZHJvcENiKCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnI2Ryb3B6b25lJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodC1kcm9wLWJveCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgZmlsZSBzZWxlY3Qgd2luZG93LCB3aGVuIGNsaWNrZWQgYW55d2hlcmUgb24gdGhlIGZpbGUgdXBsb2FkIHdpZGdldCBpbiBjYXNlIG9mIG11bHRpIHNlbGVjdFxuICAgIHRyaWdnZXJGaWxlU2VsZWN0KCkge1xuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBmaWxlIHVwbG9hZCByZXF1ZXN0XG4gICAgICogQHBhcmFtICRmaWxlLCB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgdG8gYmUgYWJvcnRlZFxuICAgICAqL1xuICAgIGFib3J0RmlsZVVwbG9hZCgkZmlsZSkge1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5DQU5DRUwsICRmaWxlKTtcbiAgICB9XG5cbiAgICBpc01pbWVUeXBlKGZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdpbWFnZS8qJykgJiYgaXNJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgICB8fCAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2F1ZGlvLyonKSAmJiBpc0F1ZGlvRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygndmlkZW8vKicpICYmIGlzVmlkZW9GaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eSAqL1xuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpIHtcbiAgICAgICAgLypNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHN0eWxlcyBvciBwcm9wZXJ0aWVzIGFuZCBhY2NvcmRpbmdseSBoYW5kbGluZyByZXNwZWN0aXZlIGNoYW5nZXMuKi9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZHBhdGgnOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gU3Jpbml2YXM6IHdoeSBkbyB3ZSBuZWVkIHVwbG9hZHBhdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZlclVwbG9hZFBhdGgobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29udGVudHR5cGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gbnYuc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhpdGVtKSB8fCB0aGlzLmlzTWltZVR5cGUoaXRlbSkpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5jaG9vc2VGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTmFtZSA9IHRoaXMubmFtZSArICh0aGlzLm11bHRpcGxlID8gJy1tdWx0aXBsZS1maWxldXBsb2FkJyA6ICctc2luZ2xlLWZpbGV1cGxvYWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLmdldENhcHRpb24odGhpcy5jYXB0aW9uLCB0aGlzLm11bHRpcGxlLCB0aGlzLl9pc01vYmlsZVR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZXVwbG9hZG1lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZE1lc3NhZ2UgPSBudjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBBdHRyaWJ1dGUoJ3NlbGVjdC5ldmVudCcpIHB1YmxpYyBvblNlbGVjdEV2dCwgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0KTtcbiAgICAgICAgLy8gc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIC8vIGFkZGluZywgZHJhZ292ZXIgYW5kIGRyb3Agb24gdGhlIGRvY3VtZW50IGFzIHdoZW4gZmlsZSBpcyBkcmFnZ2VkIG9uIHRvIHRoZSBwYWdlIGhpZ2hsaWdodCB0aGUgZHJvcHpvbmVzIGFuZCByZW1vdmUgaGlnaGxpZ2h0IG9uIGZpbGUgZHJvcFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ092ZXJDYi5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIGFkZGluZyBtb3VzZWxlYXZlIGV2bnQgdG8gcmVtb3ZlIGhpZ2hsaWdodCB3aGVuIGZpbGUgaXMgZHJvcHBlZCBvdXRzaWRlIHRoZSB3aW5kb3dcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3R5bGVyKCB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFwcC1idXR0b24sIC5kcm9wLWJveCcpLCB0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdPdmVyQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhcHAtZmlsZXVwbG9hZFwiIGluaXQtd2lkZ2V0PlxuICAgIDwhLS0gZHJhZyBhbmQgZHJvcCBmaWxlcyBVSSBpbiB3ZWIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1tdWx0aS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc01vYmlsZVR5cGUgJiYgbXVsdGlwbGVcIj5cbiAgICAgICAgPGRpdiBpZD1cImRyb3B6b25lXCIgY2xhc3M9XCJkcm9wLWJveFwiIChjbGljayk9XCJ0cmlnZ2VyRmlsZVNlbGVjdCgpXCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCIgKGRyYWdvdmVyKT1cImRyYWdPdmVySGFuZGxlcigkZXZlbnQpO1wiIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KTtcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtpbm5lckh0bWxdPVwiY2FwdGlvblwiIGNsYXNzPVwiY2FwdGlvblwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpbGUtaW5wdXRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImhpbnQgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzXCIgKm5nSWY9XCJtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiIG11bHRpcGxlID5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cImFwcC1hbmNob3JcIj57e2ZpbGVVcGxvYWRNZXNzYWdlfX08L2E+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc2luZ2xlIGZpbGUgdXBsb2FkIGluIHdlYiBhbmQgc2luZ2xlICwgbXVsdGlwbGUgZmlsZSB1cGxvYWQgVUkgaW4gbW9iaWxlIHJ1bm1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zaW5nbGUtZmlsZS11cGxvYWRcIiAqbmdJZj1cIiFfaXNDb3Jkb3ZhICYmICghbXVsdGlwbGUgfHwgX2lzTW9iaWxlVHlwZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1idXR0b24td3JhcHBlclwiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBzdXBwb3J0IGZvciBmaWxlIHVwbG9hZCBpbiBNb2JpbGVhcHAgaW4gaXRzIHJ1bm1vZGUgKFdlYikgLS0+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIm11bHRpcGxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2FjY2VwdF09XCJjaG9vc2VGaWx0ZXJcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgbXVsdGlwbGU+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIiFtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZHJvcHpvbmVcIiBmb2N1cy10YXJnZXQgY2xhc3M9XCJhcHAtYnV0dG9uIGJ0biBidG4tZGVmYXVsdFwiIFtuZ0NsYXNzXT1cInsnaGlnaGxpZ2h0LWRyb3AtYm94JyA6IGhpZ2hsaWdodERyb3BBcmVhfVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtZmlsZXMtdXBsb2FkLXN0YXR1cyBzaW5nbGVcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZSBBcHBsaWNhdGlvbiAoZGV2aWNlKSAtLT5cbiAgICA8YnV0dG9uICpuZ0lmPVwiX2lzQ29yZG92YVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cIm9wZW5GaWxlU2VsZWN0b3IoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIGxpc3Qgb2Ygc2VsZWN0ZWRmaWxlcyBVSSAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGZpbGUtdXBsb2FkXCIgW25nU3R5bGVdPVwie2hlaWdodDogZmlsZWxpc3RoZWlnaHQsIG92ZXJmbG93OiBvdmVyZmxvd31cIiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiID5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZnQgb2YgKG11bHRpcGxlID8gbXVsdGlwbGVTZWxlY3RlZEZpbGVzIDogc2VsZWN0ZWRGaWxlcylcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIiAqbmdJZj1cImZ0LnN0YXR1cyAhPT0gJ2Fib3J0J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24ge3tnZXRGaWxlRXh0ZW5zaW9uKGZ0Lm5hbWUpIHwgZmlsZUljb25DbGFzc319XCIgdGl0bGU9XCJ7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSl9fVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1cGxvYWQtdGl0bGVcIj57e2Z0Lm5hbWV9fTwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGVzaXplXCIgKm5nSWY9XCJmdC5maWxlTGVuZ3RoICAhPT0gMFwiPnt7ZnQuc2l6ZSB8IGZpbGVzaXplOjB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdHJpcGVkIHByb2dyZXNzLWJhci1pbmZvXCIgW25nU3R5bGVdPVwie3dpZHRoOiAoZnQucHJvZ3Jlc3MgKyclJyl9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IGZ0LnN0YXR1cyA9PT0gJ3F1ZXVlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBmaWxlLXVwbG9hZC1zdG9wXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhYm9ydEZpbGVVcGxvYWQoZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1jbG9zZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjbGVhcmljb25jbGFzcyAhPT0gJycgJiYgZnQuc3RhdHVzICE9PSAnb25Qcm9ncmVzcydcIiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cImNsZWFyKGZ0KVwiIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBidG4tZGVmYXVsdCBzdGF0dXMtaWNvblwiIHRpdGxlPVwie3tjbGVhcmljb25oaW50fX1cIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2NsZWFyaWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnZXJyb3InXCIgdGl0bGU9XCJ7e2Z0LmVyck1zZyB8fCB0aGlzLmFwcExvY2FsZS5NRVNTQUdFX0ZJTEVfVVBMT0FEX0ZBSUxFRH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3VsPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZvbGRlcnMgVUkgdG8gc2hvdyB0aGUgZXJyb3IgaW4gdGl0bGUgLS0+XG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBmaWxlLXVwbG9hZFwiIFtuZ1N0eWxlXT1cIntoZWlnaHQ6IGZpbGVsaXN0aGVpZ2h0LCBvdmVyZmxvdzogb3ZlcmZsb3d9XCIgdGl0bGU9XCJ7e3RoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRk9MREVSX1VQTE9BRFNfTk9UX0FMTE9XRUR9fVwiICpuZ0lmPVwic2VsZWN0ZWRGb2xkZXJzLmxlbmd0aCA+IDBcIiA+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZnQgb2Ygc2VsZWN0ZWRGb2xkZXJzXCIgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmlsZS11cGxvYWQtc3RhdHVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEgdXBsb2FkLWZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24gZmEgZmEtZm9sZGVyLW9cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidXBsb2FkLXRpdGxlXCI+e3tmdC5uYW1lfX08L2xhYmVsPjxici8+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uICB3aSB3aS1jYW5jZWwgdGV4dC1kYW5nZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG4iXX0=
|
|
@@ -251,7 +251,7 @@ function FileUploadComponent_ul_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
251
251
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
252
252
|
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
|
|
253
253
|
i0.ɵɵadvance();
|
|
254
|
-
i0.ɵɵproperty("ngForOf", ctx_r1.selectedFiles);
|
|
254
|
+
i0.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
|
|
255
255
|
} }
|
|
256
256
|
function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
|
|
257
257
|
i0.ɵɵelementStart(0, "li", 26)(1, "div", 27);
|
|
@@ -388,6 +388,7 @@ class FileUploadComponent extends StylableComponent {
|
|
|
388
388
|
* @param $files
|
|
389
389
|
*/
|
|
390
390
|
onSelectEventCall($event, $files) {
|
|
391
|
+
this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
|
|
391
392
|
this.selectedFiles = $files;
|
|
392
393
|
setTimeout(() => {
|
|
393
394
|
this.invokeEventCallback('select', {
|
|
@@ -410,7 +411,12 @@ class FileUploadComponent extends StylableComponent {
|
|
|
410
411
|
}
|
|
411
412
|
/*this function to clear the specified file. if argument is not provided, it clears the complete list */
|
|
412
413
|
clear(fileObj) {
|
|
413
|
-
|
|
414
|
+
if (this.multiple) {
|
|
415
|
+
this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
|
|
419
|
+
}
|
|
414
420
|
}
|
|
415
421
|
/*this function to set the class names for clear icon */
|
|
416
422
|
setClearIconClass(classValue) {
|
|
@@ -457,6 +463,10 @@ class FileUploadComponent extends StylableComponent {
|
|
|
457
463
|
file.status = progressObj.status;
|
|
458
464
|
if (progressObj.errMsg) {
|
|
459
465
|
file.errMsg = progressObj.errMsg;
|
|
466
|
+
this.invokeEventCallback('error', {
|
|
467
|
+
$event,
|
|
468
|
+
files: file
|
|
469
|
+
});
|
|
460
470
|
}
|
|
461
471
|
}
|
|
462
472
|
}
|
|
@@ -554,6 +564,7 @@ class FileUploadComponent extends StylableComponent {
|
|
|
554
564
|
this.app = app;
|
|
555
565
|
this.onSelectEvt = onSelectEvt;
|
|
556
566
|
this.selectedFiles = [];
|
|
567
|
+
this.multipleSelectedFiles = [];
|
|
557
568
|
this.selectedFolders = [];
|
|
558
569
|
this.fileTransfers = {};
|
|
559
570
|
this.caption = 'Upload';
|
|
@@ -629,7 +640,7 @@ class FileUploadComponent extends StylableComponent {
|
|
|
629
640
|
type: Component,
|
|
630
641
|
args: [{ selector: '[wmFileUpload]', providers: [
|
|
631
642
|
provideAsWidgetRef(FileUploadComponent)
|
|
632
|
-
], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of selectedFiles\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
|
|
643
|
+
], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of (multiple ? multipleSelectedFiles : selectedFiles)\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
|
|
633
644
|
}], () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
|
|
634
645
|
type: Attribute,
|
|
635
646
|
args: ['select.event']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/input/file-upload/src/file-upload.props.ts","../../../../../projects/components/widgets/input/file-upload/src/file-upload.component.html","../../../../../projects/components/widgets/input/file-upload/src/file-upload.component.ts","../../../../../projects/components/widgets/input/file-upload/src/file-upload.module.ts","../../../../../projects/components/widgets/input/file-upload/src/index.ts"],"sourcesContent":["import { PROP_BOOLEAN, PROP_NUMBER, PROP_STRING, register, registerFormWidget } from '@wm/components/base';\nimport { FormWidgetType } from '@wm/core';\n\nexport const registerProps = () => {\n register(\n 'wm-fileupload',\n new Map(\n [\n ['caption', PROP_STRING],\n ['name', PROP_STRING],\n ['tabindex', PROP_NUMBER],\n ['multiple', PROP_BOOLEAN],\n ['fileuploadmessage' , PROP_STRING],\n ['show', {value: true, ...PROP_BOOLEAN}],\n ['disabled', PROP_BOOLEAN],\n ['contenttype', PROP_STRING],\n ['maxfilesize', PROP_NUMBER],\n ['iconclass', {value: 'wm-sl-l sl-cloud-upload', ...PROP_STRING}],\n ['cleariconclass', {value: '', ...PROP_STRING}],\n ['cleariconhint', {value: 'Clear', ...PROP_STRING}],\n ['class', PROP_STRING],\n ['uploadpath', {...PROP_STRING}],\n ['datasource', PROP_STRING],\n ['selectedFiles', PROP_STRING],\n ['destination', PROP_STRING],\n ['filelistheight', PROP_NUMBER],\n ]\n )\n );\n registerFormWidget(\n FormWidgetType.UPLOAD,\n new Map([\n ['disabled', PROP_BOOLEAN],\n ['extensions', PROP_STRING],\n ['filetype', PROP_STRING],\n ['multiple', PROP_BOOLEAN],\n ['readonly', PROP_BOOLEAN],\n ['required', PROP_BOOLEAN]\n ])\n );\n};\n","<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of selectedFiles\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n","import {AfterViewInit, Attribute, Component, Inject, Injector, OnDestroy, OnInit, Optional} from '@angular/core';\n\nimport {Subject} from 'rxjs';\n\nimport {App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile} from '@wm/core';\nimport {provideAsWidgetRef, StylableComponent, styler} from '@wm/components/base';\n\nimport {registerProps} from './file-upload.props';\nimport {forEach, includes, isEmpty, toLower} from \"lodash-es\";\n\ndeclare const $;\n\nconst DEFAULT_CLS = 'app-fileupload';\nconst WIDGET_CONFIG = {\n widgetType: 'wm-fileupload',\n hostClass: DEFAULT_CLS\n};\n\n@Component({\n selector: '[wmFileUpload]',\n templateUrl: './file-upload.component.html',\n providers: [\n provideAsWidgetRef(FileUploadComponent)\n ]\n})\n\nexport class FileUploadComponent extends StylableComponent implements OnInit, AfterViewInit, OnDestroy {\n static initializeProps = registerProps();\n selectedFiles: any = [];\n selectedFolders: any = [];\n progressObservable;\n name;\n hint;\n multiple;\n fileTransfers = {};\n caption = 'Upload';\n formName = '';\n maxfilesize;\n cleariconclass;\n cleariconhint;\n selectedUploadTypePath;\n DEFAULT_CAPTIONS = {\n MULTIPLE_SELECT: 'Drop your files here.',\n SELECT: 'Select'\n };\n DEVICE_CONTENTTYPES = {\n IMAGE: 'image',\n VIDEO: 'video',\n AUDIO: 'audio',\n FILES: 'files'\n };\n FILESIZE_MB = 1048576;\n widgetProps;\n _isMobileType;\n _isCordova;\n // parentPrefabScope = element.closest('.app-prefab').isolateScope(),\n CONSTANT_FILE_SERVICE = 'FileService';\n uploadData = {\n file: undefined,\n uploadPath: undefined\n };\n allowedFileUploadExtensions = getWmProjectProperties().allowedFileUploadExtensions;\n defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);\n chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;\n datasource;\n fileUploadMessage = 'Drop your files here or click here to browse';\n uploadedFiles = {\n fileName: '',\n path: '',\n length: '',\n status: ''\n };\n highlightDropArea;\n /*_hasOnSuccessEvt = WM.isDefined(attrs.onSuccess);\n _hasOnErrorEvt = WM.isDefined(attrs.onError);*/\n\n // Checking if the selected file is valid for the choosen filter type\n isValidFile(filename, contenttype, extensionName, isMobileType) {\n let isValid, contentTypes;\n\n if (!contenttype) {\n return true;\n }\n contentTypes = toLower(contenttype).split(',');\n\n if (includes(contentTypes, 'image/*') || (includes(contentTypes, 'image') && isMobileType)) {\n isValid = isImageFile(filename);\n // If one of the content type chosen is image and user uploads image it is valid file\n if (isValid) {\n return isValid;\n }\n }\n if (includes(contentTypes, 'audio/*') || (includes(contentTypes, 'audio') && isMobileType)) {\n isValid = isAudioFile(filename);\n // If one of the content type chosen is audio/* and user uploads audio it is valid file\n if (isValid) {\n return isValid;\n }\n }\n if (includes(contentTypes, 'video/*') || (includes(contentTypes, 'video') && isMobileType)) {\n isValid = isVideoFile(filename);\n // If one of the content type chosen is video/* and user uploads video it is valid file\n if (isValid) {\n return isValid;\n }\n }\n /*content type and the uploaded file extension should be same*/\n if (includes(contentTypes, '.' + toLower(extensionName))) {\n isValid = true;\n }\n return isValid;\n }\n\n /* this return the array of files which are having the file size not more than maxfilesize and filters based on contenttype */\n getValidFiles($files) {\n const validFiles = [];\n const errorFiles = [];\n const MAXFILEUPLOAD_SIZE = parseFloat(this.maxfilesize) * this.FILESIZE_MB || this.FILESIZE_MB;\n const MAX_FILE_UPLOAD_FORMATTED_SIZE = (this.maxfilesize || '1') + 'MB';\n\n // if contenttype is files for mobile projects.\n if (this.chooseFilter === this.DEVICE_CONTENTTYPES.FILES) {\n this.chooseFilter = '';\n }\n\n forEach($files, (file) => {\n /* check for the file content type before uploading */\n if (!this.isValidFile(file.name, this.chooseFilter, this.getFileExtension(file.name), this._isMobileType)) {\n const msg = `${this.appLocale.LABEL_FILE_EXTENTION_VALIDATION_MESSAGE} ${this.chooseFilter}`;\n this.handleErrorFiles('INVALID_FILE_EXTENSION', msg, file, errorFiles);\n return;\n }\n if (file.size > MAXFILEUPLOAD_SIZE) {\n const msg = `${this.appLocale.LABEL_FILE_EXCEED_VALIDATION_MESSAGE} ${MAX_FILE_UPLOAD_FORMATTED_SIZE}`;\n this.handleErrorFiles('INVALID_FILE_SIZE', msg, file, errorFiles);\n return;\n }\n validFiles.push(file);\n });\n return {\n validFiles: validFiles,\n errorFiles: errorFiles\n };\n }\n\n handleErrorFiles(key, msg, file, errorFiles) {\n // Check whether the error callback exist or not. If it exists then dont show taoster message\n if (!this.hasEventCallback('error')) {\n this.app.notifyApp(msg, 'Error');\n }\n const error = {\n key: key,\n message: msg\n };\n file.error = error;\n errorFiles.push(file);\n }\n\n /*Overwrite the caption only if they are default*/\n getCaption(caption, isMultiple, isMobileType) {\n if (includes(this.DEFAULT_CAPTIONS, caption)) {\n return isMultiple && !isMobileType ? this.DEFAULT_CAPTIONS.MULTIPLE_SELECT : this.DEFAULT_CAPTIONS.SELECT;\n }\n return caption;\n }\n\n uploadUrl = 'services';\n\n /* change server path based on user option */\n changeServerUploadPath(path) {\n this.selectedUploadTypePath = path;\n }\n\n /* this function returns the fileextension */\n getFileExtension(fileName) {\n if (fileName && includes(fileName, '.')) {\n return fileName.substring(fileName.lastIndexOf('.') + 1);\n }\n return 'file';\n }\n\n /**\n * Calls select Event\n * @param $event\n * @param $files\n */\n onSelectEventCall($event, $files) {\n this.selectedFiles = $files;\n setTimeout(() => {\n this.invokeEventCallback('select', {\n $event: $.extend($event.$files || {}, $files),\n selectedFiles: $files\n });\n });\n }\n\n onFileElemClick($event) {\n this.highlightDropArea = true;\n\n //The file upload widget value should be set to null to reupload the same file.\n this.$element.find('.file-input')[0].value = null;\n $event.stopPropagation();\n\n // when the filepicker is not there on the window, remove the dropzone highlight\n window.addEventListener('focus', this.disableDropZone.bind(this));\n }\n\n disableDropZone() {\n this.highlightDropArea = false;\n window.removeEventListener('focus', this.disableDropZone);\n }\n\n /*this function to clear the specified file. if argument is not provided, it clears the complete list */\n clear(fileObj) {\n this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];\n }\n\n /*this function to set the class names for clear icon */\n setClearIconClass(classValue) {\n this.cleariconclass = classValue;\n }\n /*this function to set the hint for clear icon */\n setClearIconHint(hint) {\n this.cleariconhint = hint;\n }\n\n\n /*this function to append upload status dom elements to widget */\n onFileSelect($event, $files) {\n let beforeSelectVal;\n const files = this.getValidFiles($files);\n $files = files.validFiles;\n\n // If the user has previously tried uploading folders using drop, and then uploading using click method we clear the folders dom\n if ($event.type === \"change\") {\n this.selectedFolders = [];\n }\n\n // Trigger error callback event if any invalid file found.\n if (!isEmpty(files.errorFiles)) {\n this.invokeEventCallback('error', {\n $event,\n files: files.errorFiles\n });\n }\n\n // Make call if there are valid files else no call is made\n if ($files.length) {\n this.progressObservable = new Subject();\n // EVENT: ON_BEFORE_SELECT\n beforeSelectVal = this.invokeEventCallback('beforeselect', {\n $event: $.extend($event.$files || {}, $files),\n files: $files\n });\n if (this.datasource) {\n this.datasource._progressObservable = this.progressObservable;\n this.datasource._progressObservable.asObservable().subscribe((progressObj) => {\n forEach(this.selectedFiles, (file) => {\n if (file.name === progressObj.fileName) {\n file.progress = progressObj.progress;\n if (file.progress === 100) {\n file.status = 'success';\n } else {\n file.status = progressObj.status;\n if (progressObj.errMsg) {\n file.errMsg = progressObj.errMsg;\n }\n }\n }\n });\n });\n } else {\n this.selectedFiles = $files;\n }\n if (beforeSelectVal !== false) {\n // EVENT: ON_SELECT\n this.onSelectEventCall($event, $files);\n }\n }\n }\n\n // Prevent default behavior (Prevent file from being opened)\n dragOverHandler($event) {\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n // Get the file data if it exists and call the onFileSelect function\n onFileDrop($event) {\n $event.preventDefault();\n let listOfFiles = [];\n this.selectedFolders = [];\n const filesData = $event.dataTransfer.items;\n if (filesData.length > 0) {\n // Use DataTransferItemList interface to access the file(s)\n for (var i = 0; i < filesData.length; i++) {\n // Get all the files and push them into an array\n if (filesData[i].webkitGetAsEntry().isFile) {\n listOfFiles.push(filesData[i].getAsFile());\n }\n // If a selected item is directory push the folder element into an array and display error message by adding to dom\n else if(filesData[i].webkitGetAsEntry().isDirectory) {\n this.selectedFolders.push(filesData[i].getAsFile());\n }\n }\n this.onFileSelect($event, listOfFiles);\n }\n }\n\n dragOverCb(e) {\n e.preventDefault();\n $(this.nativeElement).find('#dropzone').addClass('highlight-drop-box');\n }\n\n dropCb() {\n $(this.nativeElement).find('#dropzone').removeClass('highlight-drop-box');\n }\n\n // this function triggers file select window, when clicked anywhere on the file upload widget in case of multi select\n triggerFileSelect() {\n this.$element.find('.file-input').trigger('click');\n }\n\n /**\n * Aborts a file upload request\n * @param $file, the file for which the request is to be aborted\n */\n abortFileUpload($file) {\n this.datasource.execute(DataSource.Operation.CANCEL, $file);\n }\n\n isMimeType(file: string) {\n return (this.defaultAllowedExtensions.includes('image/*') && isImageFile(file))\n || (this.defaultAllowedExtensions.includes('audio/*') && isAudioFile(file))\n || (this.defaultAllowedExtensions.includes('video/*') && isVideoFile(file));\n }\n\n /* Define the property change handler. This function will be triggered when there is a change in the widget property */\n onPropertyChange(key, nv, ov) {\n /*Monitoring changes for styles or properties and accordingly handling respective changes.*/\n switch (key) {\n case 'uploadpath':\n // TODO Srinivas: why do we need uploadpath\n this.changeServerUploadPath(nv);\n break;\n case 'contenttype':\n if (this.defaultAllowedExtensions.includes('*/*')) {\n this.chooseFilter = nv.split(' ').join(',')\n } else {\n this.chooseFilter = nv.split(' ').filter(item => this.defaultAllowedExtensions.includes(item) || this.isMimeType(item)).join(',');\n if (isEmpty(this.chooseFilter)) {\n this.chooseFilter = this.defaultAllowedExtensions;\n }\n }\n\n break;\n case 'multiple':\n this.formName = this.name + (this.multiple ? '-multiple-fileupload' : '-single-fileupload');\n this.caption = this.getCaption(this.caption, this.multiple, this._isMobileType);\n break;\n case 'fileuploadmessage':\n this.fileUploadMessage = nv;\n }\n\n super.onPropertyChange(key, nv, ov);\n }\n\n constructor(inj: Injector, private app: App, @Attribute('select.event') public onSelectEvt, @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any) {\n super(inj, WIDGET_CONFIG, explicitContext);\n // styler(this.nativeElement, this);\n }\n\n ngOnInit() {\n super.ngOnInit();\n // adding, dragover and drop on the document as when file is dragged on to the page highlight the dropzones and remove highlight on file drop\n document.addEventListener('dragover', this.dragOverCb.bind(this));\n document.addEventListener('drop', this.dropCb.bind(this));\n\n // adding mouseleave evnt to remove highlight when file is dropped outside the window\n document.addEventListener('mouseleave', this.dropCb.bind(this));\n }\n\n ngAfterViewInit() {\n styler( this.nativeElement.querySelector('.app-button, .drop-box'), this);\n }\n\n ngOnDestroy() {\n document.removeEventListener('dragover', this.dragOverCb);\n document.removeEventListener('drop', this.dropCb);\n document.removeEventListener('mouseleave', this.dropCb);\n super.ngOnDestroy();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { WmComponentsModule } from '@wm/components/base';\n\nimport { FileUploadComponent } from './file-upload.component';\n\nconst components = [\n FileUploadComponent\n];\n\n@NgModule({\n imports: [\n CommonModule,\n WmComponentsModule\n ],\n declarations: [...components],\n exports: [...components]\n})\nexport class FileUploadModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/input/file-upload/src/file-upload.props.ts","../../../../../projects/components/widgets/input/file-upload/src/file-upload.component.html","../../../../../projects/components/widgets/input/file-upload/src/file-upload.component.ts","../../../../../projects/components/widgets/input/file-upload/src/file-upload.module.ts","../../../../../projects/components/widgets/input/file-upload/src/index.ts"],"sourcesContent":["import { PROP_BOOLEAN, PROP_NUMBER, PROP_STRING, register, registerFormWidget } from '@wm/components/base';\nimport { FormWidgetType } from '@wm/core';\n\nexport const registerProps = () => {\n register(\n 'wm-fileupload',\n new Map(\n [\n ['caption', PROP_STRING],\n ['name', PROP_STRING],\n ['tabindex', PROP_NUMBER],\n ['multiple', PROP_BOOLEAN],\n ['fileuploadmessage' , PROP_STRING],\n ['show', {value: true, ...PROP_BOOLEAN}],\n ['disabled', PROP_BOOLEAN],\n ['contenttype', PROP_STRING],\n ['maxfilesize', PROP_NUMBER],\n ['iconclass', {value: 'wm-sl-l sl-cloud-upload', ...PROP_STRING}],\n ['cleariconclass', {value: '', ...PROP_STRING}],\n ['cleariconhint', {value: 'Clear', ...PROP_STRING}],\n ['class', PROP_STRING],\n ['uploadpath', {...PROP_STRING}],\n ['datasource', PROP_STRING],\n ['selectedFiles', PROP_STRING],\n ['destination', PROP_STRING],\n ['filelistheight', PROP_NUMBER],\n ]\n )\n );\n registerFormWidget(\n FormWidgetType.UPLOAD,\n new Map([\n ['disabled', PROP_BOOLEAN],\n ['extensions', PROP_STRING],\n ['filetype', PROP_STRING],\n ['multiple', PROP_BOOLEAN],\n ['readonly', PROP_BOOLEAN],\n ['required', PROP_BOOLEAN]\n ])\n );\n};\n","<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of (multiple ? multipleSelectedFiles : selectedFiles)\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n","import {AfterViewInit, Attribute, Component, Inject, Injector, OnDestroy, OnInit, Optional} from '@angular/core';\n\nimport {Subject} from 'rxjs';\n\nimport {App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile} from '@wm/core';\nimport {provideAsWidgetRef, StylableComponent, styler} from '@wm/components/base';\n\nimport {registerProps} from './file-upload.props';\nimport {forEach, includes, isEmpty, toLower} from \"lodash-es\";\n\ndeclare const $;\n\nconst DEFAULT_CLS = 'app-fileupload';\nconst WIDGET_CONFIG = {\n widgetType: 'wm-fileupload',\n hostClass: DEFAULT_CLS\n};\n\n@Component({\n selector: '[wmFileUpload]',\n templateUrl: './file-upload.component.html',\n providers: [\n provideAsWidgetRef(FileUploadComponent)\n ]\n})\n\nexport class FileUploadComponent extends StylableComponent implements OnInit, AfterViewInit, OnDestroy {\n static initializeProps = registerProps();\n selectedFiles: any = [];\n multipleSelectedFiles: any = [];\n selectedFolders: any = [];\n progressObservable;\n name;\n hint;\n multiple;\n fileTransfers = {};\n caption = 'Upload';\n formName = '';\n maxfilesize;\n cleariconclass;\n cleariconhint;\n selectedUploadTypePath;\n DEFAULT_CAPTIONS = {\n MULTIPLE_SELECT: 'Drop your files here.',\n SELECT: 'Select'\n };\n DEVICE_CONTENTTYPES = {\n IMAGE: 'image',\n VIDEO: 'video',\n AUDIO: 'audio',\n FILES: 'files'\n };\n FILESIZE_MB = 1048576;\n widgetProps;\n _isMobileType;\n _isCordova;\n // parentPrefabScope = element.closest('.app-prefab').isolateScope(),\n CONSTANT_FILE_SERVICE = 'FileService';\n uploadData = {\n file: undefined,\n uploadPath: undefined\n };\n allowedFileUploadExtensions = getWmProjectProperties().allowedFileUploadExtensions;\n defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);\n chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;\n datasource;\n fileUploadMessage = 'Drop your files here or click here to browse';\n uploadedFiles = {\n fileName: '',\n path: '',\n length: '',\n status: ''\n };\n highlightDropArea;\n /*_hasOnSuccessEvt = WM.isDefined(attrs.onSuccess);\n _hasOnErrorEvt = WM.isDefined(attrs.onError);*/\n\n // Checking if the selected file is valid for the choosen filter type\n isValidFile(filename, contenttype, extensionName, isMobileType) {\n let isValid, contentTypes;\n\n if (!contenttype) {\n return true;\n }\n contentTypes = toLower(contenttype).split(',');\n\n if (includes(contentTypes, 'image/*') || (includes(contentTypes, 'image') && isMobileType)) {\n isValid = isImageFile(filename);\n // If one of the content type chosen is image and user uploads image it is valid file\n if (isValid) {\n return isValid;\n }\n }\n if (includes(contentTypes, 'audio/*') || (includes(contentTypes, 'audio') && isMobileType)) {\n isValid = isAudioFile(filename);\n // If one of the content type chosen is audio/* and user uploads audio it is valid file\n if (isValid) {\n return isValid;\n }\n }\n if (includes(contentTypes, 'video/*') || (includes(contentTypes, 'video') && isMobileType)) {\n isValid = isVideoFile(filename);\n // If one of the content type chosen is video/* and user uploads video it is valid file\n if (isValid) {\n return isValid;\n }\n }\n /*content type and the uploaded file extension should be same*/\n if (includes(contentTypes, '.' + toLower(extensionName))) {\n isValid = true;\n }\n return isValid;\n }\n\n /* this return the array of files which are having the file size not more than maxfilesize and filters based on contenttype */\n getValidFiles($files) {\n const validFiles = [];\n const errorFiles = [];\n const MAXFILEUPLOAD_SIZE = parseFloat(this.maxfilesize) * this.FILESIZE_MB || this.FILESIZE_MB;\n const MAX_FILE_UPLOAD_FORMATTED_SIZE = (this.maxfilesize || '1') + 'MB';\n\n // if contenttype is files for mobile projects.\n if (this.chooseFilter === this.DEVICE_CONTENTTYPES.FILES) {\n this.chooseFilter = '';\n }\n\n forEach($files, (file) => {\n /* check for the file content type before uploading */\n if (!this.isValidFile(file.name, this.chooseFilter, this.getFileExtension(file.name), this._isMobileType)) {\n const msg = `${this.appLocale.LABEL_FILE_EXTENTION_VALIDATION_MESSAGE} ${this.chooseFilter}`;\n this.handleErrorFiles('INVALID_FILE_EXTENSION', msg, file, errorFiles);\n return;\n }\n if (file.size > MAXFILEUPLOAD_SIZE) {\n const msg = `${this.appLocale.LABEL_FILE_EXCEED_VALIDATION_MESSAGE} ${MAX_FILE_UPLOAD_FORMATTED_SIZE}`;\n this.handleErrorFiles('INVALID_FILE_SIZE', msg, file, errorFiles);\n return;\n }\n validFiles.push(file);\n });\n return {\n validFiles: validFiles,\n errorFiles: errorFiles\n };\n }\n\n handleErrorFiles(key, msg, file, errorFiles) {\n // Check whether the error callback exist or not. If it exists then dont show taoster message\n if (!this.hasEventCallback('error')) {\n this.app.notifyApp(msg, 'Error');\n }\n const error = {\n key: key,\n message: msg\n };\n file.error = error;\n errorFiles.push(file);\n }\n\n /*Overwrite the caption only if they are default*/\n getCaption(caption, isMultiple, isMobileType) {\n if (includes(this.DEFAULT_CAPTIONS, caption)) {\n return isMultiple && !isMobileType ? this.DEFAULT_CAPTIONS.MULTIPLE_SELECT : this.DEFAULT_CAPTIONS.SELECT;\n }\n return caption;\n }\n\n uploadUrl = 'services';\n\n /* change server path based on user option */\n changeServerUploadPath(path) {\n this.selectedUploadTypePath = path;\n }\n\n /* this function returns the fileextension */\n getFileExtension(fileName) {\n if (fileName && includes(fileName, '.')) {\n return fileName.substring(fileName.lastIndexOf('.') + 1);\n }\n return 'file';\n }\n\n /**\n * Calls select Event\n * @param $event\n * @param $files\n */\n onSelectEventCall($event, $files) {\n this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;\n this.selectedFiles = $files;\n setTimeout(() => {\n this.invokeEventCallback('select', {\n $event: $.extend($event.$files || {}, $files),\n selectedFiles: $files\n });\n });\n }\n\n onFileElemClick($event) {\n this.highlightDropArea = true;\n\n //The file upload widget value should be set to null to reupload the same file.\n this.$element.find('.file-input')[0].value = null;\n $event.stopPropagation();\n\n // when the filepicker is not there on the window, remove the dropzone highlight\n window.addEventListener('focus', this.disableDropZone.bind(this));\n }\n\n disableDropZone() {\n this.highlightDropArea = false;\n window.removeEventListener('focus', this.disableDropZone);\n }\n\n /*this function to clear the specified file. if argument is not provided, it clears the complete list */\n clear(fileObj) {\n if (this.multiple) {\n this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];\n } else {\n this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];\n }\n }\n\n /*this function to set the class names for clear icon */\n setClearIconClass(classValue) {\n this.cleariconclass = classValue;\n }\n /*this function to set the hint for clear icon */\n setClearIconHint(hint) {\n this.cleariconhint = hint;\n }\n\n\n /*this function to append upload status dom elements to widget */\n onFileSelect($event, $files) {\n let beforeSelectVal;\n const files = this.getValidFiles($files);\n $files = files.validFiles;\n\n // If the user has previously tried uploading folders using drop, and then uploading using click method we clear the folders dom\n if ($event.type === \"change\") {\n this.selectedFolders = [];\n }\n\n // Trigger error callback event if any invalid file found.\n if (!isEmpty(files.errorFiles)) {\n this.invokeEventCallback('error', {\n $event,\n files: files.errorFiles\n });\n }\n\n // Make call if there are valid files else no call is made\n if ($files.length) {\n this.progressObservable = new Subject();\n // EVENT: ON_BEFORE_SELECT\n beforeSelectVal = this.invokeEventCallback('beforeselect', {\n $event: $.extend($event.$files || {}, $files),\n files: $files\n });\n if (this.datasource) {\n this.datasource._progressObservable = this.progressObservable;\n this.datasource._progressObservable.asObservable().subscribe((progressObj) => {\n forEach(this.selectedFiles, (file) => {\n if (file.name === progressObj.fileName) {\n file.progress = progressObj.progress;\n if (file.progress === 100) {\n file.status = 'success';\n } else {\n file.status = progressObj.status;\n if (progressObj.errMsg) {\n file.errMsg = progressObj.errMsg;\n this.invokeEventCallback('error', {\n $event,\n files: file\n });\n }\n }\n }\n });\n });\n } else {\n this.selectedFiles = $files;\n }\n if (beforeSelectVal !== false) {\n // EVENT: ON_SELECT\n this.onSelectEventCall($event, $files);\n }\n }\n }\n\n // Prevent default behavior (Prevent file from being opened)\n dragOverHandler($event) {\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n // Get the file data if it exists and call the onFileSelect function\n onFileDrop($event) {\n $event.preventDefault();\n let listOfFiles = [];\n this.selectedFolders = [];\n const filesData = $event.dataTransfer.items;\n if (filesData.length > 0) {\n // Use DataTransferItemList interface to access the file(s)\n for (var i = 0; i < filesData.length; i++) {\n // Get all the files and push them into an array\n if (filesData[i].webkitGetAsEntry().isFile) {\n listOfFiles.push(filesData[i].getAsFile());\n }\n // If a selected item is directory push the folder element into an array and display error message by adding to dom\n else if(filesData[i].webkitGetAsEntry().isDirectory) {\n this.selectedFolders.push(filesData[i].getAsFile());\n }\n }\n this.onFileSelect($event, listOfFiles);\n }\n }\n\n dragOverCb(e) {\n e.preventDefault();\n $(this.nativeElement).find('#dropzone').addClass('highlight-drop-box');\n }\n\n dropCb() {\n $(this.nativeElement).find('#dropzone').removeClass('highlight-drop-box');\n }\n\n // this function triggers file select window, when clicked anywhere on the file upload widget in case of multi select\n triggerFileSelect() {\n this.$element.find('.file-input').trigger('click');\n }\n\n /**\n * Aborts a file upload request\n * @param $file, the file for which the request is to be aborted\n */\n abortFileUpload($file) {\n this.datasource.execute(DataSource.Operation.CANCEL, $file);\n }\n\n isMimeType(file: string) {\n return (this.defaultAllowedExtensions.includes('image/*') && isImageFile(file))\n || (this.defaultAllowedExtensions.includes('audio/*') && isAudioFile(file))\n || (this.defaultAllowedExtensions.includes('video/*') && isVideoFile(file));\n }\n\n /* Define the property change handler. This function will be triggered when there is a change in the widget property */\n onPropertyChange(key, nv, ov) {\n /*Monitoring changes for styles or properties and accordingly handling respective changes.*/\n switch (key) {\n case 'uploadpath':\n // TODO Srinivas: why do we need uploadpath\n this.changeServerUploadPath(nv);\n break;\n case 'contenttype':\n if (this.defaultAllowedExtensions.includes('*/*')) {\n this.chooseFilter = nv.split(' ').join(',')\n } else {\n this.chooseFilter = nv.split(' ').filter(item => this.defaultAllowedExtensions.includes(item) || this.isMimeType(item)).join(',');\n if (isEmpty(this.chooseFilter)) {\n this.chooseFilter = this.defaultAllowedExtensions;\n }\n }\n\n break;\n case 'multiple':\n this.formName = this.name + (this.multiple ? '-multiple-fileupload' : '-single-fileupload');\n this.caption = this.getCaption(this.caption, this.multiple, this._isMobileType);\n break;\n case 'fileuploadmessage':\n this.fileUploadMessage = nv;\n }\n\n super.onPropertyChange(key, nv, ov);\n }\n\n constructor(inj: Injector, private app: App, @Attribute('select.event') public onSelectEvt, @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any) {\n super(inj, WIDGET_CONFIG, explicitContext);\n // styler(this.nativeElement, this);\n }\n\n ngOnInit() {\n super.ngOnInit();\n // adding, dragover and drop on the document as when file is dragged on to the page highlight the dropzones and remove highlight on file drop\n document.addEventListener('dragover', this.dragOverCb.bind(this));\n document.addEventListener('drop', this.dropCb.bind(this));\n\n // adding mouseleave evnt to remove highlight when file is dropped outside the window\n document.addEventListener('mouseleave', this.dropCb.bind(this));\n }\n\n ngAfterViewInit() {\n styler( this.nativeElement.querySelector('.app-button, .drop-box'), this);\n }\n\n ngOnDestroy() {\n document.removeEventListener('dragover', this.dragOverCb);\n document.removeEventListener('drop', this.dropCb);\n document.removeEventListener('mouseleave', this.dropCb);\n super.ngOnDestroy();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { WmComponentsModule } from '@wm/components/base';\n\nimport { FileUploadComponent } from './file-upload.component';\n\nconst components = [\n FileUploadComponent\n];\n\n@NgModule({\n imports: [\n CommonModule,\n WmComponentsModule\n ],\n declarations: [...components],\n exports: [...components]\n})\nexport class FileUploadModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|