@wavemaker/app-ng-runtime 11.8.5-next.27442 → 11.8.5-next.27448

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.
@@ -310,7 +310,7 @@
310
310
  const ctx_r1 = i0__namespace.ɵɵnextContext();
311
311
  i0__namespace.ɵɵproperty("ngStyle", i0__namespace.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
312
312
  i0__namespace.ɵɵadvance();
313
- i0__namespace.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
313
+ i0__namespace.ɵɵproperty("ngForOf", ctx_r1.uploadedFiles);
314
314
  } }
315
315
  function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
316
316
  i0__namespace.ɵɵelementStart(0, "li", 30)(1, "div", 31);
@@ -447,8 +447,8 @@
447
447
  * @param $files
448
448
  */
449
449
  onSelectEventCall($event, $files) {
450
- this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
451
450
  this.selectedFiles = $files;
451
+ this.uploadedFiles = this.multiple ? [...this.uploadedFiles, ...$files] : $files;
452
452
  setTimeout(() => {
453
453
  this.invokeEventCallback('select', {
454
454
  $event: $.extend($event.$files || {}, $files),
@@ -470,12 +470,8 @@
470
470
  }
471
471
  /*this function to clear the specified file. if argument is not provided, it clears the complete list */
472
472
  clear(fileObj) {
473
- if (this.multiple) {
474
- this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
475
- }
476
- else {
477
- this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
478
- }
473
+ this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
474
+ this.uploadedFiles = (fileObj) ? this.uploadedFiles.filter((file) => file !== fileObj) : [];
479
475
  }
480
476
  /*this function to set the class names for clear icon */
481
477
  setClearIconClass(classValue) {
@@ -623,7 +619,7 @@
623
619
  this.app = app;
624
620
  this.onSelectEvt = onSelectEvt;
625
621
  this.selectedFiles = [];
626
- this.multipleSelectedFiles = [];
622
+ this.uploadedFiles = [];
627
623
  this.selectedFolders = [];
628
624
  this.fileTransfers = {};
629
625
  this.caption = 'Upload';
@@ -649,12 +645,6 @@
649
645
  this.defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);
650
646
  this.chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;
651
647
  this.fileUploadMessage = 'Drop your files here or click here to browse';
652
- this.uploadedFiles = {
653
- fileName: '',
654
- path: '',
655
- length: '',
656
- status: ''
657
- };
658
648
  this.uploadUrl = 'services';
659
649
  // styler(this.nativeElement, this);
660
650
  }
@@ -690,7 +680,7 @@
690
680
  i0__namespace.ɵɵadvance();
691
681
  i0__namespace.ɵɵproperty("ngIf", ctx._isCordova);
692
682
  i0__namespace.ɵɵadvance();
693
- i0__namespace.ɵɵproperty("ngIf", ctx.selectedFiles.length > 0);
683
+ i0__namespace.ɵɵproperty("ngIf", ctx.uploadedFiles.length > 0);
694
684
  i0__namespace.ɵɵadvance();
695
685
  i0__namespace.ɵɵproperty("ngIf", ctx.selectedFolders.length > 0);
696
686
  } }, dependencies: [i2__namespace.NgClass, i2__namespace.NgForOf, i2__namespace.NgIf, i2__namespace.NgStyle, i3__namespace.FileIconClassPipe, i3__namespace.FileSizePipe, i3__namespace.StateClassPipe], encapsulation: 2 }); }
@@ -699,7 +689,7 @@
699
689
  type: i0.Component,
700
690
  args: [{ selector: '[wmFileUpload]', providers: [
701
691
  i3.provideAsWidgetRef(FileUploadComponent)
702
- ], 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=\"upload-label\"></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 class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\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 col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\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 <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\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" }]
692
+ ], 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=\"upload-label\"></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 class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\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=\"uploadedFiles.length > 0\" >\n <div *ngFor=\"let ft of uploadedFiles\">\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 col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\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 <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\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" }]
703
693
  }], () => [{ type: i0__namespace.Injector }, { type: i1__namespace.App }, { type: undefined, decorators: [{
704
694
  type: i0.Attribute,
705
695
  args: ['select.event']
@@ -258,7 +258,7 @@ function FileUploadComponent_ul_4_Template(rf, ctx) { if (rf & 1) {
258
258
  const ctx_r1 = i0.ɵɵnextContext();
259
259
  i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
260
260
  i0.ɵɵadvance();
261
- i0.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
261
+ i0.ɵɵproperty("ngForOf", ctx_r1.uploadedFiles);
262
262
  } }
263
263
  function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
264
264
  i0.ɵɵelementStart(0, "li", 30)(1, "div", 31);
@@ -395,8 +395,8 @@ export class FileUploadComponent extends StylableComponent {
395
395
  * @param $files
396
396
  */
397
397
  onSelectEventCall($event, $files) {
398
- this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
399
398
  this.selectedFiles = $files;
399
+ this.uploadedFiles = this.multiple ? [...this.uploadedFiles, ...$files] : $files;
400
400
  setTimeout(() => {
401
401
  this.invokeEventCallback('select', {
402
402
  $event: $.extend($event.$files || {}, $files),
@@ -418,12 +418,8 @@ export class FileUploadComponent extends StylableComponent {
418
418
  }
419
419
  /*this function to clear the specified file. if argument is not provided, it clears the complete list */
420
420
  clear(fileObj) {
421
- if (this.multiple) {
422
- this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
423
- }
424
- else {
425
- this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
426
- }
421
+ this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
422
+ this.uploadedFiles = (fileObj) ? this.uploadedFiles.filter((file) => file !== fileObj) : [];
427
423
  }
428
424
  /*this function to set the class names for clear icon */
429
425
  setClearIconClass(classValue) {
@@ -571,7 +567,7 @@ export class FileUploadComponent extends StylableComponent {
571
567
  this.app = app;
572
568
  this.onSelectEvt = onSelectEvt;
573
569
  this.selectedFiles = [];
574
- this.multipleSelectedFiles = [];
570
+ this.uploadedFiles = [];
575
571
  this.selectedFolders = [];
576
572
  this.fileTransfers = {};
577
573
  this.caption = 'Upload';
@@ -597,12 +593,6 @@ export class FileUploadComponent extends StylableComponent {
597
593
  this.defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);
598
594
  this.chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;
599
595
  this.fileUploadMessage = 'Drop your files here or click here to browse';
600
- this.uploadedFiles = {
601
- fileName: '',
602
- path: '',
603
- length: '',
604
- status: ''
605
- };
606
596
  this.uploadUrl = 'services';
607
597
  // styler(this.nativeElement, this);
608
598
  }
@@ -638,7 +628,7 @@ export class FileUploadComponent extends StylableComponent {
638
628
  i0.ɵɵadvance();
639
629
  i0.ɵɵproperty("ngIf", ctx._isCordova);
640
630
  i0.ɵɵadvance();
641
- i0.ɵɵproperty("ngIf", ctx.selectedFiles.length > 0);
631
+ i0.ɵɵproperty("ngIf", ctx.uploadedFiles.length > 0);
642
632
  i0.ɵɵadvance();
643
633
  i0.ɵɵproperty("ngIf", ctx.selectedFolders.length > 0);
644
634
  } }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i2.NgStyle, i3.FileIconClassPipe, i3.FileSizePipe, i3.StateClassPipe], encapsulation: 2 }); }
@@ -647,7 +637,7 @@ export class FileUploadComponent extends StylableComponent {
647
637
  type: Component,
648
638
  args: [{ selector: '[wmFileUpload]', providers: [
649
639
  provideAsWidgetRef(FileUploadComponent)
650
- ], 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=\"upload-label\"></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 class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\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 col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\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 <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\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" }]
640
+ ], 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=\"upload-label\"></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 class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\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=\"uploadedFiles.length > 0\" >\n <div *ngFor=\"let ft of uploadedFiles\">\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 col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\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 <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\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" }]
651
641
  }], () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
652
642
  type: Attribute,
653
643
  args: ['select.event']
@@ -658,4 +648,4 @@ export class FileUploadComponent extends StylableComponent {
658
648
  type: Optional
659
649
  }] }], null); })();
660
650
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileUploadComponent, { className: "FileUploadComponent", filePath: "file-upload.component.ts", lineNumber: 27 }); })();
661
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN4RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7O0lBR3hLLDRCQUFvRzs7O0lBQXhFLDZFQUFxQzs7O0lBQ2pFLGdDQUFvRTtJQUFDLG1CQUFFO0lBQUEsaUJBQU87OztJQUM5RSw0QkFBa0c7OztJQUF2RSw0RUFBb0M7Ozs7SUFWdkUs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QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDO29GQXpYUSxtQkFBbUIsd0ZBaVc0QixjQUFjLHdCQUE4QixrQkFBa0I7b0VBalc3RyxtQkFBbUIsMEVBTGpCO2dCQUNQLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDO2FBQzFDO1lDdkJMLDhCQUF3QztZQWlGcEMsQUEzQ0EsQUFMQSxBQWZBLEFBaEJBLHNFQUFzRSx3REFnQmtCLDZEQWVzQyxxREFLQSxxREEyQ2dFO1lBZWxNLGlCQUFNOztZQTlGa0MsY0FBZ0M7WUFBaEMseURBQWdDO1lBZ0IvQixjQUFpRDtZQUFqRCw4RUFBaUQ7WUFlN0UsY0FBZ0I7WUFBaEIscUNBQWdCO1lBS29FLGNBQThCO1lBQTlCLG1EQUE4QjtZQTJDZ0MsY0FBZ0M7WUFBaEMscURBQWdDOzs7aUZEdkRsTCxtQkFBbUI7Y0FSL0IsU0FBUzsyQkFDSSxnQkFBZ0IsYUFFZjtvQkFDUCxrQkFBa0IscUJBQXFCO2lCQUMxQzs7c0JBb1c2QyxTQUFTO3VCQUFDLGNBQWM7O3NCQUF1QixNQUFNO3VCQUFDLGtCQUFrQjs7c0JBQUcsUUFBUTs7a0ZBald4SCxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIEF0dHJpYnV0ZSwgQ29tcG9uZW50LCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0FwcCwgRGF0YVNvdXJjZSwgZ2V0V21Qcm9qZWN0UHJvcGVydGllcywgaXNBdWRpb0ZpbGUsIGlzSW1hZ2VGaWxlLCBpc1ZpZGVvRmlsZX0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHtwcm92aWRlQXNXaWRnZXRSZWYsIFN0eWxhYmxlQ29tcG9uZW50LCBzdHlsZXJ9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQge3JlZ2lzdGVyUHJvcHN9IGZyb20gJy4vZmlsZS11cGxvYWQucHJvcHMnO1xuaW1wb3J0IHtmb3JFYWNoLCBpbmNsdWRlcywgaXNFbXB0eSwgdG9Mb3dlcn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5kZWNsYXJlIGNvbnN0ICQ7XG5cbmNvbnN0IERFRkFVTFRfQ0xTID0gJ2FwcC1maWxldXBsb2FkJztcbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7XG4gICAgd2lkZ2V0VHlwZTogJ3dtLWZpbGV1cGxvYWQnLFxuICAgIGhvc3RDbGFzczogREVGQVVMVF9DTFNcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnW3dtRmlsZVVwbG9hZF0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihGaWxlVXBsb2FkQ29tcG9uZW50KVxuICAgIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcbiAgICBzZWxlY3RlZEZpbGVzOiBhbnkgPSBbXTtcbiAgICBtdWx0aXBsZVNlbGVjdGVkRmlsZXM6IGFueSA9IFtdO1xuICAgIHNlbGVjdGVkRm9sZGVyczogYW55ID0gW107XG4gICAgcHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgIG5hbWU7XG4gICAgaGludDtcbiAgICBtdWx0aXBsZTtcbiAgICBmaWxlVHJhbnNmZXJzID0ge307XG4gICAgY2FwdGlvbiA9ICdVcGxvYWQnO1xuICAgIGZvcm1OYW1lID0gJyc7XG4gICAgbWF4ZmlsZXNpemU7XG4gICAgY2xlYXJpY29uY2xhc3M7XG4gICAgY2xlYXJpY29uaGludDtcbiAgICBzZWxlY3RlZFVwbG9hZFR5cGVQYXRoO1xuICAgIERFRkFVTFRfQ0FQVElPTlMgPSB7XG4gICAgICAgIE1VTFRJUExFX1NFTEVDVDogJ0Ryb3AgeW91ciBmaWxlcyBoZXJlLicsXG4gICAgICAgIFNFTEVDVDogJ1NlbGVjdCdcbiAgICB9O1xuICAgIERFVklDRV9DT05URU5UVFlQRVMgPSB7XG4gICAgICAgIElNQUdFOiAnaW1hZ2UnLFxuICAgICAgICBWSURFTzogJ3ZpZGVvJyxcbiAgICAgICAgQVVESU86ICdhdWRpbycsXG4gICAgICAgIEZJTEVTOiAnZmlsZXMnXG4gICAgfTtcbiAgICBGSUxFU0laRV9NQiA9IDEwNDg1NzY7XG4gICAgd2lkZ2V0UHJvcHM7XG4gICAgX2lzTW9iaWxlVHlwZTtcbiAgICBfaXNDb3Jkb3ZhO1xuICAgIC8vIHBhcmVudFByZWZhYlNjb3BlID0gZWxlbWVudC5jbG9zZXN0KCcuYXBwLXByZWZhYicpLmlzb2xhdGVTY29wZSgpLFxuICAgIENPTlNUQU5UX0ZJTEVfU0VSVklDRSA9ICdGaWxlU2VydmljZSc7XG4gICAgdXBsb2FkRGF0YSA9IHtcbiAgICAgICAgZmlsZTogdW5kZWZpbmVkLFxuICAgICAgICB1cGxvYWRQYXRoOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucyA9IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5hbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnM7XG4gICAgZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zID0gdGhpcy5hbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnMuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSkubWFwKGl0ZW0gPT4gaXRlbS5lbmRzV2l0aCgnLyonKSA/IGl0ZW0gOiBgLiR7aXRlbX1gKTtcbiAgICBjaG9vc2VGaWx0ZXIgPSB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykgPyAnJyA6IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgIGRhdGFzb3VyY2U7XG4gICAgZmlsZVVwbG9hZE1lc3NhZ2UgPSAnRHJvcCB5b3VyIGZpbGVzIGhlcmUgb3IgY2xpY2sgaGVyZSB0byBicm93c2UnO1xuICAgIHVwbG9hZGVkRmlsZXMgPSB7XG4gICAgICAgIGZpbGVOYW1lOiAnJyxcbiAgICAgICAgcGF0aDogJycsXG4gICAgICAgIGxlbmd0aDogJycsXG4gICAgICAgIHN0YXR1czogJydcbiAgICB9O1xuICAgIGhpZ2hsaWdodERyb3BBcmVhO1xuICAgIHNob3dwcm9ncmVzc2JhcjtcbiAgICBzaG93cHJvZ3Jlc3NiYXJwZXJjZW50YWdlO1xuICAgIC8qX2hhc09uU3VjY2Vzc0V2dCA9IFdNLmlzRGVmaW5lZChhdHRycy5vblN1Y2Nlc3MpO1xuICAgICBfaGFzT25FcnJvckV2dCA9IFdNLmlzRGVmaW5lZChhdHRycy5vbkVycm9yKTsqL1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHNlbGVjdGVkIGZpbGUgaXMgdmFsaWQgZm9yIHRoZSBjaG9vc2VuIGZpbHRlciB0eXBlXG4gICAgaXNWYWxpZEZpbGUoZmlsZW5hbWUsIGNvbnRlbnR0eXBlLCBleHRlbnNpb25OYW1lLCBpc01vYmlsZVR5cGUpIHtcbiAgICAgICAgbGV0IGlzVmFsaWQsIGNvbnRlbnRUeXBlcztcblxuICAgICAgICBpZiAoIWNvbnRlbnR0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50VHlwZXMgPSB0b0xvd2VyKGNvbnRlbnR0eXBlKS5zcGxpdCgnLCcpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdpbWFnZS8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2ltYWdlJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzSW1hZ2VGaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyBpbWFnZSBhbmQgdXNlciB1cGxvYWRzIGltYWdlIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2F1ZGlvLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnYXVkaW8nKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNBdWRpb0ZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIGF1ZGlvLyogYW5kIHVzZXIgdXBsb2FkcyBhdWRpbyBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICd2aWRlby8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ3ZpZGVvJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzVmlkZW9GaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyB2aWRlby8qIGFuZCB1c2VyIHVwbG9hZHMgdmlkZW8gaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKmNvbnRlbnQgdHlwZSBhbmQgdGhlIHVwbG9hZGVkIGZpbGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBzYW1lKi9cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJy4nICsgdG9Mb3dlcihleHRlbnNpb25OYW1lKSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIC8qIHRoaXMgcmV0dXJuIHRoZSBhcnJheSBvZiBmaWxlcyB3aGljaCBhcmUgaGF2aW5nIHRoZSBmaWxlIHNpemUgbm90IG1vcmUgdGhhbiBtYXhmaWxlc2l6ZSBhbmQgZmlsdGVycyBiYXNlZCBvbiBjb250ZW50dHlwZSAqL1xuICAgIGdldFZhbGlkRmlsZXMoJGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkRmlsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZXJyb3JGaWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBNQVhGSUxFVVBMT0FEX1NJWkUgPSBwYXJzZUZsb2F0KHRoaXMubWF4ZmlsZXNpemUpICogdGhpcy5GSUxFU0laRV9NQiB8fCB0aGlzLkZJTEVTSVpFX01CO1xuICAgICAgICBjb25zdCBNQVhfRklMRV9VUExPQURfRk9STUFUVEVEX1NJWkUgPSAodGhpcy5tYXhmaWxlc2l6ZSB8fCAnMScpICsgJ01CJztcblxuICAgICAgICAvLyBpZiBjb250ZW50dHlwZSBpcyBmaWxlcyBmb3IgbW9iaWxlIHByb2plY3RzLlxuICAgICAgICBpZiAodGhpcy5jaG9vc2VGaWx0ZXIgPT09IHRoaXMuREVWSUNFX0NPTlRFTlRUWVBFUy5GSUxFUykge1xuICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2goJGZpbGVzLCAoZmlsZSkgPT4ge1xuICAgICAgICAgICAgLyogY2hlY2sgZm9yIHRoZSBmaWxlIGNvbnRlbnQgdHlwZSBiZWZvcmUgdXBsb2FkaW5nICovXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEZpbGUoZmlsZS5uYW1lLCB0aGlzLmNob29zZUZpbHRlciwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSksIHRoaXMuX2lzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHt0aGlzLmFwcExvY2FsZS5MQUJFTF9GSUxFX0VYVEVOVElPTl9WQUxJREFUSU9OX01FU1NBR0V9ICR7dGhpcy5jaG9vc2VGaWx0ZXJ9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yRmlsZXMoJ0lOVkFMSURfRklMRV9FWFRFTlNJT04nLCBtc2csIGZpbGUsIGVycm9yRmlsZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPiBNQVhGSUxFVVBMT0FEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHt0aGlzLmFwcExvY2FsZS5MQUJFTF9GSUxFX0VYQ0VFRF9WQUxJREFUSU9OX01FU1NBR0V9ICR7TUFYX0ZJTEVfVVBMT0FEX0ZPUk1BVFRFRF9TSVpFfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvckZpbGVzKCdJTlZBTElEX0ZJTEVfU0laRScsIG1zZywgZmlsZSwgZXJyb3JGaWxlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkRmlsZXM6IHZhbGlkRmlsZXMsXG4gICAgICAgICAgICBlcnJvckZpbGVzOiBlcnJvckZpbGVzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3JGaWxlcyhrZXksIG1zZywgZmlsZSwgZXJyb3JGaWxlcykge1xuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlcnJvciBjYWxsYmFjayBleGlzdCBvciBub3QuIElmIGl0IGV4aXN0cyB0aGVuIGRvbnQgc2hvdyB0YW9zdGVyIG1lc3NhZ2VcbiAgICAgICAgaWYgKCF0aGlzLmhhc0V2ZW50Q2FsbGJhY2soJ2Vycm9yJykpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeUFwcChtc2csICdFcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICBtZXNzYWdlOiBtc2dcbiAgICAgICAgfTtcbiAgICAgICAgZmlsZS5lcnJvciA9IGVycm9yO1xuICAgICAgICBlcnJvckZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuXG4gICAgLypPdmVyd3JpdGUgdGhlIGNhcHRpb24gb25seSBpZiB0aGV5IGFyZSBkZWZhdWx0Ki9cbiAgICBnZXRDYXB0aW9uKGNhcHRpb24sIGlzTXVsdGlwbGUsIGlzTW9iaWxlVHlwZSkge1xuICAgICAgICBpZiAoaW5jbHVkZXModGhpcy5ERUZBVUxUX0NBUFRJT05TLCBjYXB0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTXVsdGlwbGUgJiYgIWlzTW9iaWxlVHlwZSA/IHRoaXMuREVGQVVMVF9DQVBUSU9OUy5NVUxUSVBMRV9TRUxFQ1QgOiB0aGlzLkRFRkFVTFRfQ0FQVElPTlMuU0VMRUNUO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYXB0aW9uO1xuICAgIH1cblxuICAgIHVwbG9hZFVybCA9ICdzZXJ2aWNlcyc7XG5cbiAgICAvKiBjaGFuZ2Ugc2VydmVyIHBhdGggYmFzZWQgb24gdXNlciBvcHRpb24gKi9cbiAgICBjaGFuZ2VTZXJ2ZXJVcGxvYWRQYXRoKHBhdGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVwbG9hZFR5cGVQYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICAvKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpbGVleHRlbnNpb24gKi9cbiAgICBnZXRGaWxlRXh0ZW5zaW9uKGZpbGVOYW1lKSB7XG4gICAgICAgIGlmIChmaWxlTmFtZSAmJiBpbmNsdWRlcyhmaWxlTmFtZSwgJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdmaWxlJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBzZWxlY3QgRXZlbnRcbiAgICAgKiBAcGFyYW0gJGV2ZW50XG4gICAgICogQHBhcmFtICRmaWxlc1xuICAgICAqL1xuICAgIG9uU2VsZWN0RXZlbnRDYWxsKCRldmVudCwgJGZpbGVzKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3RlZEZpbGVzID0gdGhpcy5tdWx0aXBsZSA/IFsuLi50aGlzLm11bHRpcGxlU2VsZWN0ZWRGaWxlcywgLi4uJGZpbGVzXSA6ICRmaWxlcztcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gJGZpbGVzO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEZpbGVzOiAkZmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RHJvcEFyZWEgPSB0cnVlO1xuXG4gICAgICAgIC8vVGhlIGZpbGUgdXBsb2FkIHdpZGdldCB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIG51bGwgdG8gcmV1cGxvYWQgdGhlIHNhbWUgZmlsZS5cbiAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuZmlsZS1pbnB1dCcpWzBdLnZhbHVlID0gbnVsbDtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGZpbGVwaWNrZXIgaXMgbm90IHRoZXJlIG9uIHRoZSB3aW5kb3csIHJlbW92ZSB0aGUgZHJvcHpvbmUgaGlnaGxpZ2h0XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZGlzYWJsZURyb3Bab25lLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGRpc2FibGVEcm9wWm9uZSgpIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHREcm9wQXJlYSA9IGZhbHNlO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmRpc2FibGVEcm9wWm9uZSk7XG4gICAgfVxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGNsZWFyIHRoZSBzcGVjaWZpZWQgZmlsZS4gaWYgYXJndW1lbnQgaXMgbm90IHByb3ZpZGVkLCBpdCBjbGVhcnMgdGhlIGNvbXBsZXRlIGxpc3QgICovXG4gICAgY2xlYXIoZmlsZU9iaikge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMgPSAoZmlsZU9iaikgPyB0aGlzLm11bHRpcGxlU2VsZWN0ZWRGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUgIT09IGZpbGVPYmopIDogW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSAoZmlsZU9iaikgPyB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlICE9PSBmaWxlT2JqKSA6IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgY2xhc3MgbmFtZXMgZm9yIGNsZWFyIGljb24gKi9cbiAgICBzZXRDbGVhckljb25DbGFzcyhjbGFzc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJpY29uY2xhc3MgPSBjbGFzc1ZhbHVlO1xuICAgIH1cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBoaW50IGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uSGludChoaW50KSB7XG4gICAgICAgIHRoaXMuY2xlYXJpY29uaGludCA9IGhpbnQ7XG4gICAgfVxuXG5cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gYXBwZW5kIHVwbG9hZCBzdGF0dXMgZG9tIGVsZW1lbnRzIHRvIHdpZGdldCAqL1xuICAgIG9uRmlsZVNlbGVjdCgkZXZlbnQsICRmaWxlcykge1xuICAgICAgICBsZXQgYmVmb3JlU2VsZWN0VmFsO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuZ2V0VmFsaWRGaWxlcygkZmlsZXMpO1xuICAgICAgICAkZmlsZXMgPSBmaWxlcy52YWxpZEZpbGVzO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBwcmV2aW91c2x5IHRyaWVkIHVwbG9hZGluZyBmb2xkZXJzIHVzaW5nIGRyb3AsIGFuZCB0aGVuIHVwbG9hZGluZyB1c2luZyBjbGljayBtZXRob2Qgd2UgY2xlYXIgdGhlIGZvbGRlcnMgZG9tXG4gICAgICAgIGlmICgkZXZlbnQudHlwZSA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlcnMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgZXJyb3IgY2FsbGJhY2sgZXZlbnQgaWYgYW55IGludmFsaWQgZmlsZSBmb3VuZC5cbiAgICAgICAgaWYgKCFpc0VtcHR5KGZpbGVzLmVycm9yRmlsZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICRldmVudCxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMuZXJyb3JGaWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIGNhbGwgaWYgdGhlcmUgYXJlIHZhbGlkIGZpbGVzIGVsc2Ugbm8gY2FsbCBpcyBtYWRlXG4gICAgICAgIGlmICgkZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgICAgICAvLyBFVkVOVDogT05fQkVGT1JFX1NFTEVDVFxuICAgICAgICAgICAgYmVmb3JlU2VsZWN0VmFsID0gdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVzZWxlY3QnLCB7XG4gICAgICAgICAgICAgICAgJGV2ZW50OiAkLmV4dGVuZCgkZXZlbnQuJGZpbGVzIHx8IHt9LCAkZmlsZXMpLFxuICAgICAgICAgICAgICAgIGZpbGVzOiAkZmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlID0gdGhpcy5wcm9ncmVzc09ic2VydmFibGU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLl9wcm9ncmVzc09ic2VydmFibGUuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChwcm9ncmVzc09iaikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JFYWNoKHRoaXMuc2VsZWN0ZWRGaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLm5hbWUgPT09IHByb2dyZXNzT2JqLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5wcm9ncmVzcyA9IHByb2dyZXNzT2JqLnByb2dyZXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnByb2dyZXNzID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPSBwcm9ncmVzc09iai5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc09iai5lcnJNc2cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZXJyTXNnID0gcHJvZ3Jlc3NPYmouZXJyTXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gJGZpbGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJlZm9yZVNlbGVjdFZhbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBFVkVOVDogT05fU0VMRUNUXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdEV2ZW50Q2FsbCgkZXZlbnQsICRmaWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgKFByZXZlbnQgZmlsZSBmcm9tIGJlaW5nIG9wZW5lZClcbiAgICBkcmFnT3ZlckhhbmRsZXIoJGV2ZW50KSB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBmaWxlIGRhdGEgaWYgaXQgZXhpc3RzIGFuZCBjYWxsIHRoZSBvbkZpbGVTZWxlY3QgZnVuY3Rpb25cbiAgICBvbkZpbGVEcm9wKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGxpc3RPZkZpbGVzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIGNvbnN0IGZpbGVzRGF0YSA9ICRldmVudC5kYXRhVHJhbnNmZXIuaXRlbXM7XG4gICAgICAgIGlmIChmaWxlc0RhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gVXNlIERhdGFUcmFuc2Zlckl0ZW1MaXN0IGludGVyZmFjZSB0byBhY2Nlc3MgdGhlIGZpbGUocylcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXNEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGZpbGVzIGFuZCBwdXNoIHRoZW0gaW50byBhbiBhcnJheVxuICAgICAgICAgICAgICAgIGlmIChmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZGaWxlcy5wdXNoKGZpbGVzRGF0YVtpXS5nZXRBc0ZpbGUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIGEgc2VsZWN0ZWQgaXRlbSBpcyBkaXJlY3RvcnkgcHVzaCB0aGUgZm9sZGVyIGVsZW1lbnQgaW50byBhbiBhcnJheSBhbmQgZGlzcGxheSBlcnJvciBtZXNzYWdlIGJ5IGFkZGluZyB0byBkb21cbiAgICAgICAgICAgICAgICBlbHNlIGlmKGZpbGVzRGF0YVtpXS53ZWJraXRHZXRBc0VudHJ5KCkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlcnMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0KCRldmVudCwgbGlzdE9mRmlsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHJhZ092ZXJDYihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJyNkcm9wem9uZScpLmFkZENsYXNzKCdoaWdobGlnaHQtZHJvcC1ib3gnKTtcbiAgICB9XG5cbiAgICBkcm9wQ2IoKSB7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5yZW1vdmVDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0cmlnZ2VycyBmaWxlIHNlbGVjdCB3aW5kb3csIHdoZW4gY2xpY2tlZCBhbnl3aGVyZSBvbiB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IGluIGNhc2Ugb2YgbXVsdGkgc2VsZWN0XG4gICAgdHJpZ2dlckZpbGVTZWxlY3QoKSB7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZpbGUtaW5wdXQnKS50cmlnZ2VyKCdjbGljaycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFib3J0cyBhIGZpbGUgdXBsb2FkIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gJGZpbGUsIHRoZSBmaWxlIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyB0byBiZSBhYm9ydGVkXG4gICAgICovXG4gICAgYWJvcnRGaWxlVXBsb2FkKCRmaWxlKSB7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkNBTkNFTCwgJGZpbGUpO1xuICAgIH1cblxuICAgIGlzTWltZVR5cGUoZmlsZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2ltYWdlLyonKSAmJiBpc0ltYWdlRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnYXVkaW8vKicpICYmIGlzQXVkaW9GaWxlKGZpbGUpKVxuICAgICAgICAgICAgfHwgKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCd2aWRlby8qJykgJiYgaXNWaWRlb0ZpbGUoZmlsZSkpO1xuICAgIH1cblxuICAgIC8qIERlZmluZSB0aGUgcHJvcGVydHkgY2hhbmdlIGhhbmRsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgd2lkZ2V0IHByb3BlcnR5ICovXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdikge1xuICAgICAgICAvKk1vbml0b3JpbmcgY2hhbmdlcyBmb3Igc3R5bGVzIG9yIHByb3BlcnRpZXMgYW5kIGFjY29yZGluZ2x5IGhhbmRsaW5nIHJlc3BlY3RpdmUgY2hhbmdlcy4qL1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAndXBsb2FkcGF0aCc6XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBTcmluaXZhczogd2h5IGRvIHdlIG5lZWQgdXBsb2FkcGF0aFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmVyVXBsb2FkUGF0aChudik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb250ZW50dHlwZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCcqLyonKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IG52LnNwbGl0KCcgJykuam9pbignLCcpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmZpbHRlcihpdGVtID0+IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGl0ZW0pIHx8IHRoaXMuaXNNaW1lVHlwZShpdGVtKSkuam9pbignLCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmNob29zZUZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ211bHRpcGxlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1OYW1lID0gdGhpcy5uYW1lICsgKHRoaXMubXVsdGlwbGUgPyAnLW11bHRpcGxlLWZpbGV1cGxvYWQnIDogJy1zaW5nbGUtZmlsZXVwbG9hZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9IHRoaXMuZ2V0Q2FwdGlvbih0aGlzLmNhcHRpb24sIHRoaXMubXVsdGlwbGUsIHRoaXMuX2lzTW9iaWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmaWxldXBsb2FkbWVzc2FnZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTWVzc2FnZSA9IG52O1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoaW5qOiBJbmplY3RvciwgcHJpdmF0ZSBhcHA6IEFwcCwgQEF0dHJpYnV0ZSgnc2VsZWN0LmV2ZW50JykgcHVibGljIG9uU2VsZWN0RXZ0LCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuICAgICAgICAvLyBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgLy8gYWRkaW5nLCBkcmFnb3ZlciBhbmQgZHJvcCBvbiB0aGUgZG9jdW1lbnQgYXMgd2hlbiBmaWxlIGlzIGRyYWdnZWQgb24gdG8gdGhlIHBhZ2UgaGlnaGxpZ2h0IHRoZSBkcm9wem9uZXMgYW5kIHJlbW92ZSBoaWdobGlnaHQgb24gZmlsZSBkcm9wXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnT3ZlckNiLmJpbmQodGhpcykpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wQ2IuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gYWRkaW5nIG1vdXNlbGVhdmUgZXZudCB0byByZW1vdmUgaGlnaGxpZ2h0IHdoZW4gZmlsZSBpcyBkcm9wcGVkIG91dHNpZGUgdGhlIHdpbmRvd1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5kcm9wQ2IuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdHlsZXIoIHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYXBwLWJ1dHRvbiwgLmRyb3AtYm94JyksIHRoaXMpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ092ZXJDYik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BDYik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmRyb3BDYik7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFwcC1maWxldXBsb2FkXCIgaW5pdC13aWRnZXQ+XG4gICAgPCEtLSBkcmFnIGFuZCBkcm9wIGZpbGVzIFVJIGluIHdlYiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwLW11bHRpLWZpbGUtdXBsb2FkXCIgKm5nSWY9XCIhX2lzTW9iaWxlVHlwZSAmJiBtdWx0aXBsZVwiPlxuICAgICAgICA8ZGl2IGlkPVwiZHJvcHpvbmVcIiBjbGFzcz1cImRyb3AtYm94XCIgKGNsaWNrKT1cInRyaWdnZXJGaWxlU2VsZWN0KClcIiBbbmdDbGFzc109XCJ7J2hpZ2hsaWdodC1kcm9wLWJveCcgOiBoaWdobGlnaHREcm9wQXJlYX1cIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXJIYW5kbGVyKCRldmVudCk7XCIgKGRyb3ApPVwib25GaWxlRHJvcCgkZXZlbnQpO1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2ljb25jbGFzc319XCI+PC9pPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2lubmVySHRtbF09XCJjYXB0aW9uXCIgY2xhc3M9XCJ1cGxvYWQtbGFiZWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgbmFtZT1cInt7Zm9ybU5hbWV9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwibXVsdGlwbGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIChjbGljayk9XCJvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudCwgJGV2ZW50LnRhcmdldC5maWxlcylcIiBtdWx0aXBsZSA+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXBwLWFuY2hvciB1cGxvYWQtbGFiZWxcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPnt7IGZpbGVVcGxvYWRNZXNzYWdlIH19PC9hPlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJjaG9vc2VGaWx0ZXJcIiBbaW5uZXJIdG1sXT1cImNob29zZUZpbHRlciArICcgb25seSAnXCIgY2xhc3M9XCJ1cGxvYWQtZXh0ZW5zaW9uc1wiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjaG9vc2VGaWx0ZXIgJiYgbWF4ZmlsZXNpemVcIiBjbGFzcz1cInVwbG9hZC1leHRlbnNpb25zXCI+IC4gPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIm1heGZpbGVzaXplXCIgW2lubmVySHRtbF09XCJtYXhmaWxlc2l6ZSArICdNQiBtYXgnXCIgY2xhc3M9XCJ1cGxvYWQtZXh0ZW5zaW9uc1wiPjwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBzaW5nbGUgZmlsZSB1cGxvYWQgaW4gd2ViIGFuZCBzaW5nbGUgLCBtdWx0aXBsZSBmaWxlIHVwbG9hZCBVSSBpbiBtb2JpbGUgcnVubW9kZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwLXNpbmdsZS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc0NvcmRvdmEgJiYgKCFtdWx0aXBsZSB8fCBfaXNNb2JpbGVUeXBlKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIG5hbWU9XCJ7e2Zvcm1OYW1lfX1cIj5cbiAgICAgICAgICAgICAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZWFwcCBpbiBpdHMgcnVubW9kZSAoV2ViKSAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwibXVsdGlwbGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIChjbGljayk9XCJvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudCwgJGV2ZW50LnRhcmdldC5maWxlcylcIiBtdWx0aXBsZT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwiIW11bHRpcGxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2FjY2VwdF09XCJjaG9vc2VGaWx0ZXJcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkcm9wem9uZVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXB0aW9uXCIgW2lubmVySFRNTF09XCJjYXB0aW9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1maWxlcy11cGxvYWQtc3RhdHVzIHNpbmdsZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc3VwcG9ydCBmb3IgZmlsZSB1cGxvYWQgaW4gTW9iaWxlIEFwcGxpY2F0aW9uIChkZXZpY2UpIC0tPlxuICAgIDxidXR0b24gKm5nSWY9XCJfaXNDb3Jkb3ZhXCIgZm9jdXMtdGFyZ2V0IGNsYXNzPVwiYXBwLWJ1dHRvbiBidG4gYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwib3BlbkZpbGVTZWxlY3RvcigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXB0aW9uXCIgW2lubmVySFRNTF09XCJjYXB0aW9uXCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZpbGVzIFVJIC0tPlxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgZmlsZS11cGxvYWRcIiBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBmaWxlbGlzdGhlaWdodCwgb3ZlcmZsb3c6IG92ZXJmbG93fVwiICpuZ0lmPVwic2VsZWN0ZWRGaWxlcy5sZW5ndGggPiAwXCIgPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmdCBvZiAobXVsdGlwbGUgPyBtdWx0aXBsZVNlbGVjdGVkRmlsZXMgOiBzZWxlY3RlZEZpbGVzKVwiPlxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGZpbGUtdXBsb2FkLXN0YXR1c1wiICpuZ0lmPVwiZnQuc3RhdHVzICE9PSAnYWJvcnQnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhIHVwbG9hZC1maWxlLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWxlZnQgbWVkaWEtbWlkZGxlIGZpbGUtaWNvbiB7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSkgfCBmaWxlSWNvbkNsYXNzfX1cIiB0aXRsZT1cInt7Z2V0RmlsZUV4dGVuc2lvbihmdC5uYW1lKX19XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1ib2R5IG1lZGlhLW1pZGRsZSBmaWxlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkZGV0YWlscyBjb2wtbWQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXBsb2FkLXRpdGxlXCI+e3sgZnQuc3RvcmFnZU5hbWUgfHwgZnQubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZXNpemVcIiAqbmdJZj1cImZ0LmZpbGVMZW5ndGggICE9PSAwXCI+e3tmdC5zaXplIHwgZmlsZXNpemU6MH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnZXJyb3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7e2Z0LmVyck1zZyB8fCB0aGlzLmFwcExvY2FsZS5NRVNTQUdFX0ZJTEVfVVBMT0FEX0ZBSUxFRH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnZXJyb3InXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+VXBsb2FkIEZhaWxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdvblByb2dyZXNzJyB8fCBzaG93cHJvZ3Jlc3NiYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2dyZXNzIGNvbC1tZC03IHVwbG9hZC1wcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZnQuc3RhdHVzID09PSAnZXJyb3InID8gJ3Byb2dyZXNzLWJhci1kYW5nZXInIDogJ3Byb2dyZXNzLWJhci1pbmZvJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7d2lkdGg6IChmdC5wcm9ncmVzcyArJyUnKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN0cmlwZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIihmdC5zdGF0dXMgPT09ICdvblByb2dyZXNzJyB8fCBzaG93cHJvZ3Jlc3NiYXIgJiYgc2hvd3Byb2dyZXNzYmFycGVyY2VudGFnZSkgJiYgZnQucHJvZ3Jlc3MgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWQtMSB1cGxvYWQtcHJvZ3Jlc3MtcGVyY2VudGFnZVwiPnt7IGZ0LnByb2dyZXNzICsgJyUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IGZ0LnN0YXR1cyA9PT0gJ3F1ZXVlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBmaWxlLXVwbG9hZC1zdG9wXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhYm9ydEZpbGVVcGxvYWQoZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1jbG9zZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJjbGVhcihmdClcIiAqbmdJZj1cImNsZWFyaWNvbmNsYXNzICE9PSAnJyAmJiBmdC5zdGF0dXMgIT09ICdvblByb2dyZXNzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tdHJhbnNwYXJlbnQgYnRuLWRlZmF1bHQgc3RhdHVzLWljb25cIiB0aXRsZT1cInt7Y2xlYXJpY29uaGludH19XCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tjbGVhcmljb25jbGFzc319XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvdWw+XG4gICAgPCEtLSBsaXN0IG9mIHNlbGVjdGVkZm9sZGVycyBVSSB0byBzaG93IHRoZSBlcnJvciBpbiB0aXRsZSAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGZpbGUtdXBsb2FkXCIgW25nU3R5bGVdPVwie2hlaWdodDogZmlsZWxpc3RoZWlnaHQsIG92ZXJmbG93OiBvdmVyZmxvd31cIiB0aXRsZT1cInt7dGhpcy5hcHBMb2NhbGUuTUVTU0FHRV9GT0xERVJfVVBMT0FEU19OT1RfQUxMT1dFRH19XCIgKm5nSWY9XCJzZWxlY3RlZEZvbGRlcnMubGVuZ3RoID4gMFwiID5cbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBmdCBvZiBzZWxlY3RlZEZvbGRlcnNcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWxlZnQgbWVkaWEtbWlkZGxlIGZpbGUtaWNvbiBmYSBmYS1mb2xkZXItb1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1ib2R5IG1lZGlhLW1pZGRsZSBmaWxlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ1cGxvYWRkZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1cGxvYWQtdGl0bGVcIj57e2Z0Lm5hbWV9fTwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWljb24gIHdpIHdpLWNhbmNlbCB0ZXh0LWRhbmdlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgIDwvdWw+XG48L2Rpdj5cbiJdfQ==
651
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN4RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7O0lBR3hLLDRCQUFvRzs7O0lBQXhFLDZFQUFxQzs7O0lBQ2pFLGdDQUFvRTtJQUFDLG1CQUFFO0lBQUEsaUJBQU87OztJQUM5RSw0QkFBa0c7OztJQUF2RSw0RUFBb0M7Ozs7SUFWdkUs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QVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7b0ZBaFhRLG1CQUFtQix3RkF3VjRCLGNBQWMsd0JBQThCLGtCQUFrQjtvRUF4VjdHLG1CQUFtQiwwRUFMakI7Z0JBQ1Asa0JBQWtCLENBQUMsbUJBQW1CLENBQUM7YUFDMUM7WUN2QkwsOEJBQXdDO1lBaUZwQyxBQTNDQSxBQUxBLEFBZkEsQUFoQkEsc0VBQXNFLHdEQWdCa0IsNkRBZXNDLHFEQUtBLHFEQTJDZ0U7WUFlbE0saUJBQU07O1lBOUZrQyxjQUFnQztZQUFoQyx5REFBZ0M7WUFnQi9CLGNBQWlEO1lBQWpELDhFQUFpRDtZQWU3RSxjQUFnQjtZQUFoQixxQ0FBZ0I7WUFLb0UsY0FBOEI7WUFBOUIsbURBQThCO1lBMkNnQyxjQUFnQztZQUFoQyxxREFBZ0M7OztpRkR2RGxMLG1CQUFtQjtjQVIvQixTQUFTOzJCQUNJLGdCQUFnQixhQUVmO29CQUNQLGtCQUFrQixxQkFBcUI7aUJBQzFDOztzQkEyVjZDLFNBQVM7dUJBQUMsY0FBYzs7c0JBQXVCLE1BQU07dUJBQUMsa0JBQWtCOztzQkFBRyxRQUFROztrRkF4VnhILG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7QXBwLCBEYXRhU291cmNlLCBnZXRXbVByb2plY3RQcm9wZXJ0aWVzLCBpc0F1ZGlvRmlsZSwgaXNJbWFnZUZpbGUsIGlzVmlkZW9GaWxlfSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge3Byb3ZpZGVBc1dpZGdldFJlZiwgU3R5bGFibGVDb21wb25lbnQsIHN0eWxlcn0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5cbmltcG9ydCB7cmVnaXN0ZXJQcm9wc30gZnJvbSAnLi9maWxlLXVwbG9hZC5wcm9wcyc7XG5pbXBvcnQge2ZvckVhY2gsIGluY2x1ZGVzLCBpc0VtcHR5LCB0b0xvd2VyfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmRlY2xhcmUgY29uc3QgJDtcblxuY29uc3QgREVGQVVMVF9DTFMgPSAnYXBwLWZpbGV1cGxvYWQnO1xuY29uc3QgV0lER0VUX0NPTkZJRyA9IHtcbiAgICB3aWRnZXRUeXBlOiAnd20tZmlsZXVwbG9hZCcsXG4gICAgaG9zdENsYXNzOiBERUZBVUxUX0NMU1xufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdbd21GaWxlVXBsb2FkXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKEZpbGVVcGxvYWRDb21wb25lbnQpXG4gICAgXVxufSlcblxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuICAgIHNlbGVjdGVkRmlsZXM6IGFueSA9IFtdO1xuICAgIHVwbG9hZGVkRmlsZXM6IGFueSA9IFtdO1xuICAgIHNlbGVjdGVkRm9sZGVyczogYW55ID0gW107XG4gICAgcHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgIG5hbWU7XG4gICAgaGludDtcbiAgICBtdWx0aXBsZTtcbiAgICBmaWxlVHJhbnNmZXJzID0ge307XG4gICAgY2FwdGlvbiA9ICdVcGxvYWQnO1xuICAgIGZvcm1OYW1lID0gJyc7XG4gICAgbWF4ZmlsZXNpemU7XG4gICAgY2xlYXJpY29uY2xhc3M7XG4gICAgY2xlYXJpY29uaGludDtcbiAgICBzZWxlY3RlZFVwbG9hZFR5cGVQYXRoO1xuICAgIERFRkFVTFRfQ0FQVElPTlMgPSB7XG4gICAgICAgIE1VTFRJUExFX1NFTEVDVDogJ0Ryb3AgeW91ciBmaWxlcyBoZXJlLicsXG4gICAgICAgIFNFTEVDVDogJ1NlbGVjdCdcbiAgICB9O1xuICAgIERFVklDRV9DT05URU5UVFlQRVMgPSB7XG4gICAgICAgIElNQUdFOiAnaW1hZ2UnLFxuICAgICAgICBWSURFTzogJ3ZpZGVvJyxcbiAgICAgICAgQVVESU86ICdhdWRpbycsXG4gICAgICAgIEZJTEVTOiAnZmlsZXMnXG4gICAgfTtcbiAgICBGSUxFU0laRV9NQiA9IDEwNDg1NzY7XG4gICAgd2lkZ2V0UHJvcHM7XG4gICAgX2lzTW9iaWxlVHlwZTtcbiAgICBfaXNDb3Jkb3ZhO1xuICAgIC8vIHBhcmVudFByZWZhYlNjb3BlID0gZWxlbWVudC5jbG9zZXN0KCcuYXBwLXByZWZhYicpLmlzb2xhdGVTY29wZSgpLFxuICAgIENPTlNUQU5UX0ZJTEVfU0VSVklDRSA9ICdGaWxlU2VydmljZSc7XG4gICAgdXBsb2FkRGF0YSA9IHtcbiAgICAgICAgZmlsZTogdW5kZWZpbmVkLFxuICAgICAgICB1cGxvYWRQYXRoOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucyA9IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5hbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnM7XG4gICAgZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zID0gdGhpcy5hbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnMuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSkubWFwKGl0ZW0gPT4gaXRlbS5lbmRzV2l0aCgnLyonKSA/IGl0ZW0gOiBgLiR7aXRlbX1gKTtcbiAgICBjaG9vc2VGaWx0ZXIgPSB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykgPyAnJyA6IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgIGRhdGFzb3VyY2U7XG4gICAgZmlsZVVwbG9hZE1lc3NhZ2UgPSAnRHJvcCB5b3VyIGZpbGVzIGhlcmUgb3IgY2xpY2sgaGVyZSB0byBicm93c2UnO1xuICAgIGhpZ2hsaWdodERyb3BBcmVhO1xuICAgIHNob3dwcm9ncmVzc2JhcjtcbiAgICBzaG93cHJvZ3Jlc3NiYXJwZXJjZW50YWdlO1xuICAgIC8qX2hhc09uU3VjY2Vzc0V2dCA9IFdNLmlzRGVmaW5lZChhdHRycy5vblN1Y2Nlc3MpO1xuICAgICBfaGFzT25FcnJvckV2dCA9IFdNLmlzRGVmaW5lZChhdHRycy5vbkVycm9yKTsqL1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHNlbGVjdGVkIGZpbGUgaXMgdmFsaWQgZm9yIHRoZSBjaG9vc2VuIGZpbHRlciB0eXBlXG4gICAgaXNWYWxpZEZpbGUoZmlsZW5hbWUsIGNvbnRlbnR0eXBlLCBleHRlbnNpb25OYW1lLCBpc01vYmlsZVR5cGUpIHtcbiAgICAgICAgbGV0IGlzVmFsaWQsIGNvbnRlbnRUeXBlcztcblxuICAgICAgICBpZiAoIWNvbnRlbnR0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50VHlwZXMgPSB0b0xvd2VyKGNvbnRlbnR0eXBlKS5zcGxpdCgnLCcpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdpbWFnZS8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2ltYWdlJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzSW1hZ2VGaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyBpbWFnZSBhbmQgdXNlciB1cGxvYWRzIGltYWdlIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2F1ZGlvLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnYXVkaW8nKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNBdWRpb0ZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIGF1ZGlvLyogYW5kIHVzZXIgdXBsb2FkcyBhdWRpbyBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICd2aWRlby8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ3ZpZGVvJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzVmlkZW9GaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyB2aWRlby8qIGFuZCB1c2VyIHVwbG9hZHMgdmlkZW8gaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKmNvbnRlbnQgdHlwZSBhbmQgdGhlIHVwbG9hZGVkIGZpbGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBzYW1lKi9cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJy4nICsgdG9Mb3dlcihleHRlbnNpb25OYW1lKSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIC8qIHRoaXMgcmV0dXJuIHRoZSBhcnJheSBvZiBmaWxlcyB3aGljaCBhcmUgaGF2aW5nIHRoZSBmaWxlIHNpemUgbm90IG1vcmUgdGhhbiBtYXhmaWxlc2l6ZSBhbmQgZmlsdGVycyBiYXNlZCBvbiBjb250ZW50dHlwZSAqL1xuICAgIGdldFZhbGlkRmlsZXMoJGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkRmlsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZXJyb3JGaWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBNQVhGSUxFVVBMT0FEX1NJWkUgPSBwYXJzZUZsb2F0KHRoaXMubWF4ZmlsZXNpemUpICogdGhpcy5GSUxFU0laRV9NQiB8fCB0aGlzLkZJTEVTSVpFX01CO1xuICAgICAgICBjb25zdCBNQVhfRklMRV9VUExPQURfRk9STUFUVEVEX1NJWkUgPSAodGhpcy5tYXhmaWxlc2l6ZSB8fCAnMScpICsgJ01CJztcblxuICAgICAgICAvLyBpZiBjb250ZW50dHlwZSBpcyBmaWxlcyBmb3IgbW9iaWxlIHByb2plY3RzLlxuICAgICAgICBpZiAodGhpcy5jaG9vc2VGaWx0ZXIgPT09IHRoaXMuREVWSUNFX0NPTlRFTlRUWVBFUy5GSUxFUykge1xuICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2goJGZpbGVzLCAoZmlsZSkgPT4ge1xuICAgICAgICAgICAgLyogY2hlY2sgZm9yIHRoZSBmaWxlIGNvbnRlbnQgdHlwZSBiZWZvcmUgdXBsb2FkaW5nICovXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEZpbGUoZmlsZS5uYW1lLCB0aGlzLmNob29zZUZpbHRlciwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKGZpbGUubmFtZSksIHRoaXMuX2lzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHt0aGlzLmFwcExvY2FsZS5MQUJFTF9GSUxFX0VYVEVOVElPTl9WQUxJREFUSU9OX01FU1NBR0V9ICR7dGhpcy5jaG9vc2VGaWx0ZXJ9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yRmlsZXMoJ0lOVkFMSURfRklMRV9FWFRFTlNJT04nLCBtc2csIGZpbGUsIGVycm9yRmlsZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPiBNQVhGSUxFVVBMT0FEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHt0aGlzLmFwcExvY2FsZS5MQUJFTF9GSUxFX0VYQ0VFRF9WQUxJREFUSU9OX01FU1NBR0V9ICR7TUFYX0ZJTEVfVVBMT0FEX0ZPUk1BVFRFRF9TSVpFfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvckZpbGVzKCdJTlZBTElEX0ZJTEVfU0laRScsIG1zZywgZmlsZSwgZXJyb3JGaWxlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkRmlsZXM6IHZhbGlkRmlsZXMsXG4gICAgICAgICAgICBlcnJvckZpbGVzOiBlcnJvckZpbGVzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3JGaWxlcyhrZXksIG1zZywgZmlsZSwgZXJyb3JGaWxlcykge1xuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlcnJvciBjYWxsYmFjayBleGlzdCBvciBub3QuIElmIGl0IGV4aXN0cyB0aGVuIGRvbnQgc2hvdyB0YW9zdGVyIG1lc3NhZ2VcbiAgICAgICAgaWYgKCF0aGlzLmhhc0V2ZW50Q2FsbGJhY2soJ2Vycm9yJykpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeUFwcChtc2csICdFcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICBtZXNzYWdlOiBtc2dcbiAgICAgICAgfTtcbiAgICAgICAgZmlsZS5lcnJvciA9IGVycm9yO1xuICAgICAgICBlcnJvckZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuXG4gICAgLypPdmVyd3JpdGUgdGhlIGNhcHRpb24gb25seSBpZiB0aGV5IGFyZSBkZWZhdWx0Ki9cbiAgICBnZXRDYXB0aW9uKGNhcHRpb24sIGlzTXVsdGlwbGUsIGlzTW9iaWxlVHlwZSkge1xuICAgICAgICBpZiAoaW5jbHVkZXModGhpcy5ERUZBVUxUX0NBUFRJT05TLCBjYXB0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTXVsdGlwbGUgJiYgIWlzTW9iaWxlVHlwZSA/IHRoaXMuREVGQVVMVF9DQVBUSU9OUy5NVUxUSVBMRV9TRUxFQ1QgOiB0aGlzLkRFRkFVTFRfQ0FQVElPTlMuU0VMRUNUO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYXB0aW9uO1xuICAgIH1cblxuICAgIHVwbG9hZFVybCA9ICdzZXJ2aWNlcyc7XG5cbiAgICAvKiBjaGFuZ2Ugc2VydmVyIHBhdGggYmFzZWQgb24gdXNlciBvcHRpb24gKi9cbiAgICBjaGFuZ2VTZXJ2ZXJVcGxvYWRQYXRoKHBhdGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVwbG9hZFR5cGVQYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICAvKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpbGVleHRlbnNpb24gKi9cbiAgICBnZXRGaWxlRXh0ZW5zaW9uKGZpbGVOYW1lKSB7XG4gICAgICAgIGlmIChmaWxlTmFtZSAmJiBpbmNsdWRlcyhmaWxlTmFtZSwgJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdmaWxlJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBzZWxlY3QgRXZlbnRcbiAgICAgKiBAcGFyYW0gJGV2ZW50XG4gICAgICogQHBhcmFtICRmaWxlc1xuICAgICAqL1xuICAgIG9uU2VsZWN0RXZlbnRDYWxsKCRldmVudCwgJGZpbGVzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy5tdWx0aXBsZSA/IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLiRmaWxlc10gOiAkZmlsZXM7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3QnLCB7XG4gICAgICAgICAgICAgICAgJGV2ZW50OiAkLmV4dGVuZCgkZXZlbnQuJGZpbGVzIHx8IHt9LCAkZmlsZXMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsZXM6ICRmaWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRmlsZUVsZW1DbGljaygkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHREcm9wQXJlYSA9IHRydWU7XG5cbiAgICAgICAgLy9UaGUgZmlsZSB1cGxvYWQgd2lkZ2V0IHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gbnVsbCB0byByZXVwbG9hZCB0aGUgc2FtZSBmaWxlLlxuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JylbMF0udmFsdWUgPSBudWxsO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgZmlsZXBpY2tlciBpcyBub3QgdGhlcmUgb24gdGhlIHdpbmRvdywgcmVtb3ZlIHRoZSBkcm9wem9uZSBoaWdobGlnaHRcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5kaXNhYmxlRHJvcFpvbmUuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZGlzYWJsZURyb3Bab25lKCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodERyb3BBcmVhID0gZmFsc2U7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZGlzYWJsZURyb3Bab25lKTtcbiAgICB9XG5cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gY2xlYXIgdGhlIHNwZWNpZmllZCBmaWxlLiBpZiBhcmd1bWVudCBpcyBub3QgcHJvdmlkZWQsIGl0IGNsZWFycyB0aGUgY29tcGxldGUgbGlzdCAgKi9cbiAgICBjbGVhcihmaWxlT2JqKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IChmaWxlT2JqKSA/IHRoaXMuc2VsZWN0ZWRGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUgIT09IGZpbGVPYmopIDogW107XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IChmaWxlT2JqKSA/IHRoaXMudXBsb2FkZWRGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUgIT09IGZpbGVPYmopIDogW107XG4gICAgfVxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgY2xhc3MgbmFtZXMgZm9yIGNsZWFyIGljb24gKi9cbiAgICBzZXRDbGVhckljb25DbGFzcyhjbGFzc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJpY29uY2xhc3MgPSBjbGFzc1ZhbHVlO1xuICAgIH1cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBoaW50IGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uSGludChoaW50KSB7XG4gICAgICAgIHRoaXMuY2xlYXJpY29uaGludCA9IGhpbnQ7XG4gICAgfVxuXG5cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gYXBwZW5kIHVwbG9hZCBzdGF0dXMgZG9tIGVsZW1lbnRzIHRvIHdpZGdldCAqL1xuICAgIG9uRmlsZVNlbGVjdCgkZXZlbnQsICRmaWxlcykge1xuICAgICAgICBsZXQgYmVmb3JlU2VsZWN0VmFsO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuZ2V0VmFsaWRGaWxlcygkZmlsZXMpO1xuICAgICAgICAkZmlsZXMgPSBmaWxlcy52YWxpZEZpbGVzO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBwcmV2aW91c2x5IHRyaWVkIHVwbG9hZGluZyBmb2xkZXJzIHVzaW5nIGRyb3AsIGFuZCB0aGVuIHVwbG9hZGluZyB1c2luZyBjbGljayBtZXRob2Qgd2UgY2xlYXIgdGhlIGZvbGRlcnMgZG9tXG4gICAgICAgIGlmICgkZXZlbnQudHlwZSA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlcnMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgZXJyb3IgY2FsbGJhY2sgZXZlbnQgaWYgYW55IGludmFsaWQgZmlsZSBmb3VuZC5cbiAgICAgICAgaWYgKCFpc0VtcHR5KGZpbGVzLmVycm9yRmlsZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICRldmVudCxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMuZXJyb3JGaWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIGNhbGwgaWYgdGhlcmUgYXJlIHZhbGlkIGZpbGVzIGVsc2Ugbm8gY2FsbCBpcyBtYWRlXG4gICAgICAgIGlmICgkZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgICAgICAvLyBFVkVOVDogT05fQkVGT1JFX1NFTEVDVFxuICAgICAgICAgICAgYmVmb3JlU2VsZWN0VmFsID0gdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVzZWxlY3QnLCB7XG4gICAgICAgICAgICAgICAgJGV2ZW50OiAkLmV4dGVuZCgkZXZlbnQuJGZpbGVzIHx8IHt9LCAkZmlsZXMpLFxuICAgICAgICAgICAgICAgIGZpbGVzOiAkZmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlID0gdGhpcy5wcm9ncmVzc09ic2VydmFibGU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLl9wcm9ncmVzc09ic2VydmFibGUuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChwcm9ncmVzc09iaikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JFYWNoKHRoaXMuc2VsZWN0ZWRGaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLm5hbWUgPT09IHByb2dyZXNzT2JqLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5wcm9ncmVzcyA9IHByb2dyZXNzT2JqLnByb2dyZXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnByb2dyZXNzID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPSBwcm9ncmVzc09iai5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc09iai5lcnJNc2cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZXJyTXNnID0gcHJvZ3Jlc3NPYmouZXJyTXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gJGZpbGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJlZm9yZVNlbGVjdFZhbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBFVkVOVDogT05fU0VMRUNUXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdEV2ZW50Q2FsbCgkZXZlbnQsICRmaWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgKFByZXZlbnQgZmlsZSBmcm9tIGJlaW5nIG9wZW5lZClcbiAgICBkcmFnT3ZlckhhbmRsZXIoJGV2ZW50KSB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBmaWxlIGRhdGEgaWYgaXQgZXhpc3RzIGFuZCBjYWxsIHRoZSBvbkZpbGVTZWxlY3QgZnVuY3Rpb25cbiAgICBvbkZpbGVEcm9wKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGxpc3RPZkZpbGVzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIGNvbnN0IGZpbGVzRGF0YSA9ICRldmVudC5kYXRhVHJhbnNmZXIuaXRlbXM7XG4gICAgICAgIGlmIChmaWxlc0RhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gVXNlIERhdGFUcmFuc2Zlckl0ZW1MaXN0IGludGVyZmFjZSB0byBhY2Nlc3MgdGhlIGZpbGUocylcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXNEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGZpbGVzIGFuZCBwdXNoIHRoZW0gaW50byBhbiBhcnJheVxuICAgICAgICAgICAgICAgIGlmIChmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZGaWxlcy5wdXNoKGZpbGVzRGF0YVtpXS5nZXRBc0ZpbGUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIGEgc2VsZWN0ZWQgaXRlbSBpcyBkaXJlY3RvcnkgcHVzaCB0aGUgZm9sZGVyIGVsZW1lbnQgaW50byBhbiBhcnJheSBhbmQgZGlzcGxheSBlcnJvciBtZXNzYWdlIGJ5IGFkZGluZyB0byBkb21cbiAgICAgICAgICAgICAgICBlbHNlIGlmKGZpbGVzRGF0YVtpXS53ZWJraXRHZXRBc0VudHJ5KCkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlcnMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0KCRldmVudCwgbGlzdE9mRmlsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHJhZ092ZXJDYihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJyNkcm9wem9uZScpLmFkZENsYXNzKCdoaWdobGlnaHQtZHJvcC1ib3gnKTtcbiAgICB9XG5cbiAgICBkcm9wQ2IoKSB7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5yZW1vdmVDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0cmlnZ2VycyBmaWxlIHNlbGVjdCB3aW5kb3csIHdoZW4gY2xpY2tlZCBhbnl3aGVyZSBvbiB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IGluIGNhc2Ugb2YgbXVsdGkgc2VsZWN0XG4gICAgdHJpZ2dlckZpbGVTZWxlY3QoKSB7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZpbGUtaW5wdXQnKS50cmlnZ2VyKCdjbGljaycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFib3J0cyBhIGZpbGUgdXBsb2FkIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gJGZpbGUsIHRoZSBmaWxlIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyB0byBiZSBhYm9ydGVkXG4gICAgICovXG4gICAgYWJvcnRGaWxlVXBsb2FkKCRmaWxlKSB7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkNBTkNFTCwgJGZpbGUpO1xuICAgIH1cblxuICAgIGlzTWltZVR5cGUoZmlsZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2ltYWdlLyonKSAmJiBpc0ltYWdlRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnYXVkaW8vKicpICYmIGlzQXVkaW9GaWxlKGZpbGUpKVxuICAgICAgICAgICAgfHwgKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCd2aWRlby8qJykgJiYgaXNWaWRlb0ZpbGUoZmlsZSkpO1xuICAgIH1cblxuICAgIC8qIERlZmluZSB0aGUgcHJvcGVydHkgY2hhbmdlIGhhbmRsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgd2lkZ2V0IHByb3BlcnR5ICovXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdikge1xuICAgICAgICAvKk1vbml0b3JpbmcgY2hhbmdlcyBmb3Igc3R5bGVzIG9yIHByb3BlcnRpZXMgYW5kIGFjY29yZGluZ2x5IGhhbmRsaW5nIHJlc3BlY3RpdmUgY2hhbmdlcy4qL1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAndXBsb2FkcGF0aCc6XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBTcmluaXZhczogd2h5IGRvIHdlIG5lZWQgdXBsb2FkcGF0aFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmVyVXBsb2FkUGF0aChudik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb250ZW50dHlwZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCcqLyonKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IG52LnNwbGl0KCcgJykuam9pbignLCcpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmZpbHRlcihpdGVtID0+IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGl0ZW0pIHx8IHRoaXMuaXNNaW1lVHlwZShpdGVtKSkuam9pbignLCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmNob29zZUZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ211bHRpcGxlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1OYW1lID0gdGhpcy5uYW1lICsgKHRoaXMubXVsdGlwbGUgPyAnLW11bHRpcGxlLWZpbGV1cGxvYWQnIDogJy1zaW5nbGUtZmlsZXVwbG9hZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9IHRoaXMuZ2V0Q2FwdGlvbih0aGlzLmNhcHRpb24sIHRoaXMubXVsdGlwbGUsIHRoaXMuX2lzTW9iaWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmaWxldXBsb2FkbWVzc2FnZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTWVzc2FnZSA9IG52O1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoaW5qOiBJbmplY3RvciwgcHJpdmF0ZSBhcHA6IEFwcCwgQEF0dHJpYnV0ZSgnc2VsZWN0LmV2ZW50JykgcHVibGljIG9uU2VsZWN0RXZ0LCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuICAgICAgICAvLyBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgLy8gYWRkaW5nLCBkcmFnb3ZlciBhbmQgZHJvcCBvbiB0aGUgZG9jdW1lbnQgYXMgd2hlbiBmaWxlIGlzIGRyYWdnZWQgb24gdG8gdGhlIHBhZ2UgaGlnaGxpZ2h0IHRoZSBkcm9wem9uZXMgYW5kIHJlbW92ZSBoaWdobGlnaHQgb24gZmlsZSBkcm9wXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnT3ZlckNiLmJpbmQodGhpcykpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wQ2IuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gYWRkaW5nIG1vdXNlbGVhdmUgZXZudCB0byByZW1vdmUgaGlnaGxpZ2h0IHdoZW4gZmlsZSBpcyBkcm9wcGVkIG91dHNpZGUgdGhlIHdpbmRvd1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5kcm9wQ2IuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdHlsZXIoIHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYXBwLWJ1dHRvbiwgLmRyb3AtYm94JyksIHRoaXMpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ092ZXJDYik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BDYik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmRyb3BDYik7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFwcC1maWxldXBsb2FkXCIgaW5pdC13aWRnZXQ+XG4gICAgPCEtLSBkcmFnIGFuZCBkcm9wIGZpbGVzIFVJIGluIHdlYiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwLW11bHRpLWZpbGUtdXBsb2FkXCIgKm5nSWY9XCIhX2lzTW9iaWxlVHlwZSAmJiBtdWx0aXBsZVwiPlxuICAgICAgICA8ZGl2IGlkPVwiZHJvcHpvbmVcIiBjbGFzcz1cImRyb3AtYm94XCIgKGNsaWNrKT1cInRyaWdnZXJGaWxlU2VsZWN0KClcIiBbbmdDbGFzc109XCJ7J2hpZ2hsaWdodC1kcm9wLWJveCcgOiBoaWdobGlnaHREcm9wQXJlYX1cIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXJIYW5kbGVyKCRldmVudCk7XCIgKGRyb3ApPVwib25GaWxlRHJvcCgkZXZlbnQpO1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2ljb25jbGFzc319XCI+PC9pPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2lubmVySHRtbF09XCJjYXB0aW9uXCIgY2xhc3M9XCJ1cGxvYWQtbGFiZWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgbmFtZT1cInt7Zm9ybU5hbWV9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwibXVsdGlwbGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIChjbGljayk9XCJvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudCwgJGV2ZW50LnRhcmdldC5maWxlcylcIiBtdWx0aXBsZSA+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXBwLWFuY2hvciB1cGxvYWQtbGFiZWxcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPnt7IGZpbGVVcGxvYWRNZXNzYWdlIH19PC9hPlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJjaG9vc2VGaWx0ZXJcIiBbaW5uZXJIdG1sXT1cImNob29zZUZpbHRlciArICcgb25seSAnXCIgY2xhc3M9XCJ1cGxvYWQtZXh0ZW5zaW9uc1wiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjaG9vc2VGaWx0ZXIgJiYgbWF4ZmlsZXNpemVcIiBjbGFzcz1cInVwbG9hZC1leHRlbnNpb25zXCI+IC4gPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIm1heGZpbGVzaXplXCIgW2lubmVySHRtbF09XCJtYXhmaWxlc2l6ZSArICdNQiBtYXgnXCIgY2xhc3M9XCJ1cGxvYWQtZXh0ZW5zaW9uc1wiPjwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBzaW5nbGUgZmlsZSB1cGxvYWQgaW4gd2ViIGFuZCBzaW5nbGUgLCBtdWx0aXBsZSBmaWxlIHVwbG9hZCBVSSBpbiBtb2JpbGUgcnVubW9kZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwLXNpbmdsZS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc0NvcmRvdmEgJiYgKCFtdWx0aXBsZSB8fCBfaXNNb2JpbGVUeXBlKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIG5hbWU9XCJ7e2Zvcm1OYW1lfX1cIj5cbiAgICAgICAgICAgICAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZWFwcCBpbiBpdHMgcnVubW9kZSAoV2ViKSAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwibXVsdGlwbGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIChjbGljayk9XCJvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudCwgJGV2ZW50LnRhcmdldC5maWxlcylcIiBtdWx0aXBsZT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwiIW11bHRpcGxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2FjY2VwdF09XCJjaG9vc2VGaWx0ZXJcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkcm9wem9uZVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXB0aW9uXCIgW2lubmVySFRNTF09XCJjYXB0aW9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1maWxlcy11cGxvYWQtc3RhdHVzIHNpbmdsZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc3VwcG9ydCBmb3IgZmlsZSB1cGxvYWQgaW4gTW9iaWxlIEFwcGxpY2F0aW9uIChkZXZpY2UpIC0tPlxuICAgIDxidXR0b24gKm5nSWY9XCJfaXNDb3Jkb3ZhXCIgZm9jdXMtdGFyZ2V0IGNsYXNzPVwiYXBwLWJ1dHRvbiBidG4gYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwib3BlbkZpbGVTZWxlY3RvcigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXB0aW9uXCIgW2lubmVySFRNTF09XCJjYXB0aW9uXCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZpbGVzIFVJIC0tPlxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgZmlsZS11cGxvYWRcIiBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBmaWxlbGlzdGhlaWdodCwgb3ZlcmZsb3c6IG92ZXJmbG93fVwiICpuZ0lmPVwidXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwXCIgPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmdCBvZiB1cGxvYWRlZEZpbGVzXCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmlsZS11cGxvYWQtc3RhdHVzXCIgKm5nSWY9XCJmdC5zdGF0dXMgIT09ICdhYm9ydCdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEgdXBsb2FkLWZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtbGVmdCBtZWRpYS1taWRkbGUgZmlsZS1pY29uIHt7Z2V0RmlsZUV4dGVuc2lvbihmdC5uYW1lKSB8IGZpbGVJY29uQ2xhc3N9fVwiIHRpdGxlPVwie3tnZXRGaWxlRXh0ZW5zaW9uKGZ0Lm5hbWUpfX1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWJvZHkgbWVkaWEtbWlkZGxlIGZpbGUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ1cGxvYWRkZXRhaWxzIGNvbC1tZC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1cGxvYWQtdGl0bGVcIj57eyBmdC5zdG9yYWdlTmFtZSB8fCBmdC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnc3VjY2VzcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWljb24ge3tmdC5zdGF0dXMgfCBzdGF0ZUNsYXNzIH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlc2l6ZVwiICpuZ0lmPVwiZnQuZmlsZUxlbmd0aCAgIT09IDBcIj57e2Z0LnNpemUgfCBmaWxlc2l6ZTowfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdlcnJvcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWljb24ge3tmdC5zdGF0dXMgfCBzdGF0ZUNsYXNzIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ZnQuZXJyTXNnIHx8IHRoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRklMRV9VUExPQURfRkFJTEVEfX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdlcnJvcidcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5VcGxvYWQgRmFpbGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IHNob3dwcm9ncmVzc2JhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZ3Jlc3MgY29sLW1kLTcgdXBsb2FkLXByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJmdC5zdGF0dXMgPT09ICdlcnJvcicgPyAncHJvZ3Jlc3MtYmFyLWRhbmdlcicgOiAncHJvZ3Jlc3MtYmFyLWluZm8nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInt3aWR0aDogKGZ0LnByb2dyZXNzICsnJScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3RyaXBlZFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IHNob3dwcm9ncmVzc2JhciAmJiBzaG93cHJvZ3Jlc3NiYXJwZXJjZW50YWdlKSAmJiBmdC5wcm9ncmVzcyBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0xIHVwbG9hZC1wcm9ncmVzcy1wZXJjZW50YWdlXCI+e3sgZnQucHJvZ3Jlc3MgKyAnJScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcycgfHwgZnQuc3RhdHVzID09PSAncXVldWVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXRyYW5zcGFyZW50IGZpbGUtdXBsb2FkLXN0b3BcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFib3J0RmlsZVVwbG9hZChmdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIndpIHdpLWNsb3NlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cImNsZWFyKGZ0KVwiICpuZ0lmPVwiY2xlYXJpY29uY2xhc3MgIT09ICcnICYmIGZ0LnN0YXR1cyAhPT0gJ29uUHJvZ3Jlc3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBidG4tZGVmYXVsdCBzdGF0dXMtaWNvblwiIHRpdGxlPVwie3tjbGVhcmljb25oaW50fX1cIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2NsZWFyaWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC91bD5cbiAgICA8IS0tIGxpc3Qgb2Ygc2VsZWN0ZWRmb2xkZXJzIFVJIHRvIHNob3cgdGhlIGVycm9yIGluIHRpdGxlIC0tPlxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgZmlsZS11cGxvYWRcIiBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBmaWxlbGlzdGhlaWdodCwgb3ZlcmZsb3c6IG92ZXJmbG93fVwiIHRpdGxlPVwie3t0aGlzLmFwcExvY2FsZS5NRVNTQUdFX0ZPTERFUl9VUExPQURTX05PVF9BTExPV0VEfX1cIiAqbmdJZj1cInNlbGVjdGVkRm9sZGVycy5sZW5ndGggPiAwXCIgPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGZ0IG9mIHNlbGVjdGVkRm9sZGVyc1wiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGZpbGUtdXBsb2FkLXN0YXR1c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhIHVwbG9hZC1maWxlLWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtbGVmdCBtZWRpYS1taWRkbGUgZmlsZS1pY29uIGZhIGZhLWZvbGRlci1vXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWJvZHkgbWVkaWEtbWlkZGxlIGZpbGUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZC10aXRsZVwiPnt7ZnQubmFtZX19PC9sYWJlbD48YnIvPlxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaWNvbiAgd2kgd2ktY2FuY2VsIHRleHQtZGFuZ2VyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgPC91bD5cbjwvZGl2PlxuIl19
@@ -293,7 +293,7 @@ function FileUploadComponent_ul_4_Template(rf, ctx) { if (rf & 1) {
293
293
  const ctx_r1 = i0.ɵɵnextContext();
294
294
  i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
295
295
  i0.ɵɵadvance();
296
- i0.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
296
+ i0.ɵɵproperty("ngForOf", ctx_r1.uploadedFiles);
297
297
  } }
298
298
  function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
299
299
  i0.ɵɵelementStart(0, "li", 30)(1, "div", 31);
@@ -430,8 +430,8 @@ class FileUploadComponent extends StylableComponent {
430
430
  * @param $files
431
431
  */
432
432
  onSelectEventCall($event, $files) {
433
- this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
434
433
  this.selectedFiles = $files;
434
+ this.uploadedFiles = this.multiple ? [...this.uploadedFiles, ...$files] : $files;
435
435
  setTimeout(() => {
436
436
  this.invokeEventCallback('select', {
437
437
  $event: $.extend($event.$files || {}, $files),
@@ -453,12 +453,8 @@ class FileUploadComponent extends StylableComponent {
453
453
  }
454
454
  /*this function to clear the specified file. if argument is not provided, it clears the complete list */
455
455
  clear(fileObj) {
456
- if (this.multiple) {
457
- this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
458
- }
459
- else {
460
- this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
461
- }
456
+ this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
457
+ this.uploadedFiles = (fileObj) ? this.uploadedFiles.filter((file) => file !== fileObj) : [];
462
458
  }
463
459
  /*this function to set the class names for clear icon */
464
460
  setClearIconClass(classValue) {
@@ -606,7 +602,7 @@ class FileUploadComponent extends StylableComponent {
606
602
  this.app = app;
607
603
  this.onSelectEvt = onSelectEvt;
608
604
  this.selectedFiles = [];
609
- this.multipleSelectedFiles = [];
605
+ this.uploadedFiles = [];
610
606
  this.selectedFolders = [];
611
607
  this.fileTransfers = {};
612
608
  this.caption = 'Upload';
@@ -632,12 +628,6 @@ class FileUploadComponent extends StylableComponent {
632
628
  this.defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);
633
629
  this.chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;
634
630
  this.fileUploadMessage = 'Drop your files here or click here to browse';
635
- this.uploadedFiles = {
636
- fileName: '',
637
- path: '',
638
- length: '',
639
- status: ''
640
- };
641
631
  this.uploadUrl = 'services';
642
632
  // styler(this.nativeElement, this);
643
633
  }
@@ -673,7 +663,7 @@ class FileUploadComponent extends StylableComponent {
673
663
  i0.ɵɵadvance();
674
664
  i0.ɵɵproperty("ngIf", ctx._isCordova);
675
665
  i0.ɵɵadvance();
676
- i0.ɵɵproperty("ngIf", ctx.selectedFiles.length > 0);
666
+ i0.ɵɵproperty("ngIf", ctx.uploadedFiles.length > 0);
677
667
  i0.ɵɵadvance();
678
668
  i0.ɵɵproperty("ngIf", ctx.selectedFolders.length > 0);
679
669
  } }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i2.NgStyle, i3.FileIconClassPipe, i3.FileSizePipe, i3.StateClassPipe], encapsulation: 2 }); }
@@ -682,7 +672,7 @@ class FileUploadComponent extends StylableComponent {
682
672
  type: Component,
683
673
  args: [{ selector: '[wmFileUpload]', providers: [
684
674
  provideAsWidgetRef(FileUploadComponent)
685
- ], 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=\"upload-label\"></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 class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\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 col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\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 <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\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" }]
675
+ ], 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=\"upload-label\"></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 class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\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=\"uploadedFiles.length > 0\" >\n <div *ngFor=\"let ft of uploadedFiles\">\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 col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\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 <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\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" }]
686
676
  }], () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
687
677
  type: Attribute,
688
678
  args: ['select.event']