@eqproject/eqp-attachments 3.1.13 → 3.1.14

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.
@@ -1184,6 +1184,20 @@ export class EqpAttachmentsComponent {
1184
1184
  isDeleteDisabled(att) {
1185
1185
  return this.disableAction || !!this.actionDisabledFn?.('delete', att);
1186
1186
  }
1187
+ isPrimaryActionHidden(att) {
1188
+ if (this.hiddenActions?.includes('download') || this.hiddenActions?.includes('preview') || this.hiddenActions?.includes('primaryAction'))
1189
+ return true;
1190
+ if (this.hiddenColumns?.includes('download') || this.hiddenColumns?.includes('preview') || this.hiddenColumns?.includes('primaryAction'))
1191
+ return true;
1192
+ if (this.actionHiddenFn?.('primaryAction', att) || this.actionHiddenFn?.('download', att) || this.actionHiddenFn?.('preview', att))
1193
+ return true;
1194
+ return false;
1195
+ }
1196
+ isPrimaryActionDisabled(att) {
1197
+ if (this.actionDisabledFn?.('primaryAction', att) || this.actionDisabledFn?.('download', att) || this.actionDisabledFn?.('preview', att))
1198
+ return true;
1199
+ return false;
1200
+ }
1187
1201
  /**
1188
1202
  * Unisce le colonne di default con quelle custom e le ordina.
1189
1203
  */
@@ -1328,11 +1342,11 @@ export class EqpAttachmentsComponent {
1328
1342
  }
1329
1343
  }
1330
1344
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EqpAttachmentsComponent, deps: [{ token: i1.MatDialog }, { token: i2.FormBuilder }, { token: i3.DomSanitizer }, { token: i4.HttpClient }, { token: i5.EqpAttachmentService }], target: i0.ɵɵFactoryTarget.Component });
1331
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EqpAttachmentsComponent, selector: "eqp-attachments", inputs: { disableAction: "disableAction", showHeader: "showHeader", attachmentsList: "attachmentsList", singleAttachment: "singleAttachment", showMatCard: "showMatCard", multipleAttachment: "multipleAttachment", loadMultipleFiles: "loadMultipleFiles", emptyTableMessage: "emptyTableMessage", allowOnlyImages: "allowOnlyImages", acceptedFileTypes: "acceptedFileTypes", isDisabled: "isDisabled", showInlinePreview: "showInlinePreview", getAttachmentEndpoint: "getAttachmentEndpoint", productionBaseUrl: "productionBaseUrl", compressionOptions: "compressionOptions", allowedTypes: "allowedTypes", isEqpTableMultiLanguage: "isEqpTableMultiLanguage", tablePaginatorVisible: "tablePaginatorVisible", isTableSearcheable: "isTableSearcheable", tablePaginatorSize: "tablePaginatorSize", separatedUploadButtons: "separatedUploadButtons", showPreview: "showPreview", singleAttachmentDragAndDrop: "singleAttachmentDragAndDrop", cropOptions: "cropOptions", cropDialogClass: "cropDialogClass", maxFileSizeMB: "maxFileSizeMB", cardSize: "cardSize", customCardWidthPx: "customCardWidthPx", customCardHeightPx: "customCardHeightPx", layout: "layout", openLinkLabel: "openLinkLabel", addButtonLabel: "addButtonLabel", downloadLabel: "downloadLabel", deleteLabel: "deleteLabel", fileNameLabel: "fileNameLabel", previewLabel: "previewLabel", uploadFileLabel: "uploadFileLabel", confirmLabel: "confirmLabel", abortLabel: "abortLabel", saveLabel: "saveLabel", exitLabel: "exitLabel", uploadWithDropboxLabel: "uploadWithDropboxLabel", cropLabel: "cropLabel", deleteDialogTitle: "deleteDialogTitle", deleteDialogMessage: "deleteDialogMessage", noImageSelectedErrorMessage: "noImageSelectedErrorMessage", wrongTypeSelectedErrorMessage: "wrongTypeSelectedErrorMessage", videoPreviewErrorMessage: "videoPreviewErrorMessage", audioPreviewErrorMessage: ["videoPreviewErrorMessage", "audioPreviewErrorMessage"], flipHorinzontalLabel: "flipHorinzontalLabel", flipVerticalLabel: "flipVerticalLabel", rotateRightLabel: "rotateRightLabel", rotateLeftLabel: "rotateLeftLabel", base64LimitMB: "base64LimitMB", uploadTitle: "uploadTitle", uploadSubtitle: "uploadSubtitle", dropHereLabel: "dropHereLabel", supportedFormatsLabel: "supportedFormatsLabel", browseFilesLabel: "browseFilesLabel", uploadSummaryLabel: "uploadSummaryLabel", filesLabel: "filesLabel", totalSizeLabel: "totalSizeLabel", emptyStateLabel: "emptyStateLabel", addedSuccessfullyLabel: "addedSuccessfullyLabel", removedLabel: "removedLabel", chooseView: "chooseView", showSummary: "showSummary", viewMode: "viewMode", showUploadTitle: "showUploadTitle", showDropArea: "showDropArea", hiddenColumns: "hiddenColumns", hiddenActions: "hiddenActions", showActionButtons: "showActionButtons", enableImageCrop: "enableImageCrop", actionHiddenFn: "actionHiddenFn", actionDisabledFn: "actionDisabledFn", videoCompression: "videoCompression", customMenuActions: "customMenuActions", customColumns: "customColumns" }, outputs: { localEditedAttachments: "localEditedAttachments", abortAddAttachment: "abortAddAttachment", downloadAttachment: "downloadAttachment", onDeleteAttachment: "onDeleteAttachment" }, viewQueries: [{ propertyName: "dialogAddAttachment", first: true, predicate: ["dialogAddAttachment"], descendants: true, static: true }, { propertyName: "dialogAddMultipleAttachment", first: true, predicate: ["dialogAddMultipleAttachment"], descendants: true, static: true }, { propertyName: "dialogCropImage", first: true, predicate: ["dialogCropImage"], descendants: true, static: true }, { propertyName: "addingLinkTemplate", first: true, predicate: ["addingLinkTemplate"], descendants: true }, { propertyName: "imageCropper", first: true, predicate: ImageCropperComponent, descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "inlinePreviewTemplate", first: true, predicate: ["inlinePreviewTemplate"], descendants: true, static: true }, { propertyName: "dialogPreview", first: true, predicate: ["dialogPreview"], descendants: true, static: true }, { propertyName: "defaultFileTemplate", first: true, predicate: ["defaultFileTemplate"], descendants: true, static: true }, { propertyName: "defaultActionsTemplate", first: true, predicate: ["defaultActionsTemplate"], descendants: true, static: true }], ngImport: i0, template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n@if(showUploadTitle == true || chooseView == true){\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && showActionButtons == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n\r\n @if (showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!isDeleteHidden(att)){\r\n <button mat-icon-button class=\"remove-btn\" (click)=\"deleteAttachment(att)\"\r\n [disabled]=\"att.isUploading || isDeleteDisabled(att)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n\r\n @if (!hiddenActions.includes('actionsMenu')) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"isActionDisabled(action, att)\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden; display: flex; flex-direction: column; height: 100%; min-height: 0; flex: 1 1 auto;\"\r\n [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog{display:flex!important;flex-direction:column!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;max-height:90vh!important;margin:0 auto;background-color:#fff!important;display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden!important}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;flex:1 1 auto;min-height:0;height:100%;max-height:100%;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .close-btn{display:inline-flex!important;align-items:center!important;justify-content:center!important;padding:0!important;width:40px!important;height:40px!important}.modern-dialog-container .preview-header .close-btn ::ng-deep mat-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin:0!important;padding:0!important;line-height:1!important}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1 1 auto;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:100%;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y))}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1 1 auto;width:100%;height:100%;display:flex;flex-direction:column;align-items:stretch;min-height:0;overflow:hidden}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0;overflow:hidden;min-height:0;width:100%;height:100%}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{flex:1 1 auto;width:100%;height:100%;max-width:100%!important;max-height:100%!important;display:block;min-height:0}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper{display:flex!important;max-width:100%!important;max-height:100%!important;height:100%;width:100%}image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}.disabled-dropzone{opacity:.5;cursor:not-allowed!important;background-color:#f5f5f5;border-color:#d1d5db}.disabled-dropzone *{pointer-events:none}.disabled-dropzone .browse-btn,.disabled-dropzone button{cursor:not-allowed!important;background-color:#e5e7eb;color:#9ca3af;border:none}.disabled-dropzone .secondary-action-link,.disabled-dropzone a{color:#9ca3af;text-decoration:none}\n"], dependencies: [{ kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i10.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i13.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "pipe", type: i13.DatePipe, name: "date" }] });
1345
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EqpAttachmentsComponent, selector: "eqp-attachments", inputs: { disableAction: "disableAction", showHeader: "showHeader", attachmentsList: "attachmentsList", singleAttachment: "singleAttachment", showMatCard: "showMatCard", multipleAttachment: "multipleAttachment", loadMultipleFiles: "loadMultipleFiles", emptyTableMessage: "emptyTableMessage", allowOnlyImages: "allowOnlyImages", acceptedFileTypes: "acceptedFileTypes", isDisabled: "isDisabled", showInlinePreview: "showInlinePreview", getAttachmentEndpoint: "getAttachmentEndpoint", productionBaseUrl: "productionBaseUrl", compressionOptions: "compressionOptions", allowedTypes: "allowedTypes", isEqpTableMultiLanguage: "isEqpTableMultiLanguage", tablePaginatorVisible: "tablePaginatorVisible", isTableSearcheable: "isTableSearcheable", tablePaginatorSize: "tablePaginatorSize", separatedUploadButtons: "separatedUploadButtons", showPreview: "showPreview", singleAttachmentDragAndDrop: "singleAttachmentDragAndDrop", cropOptions: "cropOptions", cropDialogClass: "cropDialogClass", maxFileSizeMB: "maxFileSizeMB", cardSize: "cardSize", customCardWidthPx: "customCardWidthPx", customCardHeightPx: "customCardHeightPx", layout: "layout", openLinkLabel: "openLinkLabel", addButtonLabel: "addButtonLabel", downloadLabel: "downloadLabel", deleteLabel: "deleteLabel", fileNameLabel: "fileNameLabel", previewLabel: "previewLabel", uploadFileLabel: "uploadFileLabel", confirmLabel: "confirmLabel", abortLabel: "abortLabel", saveLabel: "saveLabel", exitLabel: "exitLabel", uploadWithDropboxLabel: "uploadWithDropboxLabel", cropLabel: "cropLabel", deleteDialogTitle: "deleteDialogTitle", deleteDialogMessage: "deleteDialogMessage", noImageSelectedErrorMessage: "noImageSelectedErrorMessage", wrongTypeSelectedErrorMessage: "wrongTypeSelectedErrorMessage", videoPreviewErrorMessage: "videoPreviewErrorMessage", audioPreviewErrorMessage: ["videoPreviewErrorMessage", "audioPreviewErrorMessage"], flipHorinzontalLabel: "flipHorinzontalLabel", flipVerticalLabel: "flipVerticalLabel", rotateRightLabel: "rotateRightLabel", rotateLeftLabel: "rotateLeftLabel", base64LimitMB: "base64LimitMB", uploadTitle: "uploadTitle", uploadSubtitle: "uploadSubtitle", dropHereLabel: "dropHereLabel", supportedFormatsLabel: "supportedFormatsLabel", browseFilesLabel: "browseFilesLabel", uploadSummaryLabel: "uploadSummaryLabel", filesLabel: "filesLabel", totalSizeLabel: "totalSizeLabel", emptyStateLabel: "emptyStateLabel", addedSuccessfullyLabel: "addedSuccessfullyLabel", removedLabel: "removedLabel", chooseView: "chooseView", showSummary: "showSummary", viewMode: "viewMode", showUploadTitle: "showUploadTitle", showDropArea: "showDropArea", hiddenColumns: "hiddenColumns", hiddenActions: "hiddenActions", showActionButtons: "showActionButtons", enableImageCrop: "enableImageCrop", actionHiddenFn: "actionHiddenFn", actionDisabledFn: "actionDisabledFn", videoCompression: "videoCompression", customMenuActions: "customMenuActions", customColumns: "customColumns" }, outputs: { localEditedAttachments: "localEditedAttachments", abortAddAttachment: "abortAddAttachment", downloadAttachment: "downloadAttachment", onDeleteAttachment: "onDeleteAttachment" }, viewQueries: [{ propertyName: "dialogAddAttachment", first: true, predicate: ["dialogAddAttachment"], descendants: true, static: true }, { propertyName: "dialogAddMultipleAttachment", first: true, predicate: ["dialogAddMultipleAttachment"], descendants: true, static: true }, { propertyName: "dialogCropImage", first: true, predicate: ["dialogCropImage"], descendants: true, static: true }, { propertyName: "addingLinkTemplate", first: true, predicate: ["addingLinkTemplate"], descendants: true }, { propertyName: "imageCropper", first: true, predicate: ImageCropperComponent, descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "inlinePreviewTemplate", first: true, predicate: ["inlinePreviewTemplate"], descendants: true, static: true }, { propertyName: "dialogPreview", first: true, predicate: ["dialogPreview"], descendants: true, static: true }, { propertyName: "defaultFileTemplate", first: true, predicate: ["defaultFileTemplate"], descendants: true, static: true }, { propertyName: "defaultActionsTemplate", first: true, predicate: ["defaultActionsTemplate"], descendants: true, static: true }], ngImport: i0, template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n@if(showUploadTitle == true || chooseView == true){\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && showActionButtons == true) {\r\n @if (!isPrimaryActionHidden(attachmentsList[0])) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n [disabled]=\"isPrimaryActionDisabled(attachmentsList[0])\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n }\r\n\r\n @if (!isPrimaryActionHidden(attachmentsList[0]) && showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n [disabled]=\"isPrimaryActionDisabled(attachmentsList[0])\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && !isPrimaryActionHidden(att) && !isPrimaryActionDisabled(att) && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n @if (!isPrimaryActionHidden(att)) {\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!isDeleteHidden(att)){\r\n <button mat-icon-button class=\"remove-btn\" (click)=\"deleteAttachment(att)\"\r\n [disabled]=\"att.isUploading || isDeleteDisabled(att)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n @if (!isPrimaryActionHidden(att)) {\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\" [disabled]=\"isPrimaryActionDisabled(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n }\r\n\r\n @if (!hiddenActions.includes('actionsMenu')) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"isActionDisabled(action, att)\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden; display: flex; flex-direction: column; height: 100%; min-height: 0; flex: 1 1 auto;\"\r\n [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog{display:flex!important;flex-direction:column!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;max-height:90vh!important;margin:0 auto;background-color:#fff!important;display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden!important}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;flex:1 1 auto;min-height:0;height:100%;max-height:100%;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .close-btn{display:inline-flex!important;align-items:center!important;justify-content:center!important;padding:0!important;width:40px!important;height:40px!important}.modern-dialog-container .preview-header .close-btn ::ng-deep mat-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin:0!important;padding:0!important;line-height:1!important}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1 1 auto;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:100%;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y))}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1 1 auto;width:100%;height:100%;display:flex;flex-direction:column;align-items:stretch;min-height:0;overflow:hidden}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0;overflow:hidden;min-height:0;width:100%;height:100%}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{flex:1 1 auto;width:100%;height:100%;max-width:100%!important;max-height:100%!important;display:block;min-height:0}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper{display:flex!important;max-width:100%!important;max-height:100%!important;height:100%;width:100%}image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}.disabled-dropzone{opacity:.5;cursor:not-allowed!important;background-color:#f5f5f5;border-color:#d1d5db}.disabled-dropzone *{pointer-events:none}.disabled-dropzone .browse-btn,.disabled-dropzone button{cursor:not-allowed!important;background-color:#e5e7eb;color:#9ca3af;border:none}.disabled-dropzone .secondary-action-link,.disabled-dropzone a{color:#9ca3af;text-decoration:none}\n"], dependencies: [{ kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i10.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i13.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "pipe", type: i13.DatePipe, name: "date" }] });
1332
1346
  }
1333
1347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EqpAttachmentsComponent, decorators: [{
1334
1348
  type: Component,
1335
- args: [{ selector: "eqp-attachments", template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n@if(showUploadTitle == true || chooseView == true){\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && showActionButtons == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n\r\n @if (showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!isDeleteHidden(att)){\r\n <button mat-icon-button class=\"remove-btn\" (click)=\"deleteAttachment(att)\"\r\n [disabled]=\"att.isUploading || isDeleteDisabled(att)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n\r\n @if (!hiddenActions.includes('actionsMenu')) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"isActionDisabled(action, att)\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden; display: flex; flex-direction: column; height: 100%; min-height: 0; flex: 1 1 auto;\"\r\n [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog{display:flex!important;flex-direction:column!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;max-height:90vh!important;margin:0 auto;background-color:#fff!important;display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden!important}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;flex:1 1 auto;min-height:0;height:100%;max-height:100%;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .close-btn{display:inline-flex!important;align-items:center!important;justify-content:center!important;padding:0!important;width:40px!important;height:40px!important}.modern-dialog-container .preview-header .close-btn ::ng-deep mat-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin:0!important;padding:0!important;line-height:1!important}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1 1 auto;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:100%;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y))}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1 1 auto;width:100%;height:100%;display:flex;flex-direction:column;align-items:stretch;min-height:0;overflow:hidden}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0;overflow:hidden;min-height:0;width:100%;height:100%}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{flex:1 1 auto;width:100%;height:100%;max-width:100%!important;max-height:100%!important;display:block;min-height:0}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper{display:flex!important;max-width:100%!important;max-height:100%!important;height:100%;width:100%}image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}.disabled-dropzone{opacity:.5;cursor:not-allowed!important;background-color:#f5f5f5;border-color:#d1d5db}.disabled-dropzone *{pointer-events:none}.disabled-dropzone .browse-btn,.disabled-dropzone button{cursor:not-allowed!important;background-color:#e5e7eb;color:#9ca3af;border:none}.disabled-dropzone .secondary-action-link,.disabled-dropzone a{color:#9ca3af;text-decoration:none}\n"] }]
1349
+ args: [{ selector: "eqp-attachments", template: "<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n@if(showUploadTitle == true || chooseView == true){\r\n<div class=\"header\">\r\n @if(showUploadTitle == true){\r\n <h4>{{ uploadTitle }}</h4>\r\n }\r\n @if(chooseView == true){\r\n <mat-button-toggle-group [value]=\"viewMode\" (change)=\"setViewMode($event.value)\"\r\n aria-label=\"Modalit\u00E0 di visualizzazione\">\r\n <mat-button-toggle value=\"card\"><mat-icon>grid_view</mat-icon></mat-button-toggle>\r\n <mat-button-toggle value=\"table\"><mat-icon>view_list</mat-icon></mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione singolo -->\r\n@if (multipleAttachment != true) {\r\n@if (!singleAttachmentDragAndDrop) {\r\n@if (!addingLinkMode) {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addAttachmentButton\"></ng-container>\r\n</div>\r\n} @else {\r\n<div class=\"text-center\">\r\n <ng-container [ngTemplateOutlet]=\"addingLinkTemplate\"></ng-container>\r\n</div>\r\n}\r\n} @else {\r\n<input #fileInput id=\"file_attachment\" name=\"file_attachment\" type=\"file\" hidden (change)=\"onFileAdded($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (allowedTypes && allowedTypes.includes(1) && (!attachmentsList || attachmentsList.length == 0 ||\r\n(attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n\r\n@if (showDropArea == true) {\r\n<!-- FULL -->\r\n@if (layout === 'full') {\r\n\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n <div class=\"secondary-action\">\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n @if (allowedTypes.includes(2) && allowedTypes.includes(3)) {\r\n <a class=\"secondary-action-link\" [matMenuTriggerFor]=\"isDisabled ? null : linkMenu\"\r\n [class.disabled-link]=\"isDisabled\" (click)=\"$event.stopPropagation()\">\r\n o aggiungi da web\r\n </a>\r\n <mat-menu #linkMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"switchToAddingLinkMode()\">\r\n <mat-icon>link</mat-icon>\r\n <span>Aggiungi da link</span>\r\n </button>\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\">\r\n <mat-icon>cloud_queue</mat-icon>\r\n <span>Carica da Dropbox</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @else if (allowedTypes.includes(2)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">\r\n aggiungi un link\r\n </a>\r\n }\r\n\r\n @else if (allowedTypes.includes(3)) {\r\n <a [class.disabled-link]=\"isDisabled\" class=\"secondary-action-link\"\r\n (click)=\"$event.stopPropagation(); chooseDropboxFile()\">\r\n carica da Dropbox\r\n </a>\r\n }\r\n }\r\n </div>\r\n</div>\r\n}@else {\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n}\r\n}\r\n\r\n<!-- Azioni singolo elemento (come prima) -->\r\n<div class=\"text-center\">\r\n @if (attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && showActionButtons == true) {\r\n @if (!isPrimaryActionHidden(attachmentsList[0])) {\r\n <button class=\"mb-2 me-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n [disabled]=\"isPrimaryActionDisabled(attachmentsList[0])\"\r\n mat-raised-button color=\"primary\">\r\n @if (attachmentsList[0].AttachmentType == AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n } @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n {{ attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel }}\r\n </button>\r\n }\r\n\r\n @if (!isPrimaryActionHidden(attachmentsList[0]) && showPreview && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video')\r\n && !attachmentsList[0].FileContentType.startsWith('audio'))) && attachmentsList[0].IsImage == true) {\r\n <button class=\"mb-2 me-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n [disabled]=\"isPrimaryActionDisabled(attachmentsList[0])\"\r\n mat-raised-button color=\"primary\">\r\n <mat-icon>visibility</mat-icon> {{ previewLabel }}\r\n </button>\r\n }\r\n\r\n <button [disabled]=\"disableAction\" class=\"mb-2 eqp-attachments-delete-btn\"\r\n (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\" mat-raised-button [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{ deleteLabel }}\r\n </button>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Gestione multipla -->\r\n@if (multipleAttachment == true && showDropArea == true) {\r\n<input #fileInput id=\"file_attachment_multi\" name=\"file_attachment_multi\" type=\"file\" hidden\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n@if (layout === 'full') {\r\n<div class=\"dropbox\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\"\r\n (click)=\"!isDisabled && onSelectFile($event, fileInput)\" role=\"button\" [attr.tabindex]=\"isDisabled ? -1 : 0\"\r\n (keydown.enter)=\"!isDisabled && fileInput.click()\" (keydown.space)=\"!isDisabled && fileInput.click()\">\r\n <div class=\"dropbox-icon\">\uD83D\uDCC1</div>\r\n <div class=\"dropbox-text\">{{ dropHereLabel }}</div>\r\n <div class=\"dropbox-subtext\">\r\n {{ supportedFormatsLabel }}\r\n </div>\r\n <button class=\"browse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); fileInput.click()\">\r\n {{ browseFilesLabel }}\r\n </button>\r\n @if (allowedTypes.includes(2)) {\r\n <div class=\"secondary-action-link\">\r\n o <a (click)=\"$event.stopPropagation(); switchToAddingLinkMode()\">aggiungi un link</a>\r\n </div>\r\n }\r\n</div>\r\n}@else{\r\n<div class=\"compact-uploader\" [class.dragover]=\"dragOver && !isDisabled\" [class.disabled-dropzone]=\"isDisabled\"\r\n (dragover)=\"!isDisabled ? dragOver = true : null; $event.preventDefault()\" (dragleave)=\"dragOver = false\"\r\n (drop)=\"!isDisabled ? (dragOver = false) : null; fileDropped($event)\">\r\n <div class=\"compact-icon\"><mat-icon>folder_open</mat-icon></div>\r\n <div class=\"compact-text\" (click)=\"!isDisabled && onSelectFile($event, fileInput)\">\r\n <div class=\"compact-title\">Trascina i file o seleziona dal computer</div>\r\n <div class=\"compact-subtitle\">{{ supportedFormatsLabel }}</div>\r\n </div>\r\n <div class=\"compact-actions\">\r\n <button mat-stroked-button [disabled]=\"isDisabled\" color=\"primary\"\r\n (click)=\"$event.stopPropagation(); fileInput.click()\">Sfoglia</button>\r\n @if (allowedTypes.includes(2) || allowedTypes.includes(3)) {\r\n <button mat-stroked-button [disabled]=\"isDisabled\" [matMenuTriggerFor]=\"compactLinkMenu\"\r\n (click)=\"$event.stopPropagation()\">Link</button>\r\n <mat-menu #compactLinkMenu=\"matMenu\">\r\n @if (allowedTypes.includes(2)) { <button mat-menu-item [disabled]=\"isDisabled\"\r\n (click)=\"switchToAddingLinkMode()\">{{ openLinkLabel }}</button> }\r\n @if (allowedTypes.includes(3)) { <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"chooseDropboxFile()\">{{\r\n uploadWithDropboxLabel }}</button> }\r\n </mat-menu>\r\n }\r\n </div>\r\n</div>\r\n}\r\n}\r\n\r\n@if (attachmentsList?.length > 0 && showSummary) {\r\n<div class=\"upload-stats\">\r\n\r\n <div class=\"stats-info\">\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ attachmentsList?.length }}</div>\r\n <div class=\"stat-label\">{{ filesLabel }}</div>\r\n </div>\r\n <div class=\"stat-item\">\r\n <div class=\"stat-value\">{{ totalSizeFormatted }}</div>\r\n <div class=\"stat-label\">{{ totalSizeLabel }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n\r\n</div>\r\n} @else if(attachmentsList?.length == 0){\r\n<div class=\"empty-state\">{{ emptyStateLabel }}</div>\r\n}\r\n\r\n<!-- Griglia anteprime card (vale per singolo e multiplo) -->\r\n@if (viewMode === 'card') {\r\n\r\n<div class=\"file-previews\" [ngStyle]=\"getPreviewsContainerStyle()\">\r\n @for (att of attachmentsList; track att.ID) {\r\n <div [ngClass]=\"getCardClass(att)\">\r\n <div class=\"preview-img-container\" (click)=\"!att.isUploading && !isPrimaryActionHidden(att) && !isPrimaryActionDisabled(att) && handlePrimaryAction(att)\">\r\n\r\n @if (att.IsImage || att.FileThumbnailBase64) {\r\n <img class=\"preview-img\" [src]=\"'data:image/jpeg;base64,' + (att.FileThumbnailBase64 || att.FileDataBase64)\"\r\n [alt]=\"att.FileName\" />\r\n } @else {\r\n <div class=\"file-icon\"><i [ngClass]=\"getAttachmentIcon(att)\"></i></div>\r\n }\r\n\r\n @if (!isPrimaryActionHidden(att)) {\r\n <div class=\"preview-action-overlay\">\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n <mat-icon>play_arrow</mat-icon>\r\n }\r\n @else if (att.IsImage && canBePreviewed(att)) {\r\n <mat-icon>visibility</mat-icon>\r\n }\r\n @else if (att.FileContentType === 'application/pdf' && canBePreviewed(att)) {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n @else if (att.AttachmentType === AttachmentType.FILE) {\r\n <mat-icon>download</mat-icon>\r\n }\r\n @else {\r\n <mat-icon>open_in_new</mat-icon>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"file-info\">\r\n <div class=\"file-name\" [title]=\"att.FileName\">{{ att.FileName }}</div>\r\n </div>\r\n\r\n @if(!isDeleteHidden(att)){\r\n <button mat-icon-button class=\"remove-btn\" (click)=\"deleteAttachment(att)\"\r\n [disabled]=\"att.isUploading || isDeleteDisabled(att)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (att.isUploading) {\r\n <div class=\"upload-spinner\"></div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n} @else if(viewMode === 'table' && attachmentsList?.length > 0) {\r\n\r\n\r\n<div class=\"table-view-container\">\r\n\r\n <div class=\"table-header\">\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n {{ col.display }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (att of attachmentsList; track att.ID) {\r\n <div class=\"table-row\">\r\n\r\n @for (col of _tableColumns; track col.key) {\r\n <div class=\"table-cell\" [style.flex]=\"col.styles?.flex\" [ngClass]=\"col.class\">\r\n\r\n @switch (col.type) {\r\n\r\n @case ('template') {\r\n <div class=\"template-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: att }\"></ng-container>\r\n </div>\r\n }\r\n @case ('date') {\r\n <span class=\"metadata-value\">{{ att[col.key] | date:'dd/MM/yyyy' }}</span>\r\n }\r\n @default {\r\n <span class=\"metadata-value\">{{ att[col.key] }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<!-- Notifica toast -->\r\n<div class=\"upload-notification\" [class.show]=\"toast?.visible\" [class.success]=\"toast?.type === 'success'\"\r\n [class.error]=\"toast?.type === 'error'\">\r\n <span>{{ toast?.text }}</span>\r\n <div class=\"notification-progress\"></div>\r\n</div>\r\n\r\n<ng-template #defaultFileTemplate let-att>\r\n <i class=\"file-icon-small\" [ngClass]=\"getAttachmentIcon(att)\"></i>\r\n <div class=\"file-info-text\">\r\n <span class=\"file-name-table\">{{ att.FileName }}</span>\r\n <span class=\"file-type-table\">{{ att.FileExtension || 'Link' }}</span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultActionsTemplate let-att>\r\n @if (!isPrimaryActionHidden(att)) {\r\n <button mat-icon-button (click)=\"handlePrimaryAction(att)\" [disabled]=\"isPrimaryActionDisabled(att)\"\r\n [matTooltip]=\"att.FileContentType?.startsWith('video/') ? 'Riproduci video' : 'Visualizza/Scarica'\">\r\n\r\n <mat-icon>\r\n @if (att.FileContentType?.startsWith('video/')) {\r\n play_arrow\r\n } @else {\r\n {{ att.AttachmentType === AttachmentType.FILE ? 'download' : 'open_in_new' }}\r\n }\r\n </mat-icon>\r\n </button>\r\n }\r\n\r\n @if (!hiddenActions.includes('actionsMenu')) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"actionsMenu\" matTooltip=\"Altre opzioni\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n @for (action of _sortedMenuActions; track action.name) {\r\n @if (!isActionHidden(action, att)) {\r\n <button mat-menu-item (click)=\"action.fn(att)\" [disabled]=\"isActionDisabled(action, att)\">\r\n <mat-icon [color]=\"action.icon === 'delete' ? 'warn' : undefined\">\r\n {{ action.icon }}\r\n </mat-icon>\r\n <span>{{ action.name }}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogCropImage>\r\n <div style=\"overflow-x: hidden; display: flex; flex-direction: column; height: 100%; min-height: 0; flex: 1 1 auto;\"\r\n [ngClass]=\"cropDialogClass\">\r\n <!-- @if (showCropImage == true) { -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{ form: newAttachmentForm }\">\r\n </ng-container>\r\n <!-- } -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n @if (row.AttachmentType != AttachmentType.LINK && row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <img [src]=\"'data:image/png;base64,' + (row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64)\" />\r\n </div>\r\n } @else if (row.AttachmentType != AttachmentType.LINK && !row.IsImage) {\r\n <div class=\"inline-preview-container\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"modern-dialog-container\"> @if (selectedAttachment) {\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ previewLabel }}</span>\r\n <span class=\"file-t\">{{ selectedAttachment.FileName }}</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"media-viewer-wrapper\">\r\n @if (selectedAttachment.IsImage) {\r\n <img class=\"main-preview-media\"\r\n [src]=\"'data:image/png;base64,' + (selectedAttachment.FileDataBase64 || selectedAttachment.FileThumbnailBase64)\"\r\n [alt]=\"selectedAttachment.FileName\" />\r\n }\r\n @else if (selectedAttachment.FileContentType?.startsWith('video/')) {\r\n <video controls autoplay playsinline class=\"main-preview-media video-player\">\r\n <source [src]=\"selectedAttachment.TrustedUrl\" [type]=\"selectedAttachment.FileContentType\">\r\n Il tuo browser non supporta il video.\r\n </video>\r\n }\r\n @else {\r\n <div class=\"iframe-container\">\r\n <iframe class=\"preview-iframe-modern\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n }\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Chiudi</button>\r\n @if (selectedAttachment.AttachmentType !== AttachmentType.LINK) {\r\n <button mat-raised-button color=\"primary\" (click)=\"viewAttachment(selectedAttachment)\" class=\"btn-download\">\r\n <mat-icon>download</mat-icon> <span>{{ downloadLabel }}</span>\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n <input #fileInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n\r\n @if (allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || !attachmentsList ||\r\n attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"addFile(allowedTypes[0], fileInput)\" [disabled]=\"isDisabled\">\r\n @if (allowedTypes[0] == 1) { <mat-icon>cloud_upload</mat-icon> }\r\n @if (allowedTypes[0] == 2) { <i class=\"fas fa-link\"></i> }\r\n @if (allowedTypes[0] == 3) { <i class=\"fa-brands fa-dropbox\"></i> }\r\n <span style=\"margin-left: 10px\">\r\n {{ allowedTypes[0] == 1 ? (addButtonLabel + \" file\") : allowedTypes[0] == 2 ? (addButtonLabel + \" link\") :\r\n uploadWithDropboxLabel }}\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (!separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <button class=\"btn btn-primary mb-4 me-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\">\r\n @if (multipleAttachment != true) { <mat-icon>cloud_upload</mat-icon> } @else { <mat-icon>add</mat-icon> }\r\n <span style=\"margin-left: 0px\">{{ addButtonLabel }}</span>\r\n </button>\r\n\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(1)) {\r\n <button mat-menu-item (click)=\"imageInput.click()\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(2)) {\r\n <button mat-menu-item [disabled]=\"isDisabled\" (click)=\"switchToAddingLinkMode()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button mat-menu-item (click)=\"chooseDropboxFile()\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if (separatedUploadButtons && allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true ||\r\n !attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0]))) {\r\n <div class=\"btn-group\">\r\n @if (allowedTypes.includes(1)) {\r\n <button (click)=\"imageInput.click()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-solid fa-cloud-upload\"></i>\r\n <span style=\"margin-left: 10px\">File</span>\r\n </button>\r\n }\r\n <input #imageInput style=\"display: none\" id=\"file_attachment\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileAdded($event)\" [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\" />\r\n @if (allowedTypes.includes(2)) {\r\n <button (click)=\"switchToAddingLinkMode()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px\">Link</span>\r\n </button>\r\n }\r\n @if (allowedTypes.includes(3)) {\r\n <button (click)=\"chooseDropboxFile()\" class=\"btn btn-secondary eqp-attachments-add-btn\" mat-raised-button\r\n color=\"secondary\" type=\"button\">\r\n <i class=\"fa-brands fa-dropbox\"></i>\r\n <span style=\"margin-left: 10px\">Dropbox</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">{{ cropLabel }}</span>\r\n <span class=\"file-t\">Regola le dimensioni e l'orientamento</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" (click)=\"abortFile()\" class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"preview-content-area\">\r\n <div class=\"crop-toolbar\">\r\n @if (cropOptions.includes(1)) {\r\n <button mat-icon-button [matTooltip]=\"rotateLeftLabel\"\r\n (click)=\"rotateLeft()\"><mat-icon>rotate_left</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"rotateRightLabel\"\r\n (click)=\"rotateRight()\"><mat-icon>rotate_right</mat-icon></button>\r\n }\r\n @if (cropOptions.includes(2)) {\r\n <button mat-icon-button [matTooltip]=\"flipHorinzontalLabel\"\r\n (click)=\"flipHorizontal()\"><mat-icon>flip_horizontal</mat-icon></button>\r\n <button mat-icon-button [matTooltip]=\"flipVerticalLabel\"\r\n (click)=\"flipVertical()\"><mat-icon>flip_vertical</mat-icon></button>\r\n }\r\n <button mat-icon-button matTooltip=\"Reset\"\r\n (click)=\"restoreOriginalDimensions()\"><mat-icon>replay</mat-icon></button>\r\n </div>\r\n\r\n <div class=\"media-viewer-wrapper\">\r\n <div class=\"crop-container-modern\">\r\n <image-cropper [imageFile]=\"selectedFile\" [maintainAspectRatio]=\"false\" [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\" format=\"png\" (imageCropped)=\"imageCropped($event)\" [resizeToWidth]=\"customWidth\"\r\n [resizeToHeight]=\"customHeight\" [output]=\"'base64'\" [containWithinAspectRatio]=\"true\" [onlyScaleDown]=\"true\"\r\n [alignImage]=\"'center'\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button (click)=\"abortFile()\" class=\"btn-close\">{{ abortLabel }}</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmAddAttachment()\" class=\"btn-download\">\r\n <mat-icon>check</mat-icon> {{ confirmLabel }}\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER FORM DI AGGIUNTA DI UN LINK -->\r\n<ng-template #addingLinkTemplate>\r\n <div class=\"modern-dialog-container\">\r\n <div mat-dialog-title class=\"preview-header\">\r\n <div class=\"header-info\">\r\n <div class=\"type-icon-wrapper\">\r\n <mat-icon>link</mat-icon>\r\n </div>\r\n <div class=\"title-group\">\r\n <span class=\"main-t\">Aggiungi un link</span>\r\n <span class=\"file-t\">Inserisci l'URL della risorsa web</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button mat-dialog-close class=\"close-btn\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"add-link-modern-content\">\r\n <form [formGroup]=\"newAttachmentForm\" class=\"add-link-form\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100 mt-3\">\r\n <mat-label>URL del collegamento</mat-label>\r\n <input matInput formControlName=\"filePath\" placeholder=\"https://...\" required>\r\n <mat-icon matSuffix>language</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label>Titolo (opzionale)</mat-label>\r\n <input matInput formControlName=\"fileName\" placeholder=\"Es. Documento Progetto\">\r\n <mat-icon matSuffix>title</mat-icon>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\" class=\"preview-actions\">\r\n <button mat-button mat-dialog-close class=\"btn-close\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" [mat-dialog-close]=\"newAttachmentForm.value\"\r\n [disabled]=\"newAttachmentForm.invalid\" class=\"btn-download\">\r\n <mat-icon>add</mat-icon> Aggiungi\r\n </button>\r\n </mat-dialog-actions>\r\n </div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";:host{--primary-color: #6a5af9;--primary-color-dark: #5441f8;--success-color: #1ce593;--error-color: #ff5b5b;--background-light: #f7f9fc;--background-card: rgba(255, 255, 255, .7);--text-color: #1e293b;--text-color-light: #64748b;--border-color: rgba(203, 213, 225, .5);--shadow-color: rgba(99, 102, 241, .2);--border-radius: 16px;--transition-speed: .3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--primary-color)}70%{box-shadow:0 0 0 10px #6a5af900}to{box-shadow:0 0 #6a5af900}}.container{width:100%;max-width:700px;margin:2rem auto;font-family:Inter,sans-serif}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.header h1{color:var(--text-color);font-size:1.8rem;font-weight:700;margin:0}.dropbox{width:100%;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:2.5rem;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all var(--transition-speed) ease}.dropbox:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color);border-color:var(--primary-color)}.dropbox.dragover{border-style:solid;border-color:var(--primary-color);transform:scale(1.02);box-shadow:0 0 25px var(--shadow-color);animation:pulse 1.5s infinite}.dropbox .dropbox-icon{font-size:3.5rem;color:var(--primary-color)}.dropbox .dropbox-text{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-top:1rem}.dropbox .dropbox-subtext{color:var(--text-color-light);margin-top:.5rem}.dropbox .browse-btn{margin-top:1.5rem;padding:.75rem 1.5rem;background-color:var(--primary-color);color:#fff;border:none;border-radius:10px;font-weight:600;transition:all var(--transition-speed) ease}.dropbox .browse-btn:hover{background-color:var(--primary-color-dark);transform:translateY(-2px)}.file-previews{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1.5rem;margin-top:2rem}.file-previews{display:grid;gap:16px;padding:16px;grid-template-columns:repeat(auto-fill,minmax(var(--card-min-width, 200px),1fr))}.file-preview{background-color:var(--background-card);border-radius:var(--border-radius);box-shadow:0 4px 15px #0000000d;border:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column;position:relative;opacity:0;animation:fadeIn .5s ease-out forwards;transition:transform var(--transition-speed) ease,box-shadow var(--transition-speed) ease}.file-preview.uploading{cursor:wait}.file-preview.uploading .preview-img-container:after{content:\"\";position:absolute;inset:0;background:#ffffffb3;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);pointer-events:none}.file-preview .preview-action-overlay{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;background-color:#0006;color:#fff;opacity:1;transition:opacity .3s ease}.file-preview .preview-action-overlay .mat-icon{font-size:36px;width:36px;height:36px}.file-preview .remove-btn{position:absolute;top:8px;right:8px;z-index:2;background-color:#0000004d;color:#fff;width:32px;height:32px;display:flex;align-items:center;justify-content:center;padding:0;transition:all var(--transition-speed) ease}.file-preview .remove-btn:hover{background-color:#ff5b5b}.file-preview .remove-btn .mat-icon{font-size:18px}@media (hover: hover){.file-preview .remove-btn .file-preview .preview-action-overlay{opacity:0}.file-preview .remove-btn .file-preview:hover .preview-action-overlay,.file-preview .remove-btn .file-preview:hover .remove-btn{opacity:1}.file-preview .remove-btn .file-preview .remove-btn{opacity:0}}@media (hover: hover) and (min-width: 769px){.file-preview .remove-btn{opacity:0;transform:scale(.8)}.file-preview:hover{transform:translateY(-5px);box-shadow:0 10px 25px var(--shadow-color)}.file-preview:hover .remove-btn{opacity:1;transform:scale(1)}}.file-preview .preview-img-container{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;position:relative;cursor:pointer;background-color:#f0f2f5}.file-preview .preview-img{width:100%;height:100%;object-fit:cover}.file-preview .file-icon{font-size:4rem;color:var(--primary-color)}.file-preview .file-info{padding:12px;border-top:1px solid var(--border-color);flex-grow:1;display:flex;align-items:center}.file-preview .file-name{font-weight:600;font-size:.9rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-preview .upload-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-left-color:var(--primary-color);border-radius:50%;animation:spin 1s linear infinite;pointer-events:none}.file-preview.card-small{width:140px}.file-preview.card-small .preview-img-container{height:80px}.file-preview.card-small .file-info{padding:8px}.file-preview.card-small .file-name{font-size:.8rem}.file-preview.card-small .file-icon{font-size:3rem}.file-preview.card-small .remove-btn{width:28px;height:28px}.file-preview.card-small .remove-btn .mat-icon{font-size:16px}.file-preview.card-large{width:280px}.file-preview.card-large .preview-img-container{height:180px}.file-preview.card-large .file-info{padding:16px}.file-preview.card-large .file-name{font-size:1rem}.file-preview.card-large .file-icon{font-size:5rem}.file-preview.card-large .remove-btn{width:36px;height:36px}.file-preview.card-large .remove-btn .mat-icon{font-size:20px}.file-preview[style*=--eqp-card-width]{width:var(--eqp-card-width)}.file-preview[style*=--eqp-card-width] .preview-img-container{height:calc(var(--eqp-card-width) * .65)}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}.upload-stats{background-color:var(--background-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:1.5rem;margin-top:2rem;animation:fadeIn .5s ease-out}.upload-stats .stats-info{display:flex;justify-content:space-around}.upload-stats .progress-bar{height:10px;background-color:var(--border-color);border-radius:5px;overflow:hidden;margin-top:1rem}.upload-stats .progress-fill{height:100%;background:linear-gradient(90deg,var(--primary-color),var(--success-color));transition:width var(--transition-speed) ease-out;border-radius:5px}.upload-notification{position:fixed;bottom:20px;left:50%;transform:translate(-50%,100px);padding:1rem 1.5rem;border-radius:var(--border-radius);color:#fff;font-weight:600;box-shadow:0 10px 30px #0003;transition:transform var(--transition-speed) cubic-bezier(.175,.885,.32,1.275)}.upload-notification.show{transform:translate(-50%)}.upload-notification.success{background-color:var(--success-color)}.upload-notification.error{background-color:var(--error-color)}::ng-deep .cdk-overlay-pane.eqp-crop-dialog{transform:translateY(-4vh)}@media (max-width: 600px){::ng-deep .cdk-overlay-pane.crop-dialog{width:auto!important}}::ng-deep .eqp-attachments-dialog{display:flex!important;flex-direction:column!important}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container{display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container .mdc-dialog__container .mdc-dialog__surface{border-radius:20px!important;padding:0!important;overflow:hidden!important;width:fit-content!important;min-width:350px!important;max-width:95vw!important;max-height:90vh!important;margin:0 auto;background-color:#fff!important;display:flex!important;flex-direction:column!important;flex:1 1 auto;min-height:0}::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden!important}.modern-dialog-container{display:flex;flex-direction:column;width:100%;max-width:100%;flex:1 1 auto;min-height:0;height:100%;max-height:100%;background:#fff;--preview-header-h: 66px;--preview-footer-h: 66px;--preview-padding-y: 30px}.modern-dialog-container .main-preview-media{display:block;max-width:100%;max-height:var(--media-max-h);width:auto;height:auto;object-fit:contain;border-radius:12px;background:#fff;padding:4px;box-shadow:0 10px 30px #00000014}.modern-dialog-container video.main-preview-media{width:min(100%,1100px);background:#000}.modern-dialog-container .iframe-container{width:min(100%,1100px);height:var(--media-max-h);display:flex;width:100%;max-width:1100px}.modern-dialog-container .preview-iframe-modern{width:100%;height:100%;border:0;border-radius:12px;background:#f8fafc}.modern-dialog-container .preview-header{flex:0 0 auto;flex-shrink:0;padding:14px 20px;display:flex;align-items:center;justify-content:flex-start;border-bottom:1px solid var(--border-color);background:#f8fafc;z-index:10;width:100%}.modern-dialog-container .preview-header .close-btn{display:inline-flex!important;align-items:center!important;justify-content:center!important;padding:0!important;width:40px!important;height:40px!important}.modern-dialog-container .preview-header .close-btn ::ng-deep mat-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin:0!important;padding:0!important;line-height:1!important}.modern-dialog-container .preview-header .header-info{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex:1 1 auto;min-width:0;text-align:left}.modern-dialog-container .preview-header .header-info .type-icon-wrapper{background:var(--primary-color);color:#fff;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px var(--shadow-color)}.modern-dialog-container .preview-header .header-info .title-group{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .main-t{font-weight:800;color:var(--text-color);font-size:.95rem;line-height:1.2;text-align:left}.modern-dialog-container .preview-header .header-info .title-group .file-t{font-size:.75rem;color:var(--text-color-light);max-width:250px;overflow:hidden;text-overflow:ellipsis;text-align:left}.modern-dialog-container .preview-content-area{flex:1 1 auto;background:#fff!important;display:flex;flex-direction:column;padding:15px 15px 22px!important;overflow:hidden!important;min-height:0;width:100%;--media-max-h: calc(90vh - var(--preview-header-h) - var(--preview-footer-h) - var(--preview-padding-y))}.modern-dialog-container .preview-content-area .crop-toolbar{flex-shrink:0;z-index:20;background:#0f172a14;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 16px;border-radius:30px;margin:0 auto 15px;display:flex;gap:8px;box-shadow:0 4px 12px #0000000d}.modern-dialog-container .preview-content-area .crop-toolbar button{color:var(--text-color)!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper{flex:1 1 auto;width:100%;height:100%;display:flex;flex-direction:column;align-items:stretch;min-height:0;overflow:hidden}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;align-items:center;background:transparent;border-radius:12px;padding:0;overflow:hidden;min-height:0;width:100%;height:100%}.modern-dialog-container .preview-content-area .media-viewer-wrapper .crop-container-modern image-cropper{flex:1 1 auto;width:100%;height:100%;max-width:100%!important;max-height:100%!important;display:block;min-height:0}.modern-dialog-container .add-link-modern-content{flex:1;background:#fff;padding:24px!important}.modern-dialog-container .add-link-modern-content .add-link-form{display:flex;flex-direction:column;gap:10px}.modern-dialog-container .preview-actions{flex-shrink:0;padding:12px 24px;background:#f8fafc;border-top:1px solid #e2e8f0;margin:0}.modern-dialog-container .preview-actions .btn-download{border-radius:12px;font-weight:600;box-shadow:0 4px 12px var(--shadow-color)}@media (max-width: 600px){.modern-dialog-container{max-height:95vh}.modern-dialog-container .preview-content-area{padding:10px!important}.modern-dialog-container .preview-content-area .media-viewer-wrapper video.main-preview-media{width:100%!important;max-height:55vh!important;border-radius:4px;box-shadow:none}.modern-dialog-container .preview-content-area .media-viewer-wrapper .iframe-container{height:50vh}.modern-dialog-container .preview-content-area .crop-toolbar{width:calc(100% - 20px);max-width:400px;margin-bottom:10px;padding:4px 8px;gap:4px;overflow-x:auto;justify-content:center;-webkit-overflow-scrolling:touch;scrollbar-width:none}.modern-dialog-container .preview-content-area .crop-toolbar::-webkit-scrollbar{display:none}.modern-dialog-container .preview-content-area .crop-toolbar button{flex-shrink:0;transform:scale(.85);width:40px;height:40px}.modern-dialog-container .preview-actions{padding:10px 15px;flex-direction:column-reverse;gap:8px}.modern-dialog-container .preview-actions button{width:100%;margin:0!important}}@media (max-width: 360px){.modern-dialog-container .preview-content-area .crop-toolbar{gap:2px}.modern-dialog-container .preview-content-area .crop-toolbar button{transform:scale(.75)}}.control-icon{font-size:28px;cursor:pointer}image-cropper{display:flex!important;max-width:100%!important;max-height:100%!important;height:100%;width:100%}image-cropper canvas,image-cropper img{max-width:100%!important;max-height:100%!important}.crop-large{display:flex}.crop-small{display:none}@media (max-width: 600px){.dialog-content{max-height:55vh}.crop-container{max-width:100%;aspect-ratio:auto}.crop-large{display:none}.crop-small{display:flex;justify-content:center;gap:14px}.control-icon{font-size:24px}}.stats-header{display:flex;justify-content:space-between;align-items:center;width:100%}.table-view-container{margin-top:1.5rem;background-color:var(--background-card);border-radius:var(--border-radius);border:1px solid var(--border-color);overflow:hidden;animation:fadeIn .5s ease-out}.table-header,.table-row{display:flex;align-items:center;padding:0 1rem;transition:background-color var(--transition-speed) ease}.table-header{background-color:#f8f9fa;font-weight:600;color:var(--text-color-light);font-size:.8rem;text-transform:uppercase;border-bottom:2px solid var(--border-color)}.table-row{border-bottom:1px solid var(--border-color)}.table-row:last-child{border-bottom:none}.table-row:hover{background-color:#00000005}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem}.name-col{flex:4}.size-col,.date-col{flex:2}.actions-col{flex:1;justify-content:flex-end;min-width:150px}.file-icon-small{font-size:1.5rem;color:var(--primary-color)}.file-info-text{display:flex;flex-direction:column}.file-name-table{font-weight:600;color:var(--text-color)}.file-type-table{font-size:.8rem;color:var(--text-color-light)}@media (max-width: 768px){.date-col{display:none}.name-col{flex:3}.size-col{flex:2}.actions-col{flex:2;min-width:120px}}.secondary-action-link{color:var(--primary-color);text-decoration:none;border-bottom:1px solid var(--primary-color);cursor:pointer;font-weight:500}.secondary-action-link:hover{color:var(--primary-color-dark);border-bottom-color:var(--primary-color-dark)}h2[mat-dialog-title]+mat-dialog-content.add-link-dialog-content{padding-top:20px}mat-dialog-content.add-link-dialog-content{padding-left:24px;padding-right:24px;padding-bottom:20px}.add-link-form{display:flex;flex-direction:column;gap:16px}::ng-deep .eqp-attachments-preview-dialog{--mdc-dialog-subhead-line-height: normal}::ng-deep .eqp-attachments-preview-dialog .mat-mdc-dialog-content{padding:0!important;margin:0!important;max-height:none!important;background:#fff!important}:host ::ng-deep .eqp-attachments-dialog .mat-mdc-dialog-container{--mdc-dialog-subhead-size: 1.25rem;--mdc-dialog-subhead-line-height: 1.5;--mdc-dialog-subhead-weight: 600;--mdc-dialog-supporting-text-size: 1rem}.empty-state{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:1.5rem 1rem;margin-top:1.5rem;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#f8f9fa;text-align:center;color:var(--text-color-light);animation:fadeIn .5s ease-out}.empty-state:before{content:\"\\1f4ed\";font-size:2.5rem;margin-bottom:1rem;opacity:.7}.secondary-action-link.disabled-link{color:#adb5bd;cursor:not-allowed;border-bottom-color:transparent}.secondary-action-link.disabled-link:hover{color:#adb5bd;border-bottom-color:transparent}.table-cell{padding:1rem .5rem;display:flex;align-items:center;gap:1rem;min-width:0;overflow:hidden}.table-cell.col-actions{flex:0 0 150px;justify-content:flex-end;overflow:visible}.compact-uploader{display:flex;align-items:center;gap:16px;padding:16px;border:2px dashed var(--border-color);border-radius:var(--border-radius);background-color:#fcfdff;transition:all .3s ease}.compact-uploader .compact-text{flex:1 1 auto;min-width:0;cursor:pointer}.compact-uploader .compact-text:hover .compact-title{color:var(--primary-color)}.compact-uploader .compact-title{font-weight:600;color:var(--text-color);transition:color .3s ease}.compact-uploader .compact-subtitle{font-size:.8rem;color:var(--text-color-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.compact-uploader .compact-icon mat-icon{font-size:36px;width:36px;height:36px;color:var(--primary-color)}.compact-uploader .compact-actions{display:flex;gap:8px;flex-shrink:0}.compact-uploader.dragover{background-color:#f4f8ff;border-color:var(--primary-color);box-shadow:0 0 10px var(--shadow-color)}.disabled-dropzone{opacity:.5;cursor:not-allowed!important;background-color:#f5f5f5;border-color:#d1d5db}.disabled-dropzone *{pointer-events:none}.disabled-dropzone .browse-btn,.disabled-dropzone button{cursor:not-allowed!important;background-color:#e5e7eb;color:#9ca3af;border:none}.disabled-dropzone .secondary-action-link,.disabled-dropzone a{color:#9ca3af;text-decoration:none}\n"] }]
1336
1350
  }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.FormBuilder }, { type: i3.DomSanitizer }, { type: i4.HttpClient }, { type: i5.EqpAttachmentService }], propDecorators: { disableAction: [{
1337
1351
  type: Input,
1338
1352
  args: ["disableAction"]
@@ -1585,4 +1599,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1585
1599
  type: ViewChild,
1586
1600
  args: ['defaultActionsTemplate', { static: true }]
1587
1601
  }] } });
1588
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1hdHRhY2htZW50cy9zcmMvbGliL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtYXR0YWNobWVudHMvc3JjL2xpYi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRSxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQXFCLHFCQUFxQixFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBbUUsY0FBYyxFQUFrQyxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBS3RGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDeEIsSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJ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O3NCQUF0RSxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDSyxzQkFBc0I7c0JBQTVFLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5pbXBvcnQgaW1hZ2VDb21wcmVzc2lvbiBmcm9tIFwiYnJvd3Nlci1pbWFnZS1jb21wcmVzc2lvblwiO1xyXG5pbXBvcnQgeyBiYXNlNjRUb0ZpbGUsIEltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSBcIm5neC1pbWFnZS1jcm9wcGVyXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlIH0gZnJvbSBcIi4vaGVscGVycy9hdHRhY2htZW50LmhlbHBlclwiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZFNpemUsIEF0dGFjaG1lbnRGaWVsZENvbHVtbiwgQXR0YWNobWVudE1lbnVBY3Rpb24sIEF0dGFjaG1lbnRUeXBlLCBDcm9wT3B0aW9uRW51bSwgSUF0dGFjaG1lbnREVE8sIFR5cGVBdHRhY2htZW50Q29sdW1uIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBJT3B0aW9ucyB9IGZyb20gXCIuL2ludGVyZmFjZXMvSU9wdGlvbnNcIjtcclxuaW1wb3J0IHsgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9lcXAtYXR0YWNobWVudC1kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFcXBBdHRhY2htZW50U2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2VxcC1hdHRhY2htZW50LnNlcnZpY2VcIjtcclxuXHJcbmRlY2xhcmUgdmFyIERyb3Bib3g6IGFueTtcclxuXHJcbmNvbnN0IHRvQmFzZTY0ID0gKGZpbGUpID0+XHJcbiAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkpO1xyXG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XHJcbiAgfSk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJlcXAtYXR0YWNobWVudHNcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50LnNjc3NcIl1cclxufSlcclxuZXhwb3J0IGNsYXNzIEVxcEF0dGFjaG1lbnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAvLyNyZWdpb24gQElucHV0IGRlbCBjb21wb25lbnRlXHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIG5hc2NvbmRlIGxhIGNvbG9ubmEgcGVyIGxlIGF6aW9uaSBzdWxsJ2FsbGVnYXRvIChuZWwgY2FzbyBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImRpc2FibGVBY3Rpb25cIikgZGlzYWJsZUFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIG1vc3RyYSBpbCB0aXRvbG8gbmVsbCdoZWFkZXIgbmVsIGNhc28gaW4gY3VpIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSAoXCJFbGVuY28gYWxsZWdhdGlcIiBkaSBkZWZhdWx0KS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaG93SGVhZGVyXCIpIHNob3dIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBTb3JnZW50ZSBkYXRpIGRhIHZpc3VhbGl6emFyZS4gTmVsIGNhc28gc2kgdnVvbGUgZ2VzdGlyZSB1biBzaW5nb2xvIGFsbGVnYXRvIHZhIHBhc3NhdG8gaW4gb2duaSBjYXNvIGNvbWUgQXJyYXkuXHJcbiAgICovXHJcbiAgQElucHV0KFwiYXR0YWNobWVudHNMaXN0XCIpIGF0dGFjaG1lbnRzTGlzdDogQXJyYXk8SUF0dGFjaG1lbnREVE8+ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogTmVsIGNhc28gc2kgdnVvbGUgZ2VzdGlyZSB1biBzb2xvIGVsZW1lbnRvIHNlbnphIHBhc3NhcmxvIGNvbWUgYXJyYXksIGxvIHBhc3NvIGNvbWUgc2luZ29sbyBhbGxlZ2F0byBlIGdlc3Rpc2NvIG5lbGxhIGxpYnJlcmlhIGwnYXJyYXkuXHJcbiAgICovXHJcbiAgQElucHV0KFwic2luZ2xlQXR0YWNobWVudFwiKSBzaW5nbGVBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgbm9uIG1vc3RyYSBsYSBNYXRDYXJkIChuZWwgY2FzbyBpbiBjdWkgXCJtdWx0aXBsZUF0dGFjaG1lbnRcIiDDqCBUUlVFKS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaG93TWF0Q2FyZFwiKSBzaG93TWF0Q2FyZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIEZBTFNFIGFsbG9yYSBpbCBjb21wb25lbnRlIG1vc3RyYSBzb2xvIGlsIHB1bHNhbnRlIGRpIGNhcmljYW1lbnRvIGRpIHVuIHNpbmdvbG8gZmlsZSwgdW5hIHZvbHRhIGNhcmljYXRvIGlsIGZpbGUgaW52b2NhIGwnZXZlbnRvIGRpIG91dHB1dCBcImxvY2FsRWRpdGVkQXR0YWNobWVudHNcIi5cclxuICAgKiBTZSBUUlVFIGFsbG9yYSBpbCBjb21wb25lbnRlIG1vc3RyYSBsJ2VsZW5jbyBkaSB0dXR0aSBnbGkgYWxsZWdhdGkgcmljZXZ1dG8gbmVsIHBhcmFtZXRybyBcImF0dGFjaG1lbnRzTGlzdFwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcIm11bHRpcGxlQXR0YWNobWVudFwiKSBtdWx0aXBsZUF0dGFjaG1lbnQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBhc3N1bWUgaWwgdmFsb3JlIFRSVUUgYWxsb3JhIHNhcsOgIHBvc3NpYmlsZSBjYXJpY2FyZSBwacO5IGZpbGUgcGVyIHZvbHRhLiBRdWVzdGEgZnVuemlvbmFsaXTDoCDDqCBhdHRpdmFcclxuICAgKiBTT0xPIHNlIHNpIGdlc3Rpc2Nvbm8gYWxsZWdhdGkgbXVsdGlwbGksIHF1aW5kaSBzZSBsJ2lucHV0ICdtdWx0aXBsZUF0dGFjaG1lbnQnIGFzc3VtZSBpbCB2YWxvcmUgVFJVRSwgYWx0cmltZW50aSDDqCBzZW1wcmUgZGlzYWJpbGl0YXRhLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImxvYWRNdWx0aXBsZUZpbGVzXCIpIGxvYWRNdWx0aXBsZUZpbGVzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcG9zdGEgaWwgbWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBuZWwgY2FzbyBpbiBjdWkgbGEgdGFiZWxsYSBkZWdsaSBhbGxlZ2F0aSAobmVsIGNhc28gaW4gY3VpIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSkgw6ggdnVvdGEuXHJcbiAgICovXHJcbiAgQElucHV0KFwiZW1wdHlUYWJsZU1lc3NhZ2VcIikgZW1wdHlUYWJsZU1lc3NhZ2U6IHN0cmluZyA9IFwiTmVzc3VuIGRhdG8gdHJvdmF0b1wiO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIGFsbG9yYSBwZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBzb2x0YW50byBmaWxlIGRpIHRpcG8gaW1tYWdpbmUsIGF2ZW50ZSB1bm8gZGVpIG1pbWV0eXBlXHJcbiAgICogc3BlY2lmaWNhdGkgZGVudHJvIEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLlxyXG4gICAqIFNlIEZBTFNFIHBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIHF1YWxzaWFzaSB0aXBvIGRpIGZpbGVcclxuICAgKi9cclxuICBASW5wdXQoXCJhbGxvd09ubHlJbWFnZXNcIikgYWxsb3dPbmx5SW1hZ2VzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwZWNpZmljYSBpIHRpcGkgZGkgZmlsZSBjaGUgw6ggcG9zc2liaWxlIGNhcmljYXJlXHJcbiAgICovXHJcbiAgQElucHV0KFwiYWNjZXB0ZWRGaWxlVHlwZXNcIikgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBkaXNhYmlsaXRhIGlsIHB1bHNhbnRlIGRpIEFnZ2l1bnRhIGFsbGVnYXRvIChhIHByZXNjaW5kZXJlIGRhbCB2YWxvcmUgZGVsIHBhcmFtZXRybyBcIm11bHRpcGxlQXR0YWNobWVudFwiKS5cclxuICAgKi9cclxuICBASW5wdXQoXCJpc0Rpc2FibGVkXCIpIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogTW9zdHJhL25hc2NvbmRlIGxhIGNvbG9ubmEgcGVyIHZpc3VhbGl6emFyZSBsJ2FudGVwcmltYSBkZWkgZmlsZSBuZWxsYSB0YWJlbGxhIChjYXNvIG11bHRpcGxlQXRhdGNobWVudHMgPSB0cnVlKS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaG93SW5saW5lUHJldmlld1wiKSBzaG93SW5saW5lUHJldmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFbmRwb2ludCBkYSBjaGlhbWFyZSBwZXIgcmVjdWVwcmFyZSBsJ0lBdHRhY2htZW50RFRPIGNvbXBsZXRvIGRhIHZlZGVyZSBuZWxsJ2FudGVwcmltYS4gTGEgY2hpYW1hdGEgc2Fyw6AgaW4gUE9TVCBlIG5lbCBib2R5XHJcbiAgICogY29udGVycsOgIGwnSUF0dGFjaG1lbnREVE8gc2VsZXppb25hdG8gZGFsbCd1dGVudGUuXHJcbiAgICogTGEgY2hpYW1hdGEgdmllbmUgZXNlZ3VpdGEgc29sbyBwZXIgbCdhbnRlcHJpbWEgZGVsbGUgaW1tYWdpbmkgZXNzZW5kbyBuZWNlc3NhcmlvIGlsIGJhc2U2NCBjb21wbGV0byBkZWxsJ2ltbWFnaW5lIGEgZGltZW5zaW9uZSByZWFsZS5cclxuICAgKiBQZXIgZG9jdW1lbnRpL2xpbmsgYmFzdGEgY2hlIHNpYSBwb3BvbGF0YSBsYSBwcm9wcmlldMOgIEZpbGVQYXRoIGRpIElBdHRhY2htZW50RFRPLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImdldEF0dGFjaG1lbnRFbmRwb2ludFwiKSBnZXRBdHRhY2htZW50RW5kcG9pbnQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvc3RuYW1lIGRlbGwnYW1iaWVudGUgZGkgcHJvZHV6aW9uZSBkZWxsJ2FwcGxpY2F0aXZvLiBOZWNlc3NhcmlvIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgZGVpIGRvY3VtZW50aVxyXG4gICAqIHRyYW1pdGUgaWwgdmlld2VyIGRpIGdvb2dsZS5cclxuICAgKiBOT1RBOiBQZXIgdmlzdWFsaXp6YXJlIGwnYW50ZXByaW1hIMOoIG5lY2Vzc2FyaW8gY2hlIGxhIHByb3JpZXTDoCBGaWxlUGF0aCBkZWxsJ0lBdHRhY2htZW50RFRPIHNpYSBwb3BvbGF0YSBlIGNoZVxyXG4gICAqIHNpYSBhYmlsaXRhdG8gbCdhY2Nlc3NvIGFsbGEgY2FydGVsbGEgc3VsIHNlcnZlciB0cmFtaXRlIGhvc3RuYW1lLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInByb2R1Y3Rpb25CYXNlVXJsXCIpIHByb2R1Y3Rpb25CYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBPcHppb25pIHBlciBsYSBjb21wcmVzc2lvbmUgZGVsbGUgaW1tYWdpbmkgY2FyaWNhdGUuXHJcbiAgICovXHJcbiAgQElucHV0KFwiY29tcHJlc3Npb25PcHRpb25zXCIpIGNvbXByZXNzaW9uT3B0aW9uczogSU9wdGlvbnMgPSB7XHJcbiAgICBtYXhTaXplTUI6IDAuNSxcclxuICAgIG1heFdpZHRoT3JIZWlnaHQ6IDE5MjAsXHJcbiAgICB1c2VXZWJXb3JrZXI6IHRydWVcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBBcnJheSBkaSBBdHRhY2htZW50VHlwZSBjaGUgc2kgcG9zc29ubyBhZ2dpdW5nZXJlXHJcbiAgICovXHJcbiAgQElucHV0KFwiYWxsb3dlZFR5cGVzXCIpIGFsbG93ZWRUeXBlczogQXJyYXk8QXR0YWNobWVudFR5cGU+ID0gW0F0dGFjaG1lbnRUeXBlLkZJTEUsIEF0dGFjaG1lbnRUeXBlLkxJTktdO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBzdGFiaWxpcmUgc2UgbGEgZXFwLXRhYmxlIGNvbnRlbmVudGUgbCdlbGVuY28gZGVnbGkgYWxsZWdhdGkgdXRpbGl6emFcclxuICAgKiBpbCBtdWx0aWxpbmd1YSBvcHB1cmUgbm9cclxuICAgKi9cclxuICBASW5wdXQoXCJpc0VxcFRhYmxlTXVsdGlMYW5ndWFnZVwiKSBpc0VxcFRhYmxlTXVsdGlMYW5ndWFnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBzdGFiaWxpcmUsIGluIGNhc28gZGkgZ2VzdGlvbmUgYWxsZWdhdGkgbXVsdGlwbGksIHNlIGxhIHRhYmVsbGEgY29udGVuZW50ZSBsJ2VsZW5jb1xyXG4gICAqIGRlZ2xpIGFsbGVnYXRpIGRldmUgZXNzZXJlIHBhZ2luYXRhIG9wcHVyZSBub1xyXG4gICAqL1xyXG4gIEBJbnB1dChcInRhYmxlUGFnaW5hdG9yVmlzaWJsZVwiKSB0YWJsZVBhZ2luYXRvclZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBzdGFiaWxpcmUsIGluIGNhc28gZGkgZ2VzdGlvbmUgYWxsZWdhdGkgbXVsdGlwbGksIHNlIGxhIHRhYmVsbGEgY29udGVuZW50ZSBsJ2VsZW5jb1xyXG4gICAqIGRlZ2xpIGFsbGVnYXRpIGRldmUgY29udGVuZXJlIGlsIGNhbXBvIGRpIHJpY2VyY2Egb3BwdXJlIG5vXHJcbiAgICovXHJcbiAgQElucHV0KFwiaXNUYWJsZVNlYXJjaGVhYmxlXCIpIGlzVGFibGVTZWFyY2hlYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluIGNhc28gZGkgZ2VzdGlvbmUgYWxsZWdhdGkgbXVsdGlwbGksIHBlcm1ldHRlIGRpIHN0YWJpbGlyZSBsYSBkaW1lbnNpb25lIHBhZ2luYSBkaSBkZWZhdWx0XHJcbiAgICogcGVyIGxhIHRhYmVsbGEgY29udGVuZW50ZSBsJ2VsZW5jbyBkZWdsaSBhbGxlZ2F0aVxyXG4gICAqL1xyXG4gIEBJbnB1dChcInRhYmxlUGFnaW5hdG9yU2l6ZVwiKSB0YWJsZVBhZ2luYXRvclNpemU6IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHNjZWdsaWVyZSBpbCBtb2RvIGluIGN1aSBpIGZpbGUgZGV2b25vIGVzc2VyZSBjYXJpY2F0aVxyXG4gICAqL1xyXG4gIC8vIEBJbnB1dChcInVwbG9hZFR5cGVcIikgdXBsb2FkVHlwZTogVXBsb2FkVHlwZUVudW0gPSBVcGxvYWRUeXBlRW51bS5GSUxFX0FORF9MSU5LO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBzdGFiaWxpcmUgc2UgaSBwdWxzYW50aSBwZXIgaWwgY2FyaWNhbWVudG8gZGVpIGZpbGUgc29ubyBzZXBhcmF0aSBvIGluIHVuIG1lbsO5IGEgdGVuZGluYVxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNlcGFyYXRlZFVwbG9hZEJ1dHRvbnNcIikgc2VwYXJhdGVkVXBsb2FkQnV0dG9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBzY2VnbGllcmUgc2UgZGFyZSBsYSBwb3NzaWJpbGl0w6AgZGkgdmVkZXJlIG8gbm8gbCdhbnRlcHJpbWFcclxuICAgKi9cclxuICBASW5wdXQoXCJzaG93UHJldmlld1wiKSBzaG93UHJldmlldzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluIGNhc28gZGkgYWxsZWdhdG8gc2luZ29sbywgcGVybWV0dGUgZGkgc2NlZ2xpZXJlIHNlIGFnZ2l1bmdlcmUgZmlsZSB0cmFtaXRlIGRyYWcgYW5kIGRyb3BcclxuICAgKi9cclxuICBASW5wdXQoXCJzaW5nbGVBdHRhY2htZW50RHJhZ0FuZERyb3BcIikgc2luZ2xlQXR0YWNobWVudERyYWdBbmREcm9wOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXJyYXkgZGkgb3B6aW9uaSBjaGUgc2kgcG9zc29ubyB1dGlsaXp6YXJlIHBlciBpbCBjcm9wXHJcbiAgICovXHJcbiAgQElucHV0KFwiY3JvcE9wdGlvbnNcIikgY3JvcE9wdGlvbnM6IEFycmF5PENyb3BPcHRpb25FbnVtPiA9IFsxLCAyXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2xhc3NlIGN1c3RvbSBkYSBhc3NlZ25hcmUgYWwgZGlhbG9nIGRlbCBjcm9wIGltbWFnaW5pXHJcbiAgICovXHJcbiAgQElucHV0KFwiY3JvcERpYWxvZ0NsYXNzXCIpIGNyb3BEaWFsb2dDbGFzczogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBtYXhGaWxlU2l6ZU1COiBudW1iZXIgPSA1MDA7IC8vIERlZmF1bHQgbWF4IHNpemUgb2YgMTAwIE1CXHJcbiAgQElucHV0KCkgY2FyZFNpemU6IEF0dGFjaG1lbnRDYXJkU2l6ZSA9ICdzbWFsbCc7IC8vIERlZmF1bHRcclxuICBASW5wdXQoKSBjdXN0b21DYXJkV2lkdGhQeDogbnVtYmVyID0gMjAwOyAvLyBMYXJnaGV6emEgY3VzdG9tIGluIHB4XHJcbiAgQElucHV0KCkgY3VzdG9tQ2FyZEhlaWdodFB4OiBudW1iZXIgPSAxODA7IC8vIEFsdGV6emEgY3VzdG9tIGluIHB4XHJcblxyXG4gIEBJbnB1dCgpIGxheW91dDogJ2Z1bGwnIHwgJ2NvbXBhY3QnID0gJ2NvbXBhY3QnO1xyXG5cclxuICAvKipcclxuICAgKiBJbnB1dCBwZXIgZGVmaW5pcmUgbGUgbGFiZWwgZGEgdXNhcmUgbmVsIGNvbXBvbmVudGVcclxuICAgKi9cclxuICBASW5wdXQoXCJvcGVuTGlua0xhYmVsXCIpIG9wZW5MaW5rTGFiZWw6IHN0cmluZyA9IFwiQXByaSBsaW5rXCI7XHJcbiAgQElucHV0KFwiYWRkQnV0dG9uTGFiZWxcIikgYWRkQnV0dG9uTGFiZWw6IHN0cmluZyA9IFwiQWdnaXVuZ2lcIjtcclxuICBASW5wdXQoXCJkb3dubG9hZExhYmVsXCIpIGRvd25sb2FkTGFiZWw6IHN0cmluZyA9IFwiRG93bmxvYWRcIjtcclxuICBASW5wdXQoXCJkZWxldGVMYWJlbFwiKSBkZWxldGVMYWJlbDogc3RyaW5nID0gXCJFbGltaW5hXCI7XHJcbiAgQElucHV0KFwiZmlsZU5hbWVMYWJlbFwiKSBmaWxlTmFtZUxhYmVsOiBzdHJpbmcgPSBcIk5vbWUgZmlsZVwiO1xyXG4gIEBJbnB1dChcInByZXZpZXdMYWJlbFwiKSBwcmV2aWV3TGFiZWw6IHN0cmluZyA9IFwiQW50ZXByaW1hXCI7XHJcbiAgQElucHV0KFwidXBsb2FkRmlsZUxhYmVsXCIpIHVwbG9hZEZpbGVMYWJlbDogc3RyaW5nID0gXCJDYXJpY2EgZmlsZVwiO1xyXG4gIEBJbnB1dChcImNvbmZpcm1MYWJlbFwiKSBjb25maXJtTGFiZWw6IHN0cmluZyA9IFwiQ29uZmVybWFcIjtcclxuICBASW5wdXQoXCJhYm9ydExhYmVsXCIpIGFib3J0TGFiZWw6IHN0cmluZyA9IFwiQW5udWxsYVwiO1xyXG4gIEBJbnB1dChcInNhdmVMYWJlbFwiKSBzYXZlTGFiZWw6IHN0cmluZyA9IFwiU2FsdmFcIjtcclxuICBASW5wdXQoXCJleGl0TGFiZWxcIikgZXhpdExhYmVsOiBzdHJpbmcgPSBcIkVzY2lcIjtcclxuICBASW5wdXQoXCJ1cGxvYWRXaXRoRHJvcGJveExhYmVsXCIpIHVwbG9hZFdpdGhEcm9wYm94TGFiZWw6IHN0cmluZyA9IFwiQ2FyaWNhIGNvbiBEcm9wYm94XCI7XHJcbiAgQElucHV0KFwiY3JvcExhYmVsXCIpIGNyb3BMYWJlbDogc3RyaW5nID0gXCJTY2VnbGkgbGUgZGltZW5zaW9uaSBkZWxsJ2ltbWFnaW5lXCI7XHJcbiAgQElucHV0KFwiZGVsZXRlRGlhbG9nVGl0bGVcIikgZGVsZXRlRGlhbG9nVGl0bGU6IHN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KFwiZGVsZXRlRGlhbG9nTWVzc2FnZVwiKSBkZWxldGVEaWFsb2dNZXNzYWdlOiBzdHJpbmcgPSBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgY2FuY2VsbGFyZSBxdWVzdCdhbGxlZ2F0bz9cIjtcclxuICBASW5wdXQoXCJub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2VcIikgbm9JbWFnZVNlbGVjdGVkRXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJOb24gw6ggcG9zc2liaWxlIHNlbGV6aW9uYXJlIHVuIGZpbGUgY2hlIG5vbiBzaWEgdW4naW1tYWdpbmUuXCI7XHJcbiAgQElucHV0KFwid3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2VcIikgd3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIk5vbiDDqCBwb3NzaWJpbGUgY2FyaWNhcmUgaWwgZmlsZSBzZWxlemlvbmF0by5cIjtcclxuICBASW5wdXQoXCJ2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2VcIikgdmlkZW9QcmV2aWV3RXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJJbXBvc3NpYmlsZSBhcHJpcmUgbCdhbnRlcHJpbWEgZGkgdW4gZmlsZSB2aWRlby5cIjtcclxuICBASW5wdXQoXCJ2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2VcIikgYXVkaW9QcmV2aWV3RXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJJbXBvc3NpYmlsZSBhcHJpcmUgbCdhbnRlcHJpbWEgZGkgdW4gZmlsZSBhdWRpby5cIjtcclxuICBASW5wdXQoXCJmbGlwSG9yaW56b250YWxMYWJlbFwiKSBmbGlwSG9yaW56b250YWxMYWJlbDogc3RyaW5nID0gXCJDYXBvdm9sZ2kgb3JpenpvbnRhbG1lbnRlXCI7XHJcbiAgQElucHV0KFwiZmxpcFZlcnRpY2FsTGFiZWxcIikgZmxpcFZlcnRpY2FsTGFiZWw6IHN0cmluZyA9IFwiQ2Fwb3ZvbGdpIHZlcnRpY2FsbWVudGVcIjtcclxuICBASW5wdXQoXCJyb3RhdGVSaWdodExhYmVsXCIpIHJvdGF0ZVJpZ2h0TGFiZWw6IHN0cmluZyA9IFwiUnVvdGEgYSBkZXN0cmFcIjtcclxuICBASW5wdXQoXCJyb3RhdGVMZWZ0TGFiZWxcIikgcm90YXRlTGVmdExhYmVsOiBzdHJpbmcgPSBcIlJ1b3RhIGEgc2luaXN0cmFcIjtcclxuICBASW5wdXQoXCJiYXNlNjRMaW1pdE1CXCIpIGJhc2U2NExpbWl0TUI6IG51bWJlciA9IDEwMDtcclxuICBASW5wdXQoKSB1cGxvYWRUaXRsZSA9ICdVcGxvYWQgZmlsZSc7XHJcbiAgQElucHV0KCkgdXBsb2FkU3VidGl0bGUgPSAnRHJhZyAmIGRyb3AgZmlsZXMgbyBjbGljayc7XHJcbiAgQElucHV0KCkgZHJvcEhlcmVMYWJlbCA9ICdSaWxhc2NpYSBpIGZpbGUgcXVpJztcclxuICBASW5wdXQoKSBzdXBwb3J0ZWRGb3JtYXRzTGFiZWwgPSAnRm9ybWF0aSBzdXBwb3J0YXRpOiBKUEVHLCBQTkcsIFBERiAoTWF4IDEwME1CKSc7XHJcbiAgQElucHV0KCkgYnJvd3NlRmlsZXNMYWJlbCA9ICdDZXJjYSBpIGZpbGUnO1xyXG4gIEBJbnB1dCgpIHVwbG9hZFN1bW1hcnlMYWJlbCA9ICdMaXN0YSBhbGxlZ2F0aSc7XHJcbiAgQElucHV0KCkgZmlsZXNMYWJlbCA9ICdGaWxlcyc7XHJcbiAgQElucHV0KCkgdG90YWxTaXplTGFiZWwgPSAnRGltZW5zaW9uZSB0b3RhbGUnO1xyXG4gIEBJbnB1dCgpIGVtcHR5U3RhdGVMYWJlbCA9ICdOb24gc29ubyBwcmVzZW50aSBmaWxlIGNhcmljYXRpJztcclxuICBASW5wdXQoKSBhZGRlZFN1Y2Nlc3NmdWxseUxhYmVsID0gJ2ZpbGUocykgY2FyaWNhdGkgY29uIHN1Y2Nlc3NvLic7XHJcbiAgQElucHV0KCkgcmVtb3ZlZExhYmVsID0gJ0ZpbGUgcmltb3Nzbyc7XHJcbiAgLy8gQElucHV0KCkgcmVtb3ZlTGFiZWwgPSAnUmltdW92aSBmaWxlJztcclxuICBASW5wdXQoKSBjaG9vc2VWaWV3ID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93U3VtbWFyeSA9IGZhbHNlO1xyXG4gIEBJbnB1dChcInZpZXdNb2RlXCIpIHZpZXdNb2RlOiAnY2FyZCcgfCAndGFibGUnID0gJ3RhYmxlJztcclxuICBASW5wdXQoXCJzaG93VXBsb2FkVGl0bGVcIikgc2hvd1VwbG9hZFRpdGxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoXCJzaG93RHJvcEFyZWFcIikgc2hvd0Ryb3BBcmVhOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGhpZGRlbkFjdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBTZSBUUlVFIGFsbG9yYSBtb3N0cmEgaWwgZGlhbG9nIGRpIGNyb3AgcGVyIGxlIGltbWFnaW5pIHNpbmdvbGUuXHJcbiAgICogU2UgRkFMU0UgY2FyaWNhIGwnaW1tYWdpbmUgZGlyZXR0YW1lbnRlIChhcHBsaWNhbmRvIGNvbXVucXVlIGxhIGNvbXByZXNzaW9uZSBzZSBhdHRpdmEpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImVuYWJsZUltYWdlQ3JvcFwiKSBlbmFibGVJbWFnZUNyb3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBIb29rIGdsb2JhbGU6IGRlY2lkZSBzZSBuYXNjb25kZXJlIHVu4oCZYXppb25lIHBlciBxdWVsbG8gc3BlY2lmaWNvIGFsbGVnYXRvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFjdGlvbkhpZGRlbkZuPzogKGFjdGlvbktleTogc3RyaW5nLCBhdHQ/OiBJQXR0YWNobWVudERUTykgPT4gYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9vayBnbG9iYWxlOiBkZWNpZGUgc2UgZGlzYWJpbGl0YXJlIHVu4oCZYXppb25lIHBlciBxdWVsbG8gc3BlY2lmaWNvIGFsbGVnYXRvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFjdGlvbkRpc2FibGVkRm4/OiAoYWN0aW9uS2V5OiBzdHJpbmcsIGF0dD86IElBdHRhY2htZW50RFRPKSA9PiBib29sZWFuO1xyXG5cclxuXHJcbiAgQElucHV0KCkgdmlkZW9Db21wcmVzc2lvbjoge1xyXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcclxuICAgIG1heFdpZHRoPzogbnVtYmVyO1xyXG4gICAgYml0cmF0ZT86IG51bWJlcjtcclxuICAgIGNyZj86IG51bWJlcjtcclxuICAgIHByZXNldD86IHN0cmluZztcclxuICAgIG1heEZwcz86IG51bWJlcjtcclxuICAgIGF1ZGlvQml0cmF0ZT86IG51bWJlcjtcclxuICB9ID0geyBlbmFibGVkOiBmYWxzZSwgbWF4V2lkdGg6IDEyODAsIGNyZjogMjMsIHByZXNldDogJ3ZlcnlmYXN0JywgbWF4RnBzOiAzMCwgYXVkaW9CaXRyYXRlOiAxMjgwMDAgfTtcclxuXHJcblxyXG4gIHByaXZhdGUgX2N1c3RvbU1lbnVBY3Rpb25zOiBBdHRhY2htZW50TWVudUFjdGlvbltdID0gW107XHJcbiAgX3NvcnRlZE1lbnVBY3Rpb25zOiBBdHRhY2htZW50TWVudUFjdGlvbltdID0gW107XHJcblxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjdXN0b21NZW51QWN0aW9ucyh2YWx1ZTogQXR0YWNobWVudE1lbnVBY3Rpb25bXSkge1xyXG4gICAgdGhpcy5fY3VzdG9tTWVudUFjdGlvbnMgPSB2YWx1ZSB8fCBbXTtcclxuICAgIHRoaXMuc2V0dXBNZW51QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1c3RvbU1lbnVBY3Rpb25zKCk6IEF0dGFjaG1lbnRNZW51QWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbU1lbnVBY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3VzdG9tQ29sdW1uczogQXR0YWNobWVudEZpZWxkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogU09MTyBxdWFuZG8gW2N1c3RvbUNvbHVtbnNdPVwiLi4uXCIgY2FtYmlhLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGN1c3RvbUNvbHVtbnModmFsdWU6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jdXN0b21Db2x1bW5zID0gdmFsdWUgfHwgW107XHJcbiAgICB0aGlzLnNldHVwVGFibGVDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VzdG9tQ29sdW1ucygpOiBBdHRhY2htZW50RmllbGRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29sdW1ucztcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gQE91dHB1dCBkZWwgY29tcG9uZW50ZVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YSBkZWdsaSBhbGxlZ2F0aS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgbG9jYWxFZGl0ZWRBdHRhY2htZW50czogRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIHNjYXRlbmF0byBhbGxhIHByZXNzaW9uZSBkZWwgcHVsc2FudGUgRVNDSSBkZWxsYSBtb2RhbGUgZGkgY2FyaWNhbWVudG8gZmlsZS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgYWJvcnRBZGRBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIHBlciBpbCBkb3dubG9hZCBuZWwgY2FzbyBGaWxlRGF0YUJhc2U2NCwgRmlsZUNvbnRlbnRUeXBlIG8gRmlsZU5hbWUgbm9uIGZvc3Nlcm8gc3BlY2lmaWNhdGkuXHJcbiAgICovXHJcbiAgQE91dHB1dChcImRvd25sb2FkQXR0YWNobWVudFwiKSBkb3dubG9hZEF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ2VsZW1lbnRvIGVsaW1pbmF0byBwcmltYSBjaGUgcXVlc3RvIHZlbmdhIGVmZmV0dGl2YW1lbnRlIHJpc21vc3NvIGRhbGxhIGxpc3RhLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoXCJvbkRlbGV0ZUF0dGFjaG1lbnRcIikgb25EZWxldGVBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8SUF0dGFjaG1lbnREVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSBjYXJpY2FtZW50byBudW92byBhbGxlZ2F0b1xyXG4gIG5ld0F0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0ge30gYXMgSUF0dGFjaG1lbnREVE87XHJcbiAgbmV3TXVsdGlwbGVBdHRhY2htZW50czogQXJyYXk8SUF0dGFjaG1lbnREVE8+ID0gW107XHJcbiAgYXR0YWNobWVudFR5cGUgPSBBdHRhY2htZW50VHlwZTtcclxuICAvLyB1cGxvYWRUeXBlRW51bSA9IFVwbG9hZFR5cGVFbnVtO1xyXG4gIG5ld0F0dGFjaG1lbnRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlID0gbnVsbDtcclxuICBzZWxlY3RlZEZpbGVzOiBBcnJheTxGaWxlPiA9IG51bGw7XHJcbiAgc2hvd0Nyb3BJbWFnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRBdHRhY2htZW50XCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ0FkZEF0dGFjaG1lbnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZGlhbG9nUmVmQWRkQXR0YWNobWVudDogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQWRkTXVsdGlwbGVBdHRhY2htZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGRpYWxvZ1JlZkNyb3BJbWFnZTogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dDcm9wSW1hZ2VcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQ3JvcEltYWdlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAVmlld0NoaWxkKCdhZGRpbmdMaW5rVGVtcGxhdGUnKSBhZGRpbmdMaW5rVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSByaWRpbWVuc2lvbmFtZW50byBmaWxlIGRpIHRpcG8gaW1hZ2VcclxuICBpbWFnZUNoYW5nZWRFdmVudDogYW55ID0gXCJcIjtcclxuICBjcm9wcGVkSW1hZ2U6IGFueSA9IFwiXCI7XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIGNhbnZhc1JvdGF0aW9uID0gMDtcclxuICBAVmlld0NoaWxkKEltYWdlQ3JvcHBlckNvbXBvbmVudCkgaW1hZ2VDcm9wcGVyOiBJbWFnZUNyb3BwZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImltYWdlSW5wdXRcIikgaW1hZ2VJbnB1dDogYW55O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBBdHRhY2htZW50VHlwZSA9IEF0dGFjaG1lbnRUeXBlO1xyXG4gIHNlbGVjdGVkQXR0YWNobWVudDogSUF0dGFjaG1lbnREVE87XHJcblxyXG4gIG9yaWdpbmFsV2lkdGg6IG51bWJlcjtcclxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyO1xyXG4gIGN1c3RvbVdpZHRoOiBudW1iZXI7XHJcbiAgY3VzdG9tSGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbmxpbmVQcmV2aWV3VGVtcGxhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgaW5saW5lUHJldmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dQcmV2aWV3XCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ1ByZXZpZXc6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIGltYWdlRmlsZTogRmlsZTtcclxuXHJcbiAgYWRkaW5nTGlua01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8jcmVnaW9uIFNlemlvbmUgbnVvdmEgcmVmYWN0b3JpbmdcclxuXHJcbiAgLy8gUHJvcHJpZXTDoCBpbnRlcm5hIGNoZSBjb250ZXJyw6AgbCdhcnJheSBmaW5hbGUgZGkgY29sb25uZSBvcmRpbmF0ZVxyXG4gIF90YWJsZUNvbHVtbnM6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdID0gW107XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEZpbGVUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRlZmF1bHRGaWxlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEFjdGlvbnNUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRlZmF1bHRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8vIFN0YXRvIGRyYWcgJiBkcm9wIGUgdG9hc3RcclxuICBkcmFnT3ZlciA9IGZhbHNlO1xyXG4gIHRvYXN0ID0ge1xyXG4gICAgdmlzaWJsZTogZmFsc2UgYXMgYm9vbGVhbixcclxuICAgIHR5cGU6ICdzdWNjZXNzJyBhcyAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nLFxyXG4gICAgdGV4dDogJycgYXMgc3RyaW5nLFxyXG4gICAgdGltZW91dElkOiAwIGFzIGFueVxyXG4gIH07XHJcblxyXG4gIHByb2dyZXNzUGVyY2VudCA9IDA7XHJcbiAgdG90YWxTaXplQnl0ZXMgPSAwO1xyXG4gIGdldCB0b3RhbFNpemVGb3JtYXR0ZWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybWF0RmlsZVNpemUodGhpcy50b3RhbFNpemVCeXRlcyk7IH1cclxuXHJcbiAgLy8gVXRpbGl0eSBwZXIgZm9ybWF0dGFyZSBieXRlcyAoMiBkZWNpbWFsaSlcclxuICBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuICcwIEJ5dGVzJztcclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgyKSl9ICR7c2l6ZXNbaV19YDtcclxuICB9XHJcblxyXG4gIC8vIE1vc3RyYSB0b2FzdCBjb24gYXV0b+KAkWhpZGUgZSByZXNldCBwcm9ncmVzcyBiYXIgQ1NTXHJcbiAgc2hvd1RvYXN0KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICdpbmZvJyA9ICdzdWNjZXNzJywgZHVyYXRpb25NcyA9IDMwMDApIHtcclxuICAgIGlmICh0aGlzLnRvYXN0LnZpc2libGUgJiYgdGhpcy50b2FzdC50ZXh0ID09PSBtZXNzYWdlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYW5jZWxsYSBpbCB0aW1lb3V0IHByZWNlZGVudGUgc2UgZXNpc3RlXHJcbiAgICBpZiAodGhpcy50b2FzdC50aW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3QudGltZW91dElkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjb2xhIHVuYSBkdXJhdGEgZGluYW1pY2FcclxuICAgIGNvbnN0IGR1cmF0aW9uID0gZHVyYXRpb25NcyB8fCBNYXRoLm1heCg0MDAwLCBtZXNzYWdlLmxlbmd0aCAqIDEwMCk7XHJcblxyXG4gICAgdGhpcy50b2FzdC50ZXh0ID0gbWVzc2FnZTtcclxuICAgIHRoaXMudG9hc3QudHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLnRvYXN0LnZpc2libGUgPSB0cnVlO1xyXG5cclxuICAgIC8vIEltcG9zdGEgaWwgbnVvdm8gdGltZW91dCBwZXIgbmFzY29uZGVyZSBhdXRvbWF0aWNhbWVudGUgaWwgdG9hc3RcclxuICAgIHRoaXMudG9hc3QudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudG9hc3QudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfSwgZHVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgI2VuZHJlZ2lvblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGVxcEF0dGFjaG1lbnRTZXJ2aWNlOiBFcXBBdHRhY2htZW50U2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIC8vIEluaXppYWxpenphIG1ldHJpY2hlIGUgcHJvZ3Jlc3MgaW4gYmFzZSBhbGxvIHN0YXRvIGluaXppYWxlXHJcbiAgICB0aGlzLnJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCk7XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgaW1wb3N0YSBpbCBmaWx0cm8gcGVyIGxlIGVzdGVuc2lvbmkgcG9zc2liaWxpIGRhIGNhcmljYXJlXHJcbiAgICBpZiAoIXRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMpXHJcbiAgICAgIGlmICh0aGlzLmFsbG93T25seUltYWdlcyA9PSB0cnVlKSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gXCJpbWFnZS8qXCI7XHJcbiAgICAgIGVsc2UgdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9IFwiKlwiO1xyXG5cclxuICAgIC8vIFNlIG5vbiBzb25vIHN0YXRpIHNwZWNpZmljYXRpIGkgdGlwaSBkYSBnZXN0aXJlIG1hIMOoIHN0YXRvIHBhc3NhdG8gbnVsbCBvIHVuIGFycmF5IHZ1b3RvIGltcG9zdG8gaSB0aXBpIGRpIGRlZmF1bHQuXHJcbiAgICBpZiAoIXRoaXMuYWxsb3dlZFR5cGVzIHx8IHRoaXMuYWxsb3dlZFR5cGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LLCBBdHRhY2htZW50VHlwZS5EUk9QQk9YXTtcclxuICAgIGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcy5maW5kKCh0KSA9PiB0ICE9IEF0dGFjaG1lbnRUeXBlLkZJTEUgJiYgdCAhPSBBdHRhY2htZW50VHlwZS5MSU5LICYmIHQgIT0gQXR0YWNobWVudFR5cGUuRFJPUEJPWClcclxuICAgICkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5XYXJuaW5nKFxyXG4gICAgICAgICdBbG1lbm8gdW5vIGRlZ2xpIEF0dGFjaG1lbnRUeXBlIHNlbGV6aW9uYXRpIG5lbCBwYXJhbWV0cm8gXCJhbGxvd2VkVHlwZXNcIiBub24gZXNpc3RlLidcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5hbGxvd2VkVHlwZXMgPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOSywgQXR0YWNobWVudFR5cGUuRFJPUEJPWF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgIC8vIFNlIMOoIHN0YXRvIHBhc3NhdG8gdW4gc2luZ29sbyBhbGxlZ2F0byBsbyBhZ2dpdW5nbyBhbGxhIGxpc3RhXHJcbiAgICBpZiAodGhpcy5zaW5nbGVBdHRhY2htZW50ICE9IG51bGwgJiYgdGhpcy5hdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QucHVzaCh0aGlzLnNpbmdsZUF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hlY2tBdHRhY2htZW50SW1hZ2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgICAgdGhpcy5lcXBBdHRhY2htZW50U2VydmljZS5sb2FkRHJvcGJveFNjcmlwdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0dXBUYWJsZUNvbHVtbnMoKTtcclxuICAgIHRoaXMuc2V0dXBNZW51QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgc2V0Vmlld01vZGUobW9kZTogJ2NhcmQnIHwgJ3RhYmxlJyk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9IG1vZGU7XHJcbiAgfVxyXG5cclxuICAvLyBSaWNhbGNvbGEgbGEgc29tbWEgcGVzYXRhIHN1Z2xpIGFsbGVnYXRpIHByZXNlbnRpXHJcbiAgcHJpdmF0ZSByZWNvbXB1dGVUb3RhbHNBbmRQcm9ncmVzcygpIHtcclxuICAgIHRoaXMudG90YWxTaXplQnl0ZXMgPSAodGhpcy5hdHRhY2htZW50c0xpc3QgfHwgW10pXHJcbiAgICAgIC5maWx0ZXIoYSA9PiAhIWEpXHJcbiAgICAgIC5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgdGhpcy5ieXRlc0Zyb21CYXNlNjQoYS5GaWxlRGF0YUJhc2U2NCB8fCBhLkZpbGVUaHVtYm5haWxCYXNlNjQgfHwgJycpLCAwKTtcclxuXHJcbiAgICAvLyBQcm9ncmVzcyBmaXR0aXppbzogMTAwJSBzZSBwcmVzZW50aSBmaWxlLCAwIHNlIHZ1b3RvXHJcbiAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9ICh0aGlzLmF0dGFjaG1lbnRzTGlzdCAmJiB0aGlzLmF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwKSA/IDEwMCA6IDA7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnRvYXN0LnRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3QudGltZW91dElkKTtcclxuICB9XHJcblxyXG4gIC8vIENhbGNvbGEgaSBieXRlIGRhIHVuYSBzdHJpbmdhIEJhc2U2NCBwdXJhIChzZW56YSBwcmVmaXNzbyBkYXRhOi4uLilcclxuICBwdWJsaWMgYnl0ZXNGcm9tQmFzZTY0KGJhc2U2NDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmICghYmFzZTY0KSByZXR1cm4gMDtcclxuICAgIC8vIFJpbXVvdmkgZXZlbnR1YWxlIHByZWZpc3NvIGRhdGEgVVJMXHJcbiAgICBjb25zdCBjb21tYUlkeCA9IGJhc2U2NC5pbmRleE9mKCcsJyk7XHJcbiAgICBjb25zdCBiNjQgPSBjb21tYUlkeCA+PSAwID8gYmFzZTY0LnN1YnN0cmluZyhjb21tYUlkeCArIDEpIDogYmFzZTY0O1xyXG4gICAgLy8gQ29udGEgcGFkZGluZ1xyXG4gICAgbGV0IHBhZGRpbmcgPSAwO1xyXG4gICAgaWYgKGI2NC5lbmRzV2l0aCgnPT0nKSkgcGFkZGluZyA9IDI7XHJcbiAgICBlbHNlIGlmIChiNjQuZW5kc1dpdGgoJz0nKSkgcGFkZGluZyA9IDE7XHJcbiAgICAvLyBGb3JtdWxhIGVzYXR0YTogKDMgKiAobGVuIC8gNCkpIC0gcGFkZGluZ1xyXG4gICAgY29uc3QgbGVuID0gYjY0Lmxlbmd0aDtcclxuICAgIHJldHVybiBNYXRoLm1heCgwLCAoMyAqIE1hdGguZmxvb3IobGVuIC8gNCkpIC0gcGFkZGluZyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0F0dGFjaG1lbnRJbWFnZSgpIHtcclxuICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LmZvckVhY2goKGEpID0+IHtcclxuICAgICAgYS5Jc0ltYWdlID0gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuY2hlY2tJbWFnZUZyb21NaW1lVHlwZShhLkZpbGVDb250ZW50VHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBlbGVuY28gYWxsZWdhdGlcclxuXHJcbiAgLyoqXHJcbiAgICogRWxpbWluYSB1biBhbGxlZ2F0byBlbGltaW5hbmRvIGFuY2hlIGlsIGZpbGUgcHJlc2VudGUgbmVsbG8gc3RvcmFnZSBkaSBhcmNoaXZpYXppb25lIHV0aWxpenphdG8gKEFXUyBvIGNhcnRlbGxhIHByb2dldHRvKVxyXG4gICAqIEBwYXJhbSBlbGVtZW50IElBdHRhY2htZW50RFRPIGRhIGNhbmNlbGxhcmVcclxuICAgKi9cclxuICBkZWxldGVBdHRhY2htZW50KGVsZW1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5Db25maXJtKFxyXG4gICAgICB0aGlzLmRlbGV0ZURpYWxvZ01lc3NhZ2UsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZUF0dGFjaG1lbnRGcm9tTGlzdCh0aGlzLmF0dGFjaG1lbnRzTGlzdC5pbmRleE9mKGVsZW1lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZSxcclxuICAgICAgdGhpcy5kZWxldGVEaWFsb2dUaXRsZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpbXVvdmUgbCdhbGxlZ2F0byBzZWxlemlvbmF0byBkYWxsYSBsaXN0YSBcImF0dGFjaG1lbnRzTGlzdFwiIGUgaW52b2NhIGwnZXZlbnRvIGRpIG91dHB1dCBjaGUgcmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YS5cclxuICAgKiBAcGFyYW0gYXR0YWNobWVudEluZGV4IEluZGljZSBkZWxsJ2F0dGFjaG1lbnQgZGEgcmltdW92ZXJlXHJcbiAgICovXHJcbiAgcmVtb3ZlQXR0YWNobWVudEZyb21MaXN0KGF0dGFjaG1lbnRJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm9uRGVsZXRlQXR0YWNobWVudC5lbWl0KHRoaXMuYXR0YWNobWVudHNMaXN0W2F0dGFjaG1lbnRJbmRleF0pO1xyXG5cclxuICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnNwbGljZShhdHRhY2htZW50SW5kZXgsIDEpO1xyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG5cclxuICAgIHRoaXMucmVjb21wdXRlVG90YWxzQW5kUHJvZ3Jlc3MoKTtcclxuICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMucmVtb3ZlZExhYmVsIHx8ICdGaWxlIHJlbW92ZWQnLCAnc3VjY2VzcycpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2ltdWxhdGVQcm9ncmVzcygpIHtcclxuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50ID0gMDtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDMwO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDYwO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnQgPSAxMDA7XHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgfSwgMjAwKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU2NhcmljYSBsJ2FsbGVnYXRvIG8gYXByZSBpbCBsaW5rXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgQWxsZWdhdG8gZGEgbW9zdHJhcmVcclxuICAgKi9cclxuICB2aWV3QXR0YWNobWVudChhdHRhY2htZW50OiBJQXR0YWNobWVudERUTykge1xyXG4gICAgaWYgKGF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSykge1xyXG4gICAgICB3aW5kb3cub3BlbihhdHRhY2htZW50LkZpbGVQYXRoLCBcIl9ibGFua1wiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdHRhY2htZW50LkxhcmdlRmlsZSkge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXR0YWNobWVudC5MYXJnZUZpbGU7XHJcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgICBsaW5rLmRvd25sb2FkID0gYXR0YWNobWVudC5GaWxlTmFtZSB8fCBmaWxlLm5hbWU7XHJcbiAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCksIDEwMDApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgYXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYXR0YWNobWVudC5GaWxlTmFtZSkge1xyXG4gICAgICBsZXQgc291cmNlID0gYGRhdGE6JHthdHRhY2htZW50LkZpbGVDb250ZW50VHlwZX07YmFzZTY0LCR7YXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gO1xyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgIGxpbmsuaHJlZiA9IHNvdXJjZTtcclxuICAgICAgbGluay5kb3dubG9hZCA9IGAke2F0dGFjaG1lbnQuRmlsZU5hbWV9YDtcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb3dubG9hZEF0dGFjaG1lbnQuZW1pdChhdHRhY2htZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpZGVmaW5pc2NlIGwnaWNvbmEgZGEgbW9zdHJhcmUgbmVsbGEgY29sb25uYSBkZWxsJ2VxcC10YWJsZSBwZXIgb2duaSBmaWxlLlxyXG4gICAqIEwnaWNvbmEgdmFyaWEgaW4gYmFzZSBhbGwnZXN0ZW5zaW9uZSBkZWwgZmlsZVxyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50XHJcbiAgICovXHJcbiAgZ2V0QXR0YWNobWVudEljb24oYXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIGlmIChhdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHJldHVybiBcImZhcyBmYS1saW5rXCI7XHJcbiAgICBlbHNlIHJldHVybiBBdHRhY2htZW50SGVscGVyU2VydmljZS5nZXRJY29uRnJvbUZpbGVFeHRlbnNpb25lKGF0dGFjaG1lbnQuRmlsZUV4dGVuc2lvbik7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBhbGxlZ2F0byBzaW5nb2xvLCBzY2VnbGllIHF1YWxlIG1ldG9kbyByaWNoaWFtYXJlIGluIGJhc2UgYWwgdGlwbyBkaSBhbGxlZ2F0b1xyXG4gICAqL1xyXG4gIGFkZEZpbGUoYXR0YWNobWVudFR5cGU6IEF0dGFjaG1lbnRUeXBlLCBpbWFnZUlucHV0ID0gbnVsbCkge1xyXG4gICAgaWYgKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5zd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKCk7XHJcbiAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUpIHtcclxuICAgICAgaW1hZ2VJbnB1dC5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaG9vc2VEcm9wYm94RmlsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlQXR0YWNobWVudEZvcm0oKSB7XHJcbiAgICAvL0NyZWEgbGEgZm9ybSBwZXIgbGEgdmFsaWRhemlvbmUgZGVpIGNhbXBpXHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFt0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBuYW1lOiBbdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lXSxcclxuICAgICAgcGF0aDogW3RoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aF0sXHJcbiAgICAgIGN1c3RvbUhlaWdodDogW3RoaXMuY3VzdG9tSGVpZ2h0XSxcclxuICAgICAgY3VzdG9tV2lkdGg6IFt0aGlzLmN1c3RvbVdpZHRoXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZShlbWl0Q2xvc2VFdmVudCA9IHRydWUpIHtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgdGhpcy5hYm9ydEZpbGUoKTtcclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnRGb3JtKSB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLnJlc2V0KCk7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UuY2xvc2UoKTtcclxuICAgIHRoaXMucmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpO1xyXG5cclxuICAgIGlmIChlbWl0Q2xvc2VFdmVudCA9PSB0cnVlICYmIHRoaXMuYWJvcnRBZGRBdHRhY2htZW50KSB0aGlzLmFib3J0QWRkQXR0YWNobWVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbiBiYXNlIGFsIHRpcG8gZGkgYWxsZWdhdG8gY29udHJvbGxhIHNlIGRpc2FiaWxpdGFyZSBvIG1lbm8gaWwgcHVsc2FudGUgcGVyIHNhbHZhcmUuXHJcbiAgICogRnVuemlvbmUgdXNhdGEgbmVsIFtkaXNhYmxlXSBkZWwgcHVsc2FudGUgXCJTYWx2YVwiIGRlbCBkaWFsb2cgcGVyIGwnYWdnaXVudGEgZGkgdW4gYWxsZWdhdG8uXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBkaXNhYmxlU2F2ZSgpIHtcclxuICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgIXRoaXMubmV3QXR0YWNobWVudC5MYXJnZUZpbGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZVBhdGg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLmZpbHRlcihcclxuICAgICAgICAgIChwKSA9PlxyXG4gICAgICAgICAgICAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFICYmICFwLkZpbGVEYXRhQmFzZTY0ICYmICFwLkxhcmdlRmlsZSkgfHxcclxuICAgICAgICAgICAgKHAuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhcC5GaWxlUGF0aClcclxuICAgICAgICApLmxlbmd0aCA+IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbmZpcm1BZGRBdHRhY2htZW50KCkge1xyXG4gICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlICYmIHRoaXMuaW1hZ2VDcm9wcGVyKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuaW1hZ2VDcm9wcGVyLmNyb3AoKS5iYXNlNjQuc3BsaXQoXCI7YmFzZTY0LFwiKVsxXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lKVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IHRoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnB1c2godGhpcy5uZXdBdHRhY2htZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPT0gbnVsbCB8fCB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMubGVuZ3RoID09IDApIHJldHVybjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gdGhpcy5hdHRhY2htZW50c0xpc3QuY29uY2F0KHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgICB0aGlzLnJlc3RvcmVPcmlnaW5hbERpbWVuc2lvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50Rm9ybSkgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzZXRTZWxlY3RlZEZpbGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyAyLiBSRVNFVCBUT1RBTEU6IFN2dW90aWFtbyBsZSBwcm9wcmlldMOgIGRpIGNsYXNzZSBwZXIgZXZpdGFyZSBjaGUgXHJcbiAgLy8gcmVzaWR1aSBkaSB1cGxvYWQgcHJlY2VkZW50aSAoc2luZ29saSBvIG11bHRpcGxpKSB2ZW5nYW5vIHRyYXNjaW5hdGkuXHJcbiAgcHJpdmF0ZSByZXNldFNlbGVjdGVkRmlsZXMoKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHJlIGlsIGRpYWxvZyBwZXIgbCdhbnRlcHJpbWEgZGVsbCdhbGxlZ2F0byBzZWxlemlvbmF0by5cclxuICAgKiBAcGFyYW0gcm93XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBvcGVuUHJldmlld0RpYWxvZyhyb3c6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudCA9IHsgLi4ucm93IH07XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEF0dGFjaG1lbnRFbmRwb2ludCAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5Jc0ltYWdlICYmICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEF0dGFjaG1lbnRCeUlEKClcclxuICAgICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHJlcy5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5FcnJvcihlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGhcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aChcInZpZGVvL1wiKSAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5MYXJnZUZpbGUpIHtcclxuICAgICAgY29uc3QgdmlkZW9VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkxhcmdlRmlsZSk7XHJcbiAgICAgIC8vIFVzaWFtbyBieXBhc3NTZWN1cml0eVRydXN0VXJsIHBlciBsYSBzb3JnZW50ZSBkZWwgdmlkZW9cclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwodmlkZW9VcmwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiZcclxuICAgICAgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ICYmXHJcbiAgICAgICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0XHJcbiAgICApIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWxsJ2FsbGVnYXRvLCBmaWxlIG1hbmNhbnRlLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFxyXG4gICAgICAgIGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHt0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGggJiYgdGhpcy5wcm9kdWN0aW9uQmFzZVVybCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgICBcImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2d2aWV3P3VybD1cIiArXHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3Rpb25CYXNlVXJsICtcclxuICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVQYXRoICtcclxuICAgICAgICAgIFwiJmVtYmVkZGVkPXRydWVcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWwgZG9jdW1lbnRvIVwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nUHJldmlldywge1xyXG4gICAgICBwYW5lbENsYXNzOiAnZXFwLWF0dGFjaG1lbnRzLXByZXZpZXctZGlhbG9nJyxcclxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcclxuICAgICAgd2lkdGg6IHJvdy5Jc0ltYWdlIHx8IHJvdy5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpID8gJ2F1dG8nIDogJzExMDBweCcsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQdWxpemlhIGRlbGxhIG1lbW9yaWEgcXVhbmRvIGlsIGRpYWxvZyBzaSBjaGl1ZGVcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudD8uRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidmlkZW8vXCIpKSB7XHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsIGFzIGFueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0QXR0YWNobWVudEJ5SUQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SUF0dGFjaG1lbnREVE8+KHRoaXMuZ2V0QXR0YWNobWVudEVuZHBvaW50LCB0aGlzLnNlbGVjdGVkQXR0YWNobWVudCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgY2FyaWNhbWVudG8gZmlsZVxyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gc2NhdGVuYXRvIGFsbGEgc2VsZXppb25lIGRlbCBmaWxlIChvIGRlaSBmaWxlKS5cclxuICAgKiBTZSBpbCBjYXJpY2FtZW50byDDqCBTSU5HT0xPIG8gc2UgY29tdW5xdWUgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlIGFsbG9yYSBzaSBvY2N1cGEgZGkgY29udHJvbGxhcmUgc2Ugc2kgdHJhdHRhIGRpIHVuIGltbWFnaW5lIGluIG1vZG8gZGFcclxuICAgKiBtb3N0cmFyZSBsZSBmdW56aW9uYWxpdMOgIGRlbCBjcm9wcGllIChwZXIgcml0YWdsaWFyZSBsJ2ltbWFnaW5lKSBvcHB1cmUgbm8uXHJcbiAgICogU2UgaWwgZmlsZSBjYXJpY2F0byBub24gw6ggdW4gaW1tYWdpbmUgYWxsb3JhIGdlbmVyYSBkaXJldHRhbWVudGUgaWwgYmFzZTY0IGUgbG8gYXNzb2NpYSBhbGwnYWxsZWdhdG8gZGEgc2FsdmFyZS5cclxuICAgKiBTZSBpbnZlY2UgaWwgY2FyaWNhbWVudG8gZGVpIGZpbGUgw6ggTVVMVElQTE8gZSBzb25vIHByZXNlbnRpIHBpw7kgZmlsZSBhbGxvcmEgZXNlZ3VlIGxlIHN0ZXNzZSBvcGVyYXppb25pIGlnbm9yYW5kbyBwZXLDsiBpbCBjb250cmxsb1xyXG4gICAqIGltbWFnaW5lIHBlciBpbCBjcm9wcGllIChpbiBjYXNvIGRpIGNhcmljYW1lbnRvIG11bHRpcGxvIGxlIGZ1bnppb25hbGl0w6AgZGVsIGNyb3BwaWUgc29ubyBkaXNhYmlsaXRhdGUpLlxyXG4gICAqL1xyXG4gIGFzeW5jIG9uRmlsZUFkZGVkKGV2ZW50LCBpc0ZpbGVEcm9wcGVkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkluZm8oXCJDYXJpY2FtZW50byBhbGxlZ2F0aSBub24gZGlzcG9uaWJpbGUuXCIpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnJlc2V0U2VsZWN0ZWRGaWxlcygpO1xyXG5cclxuICAgIGNvbnN0IGZpbGVzT25JbnB1dDogRmlsZVtdID0gaXNGaWxlRHJvcHBlZFxyXG4gICAgICA/IChldmVudCBhcyBGaWxlW10pXHJcbiAgICAgIDogQXJyYXkuZnJvbSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5maWxlcyB8fCBbXSk7XHJcblxyXG4gICAgY29uc3QgeyB2YWxpZEZpbGVzLCBvdmVyc2l6ZWRGaWxlcyB9ID0gdGhpcy52YWxpZGF0aW9uRmlsZShmaWxlc09uSW5wdXQpO1xyXG5cclxuICAgIGlmICghdmFsaWRGaWxlcyB8fCB2YWxpZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBpZiAoIWlzRmlsZURyb3BwZWQgJiYgZXZlbnQ/LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0byByaWNoaWVzdG8gaWwgY2FyaWNhbWVudG8gU0lOR09MTyBvcHB1cmUgc2UgaWwgY2FyaWNhbWVudG8gw6ggTVVMVElQTE8gbWEgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlXHJcbiAgICAvL2FsbG9yYSB2ZXJpZmljYSBzZSBpbCBmaWxlIMOoIHVuIGltbWFnaW5lIChwZXIgbW9zdHJhcmUgaWwgQ1JPUFBJRSlcclxuICAgIGlmIChbLi4udmFsaWRGaWxlc10ubGVuZ3RoID09IDEgfHwgdGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdmFsaWRGaWxlc1swXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gdmFsaWRGaWxlcztcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgLy9NZW1vcml6emEgaSBkYXRpIHBlciBsJ2FsbGVnYXRvXHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUodGhpcy5zZWxlY3RlZEZpbGUsIGZhbHNlKTtcclxuICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG5cclxuICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICBsZXQgY2hlY2tPbmx5SW1hZ2UgPSB0aGlzLmNoZWNrQWxsb3dPbmx5SW1hZ2VGaWxlKHRoaXMubmV3QXR0YWNobWVudCk7XHJcbiAgICAgIGlmIChjaGVja09ubHlJbWFnZSA9PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5jcmVhdGVBdHRhY2htZW50Rm9ybSgpO1xyXG5cclxuICAgICAgLy9WZXJpZmljYSBzZSBpbCBmaWxlIGNhcmljYXRvIMOoIHVuJ2ltbWFnaW5lIG9wcHVyZSBuby4gU2Ugw6ggdW4gaW1tYWdpbmUsIHByaW1hIGRpIGNhcmljYXJsYSBtb3N0cmEgaWwgY3JvcHBpZSBwZXIgaWwgcmVzaXplLlxyXG4gICAgICAvL1NlIG5vbiDDqCB1biBpbW1hZ2luZSBhbGxvcmEgZ2VuZXJhIGlsIEJhc2U2NFxyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LklzSW1hZ2UgPT0gdHJ1ZSAmJiB0aGlzLmVuYWJsZUltYWdlQ3JvcCkge1xyXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2VEaW1lbnNpb25zKHZhbGlkRmlsZXNbMF0pO1xyXG5cclxuICAgICAgICAvL01vc3RyYSBpbCBjcm9wcGllIGUgZGlzYWJpbGl0YSBsYSBmb3JtIGZpbmNow6ggbm9uIHRlcm1pbmEgbGEgbW9kaWZpY2EgZGVsbCdpbW1hZ2luZVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uY29udHJvbHNbXCJjdXN0b21XaWR0aFwiXS5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLmNvbnRyb2xzW1wiY3VzdG9tSGVpZ2h0XCJdLmVuYWJsZSgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93Q3JvcEltYWdlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VGaWxlID0gZXZlbnQ7XHJcblxyXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nQ3JvcEltYWdlLCB7XHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiBcIjk1dndcIixcclxuICAgICAgICAgICAgbWF4V2lkdGg6IFwiODAwcHhcIixcclxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBcIjkwdmhcIixcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydlcXAtYXR0YWNobWVudHMtZGlhbG9nJywgJ2Nyb3AtZGlhbG9nJ11cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBiYXNlNjRSZXN1bHQgPSBhd2FpdCB0aGlzLmdldEJhc2U2NEZyb21GaWxlKHRoaXMuc2VsZWN0ZWRGaWxlKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBiYXNlNjRSZXN1bHQuQmFzZTY0RmlsZTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IHZhbGlkRmlsZXM7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGVzIHx8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMpIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXNbaV0sXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICAgIGxldCBjaGVja09ubHlJbWFnZSA9IHRoaXMuY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk7XHJcbiAgICAgICAgaWYgKGNoZWNrT25seUltYWdlID09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5wdXNoKG5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCk7XHJcbiAgICB0aGlzLnNpbXVsYXRlUHJvZ3Jlc3MoKTtcclxuICAgIC8vIENhc28gMTogU3VjY2Vzc28gUGFyemlhbGUgKGFsY3VuaSBmaWxlIHZhbGlkaSwgYWx0cmkgbm8pXHJcbiAgICBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCAmJiB2YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZU5hbWVzID0gb3ZlcnNpemVkRmlsZXMuam9pbignLCAnKTtcclxuICAgICAgdGhpcy5zaG93VG9hc3QoXHJcbiAgICAgICAgYCR7dmFsaWRGaWxlcy5sZW5ndGh9IGZpbGUgYWdnaXVudGkuICR7b3ZlcnNpemVkRmlsZXMubGVuZ3RofSBub24gY2FyaWNhdGkgcGVyY2jDqSB0cm9wcG8gZ3JhbmRpICgke2ZpbGVOYW1lc30pLmAsXHJcbiAgICAgICAgJ2Vycm9yJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FzbyAyOiBOZXNzdW4gZmlsZSB2YWxpZG9cclxuICAgIGVsc2UgaWYgKG92ZXJzaXplZEZpbGVzLmxlbmd0aCA+IDAgJiYgdmFsaWRGaWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgIH1cclxuICAgIC8vIENhc28gMzogVHV0dGkgaSBmaWxlIHZhbGlkaVxyXG4gICAgZWxzZSBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID09PSAwICYmIHZhbGlkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgJHt2YWxpZEZpbGVzLmxlbmd0aH0gJHt0aGlzLmFkZGVkU3VjY2Vzc2Z1bGx5TGFiZWwgfHwgJ2ZpbGUocykgYWdnaXVudGkgY29uIHN1Y2Nlc3NvLid9YCxcclxuICAgICAgICAnc3VjY2VzcydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1Jlc2V0dG8gaWwgdmFsb3JlIGRlbCBmaWxlIGlucHV0IGluIG1vZG8gZGEgc2NhdGVuYXJlIGlsIGNoYW5nZSBhbmNoZSBzZSBzaSBkb3Zlc3NlIGNhcmljYXJlIGxvIHN0ZXNzbyBmaWxlXHJcbiAgICBpZiAoIWlzRmlsZURyb3BwZWQpIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRpb25GaWxlKGZpbGVzT25JbnB1dDogRmlsZVtdKSB7XHJcbiAgICBjb25zdCB2YWxpZEZpbGVzOiBGaWxlW10gPSBbXTtcclxuICAgIGNvbnN0IG92ZXJzaXplZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlc09uSW5wdXQpIHtcclxuICAgICAgY29uc3QgZmlsZVNpemVNQiA9IGZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xyXG4gICAgICBpZiAoZmlsZVNpemVNQiA+IHRoaXMubWF4RmlsZVNpemVNQikge1xyXG4gICAgICAgIG92ZXJzaXplZEZpbGVzLnB1c2goZmlsZS5uYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlTmFtZXMgPSBvdmVyc2l6ZWRGaWxlcy5qb2luKCcsICcpO1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgRmlsZShzKSB0cm9wcG8gZ3JhbmRpOiAke2ZpbGVOYW1lc30uIExpbWl0ZTogJHt0aGlzLm1heEZpbGVTaXplTUJ9TUJgLFxyXG4gICAgICAgICdlcnJvcidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB2YWxpZEZpbGVzLCBvdmVyc2l6ZWRGaWxlcyB9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgRklMRSByaWNldnV0byBpbiBpbnB1dCByaWNvc3RydWlzY2UgbCdvZ2dldHRvIElBdHRhY2htZW50RFRPIGUgbG8gcmVzdGl0dWlzY2UuXHJcbiAgICogU2UgaWwgcGFyYW1ldHJvIGdldEJhc2U2NCB2aWVuZSBwYXNzYXRvIGEgVFJVRSBhbGxvcmEsIHNlbXByZSBhIHBhcnRpcmUgZGFsIGZpbGUsZ2VuZXJhIGlsIGJhc2U2NCBlXHJcbiAgICogcmljYXZhIGlsIENvbnRlbnRUeXBlIGRhIGFzc29jaWFyZSBhbGwnb2dnZXR0byBJQXR0YWNobWVudERUTyBkYSByZXN0aXR1aXJlXHJcbiAgICogQHBhcmFtIGN1cnJlbnRGaWxlIE9nZ2V0dG8gRklMRSBkYSBwcm9jZXNzYXJlXHJcbiAgICogQHBhcmFtIGdldEJhc2U2NCBTZSBUUlVFIGFsbG9yYSBjYWxjb2xhIGJhc2U2NCBlIENvbnRlbnRUeXBlIGRlbCBmaWxlIHBhc3NhdG8gaW4gaW5wdXRcclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBvZ2dldHRvIGRpIHRpcG8gSUF0dGFjaG1lbnREVE9cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUF0dGFjaG1lbnRGcm9tVXBsb2FkZWRGaWxlKFxyXG4gICAgY3VycmVudEZpbGU6IEZpbGUsXHJcbiAgICBnZXRCYXNlNjQ6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgY3JvcEZpbGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IFByb21pc2U8SUF0dGFjaG1lbnREVE8+IHtcclxuICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgLy9NZW1vcml6emEgaSBkYXRpIHBlciBsJ2FsbGVnYXRvXHJcbiAgICBuZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID0gQXR0YWNobWVudFR5cGUuRklMRTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gY3VycmVudEZpbGUudHlwZTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBjdXJyZW50RmlsZS5uYW1lO1xyXG4gICAgbmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gY3VycmVudEZpbGUubmFtZS5zdWJzdHIoY3VycmVudEZpbGUubmFtZS5sYXN0SW5kZXhPZihcIi5cIikgKyAxKTtcclxuICAgIG5ld0F0dGFjaG1lbnQuSXNJbWFnZSA9IEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmNoZWNrSW1hZ2VGcm9tTWltZVR5cGUoY3VycmVudEZpbGUudHlwZSk7XHJcblxyXG4gICAgY29uc3QgZmlsZVNpemVNQiA9IGN1cnJlbnRGaWxlLnNpemUgLyAxMDI0IC8gMTAyNDtcclxuICAgIGNvbnN0IGlzTGFyZ2VGaWxlID0gZmlsZVNpemVNQiA+IHRoaXMuYmFzZTY0TGltaXRNQjtcclxuICAgIGNvbnN0IGlzVmlkZW8gPSBjdXJyZW50RmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJyk7XHJcblxyXG4gICAgaWYgKGlzVmlkZW8pIHtcclxuICAgICAgbGV0IGZpbmFsRmlsZTogRmlsZSB8IEJsb2IgPSBjdXJyZW50RmlsZTtcclxuXHJcbiAgICAgIC8vIDEuIEdlbmVyYSBsYSBtaW5pYXR1cmEgKHJpbWFuZSBsYXRvIGNsaWVudCBwZXJjaMOpIMOoIHVuJ29wZXJhemlvbmUgaXN0YW50YW5lYSlcclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVZpZGVvVGh1bWJuYWlsKGN1cnJlbnRGaWxlKTtcclxuXHJcbiAgICAgIC8vIDIuIFNlIGxhIGNvbXByZXNzaW9uZSDDqCBhYmlsaXRhdGEsIGludmlhbW8gaWwgZmlsZSBhbGwnQVBJIEMjXHJcbiAgICAgIGlmICh0aGlzLnZpZGVvQ29tcHJlc3Npb24uZW5hYmxlZCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KFwiQ29tcHJlc3Npb25lIHZpZGVvIGluIGNvcnNvLi4uIEwnb3BlcmF6aW9uZSBwb3RyZWJiZSByaWNoaWVkZXJlIGFsY3VuaSBtaW51dGkuXCIsIFwiaW5mb1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIENoaWFtYXRhIGFsIG1pY3Jvc2Vydml6aW8gQyMgKG1ldG9kbyByaXN0cnV0dHVyYXRvIHByZWNlZGVudGVtZW50ZSlcclxuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRCbG9iID0gYXdhaXQgdGhpcy5jb21wcmVzc1ZpZGVvQXBpKGN1cnJlbnRGaWxlLCB0aGlzLnZpZGVvQ29tcHJlc3Npb24pO1xyXG5cclxuICAgICAgICAgIC8vIENyZWlhbW8gaWwgbnVvdm8gbm9tZSBmaWxlIGNvbiBlc3RlbnNpb25lIC5tcDRcclxuICAgICAgICAgIGNvbnN0IG5ld0ZpbGVOYW1lID0gY3VycmVudEZpbGUubmFtZS5yZXBsYWNlKC9cXC5bXi8uXSskLywgXCJcIikgKyBcIi5tcDRcIjtcclxuXHJcbiAgICAgICAgICAvLyBUcmFzZm9ybWlhbW8gaWwgQmxvYiByaWNldnV0byBpbiB1biBGaWxlIHBlciBtYW50ZW5lcmUgbGEgY29lcmVuemEgbmVsbCdvZ2dldHRvIERUT1xyXG4gICAgICAgICAgZmluYWxGaWxlID0gbmV3IEZpbGUoW2NvbXByZXNzZWRCbG9iXSwgbmV3RmlsZU5hbWUsIHsgdHlwZTogXCJ2aWRlby9tcDRcIiB9KTtcclxuXHJcbiAgICAgICAgICAvLyBBZ2dpb3JuaWFtbyBpIG1ldGFkYXRpIGRlbGwnYWxsZWdhdG9cclxuICAgICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBuZXdGaWxlTmFtZTtcclxuICAgICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gXCJ2aWRlby9tcDRcIjtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKFwiRXJyb3JlIGR1cmFudGUgbGEgY29tcHJlc3Npb25lIHJlbW90YSBkZWwgdmlkZW8uIFZlcnLDoCBjYXJpY2F0byBpbCBmaWxlIG9yaWdpbmFsZS5cIik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVmlkZW8gQVBJIEVycm9yOlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAvLyBJbiBjYXNvIGRpIGVycm9yZSBkZWxsJ0FQSSwgZmluYWxGaWxlIHJpbWFuZSBpbCBjdXJyZW50RmlsZSBvcmlnaW5hbGVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEltcG9zdGlhbW8gaWwgZmlsZSAoY29tcHJlc3NvIG8gb3JpZ2luYWxlKSBjb21lIExhcmdlRmlsZVxyXG4gICAgICBuZXdBdHRhY2htZW50LkxhcmdlRmlsZSA9IGZpbmFsRmlsZSBhcyBGaWxlO1xyXG4gICAgICBuZXdBdHRhY2htZW50LklzTGFyZ2VGaWxlID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIG5ld0F0dGFjaG1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzTGFyZ2VGaWxlKSB7XHJcbiAgICAgIC8vIENBU08gTEFSR0UgRklMRTpcclxuICAgICAgLy8gUG9wb2xpYW1vIE9yaWdpbmFsRmlsZSBlIGZvcnppYW1vIGlsIEJhc2U2NCBhIG51bGwuXHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBudWxsO1xyXG4gICAgICBuZXdBdHRhY2htZW50LkxhcmdlRmlsZSA9IGN1cnJlbnRGaWxlO1xyXG4gICAgICBuZXdBdHRhY2htZW50LklzTGFyZ2VGaWxlID0gdHJ1ZTtcclxuICAgICAgZ2V0QmFzZTY0ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdldEJhc2U2NCA9PSB0cnVlKSB7XHJcbiAgICAgIGxldCBiYXNlNjRSZXN1bHQgPSBhd2FpdCB0aGlzLmdldEJhc2U2NEZyb21GaWxlKGN1cnJlbnRGaWxlKTtcclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IGJhc2U2NFJlc3VsdC5CYXNlNjRGaWxlO1xyXG4gICAgICBpZiAoIW5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlICYmIGJhc2U2NFJlc3VsdC5Db250ZW50VHlwZSkge1xyXG4gICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmV3QXR0YWNobWVudC5Jc0ltYWdlICYmIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgY3JvcEZpbGUpIHtcclxuICAgICAgICB0aGlzLmdldENyb3BwZWRBbmRVcGxvYWQoYGRhdGE6JHtiYXNlNjRSZXN1bHQuQ29udGVudFR5cGV9O2Jhc2U2NCwke2Jhc2U2NFJlc3VsdC5CYXNlNjRGaWxlfWAsIG5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ld0F0dGFjaG1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBhcnRpcmUgZGFsIGZpbGUgcGFzc2F0byBpbiBpbnB1dCByZXN0aXR1aXNjZSB1biBvZ2dldHRvXHJcbiAgICogY29udGVuZW50ZSBpbCBiYXNlNjQgZGVsIGZpbGUgZSBpbCBzdW8gY29udGVudFR5cGVcclxuICAgKiBAcGFyYW0gY3VycmVudEZpbGUgT2dnZXR0byBGaWxlIGRhIGN1aSBlc3RyYXBvbGFyZSBiYXNlNjQgZSBjb250ZW50VHlwZVxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gYXZlbnRlIGxlIHByb3ByaWV0w6AgQmFzZTY0RmlsZSBlIENvbnRlbnRUeXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRCYXNlNjRGcm9tRmlsZShjdXJyZW50RmlsZTogRmlsZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBmaWxlU2l6ZU1CID0gY3VycmVudEZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xyXG4gICAgaWYgKGZpbGVTaXplTUIgPiB0aGlzLmJhc2U2NExpbWl0TUIpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBCYXNlNjRGaWxlOiBudWxsLFxyXG4gICAgICAgIENvbnRlbnRUeXBlOiBjdXJyZW50RmlsZS50eXBlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvLyBQcm9jZWR1cmEgc3RhbmRhcmRcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBiYXNlNjRGaWxlID0gYXdhaXQgdG9CYXNlNjQoY3VycmVudEZpbGUpO1xyXG4gICAgICBsZXQgY29udGVudFR5cGU6IHN0cmluZyA9IG51bGw7XHJcbiAgICAgIGlmIChiYXNlNjRGaWxlKSB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBiYXNlNjRGaWxlLnNwbGl0KFwiLFwiKVswXS5zcGxpdChcIjpcIilbMV0uc3BsaXQoXCI7XCIpWzBdO1xyXG4gICAgICAgIGJhc2U2NEZpbGUgPSBiYXNlNjRGaWxlLnNwbGl0KFwiLFwiKVsxXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIEJhc2U2NEZpbGU6IGJhc2U2NEZpbGUsXHJcbiAgICAgICAgQ29udGVudFR5cGU6IGNvbnRlbnRUeXBlXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICByZXR1cm4geyBCYXNlNjRGaWxlOiBudWxsLCBDb250ZW50VHlwZTogbnVsbCB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGlsIGZpbGUgY2hlIHNpIHN0YSBjYXJpY2FuZG8gw6ggc3VwcG9ydGF0byBkYWwgc2lzdGVtYS5cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tBY2NlcHRlZEZpbGVzKCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gU2UgYWNjZXR0byB0dXR0bywgZXNjbyBzdWJpdG9cclxuICAgIGlmICh0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID09PSBcIipcIikgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgaXNUeXBlVmFsaWQgPSAobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICBpZiAoIW1pbWVUeXBlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAvLyBDb250cm9sbG8gY29ycmlzcG9uZGVuemEgZXNhdHRhIChlcy4gaW1hZ2UvcG5nKVxyXG4gICAgICBpZiAodGhpcy5hY2NlcHRlZEZpbGVUeXBlcy5pbmNsdWRlcyhtaW1lVHlwZSkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgY29uc3Qgd2lsZGNhcmRzID0gdGhpcy5hY2NlcHRlZEZpbGVUeXBlcy5zcGxpdChcIixcIikuZmlsdGVyKHQgPT4gdC5pbmNsdWRlcyhcIipcIikpO1xyXG4gICAgICBmb3IgKGxldCB0IG9mIHdpbGRjYXJkcykge1xyXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHQuc3BsaXQoXCIqXCIpWzBdOyAvLyBQcmVuZGUgXCJpbWFnZS9cIiBkYSBcImltYWdlLypcIlxyXG4gICAgICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9PSB0cnVlKSB7XHJcbiAgICAgIC8vIENhc28gU2luZ29sb1xyXG4gICAgICByZXR1cm4gaXNUeXBlVmFsaWQodGhpcy5zZWxlY3RlZEZpbGUudHlwZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBDYXNvIE11bHRpcGxvOiBUVVRUSSBpIGZpbGUgc2VsZXppb25hdGkgZGV2b25vIGVzc2VyZSB2YWxpZGlcclxuICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5zZWxlY3RlZEZpbGVzKS5ldmVyeShmaWxlID0+IGlzVHlwZVZhbGlkKGZpbGUudHlwZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgZXFwLWF0dGFjaG1lbnRzIMOoIHN0YXRhIGNvbmZpZ3VyYXRhIHBlciBpbCBjYXJpY2FtZW50byBkZWxsZSBzb2xlIGltbWFnaW5pIGFsbG9yYSB2ZXJpZmljYSBjaGUgaWwgZmlsZSBwYXNzYXRvIGluXHJcbiAgICogaW5wdXQgc2lhIGVmZmV0dGl2YW1lbnRlIHVuIGltbWFnaW5lIG8gbm8uXHJcbiAgICogU2UgaWwgY29udHJvbGxvIHZhIGEgYnVvbiBmaW5lIHJlc3RpdHVpc2NlIFRSVUUgYWx0cmltZW50aSBtb3N0cmEgdW4gbWVzc2FnZ2lvIGQnZXJyb3JlIGUgcmVzdGl0dWlzY2UgRkFMU0VcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQWxsb3dPbmx5SW1hZ2VGaWxlKG5ld0F0dGFjaG1lbnQpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmFsbG93T25seUltYWdlcyA9PSB0cnVlICYmIG5ld0F0dGFjaG1lbnQuSXNJbWFnZSAhPSB0cnVlKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKHRoaXMubm9JbWFnZVNlbGVjdGVkRXJyb3JNZXNzYWdlKTtcclxuICAgICAgdGhpcy5hYm9ydEZpbGUoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5jaGVja0FjY2VwdGVkRmlsZXMoKSkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5FcnJvcih0aGlzLndyb25nVHlwZVNlbGVjdGVkRXJyb3JNZXNzYWdlKTtcclxuICAgICAgdGhpcy5hYm9ydEZpbGUoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEdlc3Rpb25lIGNyb3AgZmlsZVxyXG5cclxuICBnZXRJbWFnZURpbWVuc2lvbnMoaW1nOiBhbnkpIHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWFnZS5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgIGltYWdlLm9ubG9hZCA9IChycykgPT4ge1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSBycy5jdXJyZW50VGFyZ2V0W1wiaGVpZ2h0XCJdO1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxXaWR0aCA9IHJzLmN1cnJlbnRUYXJnZXRbXCJ3aWR0aFwiXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxXaWR0aCA+IDEyODApIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tV2lkdGggPSAxMjgwO1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21IZWlnaHQgPSBNYXRoLnJvdW5kKCgxMjgwICogdGhpcy5vcmlnaW5hbEhlaWdodCkgLyB0aGlzLm9yaWdpbmFsV2lkdGgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IHJzLmN1cnJlbnRUYXJnZXRbXCJoZWlnaHRcIl07XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbVdpZHRoID0gcnMuY3VycmVudFRhcmdldFtcIndpZHRoXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWcpO1xyXG4gIH1cclxuXHJcbiAgcmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpIHtcclxuICAgIHRoaXMuY3VzdG9tV2lkdGggPSB0aGlzLm9yaWdpbmFsV2lkdGg7XHJcbiAgICB0aGlzLmN1c3RvbUhlaWdodCA9IHRoaXMub3JpZ2luYWxIZWlnaHQ7XHJcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uID0gMDtcclxuICAgIHRoaXMudHJhbnNmb3JtID0ge307XHJcbiAgfVxyXG5cclxuICBvbkRpbWVuc2lvbnNDaGFuZ2UoZGltZW5zaW9uOiBzdHJpbmcpIHtcclxuICAgIGlmIChkaW1lbnNpb24gPT0gXCJIXCIpIHtcclxuICAgICAgdGhpcy5jdXN0b21XaWR0aCA9IE1hdGgucm91bmQoKHRoaXMuY3VzdG9tSGVpZ2h0ICogdGhpcy5vcmlnaW5hbFdpZHRoKSAvIHRoaXMub3JpZ2luYWxIZWlnaHQpO1xyXG4gICAgfSBlbHNlIGlmIChkaW1lbnNpb24gPT0gXCJXXCIpIHtcclxuICAgICAgdGhpcy5jdXN0b21IZWlnaHQgPSBNYXRoLnJvdW5kKCh0aGlzLmN1c3RvbVdpZHRoICogdGhpcy5vcmlnaW5hbEhlaWdodCkgLyB0aGlzLm9yaWdpbmFsV2lkdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW1hZ2VDcm9wcGVkKGV2ZW50OiBJbWFnZUNyb3BwZWRFdmVudCkge1xyXG4gICAgdGhpcy5jcm9wcGVkSW1hZ2UgPSBldmVudC5iYXNlNjQ7XHJcbiAgICB0aGlzLmdldENyb3BwZWRBbmRVcGxvYWQodGhpcy5jcm9wcGVkSW1hZ2UsIHRoaXMubmV3QXR0YWNobWVudCk7XHJcbiAgfVxyXG5cclxuICBnZXRDcm9wcGVkQW5kVXBsb2FkKGZpbGUsIG5ld0F0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgdmFyIGZpbGU6IGFueSA9IGJhc2U2NFRvRmlsZShmaWxlKTtcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb21wcmVzc2lvbk9wdGlvbnM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wcmltZSBsJ2ltbWFnaW5lIHBhc3NhbmRvIGNvbWUgcGFyYW1ldHJpIGxlIG9wdGlvbnMgY3JlYXRlIG5lbGwnb2dnZXR0byBzb3ByYSwgZSBpbCBmaWxlIGRhbCByZWFkZXIgcHJpbmNpcGFsZVxyXG4gICAgICovXHJcbiAgICBpbWFnZUNvbXByZXNzaW9uKGZpbGUsIG9wdGlvbnMpLnRoZW4oKGZpbGVDb21wcmVzc2VkKSA9PiB7XHJcbiAgICAgIGxldCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICAgIC8vRmFjY2lvIGxhIHB1c2ggZGkgb2duaSBmaWxlIGFsbCdpbnRlcm5vIGRlbGwnYXJyYXkgZGkgZmlsZSBkZWxsJ2l0ZW0gZGEgbWFuZGFyZSBhbCBzZXJ2ZXJcclxuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdFJlYWRlciA9IDxzdHJpbmc+ZmlsZVJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgdmFyIG1hcmtlciA9IFwiO2Jhc2U2NCxcIjtcclxuICAgICAgICBuZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gcmVzdWx0UmVhZGVyLnN1YnN0cmluZyhyZXN1bHRSZWFkZXIuaW5kZXhPZihtYXJrZXIpICsgbWFya2VyLmxlbmd0aCk7XHJcbiAgICAgICAgc2VsZi5zaG93Q3JvcEltYWdlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlbGYubmV3QXR0YWNobWVudEZvcm0pIHtcclxuICAgICAgICAgIHNlbGYubmV3QXR0YWNobWVudEZvcm0uZW5hYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGVDb21wcmVzc2VkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcm90YXRlTGVmdCgpIHtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb24tLTtcclxuICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XHJcbiAgfVxyXG5cclxuICByb3RhdGVSaWdodCgpIHtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb24rKztcclxuICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZsaXBBZnRlclJvdGF0ZSgpIHtcclxuICAgIGNvbnN0IGZsaXBwZWRIID0gdGhpcy50cmFuc2Zvcm0uZmxpcEg7XHJcbiAgICBjb25zdCBmbGlwcGVkViA9IHRoaXMudHJhbnNmb3JtLmZsaXBWO1xyXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XHJcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxyXG4gICAgICBmbGlwSDogZmxpcHBlZFYsXHJcbiAgICAgIGZsaXBWOiBmbGlwcGVkSFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZsaXBIb3Jpem9udGFsKCkge1xyXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XHJcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxyXG4gICAgICBmbGlwSDogIXRoaXMudHJhbnNmb3JtLmZsaXBIXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZmxpcFZlcnRpY2FsKCkge1xyXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XHJcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxyXG4gICAgICBmbGlwVjogIXRoaXMudHJhbnNmb3JtLmZsaXBWXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8qKlxyXG4gICAqIEFubnVsbGEgbGEgc2VsZXppb25lIGRlbCBmaWxlLCBzdnVvdGFuZG8gbCdpbnB1dCBlIHJlc2V0dGFuZG8gdHV0dGUgbGUgcHJvcHJpZXTDoCBkZWxsJ0lBdHRhY2htZW50RFRPXHJcbiAgICovXHJcbiAgYWJvcnRGaWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaW1hZ2VJbnB1dCkgdGhpcy5pbWFnZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuSXNJbWFnZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IG51bGw7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZUV4dGVuc2lvbiA9IG51bGw7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPSBuZXcgQXJyYXk8SUF0dGFjaG1lbnREVE8+KCk7XHJcblxyXG4gICAgdGhpcy5jdXN0b21IZWlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5jdXN0b21XaWR0aCA9IG51bGw7XHJcbiAgICB0aGlzLm9yaWdpbmFsSGVpZ2h0ID0gbnVsbDtcclxuICAgIHRoaXMub3JpZ2luYWxXaWR0aCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dSZWZDcm9wSW1hZ2UuY2xvc2UoKTtcclxuICAgIHRoaXMucmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpO1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIGZpbGVEcm9wcGVkKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG5cclxuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMub25GaWxlQWRkZWQoeyB0YXJnZXQ6IHsgZmlsZXM6IGZpbGVzIH0gfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTZSBpbCBjYXJpY2FtZW50byBkZWwgZmlsZSBkcm9wYm94IHZhIGEgYnVvbiBmaW5lLCBsYSBmdW56aW9uZSBkaSBjYWxsYmFjayByZXN0aXR1aXNjZSB1biBhcnJheSBkaSBvZ2dldHRpLlxyXG4gIC8vIFZpZW5lIHBvaSBmYXR0YSB1bmEgWE1MSHR0cFJlcXVlc3QgY29uIHJlc3BvbnNlVHlwZSAnYmxvYicgcGVyIGNvbnZlcnRpcmUgaWwgcHJpbW8gZWxlbWVudG8gZGVsbGEgcmVzcG9uc2UgaW4gdW4gQmxvYi5cclxuICBjaG9vc2VEcm9wYm94RmlsZSgpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHJldHVybjtcclxuICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICBzdWNjZXNzOiAoZmlsZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgZmlsZXNbMF0ubGluayk7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIGBCZWFyZXIgJHtBdHRhY2htZW50SGVscGVyU2VydmljZS5kcm9wYm94Q3JlZGVudGlhbHMuYWNjZXNzVG9rZW59YCk7XHJcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiO1xyXG5cclxuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYmxvYiA9IHhoci5yZXNwb25zZTtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIGZpbGVzWzBdLm5hbWUsIHsgdHlwZTogYmxvYi50eXBlIH0pO1xyXG4gICAgICAgICAgbGV0IGZpbGVzQWRkZWQgPSBbZmlsZV07XHJcbiAgICAgICAgICB0aGlzLm9uRmlsZUFkZGVkKGZpbGVzQWRkZWQsIHRydWUpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHhoci5zZW5kKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGxpbmtUeXBlOiBcImRpcmVjdFwiLFxyXG4gICAgICBtdWx0aXNlbGVjdDogZmFsc2UsXHJcbiAgICAgIGV4dGVuc2lvbnM6IFtcIi5qcGdcIiwgXCIucG5nXCIsIFwiLnBkZlwiLCBcIi5kb2NcIiwgXCIuZG9jeFwiLCBcIi50eHRcIl1cclxuICAgIH07XHJcbiAgICBEcm9wYm94LmNob29zZShvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vIFdvcmthcm91bmQgZHJvcHpvbmU6IGRpc2FiaWxpdG8gaWwgY2xpY2sgZGVnbGkgZWxlbWVudGkgaW5jbHVzaSBuZWxsYSBkcm9wem9uZSBwZXIgZXZpdGFyZSBkaSBjbGljY2FyZSBkdWUgdm9sdGVcclxuICBvblNlbGVjdEZpbGUoZXZlbnQsIGZpbGVJbnB1dCkge1xyXG4gICAgaWYgKFxyXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50KS50YWdOYW1lID09PSBcIkJVVFRPTlwiIHx8XHJcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhZ05hbWUgPT09IFwiSU5QVVRcIiB8fFxyXG4gICAgICB0aGlzLmFkZGluZ0xpbmtNb2RlID09IHRydWVcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmaWxlSW5wdXQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcmUgaWwgZGlhbG9nbyBwZXIgbCdpbnNlcmltZW50byBkZWwgbGluay5cclxuICAgKi9cclxuICBzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKCk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGZpbGVOYW1lOiBbJyddLFxyXG4gICAgICBmaWxlUGF0aDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKCdodHRwcz86Ly8uKycpXV1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5hZGRpbmdMaW5rVGVtcGxhdGUsIHtcclxuICAgICAgd2lkdGg6ICc1MDBweCcsXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdlcXAtYXR0YWNobWVudHMtZGlhbG9nJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAvLyBDcmVhIGwnb2dnZXR0byBwZXIgaWwgbnVvdm8gbGluayBkYWkgZGF0aSBkZWwgZm9ybVxyXG4gICAgICAgIGNvbnN0IG5ld0xpbmtPYmplY3Q6IElBdHRhY2htZW50RFRPID0ge1xyXG4gICAgICAgICAgSUQ6IDAsXHJcbiAgICAgICAgICBBdHRhY2htZW50VHlwZTogQXR0YWNobWVudFR5cGUuTElOSyxcclxuICAgICAgICAgIEZpbGVOYW1lOiByZXN1bHQuZmlsZU5hbWUsXHJcbiAgICAgICAgICBGaWxlUGF0aDogcmVzdWx0LmZpbGVQYXRoLFxyXG4gICAgICAgICAgSXNJbWFnZTogZmFsc2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSBuZXdMaW5rT2JqZWN0O1xyXG4gICAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IFtuZXdMaW5rT2JqZWN0XTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlybUFkZEF0dGFjaG1lbnQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vIE1ldG9kbyBwZXIgb3R0ZW5lcmUgbGUgY2xhc3NpIENTUyBkaW5hbWljaGVcclxuICBnZXRDYXJkQ2xhc3MoYXR0OiBJQXR0YWNobWVudERUTyk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdmaWxlLXByZXZpZXcnOiB0cnVlLFxyXG4gICAgICAndXBsb2FkaW5nJzogISFhdHQuaXNVcGxvYWRpbmcsXHJcbiAgICAgICdjYXJkLXNtYWxsJzogdGhpcy5jYXJkU2l6ZSA9PT0gJ3NtYWxsJyxcclxuICAgICAgJ2NhcmQtbWVkaXVtJzogdGhpcy5jYXJkU2l6ZSA9PT0gJ21lZGl1bScsXHJcbiAgICAgICdjYXJkLWxhcmdlJzogdGhpcy5jYXJkU2l6ZSA9PT0gJ2xhcmdlJyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyBRdWVzdGEgZnVuemlvbmUgb3JhIHNpIGFwcGxpY2EgYWwgY29udGVuaXRvcmUsIG5vbiBhbGxhIHNpbmdvbGEgY2FyZC5cclxuICBnZXRQcmV2aWV3c0NvbnRhaW5lclN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgbGV0IG1pbldpZHRoID0gJzIwMHB4JzsgLy8gRGltZW5zaW9uZSBkaSBkZWZhdWx0IHBlciAnbWVkaXVtJ1xyXG5cclxuICAgIGlmICh0aGlzLmNhcmRTaXplID09PSAnc21hbGwnKSB7XHJcbiAgICAgIG1pbldpZHRoID0gJzE0MHB4JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkU2l6ZSA9PT0gJ2xhcmdlJykge1xyXG4gICAgICBtaW5XaWR0aCA9ICcyODBweCc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FyZFNpemUgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgIG1pbldpZHRoID0gYCR7dGhpcy5jdXN0b21DYXJkV2lkdGhQeH1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgJy0tY2FyZC1taW4td2lkdGgnOiBtaW5XaWR0aCB9O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUHJpbWFyeUFjdGlvbihhdHRhY2htZW50OiBJQXR0YWNobWVudERUTyk6IHZvaWQge1xyXG4gICAgLy8gU2UgaWwgZmlsZSBwdcOyIGVzc2VyZSB2aXN1YWxpenphdG8gaW4gYW50ZXByaW1hLCBhcHJpIGlsIGRpYWxvZ1xyXG4gICAgaWYgKHRoaXMuY2FuQmVQcmV2aWV3ZWQoYXR0YWNobWVudCkpIHtcclxuICAgICAgdGhpcy5vcGVuUHJldmlld0RpYWxvZyhhdHRhY2htZW50KTtcclxuICAgIH1cclxuICAgIC8vIEFsdHJpbWVudGksIGVzZWd1aSBsJ2F6aW9uZSBkaSBkZWZhdWx0IChkb3dubG9hZCBwZXIgZmlsZSwgYXByaSBwZXIgbGluaylcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnZpZXdBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIERldGVybWluZXMgaWYgYW4gYXR0YWNobWVudCBjYW4gYmUgcHJldmlld2VkIGluIHRoZSBkaWFsb2cuXHJcbiAqIEBwYXJhbSBhdHQgVGhlIGF0dGFjaG1lbnQgdG8gY2hlY2suXHJcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIHByZXZpZXcgaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbiAgY2FuQmVQcmV2aWV3ZWQoYXR0OiBJQXR0YWNobWVudERUTyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFhdHQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhc2UgMTogSXQncyBhbiBpbWFnZSB3aXRoIEJhc2U2NCBkYXRhLlxyXG4gICAgY29uc3QgaXNQcmV2aWV3YWJsZUltYWdlID0gYXR0LklzSW1hZ2UgJiYgISFhdHQuRmlsZURhdGFCYXNlNjQ7XHJcblxyXG4gICAgLy8gQ2FzZSAyOiBJdCdzIGEgUERGIHdpdGggQmFzZTY0IGRhdGEuXHJcbiAgICBjb25zdCBpc1ByZXZpZXdhYmxlUGRmID0gYXR0LkZpbGVDb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicgJiYgISFhdHQuRmlsZURhdGFCYXNlNjQ7XHJcblxyXG4gICAgLy8gQ2FzZSAzOiBJdCdzIGEgcmVtb3RlIGRvY3VtZW50IHdpdGggYSBVUkwgKGZvciBHb29nbGUgVmlld2VyKS5cclxuICAgIGNvbnN0IGlzUmVtb3RlRG9jdW1lbnQgPSAhYXR0LklzSW1hZ2UgJiYgISFhdHQuRmlsZVBhdGggJiYgISF0aGlzLnByb2R1Y3Rpb25CYXNlVXJsO1xyXG5cclxuICAgIC8vQ2FzZSA0OiBWaWRlbyAtIMOIIHVuIHZpZGVvIGUgYWJiaWFtbyBpbCBmaWxlIGJpbmFyaW8gc2FsdmF0byBpbiBMYXJnZUZpbGVcclxuICAgIGNvbnN0IGlzUHJldmlld2FibGVWaWRlbyA9IGF0dC5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpICYmICEhYXR0LkxhcmdlRmlsZTtcclxuXHJcbiAgICAvLyBBIHByZXZpZXcgaXMgcG9zc2libGUgaWYgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgYXJlIHRydWUuXHJcbiAgICByZXR1cm4gaXNQcmV2aWV3YWJsZUltYWdlIHx8IGlzUHJldmlld2FibGVQZGYgfHwgaXNSZW1vdGVEb2N1bWVudCB8fCBpc1ByZXZpZXdhYmxlVmlkZW87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQ29sdW1uSGlkZGVuKGNvbDogQXR0YWNobWVudEZpZWxkQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICAvLyAxKSBoaWRkZW5Db2x1bW5zXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db2x1bW5zPy5pbmNsdWRlcyhjb2wua2V5KSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgLy8gMikgaGlkZGVuIGRlZmluaXRvIHN1bGxhIGNvbG9ubmEgKGJvb2xlYW4gbyBmdW56aW9uZSBzZW56YSBhcmdzKVxyXG4gICAgaWYgKHR5cGVvZiBjb2wuaGlkZGVuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gISFjb2wuaGlkZGVuKCk7XHJcbiAgICByZXR1cm4gISFjb2wuaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgaXNBY3Rpb25IaWRkZW4oYWN0aW9uOiBBdHRhY2htZW50TWVudUFjdGlvbiwgYXR0PzogSUF0dGFjaG1lbnREVE8pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhpZGRlbkFjdGlvbnM/LmluY2x1ZGVzKGFjdGlvbi5rZXkpKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmFjdGlvbkhpZGRlbkZuPy4oYWN0aW9uLmtleSwgYXR0KSkgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAodHlwZW9mIGFjdGlvbi5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiAhIWFjdGlvbi5oaWRkZW4oYXR0KTtcclxuICAgIHJldHVybiAhIWFjdGlvbi5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogQXR0YWNobWVudE1lbnVBY3Rpb24sIGF0dD86IElBdHRhY2htZW50RFRPKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hY3Rpb25EaXNhYmxlZEZuPy4oYWN0aW9uLmtleSwgYXR0KSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHJldHVybiAhIWFjdGlvbi5kaXNhYmxlZChhdHQpO1xyXG5cclxuICAgIHJldHVybiAhIWFjdGlvbi5kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIGlzRGVsZXRlSGlkZGVuKGF0dDogSUF0dGFjaG1lbnREVE8pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdGlvbkhpZGRlbkZuPy4oJ2RlbGV0ZScsIGF0dCkgfHwgdGhpcy5oaWRkZW5BY3Rpb25zPy5pbmNsdWRlcygnZGVsZXRlJyk7XHJcbiAgfVxyXG5cclxuICBpc0RlbGV0ZURpc2FibGVkKGF0dDogSUF0dGFjaG1lbnREVE8pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVBY3Rpb24gfHwgISF0aGlzLmFjdGlvbkRpc2FibGVkRm4/LignZGVsZXRlJywgYXR0KTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFVuaXNjZSBsZSBjb2xvbm5lIGRpIGRlZmF1bHQgY29uIHF1ZWxsZSBjdXN0b20gZSBsZSBvcmRpbmEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cFRhYmxlQ29sdW1ucygpOiB2b2lkIHtcclxuICAgIC8vIERlZmluaWFtbyBsZSBjb2xvbm5lIHN0YW5kYXJkIGNvbiB1bmEgcG9zaXppb25lXHJcbiAgICBjb25zdCBkZWZhdWx0RmlsZUNvbHVtbjogQXR0YWNobWVudEZpZWxkQ29sdW1uID0ge1xyXG4gICAgICBrZXk6ICdmaWxlJyxcclxuICAgICAgZGlzcGxheTogJ0ZpbGUnLFxyXG4gICAgICB0eXBlOiBUeXBlQXR0YWNobWVudENvbHVtbi5URU1QTEFURSxcclxuICAgICAgZXh0ZXJuYWxUZW1wbGF0ZTogdGhpcy5kZWZhdWx0RmlsZVRlbXBsYXRlLFxyXG4gICAgICBzdHlsZXM6IHsgZmxleDogJzEgMSAwJScgfSxcclxuICAgICAgcG9zaXRpb246IDEwXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb25zQ29sdW1uOiBBdHRhY2htZW50RmllbGRDb2x1bW4gPSB7XHJcbiAgICAgIGtleTogJ2FjdGlvbnMnLFxyXG4gICAgICBkaXNwbGF5OiAnQXppb25pJyxcclxuICAgICAgdHlwZTogVHlwZUF0dGFjaG1lbnRDb2x1bW4uVEVNUExBVEUsXHJcbiAgICAgIGV4dGVybmFsVGVtcGxhdGU6IHRoaXMuZGVmYXVsdEFjdGlvbnNUZW1wbGF0ZSxcclxuICAgICAgcG9zaXRpb246IDEwMCxcclxuICAgICAgY2xhc3M6ICdjb2wtYWN0aW9ucycsXHJcbiAgICAgIHN0eWxlczogeyBmbGV4OiAnMCAwIDE1MHB4JyB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHByb2Nlc3NlZEN1c3RvbUNvbHVtbnMgPSB0aGlzLl9jdXN0b21Db2x1bW5zLm1hcChjb2wgPT4ge1xyXG4gICAgICAvLyBGbGV4IGRpIGRlZmF1bHRcclxuICAgICAgaWYgKCFjb2wuc3R5bGVzIHx8ICFjb2wuc3R5bGVzLmZsZXgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uY29sLFxyXG4gICAgICAgICAgc3R5bGVzOiB7IC4uLmNvbC5zdHlsZXMsIGZsZXg6ICcxIDEgMCUnIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb2w7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gW1xyXG4gICAgICBkZWZhdWx0RmlsZUNvbHVtbixcclxuICAgICAgZGVmYXVsdEFjdGlvbnNDb2x1bW4sXHJcbiAgICAgIC4uLnByb2Nlc3NlZEN1c3RvbUNvbHVtbnNcclxuICAgIF07XHJcblxyXG4gICAgLy8gT3JkaW5pYW1vIGwnYXJyYXkgZmluYWxlIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgICdwb3NpdGlvbidcclxuICAgIHRoaXMuX3RhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhdGhpcy5pc0NvbHVtbkhpZGRlbihjb2wpKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBvc0EgPSBhLnBvc2l0aW9uIHx8IDk5O1xyXG4gICAgICAgIGNvbnN0IHBvc0IgPSBiLnBvc2l0aW9uIHx8IDk5O1xyXG4gICAgICAgIHJldHVybiBwb3NBIC0gcG9zQjtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwTWVudUFjdGlvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWZhdWx0UHJldmlld0FjdGlvbjogQXR0YWNobWVudE1lbnVBY3Rpb24gPSB7XHJcbiAgICAgIGtleTogJ3ByZXZpZXcnLFxyXG4gICAgICBpY29uOiAndmlzaWJpbGl0eScsXHJcbiAgICAgIG5hbWU6ICdBbnRlcHJpbWEnLFxyXG4gICAgICBmbjogKGF0dCkgPT4gdGhpcy5vcGVuUHJldmlld0RpYWxvZyhhdHQpLFxyXG4gICAgICBkaXNhYmxlZDogKGF0dCkgPT4gIXRoaXMuY2FuQmVQcmV2aWV3ZWQoYXR0KSxcclxuICAgICAgcG9zaXRpb246IDEwXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHREZWxldGVBY3Rpb246IEF0dGFjaG1lbnRNZW51QWN0aW9uID0ge1xyXG4gICAgICBrZXk6ICdkZWxldGUnLFxyXG4gICAgICBpY29uOiAnZGVsZXRlJyxcclxuICAgICAgbmFtZTogJ0VsaW1pbmEnLFxyXG4gICAgICBmbjogKGF0dCkgPT4gdGhpcy5kZWxldGVBdHRhY2htZW50KGF0dCksXHJcbiAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLmRpc2FibGVBY3Rpb24sXHJcbiAgICAgIHBvc2l0aW9uOiAxMDBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWxsQWN0aW9ucyA9IFtcclxuICAgICAgZGVmYXVsdFByZXZpZXdBY3Rpb24sXHJcbiAgICAgIGRlZmF1bHREZWxldGVBY3Rpb24sXHJcbiAgICAgIC4uLnRoaXMuX2N1c3RvbU1lbnVBY3Rpb25zXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIE9yZGluaWFtbyBsJ2FycmF5IGZpbmFsZSBpbiBiYXNlIGFsbGEgcHJvcHJpZXTDoCAncG9zaXRpb24nXHJcbiAgICB0aGlzLl9zb3J0ZWRNZW51QWN0aW9ucyA9IGFsbEFjdGlvbnMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBwb3NBID0gYS5wb3NpdGlvbiB8fCA5OTtcclxuICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgIHJldHVybiBwb3NBIC0gcG9zQjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVZpZGVvVGh1bWJuYWlsKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xyXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgLy8gQ3JlYSB1biBVUkwgdGVtcG9yYW5lbyBwZXIgaWwgZmlsZSB2aWRlb1xyXG4gICAgICBjb25zdCB2aWRlb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgIHZpZGVvLnNyYyA9IHZpZGVvVXJsO1xyXG4gICAgICB2aWRlby5wcmVsb2FkID0gJ21ldGFkYXRhJztcclxuICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xyXG4gICAgICB2aWRlby5wbGF5c0lubGluZSA9IHRydWU7XHJcblxyXG4gICAgICB2aWRlby5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIFZhaSBhbCBzZWNvbmRvIDEgKHBlciBldml0YXJlIGlsIGZvdG9ncmFtbWEgbmVybyBpbml6aWFsZSlcclxuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IDE7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2aWRlby5vbnNlZWtlZCA9ICgpID0+IHtcclxuICAgICAgICAvLyBJbXBvc3RhIGxlIGRpbWVuc2lvbmkgZGVsIGNhbnZhcyB1Z3VhbGkgYWwgdmlkZW9cclxuICAgICAgICBjYW52YXMud2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcclxuXHJcbiAgICAgICAgLy8gRGlzZWduYSBpbCBmb3RvZ3JhbW1hIHN1bCBjYW52YXNcclxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLy8gRXN0cmFpIGlsIEJhc2U2NCAocXVhbGl0w6AgMC43IHBlciByaXNwYXJtaWFyZSBzcGF6aW8pXHJcbiAgICAgICAgY29uc3QgdGh1bWJuYWlsID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuNyk7XHJcblxyXG4gICAgICAgIC8vIFB1bGlzY2kgbGEgbWVtb3JpYVxyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodmlkZW9VcmwpO1xyXG4gICAgICAgIHJlc29sdmUodGh1bWJuYWlsLnNwbGl0KCcsJylbMV0pOyAvLyBSZXN0aXR1aWFtbyBzb2xvIGxhIHBhcnRlIEJhc2U2NFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdmlkZW8ub25lcnJvciA9IChlcnIpID0+IHtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHZpZGVvVXJsKTtcclxuICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wcmVzc1ZpZGVvQXBpKGZpbGU6IEZpbGUsIGNvbmZpZzogYW55KTogUHJvbWlzZTxCbG9iPiB7XHJcbiAgICAvLyBQcmVwYXJpYW1vIGlsIEZvcm1EYXRhIHBlciBpbnZpYXJlIGlsIGZpbGUgYmluYXJpbyBlIGkgcGFyYW1ldHJpIGRpIGNvbmZpZ3VyYXppb25lXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKCd2aWRlbycsIGZpbGUpO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKCdtYXhXaWR0aCcsIFN0cmluZyhjb25maWcubWF4V2lkdGggPz8gMTI4MCkpO1xyXG5cclxuICAgIGlmIChjb25maWcuY3JmICE9IG51bGwpIGZvcm1EYXRhLmFwcGVuZCgnY3JmJywgU3RyaW5nKGNvbmZpZy5jcmYpKTtcclxuICAgIGlmIChjb25maWcucHJlc2V0KSBmb3JtRGF0YS5hcHBlbmQoJ3ByZXNldCcsIGNvbmZpZy5wcmVzZXQpO1xyXG5cclxuICAgIGlmIChjb25maWcuY3JmID09IG51bGwpIHtcclxuICAgICAgZm9ybURhdGEuYXBwZW5kKCdiaXRyYXRlJywgU3RyaW5nKGNvbmZpZy5iaXRyYXRlID8/IDI1MDAwMDApKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLm1heEZwcyAhPSBudWxsKSBmb3JtRGF0YS5hcHBlbmQoJ21heEZwcycsIFN0cmluZyhjb25maWcubWF4RnBzKSk7XHJcbiAgICBpZiAoY29uZmlnLmF1ZGlvQml0cmF0ZSAhPSBudWxsKSBmb3JtRGF0YS5hcHBlbmQoJ2F1ZGlvQml0cmF0ZScsIFN0cmluZyhjb25maWcuYXVkaW9CaXRyYXRlKSk7XHJcblxyXG5cclxuICAgIC8vIFVSTCBkZWxsYSB0dWEgQVBJIEMjXHJcbiAgICBjb25zdCBhcGlVcmwgPSAnaHR0cHM6Ly90dW8tc2Vydml6aW8tYXBpLml0L2FwaS92aWRlby9jb21wcmVzcyc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gRWZmZXR0dWlhbW8gbGEgY2hpYW1hdGEuIFVzaWFtbyAnZmV0Y2gnIHBlciBzZW1wbGljaXTDoCBvIEh0dHBDbGllbnQgZGkgQW5ndWxhclxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFwaVVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk6IGZvcm1EYXRhLFxyXG4gICAgICAgIC8vIE5vdGE6IE5vbiBpbXBvc3RhcmUgQ29udGVudC1UeXBlLCBpbCBicm93c2VyIGxvIGZhcsOgIGNvcnJldHRhbWVudGUgaW5jbHVkZW5kbyBpbCBib3VuZGFyeVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yZSBzZXJ2ZXI6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmljZXZpYW1vIGlsIGZpbGUgY29tcHJlc3NvIGNvbWUgQmxvYlxyXG4gICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yZSBkdXJhbnRlIGxhIGNvbXByZXNzaW9uZSByZW1vdGE6XCIsIGVycm9yKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gU2UgcmljaGllc3RhIGxhIGdlc3Rpb25lIHNpbmdvbGEgbW9zdHJhIGlsIHB1bHNhbnRlIGRpIGNhcmljYW1lbnRvIGRpIHVuIHNpbmdvbG8gZmlsZSAtLT5cclxuQGlmKHNob3dVcGxvYWRUaXRsZSA9PSB0cnVlIHx8IGNob29zZVZpZXcgPT0gdHJ1ZSl7XHJcbjxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICBAaWYoc2hvd1VwbG9hZFRpdGxlID09IHRydWUpe1xyXG4gIDxoND57eyB1cGxvYWRUaXRsZSB9fTwvaDQ+XHJcbiAgfVxyXG4gIEBpZihjaG9vc2VWaWV3ID09IHRydWUpe1xyXG4gIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBbdmFsdWVdPVwidmlld01vZGVcIiAoY2hhbmdlKT1cInNldFZpZXdNb2RlKCRldmVudC52YWx1ZSlcIlxyXG4gICAgYXJpYS1sYWJlbD1cIk1vZGFsaXTDoCBkaSB2aXN1YWxpenphemlvbmVcIj5cclxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImNhcmRcIj48bWF0LWljb24+Z3JpZF92aWV3PC9tYXQtaWNvbj48L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwidGFibGVcIj48bWF0LWljb24+dmlld19saXN0PC9tYXQtaWNvbj48L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XHJcbiAgfVxyXG48L2Rpdj5cclxufVxyXG5cclxuPCEtLSBHZXN0aW9uZSBzaW5nb2xvIC0tPlxyXG5AaWYgKG11bHRpcGxlQXR0YWNobWVudCAhPSB0cnVlKSB7XHJcbkBpZiAoIXNpbmdsZUF0dGFjaG1lbnREcmFnQW5kRHJvcCkge1xyXG5AaWYgKCFhZGRpbmdMaW5rTW9kZSkge1xyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZEF0dGFjaG1lbnRCdXR0b25cIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbn0gQGVsc2Uge1xyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGluZ0xpbmtUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxufVxyXG59IEBlbHNlIHtcclxuPGlucHV0ICNmaWxlSW5wdXQgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIiBoaWRkZW4gKGNoYW5nZSk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCJcclxuICBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuXHJcbkBpZiAoYWxsb3dlZFR5cGVzICYmIGFsbG93ZWRUeXBlcy5pbmNsdWRlcygxKSAmJiAoIWF0dGFjaG1lbnRzTGlzdCB8fCBhdHRhY2htZW50c0xpc3QubGVuZ3RoID09IDAgfHxcclxuKGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwICYmICFhdHRhY2htZW50c0xpc3RbMF0pKSkge1xyXG5cclxuQGlmIChzaG93RHJvcEFyZWEgPT0gdHJ1ZSkge1xyXG48IS0tIEZVTEwgLS0+XHJcbkBpZiAobGF5b3V0ID09PSAnZnVsbCcpIHtcclxuXHJcbjxkaXYgY2xhc3M9XCJkcm9wYm94XCIgW2NsYXNzLmRyYWdvdmVyXT1cImRyYWdPdmVyICYmICFpc0Rpc2FibGVkXCIgW2NsYXNzLmRpc2FibGVkLWRyb3B6b25lXT1cImlzRGlzYWJsZWRcIlxyXG4gIChkcmFnb3Zlcik9XCIhaXNEaXNhYmxlZCA/IGRyYWdPdmVyID0gdHJ1ZSA6IG51bGw7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlciA9IGZhbHNlXCJcclxuICAoZHJvcCk9XCIhaXNEaXNhYmxlZCA/IChkcmFnT3ZlciA9IGZhbHNlKSA6IG51bGw7IGZpbGVEcm9wcGVkKCRldmVudClcIlxyXG4gIChjbGljayk9XCIhaXNEaXNhYmxlZCAmJiBvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCIgcm9sZT1cImJ1dHRvblwiIFthdHRyLnRhYmluZGV4XT1cImlzRGlzYWJsZWQgPyAtMSA6IDBcIlxyXG4gIChrZXlkb3duLmVudGVyKT1cIiFpc0Rpc2FibGVkICYmIGZpbGVJbnB1dC5jbGljaygpXCIgKGtleWRvd24uc3BhY2UpPVwiIWlzRGlzYWJsZWQgJiYgZmlsZUlucHV0LmNsaWNrKClcIj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC1pY29uXCI+8J+TgTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LXRleHRcIj57eyBkcm9wSGVyZUxhYmVsIH19PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtc3VidGV4dFwiPlxyXG4gICAge3sgc3VwcG9ydGVkRm9ybWF0c0xhYmVsIH19XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImJyb3dzZS1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZmlsZUlucHV0LmNsaWNrKClcIj5cclxuICAgIHt7IGJyb3dzZUZpbGVzTGFiZWwgfX1cclxuICA8L2J1dHRvbj5cclxuICA8ZGl2IGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvblwiPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikgfHwgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSAmJiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIDxhIGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImlzRGlzYWJsZWQgPyBudWxsIDogbGlua01lbnVcIlxyXG4gICAgICBbY2xhc3MuZGlzYWJsZWQtbGlua109XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICBvIGFnZ2l1bmdpIGRhIHdlYlxyXG4gICAgPC9hPlxyXG4gICAgPG1hdC1tZW51ICNsaW5rTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+bGluazwvbWF0LWljb24+XHJcbiAgICAgICAgPHNwYW4+QWdnaXVuZ2kgZGEgbGluazwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hvb3NlRHJvcGJveEZpbGUoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5jbG91ZF9xdWV1ZTwvbWF0LWljb24+XHJcbiAgICAgICAgPHNwYW4+Q2FyaWNhIGRhIERyb3Bib3g8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9tYXQtbWVudT5cclxuICAgIH1cclxuXHJcbiAgICBAZWxzZSBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpKSB7XHJcbiAgICA8YSBbY2xhc3MuZGlzYWJsZWQtbGlua109XCJpc0Rpc2FibGVkXCIgY2xhc3M9XCJzZWNvbmRhcnktYWN0aW9uLWxpbmtcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj5cclxuICAgICAgYWdnaXVuZ2kgdW4gbGlua1xyXG4gICAgPC9hPlxyXG4gICAgfVxyXG5cclxuICAgIEBlbHNlIGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIDxhIFtjbGFzcy5kaXNhYmxlZC1saW5rXT1cImlzRGlzYWJsZWRcIiBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb24tbGlua1wiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGNob29zZURyb3Bib3hGaWxlKClcIj5cclxuICAgICAgY2FyaWNhIGRhIERyb3Bib3hcclxuICAgIDwvYT5cclxuICAgIH1cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1AZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJjb21wYWN0LXVwbG9hZGVyXCIgW2NsYXNzLmRyYWdvdmVyXT1cImRyYWdPdmVyICYmICFpc0Rpc2FibGVkXCIgW2NsYXNzLmRpc2FibGVkLWRyb3B6b25lXT1cImlzRGlzYWJsZWRcIlxyXG4gIChkcmFnb3Zlcik9XCIhaXNEaXNhYmxlZCA/IGRyYWdPdmVyID0gdHJ1ZSA6IG51bGw7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlciA9IGZhbHNlXCJcclxuICAoZHJvcCk9XCIhaXNEaXNhYmxlZCA/IChkcmFnT3ZlciA9IGZhbHNlKSA6IG51bGw7IGZpbGVEcm9wcGVkKCRldmVudClcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29tcGFjdC1pY29uXCI+PG1hdC1pY29uPmZvbGRlcl9vcGVuPC9tYXQtaWNvbj48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiY29tcGFjdC10ZXh0XCIgKGNsaWNrKT1cIiFpc0Rpc2FibGVkICYmIG9uU2VsZWN0RmlsZSgkZXZlbnQsIGZpbGVJbnB1dClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21wYWN0LXRpdGxlXCI+VHJhc2NpbmEgaSBmaWxlIG8gc2VsZXppb25hIGRhbCBjb21wdXRlcjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbXBhY3Qtc3VidGl0bGVcIj57eyBzdXBwb3J0ZWRGb3JtYXRzTGFiZWwgfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiY29tcGFjdC1hY3Rpb25zXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGZpbGVJbnB1dC5jbGljaygpXCI+U2ZvZ2xpYTwvYnV0dG9uPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikgfHwgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb21wYWN0TGlua01lbnVcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+TGluazwvYnV0dG9uPlxyXG4gICAgPG1hdC1tZW51ICNjb21wYWN0TGlua01lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpKSB7IDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiPnt7IG9wZW5MaW5rTGFiZWwgfX08L2J1dHRvbj4gfVxyXG4gICAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkgeyA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiAoY2xpY2spPVwiY2hvb3NlRHJvcGJveEZpbGUoKVwiPnt7XHJcbiAgICAgICAgdXBsb2FkV2l0aERyb3Bib3hMYWJlbCB9fTwvYnV0dG9uPiB9XHJcbiAgICA8L21hdC1tZW51PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxufVxyXG59XHJcbn1cclxufVxyXG5cclxuPCEtLSBBemlvbmkgc2luZ29sbyBlbGVtZW50byAoY29tZSBwcmltYSkgLS0+XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIEBpZiAoYXR0YWNobWVudHNMaXN0ICYmIGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPiAwICYmIGF0dGFjaG1lbnRzTGlzdFswXSAmJiBzaG93QWN0aW9uQnV0dG9ucyA9PSB0cnVlKSB7XHJcbiAgPGJ1dHRvbiBjbGFzcz1cIm1iLTIgbWUtMiBlcXAtYXR0YWNobWVudHMtZG93bmxvYWQtYnRuXCIgKGNsaWNrKT1cInZpZXdBdHRhY2htZW50KGF0dGFjaG1lbnRzTGlzdFswXSlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgQGlmIChhdHRhY2htZW50c0xpc3RbMF0uQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgIH0gQGVsc2Uge1xyXG4gICAgPG1hdC1pY29uPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cclxuICAgIH1cclxuICAgIHt7IGF0dGFjaG1lbnRzTGlzdFswXS5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFID8gZG93bmxvYWRMYWJlbCA6IG9wZW5MaW5rTGFiZWwgfX1cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgQGlmIChzaG93UHJldmlldyAmJiAoIWF0dGFjaG1lbnRzTGlzdFswXS5GaWxlQ29udGVudFR5cGUgfHwgKCFhdHRhY2htZW50c0xpc3RbMF0uRmlsZUNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJylcclxuICAmJiAhYXR0YWNobWVudHNMaXN0WzBdLkZpbGVDb250ZW50VHlwZS5zdGFydHNXaXRoKCdhdWRpbycpKSkgJiYgYXR0YWNobWVudHNMaXN0WzBdLklzSW1hZ2UgPT0gdHJ1ZSkge1xyXG4gIDxidXR0b24gY2xhc3M9XCJtYi0yIG1lLTIgZXFwLWF0dGFjaG1lbnRzLXByZXZpZXctYnRuXCIgKGNsaWNrKT1cIm9wZW5QcmV2aWV3RGlhbG9nKGF0dGFjaG1lbnRzTGlzdFswXSlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgPG1hdC1pY29uPnZpc2liaWxpdHk8L21hdC1pY29uPiB7eyBwcmV2aWV3TGFiZWwgfX1cclxuICA8L2J1dHRvbj5cclxuICB9XHJcblxyXG4gIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVBY3Rpb25cIiBjbGFzcz1cIm1iLTIgZXFwLWF0dGFjaG1lbnRzLWRlbGV0ZS1idG5cIlxyXG4gICAgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudHNMaXN0WzBdKVwiIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxyXG4gICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+IHt7IGRlbGV0ZUxhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG48L2Rpdj5cclxufVxyXG5cclxuPCEtLSBHZXN0aW9uZSBtdWx0aXBsYSAtLT5cclxuQGlmIChtdWx0aXBsZUF0dGFjaG1lbnQgPT0gdHJ1ZSAmJiBzaG93RHJvcEFyZWEgPT0gdHJ1ZSkge1xyXG48aW5wdXQgI2ZpbGVJbnB1dCBpZD1cImZpbGVfYXR0YWNobWVudF9tdWx0aVwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRfbXVsdGlcIiB0eXBlPVwiZmlsZVwiIGhpZGRlblxyXG4gIChjaGFuZ2UpPVwib25GaWxlQWRkZWQoJGV2ZW50KVwiIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG5cclxuQGlmIChsYXlvdXQgPT09ICdmdWxsJykge1xyXG48ZGl2IGNsYXNzPVwiZHJvcGJveFwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlciAmJiAhaXNEaXNhYmxlZFwiIFtjbGFzcy5kaXNhYmxlZC1kcm9wem9uZV09XCJpc0Rpc2FibGVkXCJcclxuICAoZHJhZ292ZXIpPVwiIWlzRGlzYWJsZWQgPyBkcmFnT3ZlciA9IHRydWUgOiBudWxsOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChkcmFnbGVhdmUpPVwiZHJhZ092ZXIgPSBmYWxzZVwiXHJcbiAgKGRyb3ApPVwiIWlzRGlzYWJsZWQgPyAoZHJhZ092ZXIgPSBmYWxzZSkgOiBudWxsOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCJcclxuICAoY2xpY2spPVwiIWlzRGlzYWJsZWQgJiYgb25TZWxlY3RGaWxlKCRldmVudCwgZmlsZUlucHV0KVwiIHJvbGU9XCJidXR0b25cIiBbYXR0ci50YWJpbmRleF09XCJpc0Rpc2FibGVkID8gLTEgOiAwXCJcclxuICAoa2V5ZG93bi5lbnRlcik9XCIhaXNEaXNhYmxlZCAmJiBmaWxlSW5wdXQuY2xpY2soKVwiIChrZXlkb3duLnNwYWNlKT1cIiFpc0Rpc2FibGVkICYmIGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtaWNvblwiPvCfk4E8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC10ZXh0XCI+e3sgZHJvcEhlcmVMYWJlbCB9fTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LXN1YnRleHRcIj5cclxuICAgIHt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fVxyXG4gIDwvZGl2PlxyXG4gIDxidXR0b24gY2xhc3M9XCJicm93c2UtYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgICB7eyBicm93c2VGaWxlc0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHtcclxuICA8ZGl2IGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCI+XHJcbiAgICBvIDxhIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiPmFnZ2l1bmdpIHVuIGxpbms8L2E+XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxufUBlbHNle1xyXG48ZGl2IGNsYXNzPVwiY29tcGFjdC11cGxvYWRlclwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlciAmJiAhaXNEaXNhYmxlZFwiIFtjbGFzcy5kaXNhYmxlZC1kcm9wem9uZV09XCJpc0Rpc2FibGVkXCJcclxuICAoZHJhZ292ZXIpPVwiIWlzRGlzYWJsZWQgPyBkcmFnT3ZlciA9IHRydWUgOiBudWxsOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChkcmFnbGVhdmUpPVwiZHJhZ092ZXIgPSBmYWxzZVwiXHJcbiAgKGRyb3ApPVwiIWlzRGlzYWJsZWQgPyAoZHJhZ092ZXIgPSBmYWxzZSkgOiBudWxsOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtaWNvblwiPjxtYXQtaWNvbj5mb2xkZXJfb3BlbjwvbWF0LWljb24+PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGV4dFwiIChjbGljayk9XCIhaXNEaXNhYmxlZCAmJiBvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC10aXRsZVwiPlRyYXNjaW5hIGkgZmlsZSBvIHNlbGV6aW9uYSBkYWwgY29tcHV0ZXI8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21wYWN0LXN1YnRpdGxlXCI+e3sgc3VwcG9ydGVkRm9ybWF0c0xhYmVsIH19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlNmb2dsaWE8L2J1dHRvbj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29tcGFjdExpbmtNZW51XCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPkxpbms8L2J1dHRvbj5cclxuICAgIDxtYXQtbWVudSAjY29tcGFjdExpbmtNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkgeyA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj57eyBvcGVuTGlua0xhYmVsIH19PC9idXR0b24+IH1cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj57e1xyXG4gICAgICAgIHVwbG9hZFdpdGhEcm9wYm94TGFiZWwgfX08L2J1dHRvbj4gfVxyXG4gICAgPC9tYXQtbWVudT5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxufVxyXG5cclxuQGlmIChhdHRhY2htZW50c0xpc3Q/Lmxlbmd0aCA+IDAgJiYgc2hvd1N1bW1hcnkpIHtcclxuPGRpdiBjbGFzcz1cInVwbG9hZC1zdGF0c1wiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic3RhdHMtaW5mb1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC12YWx1ZVwiPnt7IGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWxhYmVsXCI+e3sgZmlsZXNMYWJlbCB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LXZhbHVlXCI+e3sgdG90YWxTaXplRm9ybWF0dGVkIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWxhYmVsXCI+e3sgdG90YWxTaXplTGFiZWwgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZmlsbFwiIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbn0gQGVsc2UgaWYoYXR0YWNobWVudHNMaXN0Py5sZW5ndGggPT0gMCl7XHJcbjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPnt7IGVtcHR5U3RhdGVMYWJlbCB9fTwvZGl2PlxyXG59XHJcblxyXG48IS0tIEdyaWdsaWEgYW50ZXByaW1lIGNhcmQgKHZhbGUgcGVyIHNpbmdvbG8gZSBtdWx0aXBsbykgLS0+XHJcbkBpZiAodmlld01vZGUgPT09ICdjYXJkJykge1xyXG5cclxuPGRpdiBjbGFzcz1cImZpbGUtcHJldmlld3NcIiBbbmdTdHlsZV09XCJnZXRQcmV2aWV3c0NvbnRhaW5lclN0eWxlKClcIj5cclxuICBAZm9yIChhdHQgb2YgYXR0YWNobWVudHNMaXN0OyB0cmFjayBhdHQuSUQpIHtcclxuICA8ZGl2IFtuZ0NsYXNzXT1cImdldENhcmRDbGFzcyhhdHQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1pbWctY29udGFpbmVyXCIgKGNsaWNrKT1cIiFhdHQuaXNVcGxvYWRpbmcgJiYgaGFuZGxlUHJpbWFyeUFjdGlvbihhdHQpXCI+XHJcblxyXG4gICAgICBAaWYgKGF0dC5Jc0ltYWdlIHx8IGF0dC5GaWxlVGh1bWJuYWlsQmFzZTY0KSB7XHJcbiAgICAgIDxpbWcgY2xhc3M9XCJwcmV2aWV3LWltZ1wiIFtzcmNdPVwiJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIChhdHQuRmlsZVRodW1ibmFpbEJhc2U2NCB8fCBhdHQuRmlsZURhdGFCYXNlNjQpXCJcclxuICAgICAgICBbYWx0XT1cImF0dC5GaWxlTmFtZVwiIC8+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pY29uXCI+PGkgW25nQ2xhc3NdPVwiZ2V0QXR0YWNobWVudEljb24oYXR0KVwiPjwvaT48L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctYWN0aW9uLW92ZXJsYXlcIj5cclxuICAgICAgICBAaWYgKGF0dC5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSB7XHJcbiAgICAgICAgPG1hdC1pY29uPnBsYXlfYXJyb3c8L21hdC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSBpZiAoYXR0LklzSW1hZ2UgJiYgY2FuQmVQcmV2aWV3ZWQoYXR0KSkge1xyXG4gICAgICAgIDxtYXQtaWNvbj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKGF0dC5GaWxlQ29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnICYmIGNhbkJlUHJldmlld2VkKGF0dCkpIHtcclxuICAgICAgICA8bWF0LWljb24+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSBpZiAoYXR0LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgIDxtYXQtaWNvbj5vcGVuX2luX25ldzwvbWF0LWljb24+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLW5hbWVcIiBbdGl0bGVdPVwiYXR0LkZpbGVOYW1lXCI+e3sgYXR0LkZpbGVOYW1lIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICBAaWYoIWlzRGVsZXRlSGlkZGVuKGF0dCkpe1xyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJyZW1vdmUtYnRuXCIgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnQoYXR0KVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJhdHQuaXNVcGxvYWRpbmcgfHwgaXNEZWxldGVEaXNhYmxlZChhdHQpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChhdHQuaXNVcGxvYWRpbmcpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG59IEBlbHNlIGlmKHZpZXdNb2RlID09PSAndGFibGUnICYmIGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoID4gMCkge1xyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0YWJsZS12aWV3LWNvbnRhaW5lclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XHJcbiAgICBAZm9yIChjb2wgb2YgX3RhYmxlQ29sdW1uczsgdHJhY2sgY29sLmtleSkge1xyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWNlbGxcIiBbc3R5bGUuZmxleF09XCJjb2wuc3R5bGVzPy5mbGV4XCIgW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+XHJcbiAgICAgIHt7IGNvbC5kaXNwbGF5IH19XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgQGZvciAoYXR0IG9mIGF0dGFjaG1lbnRzTGlzdDsgdHJhY2sgYXR0LklEKSB7XHJcbiAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiPlxyXG5cclxuICAgIEBmb3IgKGNvbCBvZiBfdGFibGVDb2x1bW5zOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2VsbFwiIFtzdHlsZS5mbGV4XT1cImNvbC5zdHlsZXM/LmZsZXhcIiBbbmdDbGFzc109XCJjb2wuY2xhc3NcIj5cclxuXHJcbiAgICAgIEBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcblxyXG4gICAgICBAY2FzZSAoJ3RlbXBsYXRlJykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidGVtcGxhdGUtd3JhcHBlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sLmV4dGVybmFsVGVtcGxhdGVcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBhdHQgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAY2FzZSAoJ2RhdGUnKSB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWV0YWRhdGEtdmFsdWVcIj57eyBhdHRbY29sLmtleV0gfCBkYXRlOidkZC9NTS95eXl5JyB9fTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgICBAZGVmYXVsdCB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWV0YWRhdGEtdmFsdWVcIj57eyBhdHRbY29sLmtleV0gfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxufVxyXG5cclxuPCEtLSBOb3RpZmljYSB0b2FzdCAtLT5cclxuPGRpdiBjbGFzcz1cInVwbG9hZC1ub3RpZmljYXRpb25cIiBbY2xhc3Muc2hvd109XCJ0b2FzdD8udmlzaWJsZVwiIFtjbGFzcy5zdWNjZXNzXT1cInRvYXN0Py50eXBlID09PSAnc3VjY2VzcydcIlxyXG4gIFtjbGFzcy5lcnJvcl09XCJ0b2FzdD8udHlwZSA9PT0gJ2Vycm9yJ1wiPlxyXG4gIDxzcGFuPnt7IHRvYXN0Py50ZXh0IH19PC9zcGFuPlxyXG4gIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvZ3Jlc3NcIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWxlVGVtcGxhdGUgbGV0LWF0dD5cclxuICA8aSBjbGFzcz1cImZpbGUtaWNvbi1zbWFsbFwiIFtuZ0NsYXNzXT1cImdldEF0dGFjaG1lbnRJY29uKGF0dClcIj48L2k+XHJcbiAgPGRpdiBjbGFzcz1cImZpbGUtaW5mby10ZXh0XCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpbGUtbmFtZS10YWJsZVwiPnt7IGF0dC5GaWxlTmFtZSB9fTwvc3Bhbj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10eXBlLXRhYmxlXCI+e3sgYXR0LkZpbGVFeHRlbnNpb24gfHwgJ0xpbmsnIH19PC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QWN0aW9uc1RlbXBsYXRlIGxldC1hdHQ+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImhhbmRsZVByaW1hcnlBY3Rpb24oYXR0KVwiXHJcbiAgICBbbWF0VG9vbHRpcF09XCJhdHQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSA/ICdSaXByb2R1Y2kgdmlkZW8nIDogJ1Zpc3VhbGl6emEvU2NhcmljYSdcIj5cclxuXHJcbiAgICA8bWF0LWljb24+XHJcbiAgICAgIEBpZiAoYXR0LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykpIHtcclxuICAgICAgcGxheV9hcnJvd1xyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAge3sgYXR0LkF0dGFjaG1lbnRUeXBlID09PSBBdHRhY2htZW50VHlwZS5GSUxFID8gJ2Rvd25sb2FkJyA6ICdvcGVuX2luX25ldycgfX1cclxuICAgICAgfVxyXG4gICAgPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgQGlmICghaGlkZGVuQWN0aW9ucy5pbmNsdWRlcygnYWN0aW9uc01lbnUnKSkge1xyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25zTWVudVwiIG1hdFRvb2x0aXA9XCJBbHRyZSBvcHppb25pXCI+XHJcbiAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuICB9XHJcblxyXG4gIDxtYXQtbWVudSAjYWN0aW9uc01lbnU9XCJtYXRNZW51XCI+XHJcbiAgICBAZm9yIChhY3Rpb24gb2YgX3NvcnRlZE1lbnVBY3Rpb25zOyB0cmFjayBhY3Rpb24ubmFtZSkge1xyXG4gICAgQGlmICghaXNBY3Rpb25IaWRkZW4oYWN0aW9uLCBhdHQpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFjdGlvbi5mbihhdHQpXCIgW2Rpc2FibGVkXT1cImlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uLCBhdHQpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbY29sb3JdPVwiYWN0aW9uLmljb24gPT09ICdkZWxldGUnID8gJ3dhcm4nIDogdW5kZWZpbmVkXCI+XHJcbiAgICAgICAge3sgYWN0aW9uLmljb24gfX1cclxuICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4+e3sgYWN0aW9uLm5hbWUgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIH1cclxuICA8L21hdC1tZW51PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nQ3JvcEltYWdlPlxyXG4gIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBoaWRkZW47IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGhlaWdodDogMTAwJTsgbWluLWhlaWdodDogMDsgZmxleDogMSAxIGF1dG87XCJcclxuICAgIFtuZ0NsYXNzXT1cImNyb3BEaWFsb2dDbGFzc1wiPlxyXG4gICAgPCEtLSBAaWYgKHNob3dDcm9wSW1hZ2UgPT0gdHJ1ZSkgeyAtLT5cclxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3JvcHBpZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZm9ybTogbmV3QXR0YWNobWVudEZvcm0gfVwiPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tIH0gLS0+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNpbmxpbmVQcmV2aWV3VGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiPlxyXG4gIEBpZiAocm93LkF0dGFjaG1lbnRUeXBlICE9IEF0dGFjaG1lbnRUeXBlLkxJTksgJiYgcm93LklzSW1hZ2UpIHtcclxuICA8ZGl2IGNsYXNzPVwiaW5saW5lLXByZXZpZXctY29udGFpbmVyXCIgKGNsaWNrKT1cIm9wZW5QcmV2aWV3RGlhbG9nKHJvdylcIj5cclxuICAgIDxpbWcgW3NyY109XCInZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyAocm93LkZpbGVUaHVtYm5haWxCYXNlNjQgPyByb3cuRmlsZVRodW1ibmFpbEJhc2U2NCA6IHJvdy5GaWxlRGF0YUJhc2U2NClcIiAvPlxyXG4gIDwvZGl2PlxyXG4gIH0gQGVsc2UgaWYgKHJvdy5BdHRhY2htZW50VHlwZSAhPSBBdHRhY2htZW50VHlwZS5MSU5LICYmICFyb3cuSXNJbWFnZSkge1xyXG4gIDxkaXYgY2xhc3M9XCJpbmxpbmUtcHJldmlldy1jb250YWluZXJcIiAoY2xpY2spPVwib3BlblByZXZpZXdEaWFsb2cocm93KVwiPlxyXG4gICAgPGkgW25nQ2xhc3NdPVwiZ2V0QXR0YWNobWVudEljb24ocm93KVwiPjwvaT5cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dQcmV2aWV3PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2Rlcm4tZGlhbG9nLWNvbnRhaW5lclwiPiBAaWYgKHNlbGVjdGVkQXR0YWNobWVudCkge1xyXG4gICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwicHJldmlldy1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdFwiPnt7IHByZXZpZXdMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10XCI+e3sgc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cImNsb3NlLWJ0blwiPjxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1jb250ZW50IGNsYXNzPVwicHJldmlldy1jb250ZW50LWFyZWFcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXZpZXdlci13cmFwcGVyXCI+XHJcbiAgICAgICAgQGlmIChzZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJtYWluLXByZXZpZXctbWVkaWFcIlxyXG4gICAgICAgICAgW3NyY109XCInZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyAoc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0IHx8IHNlbGVjdGVkQXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0KVwiXHJcbiAgICAgICAgICBbYWx0XT1cInNlbGVjdGVkQXR0YWNobWVudC5GaWxlTmFtZVwiIC8+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIGlmIChzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSkge1xyXG4gICAgICAgIDx2aWRlbyBjb250cm9scyBhdXRvcGxheSBwbGF5c2lubGluZSBjbGFzcz1cIm1haW4tcHJldmlldy1tZWRpYSB2aWRlby1wbGF5ZXJcIj5cclxuICAgICAgICAgIDxzb3VyY2UgW3NyY109XCJzZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybFwiIFt0eXBlXT1cInNlbGVjdGVkQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGVcIj5cclxuICAgICAgICAgIElsIHR1byBicm93c2VyIG5vbiBzdXBwb3J0YSBpbCB2aWRlby5cclxuICAgICAgICA8L3ZpZGVvPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlmcmFtZS1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxpZnJhbWUgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZS1tb2Rlcm5cIiBbc3JjXT1cInNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsXCJcclxuICAgICAgICAgICAgW3RpdGxlXT1cInNlbGVjdGVkQXR0YWNobWVudC5GaWxlTmFtZVwiPjwvaWZyYW1lPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCIgY2xhc3M9XCJwcmV2aWV3LWFjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgY2xhc3M9XCJidG4tY2xvc2VcIj5DaGl1ZGk8L2J1dHRvbj5cclxuICAgICAgQGlmIChzZWxlY3RlZEF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgIT09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidmlld0F0dGFjaG1lbnQoc2VsZWN0ZWRBdHRhY2htZW50KVwiIGNsYXNzPVwiYnRuLWRvd25sb2FkXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj4gPHNwYW4+e3sgZG93bmxvYWRMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjwhLS0gVEVNUExBVEUgUEVSIElMIFBVTFNBTlRFIERJIEFHR0lVTlRBIE5VT1ZPIEFMTEVHQVRPIC0tPlxyXG48bmctdGVtcGxhdGUgI2FkZEF0dGFjaG1lbnRCdXR0b24+XHJcbiAgPGlucHV0ICNmaWxlSW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIlxyXG4gICAgKGNoYW5nZSk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCIgW2FjY2VwdF09XCJhY2NlcHRlZEZpbGVUeXBlc1wiIFttdWx0aXBsZV09XCJsb2FkTXVsdGlwbGVGaWxlc1wiIC8+XHJcblxyXG4gIEBpZiAoYWxsb3dlZFR5cGVzICYmIGFsbG93ZWRUeXBlcy5sZW5ndGggPT0gMSAmJiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgfHwgIWF0dGFjaG1lbnRzTGlzdCB8fFxyXG4gIGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fCAoYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtYi00IG1lLTUgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIChjbGljayk9XCJhZGRGaWxlKGFsbG93ZWRUeXBlc1swXSwgZmlsZUlucHV0KVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlc1swXSA9PSAxKSB7IDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPiB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlc1swXSA9PSAyKSB7IDxpIGNsYXNzPVwiZmFzIGZhLWxpbmtcIj48L2k+IH1cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzWzBdID09IDMpIHsgPGkgY2xhc3M9XCJmYS1icmFuZHMgZmEtZHJvcGJveFwiPjwvaT4gfVxyXG4gICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPlxyXG4gICAgICB7eyBhbGxvd2VkVHlwZXNbMF0gPT0gMSA/IChhZGRCdXR0b25MYWJlbCArIFwiIGZpbGVcIikgOiBhbGxvd2VkVHlwZXNbMF0gPT0gMiA/IChhZGRCdXR0b25MYWJlbCArIFwiIGxpbmtcIikgOlxyXG4gICAgICB1cGxvYWRXaXRoRHJvcGJveExhYmVsIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG5cclxuICBAaWYgKCFzZXBhcmF0ZWRVcGxvYWRCdXR0b25zICYmIGFsbG93ZWRUeXBlcyAmJiBhbGxvd2VkVHlwZXMubGVuZ3RoID4gMSAmJiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgfHxcclxuICAhYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fCAoYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtYi00IG1lLTUgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJhdHRhY2htZW50VHlwZU1lbnVcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxyXG4gICAgQGlmIChtdWx0aXBsZUF0dGFjaG1lbnQgIT0gdHJ1ZSkgeyA8bWF0LWljb24+Y2xvdWRfdXBsb2FkPC9tYXQtaWNvbj4gfSBAZWxzZSB7IDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiB9XHJcbiAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAwcHhcIj57eyBhZGRCdXR0b25MYWJlbCB9fTwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPG1hdC1tZW51ICNhdHRhY2htZW50VHlwZU1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICA8aW5wdXQgI2ltYWdlSW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDEpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImltYWdlSW5wdXQuY2xpY2soKVwiIGNsYXNzPVwiZXFwLWF0dGFjaG1lbnRzLWZpbGUtYnRuXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGVcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5GaWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cInN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiIGNsYXNzPVwiZXFwLWF0dGFjaG1lbnRzLWxpbmstYnRuXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWxpbmtcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5MaW5rPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaG9vc2VEcm9wYm94RmlsZSgpXCIgY2xhc3M9XCJlcXAtYXR0YWNobWVudHMtbGluay1idG5cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYS1icmFuZHMgZmEtZHJvcGJveFwiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkRyb3Bib3g8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICA8L21hdC1tZW51PlxyXG4gIH1cclxuXHJcbiAgQGlmIChzZXBhcmF0ZWRVcGxvYWRCdXR0b25zICYmIGFsbG93ZWRUeXBlcyAmJiBhbGxvd2VkVHlwZXMubGVuZ3RoID4gMSAmJiAobXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgfHxcclxuICAhYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fCAoYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcbiAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMSkpIHtcclxuICAgIDxidXR0b24gKGNsaWNrKT1cImltYWdlSW5wdXQuY2xpY2soKVwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jbG91ZC11cGxvYWRcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5GaWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICA8aW5wdXQgI2ltYWdlSW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgaWQ9XCJmaWxlX2F0dGFjaG1lbnRcIiBuYW1lPVwiZmlsZV9hdHRhY2htZW50XCIgdHlwZT1cImZpbGVcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpKSB7XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGVxcC1hdHRhY2htZW50cy1hZGQtYnRuXCIgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWxpbmtcIj48L2k+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5MaW5rPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2hvb3NlRHJvcGJveEZpbGUoKVwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYS1icmFuZHMgZmEtZHJvcGJveFwiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkRyb3Bib3g8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNjcm9wcGllVGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGVybi1kaWFsb2ctY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJwcmV2aWV3LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtZ3JvdXBcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpbi10XCI+e3sgY3JvcExhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXRcIj5SZWdvbGEgbGUgZGltZW5zaW9uaSBlIGwnb3JpZW50YW1lbnRvPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhYm9ydEZpbGUoKVwiIGNsYXNzPVwiY2xvc2UtYnRuXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJwcmV2aWV3LWNvbnRlbnQtYXJlYVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY3JvcC10b29sYmFyXCI+XHJcbiAgICAgICAgQGlmIChjcm9wT3B0aW9ucy5pbmNsdWRlcygxKSkge1xyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cInJvdGF0ZUxlZnRMYWJlbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicm90YXRlTGVmdCgpXCI+PG1hdC1pY29uPnJvdGF0ZV9sZWZ0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJyb3RhdGVSaWdodExhYmVsXCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3RhdGVSaWdodCgpXCI+PG1hdC1pY29uPnJvdGF0ZV9yaWdodDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoY3JvcE9wdGlvbnMuaW5jbHVkZXMoMikpIHtcclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCJmbGlwSG9yaW56b250YWxMYWJlbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiPjxtYXQtaWNvbj5mbGlwX2hvcml6b250YWw8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cImZsaXBWZXJ0aWNhbExhYmVsXCJcclxuICAgICAgICAgIChjbGljayk9XCJmbGlwVmVydGljYWwoKVwiPjxtYXQtaWNvbj5mbGlwX3ZlcnRpY2FsPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlJlc2V0XCJcclxuICAgICAgICAgIChjbGljayk9XCJyZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKClcIj48bWF0LWljb24+cmVwbGF5PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtdmlld2VyLXdyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3JvcC1jb250YWluZXItbW9kZXJuXCI+XHJcbiAgICAgICAgICA8aW1hZ2UtY3JvcHBlciBbaW1hZ2VGaWxlXT1cInNlbGVjdGVkRmlsZVwiIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCIgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCJcclxuICAgICAgICAgICAgW3RyYW5zZm9ybV09XCJ0cmFuc2Zvcm1cIiBmb3JtYXQ9XCJwbmdcIiAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCIgW3Jlc2l6ZVRvV2lkdGhdPVwiY3VzdG9tV2lkdGhcIlxyXG4gICAgICAgICAgICBbcmVzaXplVG9IZWlnaHRdPVwiY3VzdG9tSGVpZ2h0XCIgW291dHB1dF09XCInYmFzZTY0J1wiIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwidHJ1ZVwiIFtvbmx5U2NhbGVEb3duXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbYWxpZ25JbWFnZV09XCInY2VudGVyJ1wiPlxyXG4gICAgICAgICAgPC9pbWFnZS1jcm9wcGVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIiBjbGFzcz1cInByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImFib3J0RmlsZSgpXCIgY2xhc3M9XCJidG4tY2xvc2VcIj57eyBhYm9ydExhYmVsIH19PC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNvbmZpcm1BZGRBdHRhY2htZW50KClcIiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+IHt7IGNvbmZpcm1MYWJlbCB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcblxyXG48IS0tIFRFTVBMQVRFIFBFUiBGT1JNIERJIEFHR0lVTlRBIERJIFVOIExJTksgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYWRkaW5nTGlua1RlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2Rlcm4tZGlhbG9nLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwicHJldmlldy1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR5cGUtaWNvbi13cmFwcGVyXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+bGluazwvbWF0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWdyb3VwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdFwiPkFnZ2l1bmdpIHVuIGxpbms8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdFwiPkluc2VyaXNjaSBsJ1VSTCBkZWxsYSByaXNvcnNhIHdlYjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgY2xhc3M9XCJjbG9zZS1idG5cIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cImFkZC1saW5rLW1vZGVybi1jb250ZW50XCI+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwibmV3QXR0YWNobWVudEZvcm1cIiBjbGFzcz1cImFkZC1saW5rLWZvcm1cIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctMTAwIG10LTNcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+VVJMIGRlbCBjb2xsZWdhbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWxlUGF0aFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly8uLi5cIiByZXF1aXJlZD5cclxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+bGFuZ3VhZ2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+VGl0b2xvIChvcHppb25hbGUpPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZmlsZU5hbWVcIiBwbGFjZWhvbGRlcj1cIkVzLiBEb2N1bWVudG8gUHJvZ2V0dG9cIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+dGl0bGU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIiBjbGFzcz1cInByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cImJ0bi1jbG9zZVwiPkFubnVsbGE8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbbWF0LWRpYWxvZy1jbG9zZV09XCJuZXdBdHRhY2htZW50Rm9ybS52YWx1ZVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm5ld0F0dGFjaG1lbnRGb3JtLmludmFsaWRcIiBjbGFzcz1cImJ0bi1kb3dubG9hZFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZ2dpdW5naVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
1602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1hdHRhY2htZW50cy9zcmMvbGliL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtYXR0YWNobWVudHMvc3JjL2xpYi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRSxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQXFCLHFCQUFxQixFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBbUUsY0FBYyxFQUFrQyxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBS3RGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDeEIsSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJ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RSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCBpbWFnZUNvbXByZXNzaW9uIGZyb20gXCJicm93c2VyLWltYWdlLWNvbXByZXNzaW9uXCI7XHJcbmltcG9ydCB7IGJhc2U2NFRvRmlsZSwgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlQ3JvcHBlckNvbXBvbmVudCwgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tIFwibmd4LWltYWdlLWNyb3BwZXJcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudEhlbHBlclNlcnZpY2UgfSBmcm9tIFwiLi9oZWxwZXJzL2F0dGFjaG1lbnQuaGVscGVyXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkU2l6ZSwgQXR0YWNobWVudEZpZWxkQ29sdW1uLCBBdHRhY2htZW50TWVudUFjdGlvbiwgQXR0YWNobWVudFR5cGUsIENyb3BPcHRpb25FbnVtLCBJQXR0YWNobWVudERUTywgVHlwZUF0dGFjaG1lbnRDb2x1bW4gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IElPcHRpb25zIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JT3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2VxcC1hdHRhY2htZW50LWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEVxcEF0dGFjaG1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvZXFwLWF0dGFjaG1lbnQuc2VydmljZVwiO1xyXG5cclxuZGVjbGFyZSB2YXIgRHJvcGJveDogYW55O1xyXG5cclxuY29uc3QgdG9CYXNlNjQgPSAoZmlsZSkgPT5cclxuICBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4gcmVqZWN0KGVycm9yKTtcclxuICB9KTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImVxcC1hdHRhY2htZW50c1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXFwQXR0YWNobWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8vI3JlZ2lvbiBASW5wdXQgZGVsIGNvbXBvbmVudGVcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgbmFzY29uZGUgbGEgY29sb25uYSBwZXIgbGUgYXppb25pIHN1bGwnYWxsZWdhdG8gKG5lbCBjYXNvIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwiZGlzYWJsZUFjdGlvblwiKSBkaXNhYmxlQWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgbW9zdHJhIGlsIHRpdG9sbyBuZWxsJ2hlYWRlciBuZWwgY2FzbyBpbiBjdWkgXCJtdWx0aXBsZUF0dGFjaG1lbnRcIiDDqCBUUlVFIChcIkVsZW5jbyBhbGxlZ2F0aVwiIGRpIGRlZmF1bHQpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dIZWFkZXJcIikgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcmdlbnRlIGRhdGkgZGEgdmlzdWFsaXp6YXJlLiBOZWwgY2FzbyBzaSB2dW9sZSBnZXN0aXJlIHVuIHNpbmdvbG8gYWxsZWdhdG8gdmEgcGFzc2F0byBpbiBvZ25pIGNhc28gY29tZSBBcnJheS5cclxuICAgKi9cclxuICBASW5wdXQoXCJhdHRhY2htZW50c0xpc3RcIikgYXR0YWNobWVudHNMaXN0OiBBcnJheTxJQXR0YWNobWVudERUTz4gPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBOZWwgY2FzbyBzaSB2dW9sZSBnZXN0aXJlIHVuIHNvbG8gZWxlbWVudG8gc2VuemEgcGFzc2FybG8gY29tZSBhcnJheSwgbG8gcGFzc28gY29tZSBzaW5nb2xvIGFsbGVnYXRvIGUgZ2VzdGlzY28gbmVsbGEgbGlicmVyaWEgbCdhcnJheS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaW5nbGVBdHRhY2htZW50XCIpIHNpbmdsZUF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBub24gbW9zdHJhIGxhIE1hdENhcmQgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dNYXRDYXJkXCIpIHNob3dNYXRDYXJkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgRkFMU0UgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIHNvbG8gaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlLCB1bmEgdm9sdGEgY2FyaWNhdG8gaWwgZmlsZSBpbnZvY2EgbCdldmVudG8gZGkgb3V0cHV0IFwibG9jYWxFZGl0ZWRBdHRhY2htZW50c1wiLlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIGwnZWxlbmNvIGRpIHR1dHRpIGdsaSBhbGxlZ2F0aSByaWNldnV0byBuZWwgcGFyYW1ldHJvIFwiYXR0YWNobWVudHNMaXN0XCIuXHJcbiAgICovXHJcbiAgQElucHV0KFwibXVsdGlwbGVBdHRhY2htZW50XCIpIG11bHRpcGxlQXR0YWNobWVudDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGFzc3VtZSBpbCB2YWxvcmUgVFJVRSBhbGxvcmEgc2Fyw6AgcG9zc2liaWxlIGNhcmljYXJlIHBpw7kgZmlsZSBwZXIgdm9sdGEuIFF1ZXN0YSBmdW56aW9uYWxpdMOgIMOoIGF0dGl2YVxyXG4gICAqIFNPTE8gc2Ugc2kgZ2VzdGlzY29ubyBhbGxlZ2F0aSBtdWx0aXBsaSwgcXVpbmRpIHNlIGwnaW5wdXQgJ211bHRpcGxlQXR0YWNobWVudCcgYXNzdW1lIGlsIHZhbG9yZSBUUlVFLCBhbHRyaW1lbnRpIMOoIHNlbXByZSBkaXNhYmlsaXRhdGEuXHJcbiAgICovXHJcbiAgQElucHV0KFwibG9hZE11bHRpcGxlRmlsZXNcIikgbG9hZE11bHRpcGxlRmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3N0YSBpbCBtZXNzYWdnaW8gZGEgdmlzdWFsaXp6YXJlIG5lbCBjYXNvIGluIGN1aSBsYSB0YWJlbGxhIGRlZ2xpIGFsbGVnYXRpIChuZWwgY2FzbyBpbiBjdWkgXCJtdWx0aXBsZUF0dGFjaG1lbnRcIiDDqCBUUlVFKSDDqCB2dW90YS5cclxuICAgKi9cclxuICBASW5wdXQoXCJlbXB0eVRhYmxlTWVzc2FnZVwiKSBlbXB0eVRhYmxlTWVzc2FnZTogc3RyaW5nID0gXCJOZXNzdW4gZGF0byB0cm92YXRvXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIHBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIHNvbHRhbnRvIGZpbGUgZGkgdGlwbyBpbW1hZ2luZSwgYXZlbnRlIHVubyBkZWkgbWltZXR5cGVcclxuICAgKiBzcGVjaWZpY2F0aSBkZW50cm8gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuXHJcbiAgICogU2UgRkFMU0UgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgcXVhbHNpYXNpIHRpcG8gZGkgZmlsZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFsbG93T25seUltYWdlc1wiKSBhbGxvd09ubHlJbWFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU3BlY2lmaWNhIGkgdGlwaSBkaSBmaWxlIGNoZSDDqCBwb3NzaWJpbGUgY2FyaWNhcmVcclxuICAgKi9cclxuICBASW5wdXQoXCJhY2NlcHRlZEZpbGVUeXBlc1wiKSBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIGRpc2FiaWxpdGEgaWwgcHVsc2FudGUgZGkgQWdnaXVudGEgYWxsZWdhdG8gKGEgcHJlc2NpbmRlcmUgZGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvIFwibXVsdGlwbGVBdHRhY2htZW50XCIpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImlzRGlzYWJsZWRcIikgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBNb3N0cmEvbmFzY29uZGUgbGEgY29sb25uYSBwZXIgdmlzdWFsaXp6YXJlIGwnYW50ZXByaW1hIGRlaSBmaWxlIG5lbGxhIHRhYmVsbGEgKGNhc28gbXVsdGlwbGVBdGF0Y2htZW50cyA9IHRydWUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dJbmxpbmVQcmV2aWV3XCIpIHNob3dJbmxpbmVQcmV2aWV3OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZHBvaW50IGRhIGNoaWFtYXJlIHBlciByZWN1ZXByYXJlIGwnSUF0dGFjaG1lbnREVE8gY29tcGxldG8gZGEgdmVkZXJlIG5lbGwnYW50ZXByaW1hLiBMYSBjaGlhbWF0YSBzYXLDoCBpbiBQT1NUIGUgbmVsIGJvZHlcclxuICAgKiBjb250ZXJyw6AgbCdJQXR0YWNobWVudERUTyBzZWxlemlvbmF0byBkYWxsJ3V0ZW50ZS5cclxuICAgKiBMYSBjaGlhbWF0YSB2aWVuZSBlc2VndWl0YSBzb2xvIHBlciBsJ2FudGVwcmltYSBkZWxsZSBpbW1hZ2luaSBlc3NlbmRvIG5lY2Vzc2FyaW8gaWwgYmFzZTY0IGNvbXBsZXRvIGRlbGwnaW1tYWdpbmUgYSBkaW1lbnNpb25lIHJlYWxlLlxyXG4gICAqIFBlciBkb2N1bWVudGkvbGluayBiYXN0YSBjaGUgc2lhIHBvcG9sYXRhIGxhIHByb3ByaWV0w6AgRmlsZVBhdGggZGkgSUF0dGFjaG1lbnREVE8uXHJcbiAgICovXHJcbiAgQElucHV0KFwiZ2V0QXR0YWNobWVudEVuZHBvaW50XCIpIGdldEF0dGFjaG1lbnRFbmRwb2ludDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogSG9zdG5hbWUgZGVsbCdhbWJpZW50ZSBkaSBwcm9kdXppb25lIGRlbGwnYXBwbGljYXRpdm8uIE5lY2Vzc2FyaW8gcGVyIHZpc3VhbGl6emFyZSBsJ2FudGVwcmltYSBkZWkgZG9jdW1lbnRpXHJcbiAgICogdHJhbWl0ZSBpbCB2aWV3ZXIgZGkgZ29vZ2xlLlxyXG4gICAqIE5PVEE6IFBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgw6ggbmVjZXNzYXJpbyBjaGUgbGEgcHJvcmlldMOgIEZpbGVQYXRoIGRlbGwnSUF0dGFjaG1lbnREVE8gc2lhIHBvcG9sYXRhIGUgY2hlXHJcbiAgICogc2lhIGFiaWxpdGF0byBsJ2FjY2Vzc28gYWxsYSBjYXJ0ZWxsYSBzdWwgc2VydmVyIHRyYW1pdGUgaG9zdG5hbWUuXHJcbiAgICovXHJcbiAgQElucHV0KFwicHJvZHVjdGlvbkJhc2VVcmxcIikgcHJvZHVjdGlvbkJhc2VVcmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wemlvbmkgcGVyIGxhIGNvbXByZXNzaW9uZSBkZWxsZSBpbW1hZ2luaSBjYXJpY2F0ZS5cclxuICAgKi9cclxuICBASW5wdXQoXCJjb21wcmVzc2lvbk9wdGlvbnNcIikgY29tcHJlc3Npb25PcHRpb25zOiBJT3B0aW9ucyA9IHtcclxuICAgIG1heFNpemVNQjogMC41LFxyXG4gICAgbWF4V2lkdGhPckhlaWdodDogMTkyMCxcclxuICAgIHVzZVdlYldvcmtlcjogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IGRpIEF0dGFjaG1lbnRUeXBlIGNoZSBzaSBwb3Nzb25vIGFnZ2l1bmdlcmVcclxuICAgKi9cclxuICBASW5wdXQoXCJhbGxvd2VkVHlwZXNcIikgYWxsb3dlZFR5cGVzOiBBcnJheTxBdHRhY2htZW50VHlwZT4gPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOS107XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSBzZSBsYSBlcXAtdGFibGUgY29udGVuZW50ZSBsJ2VsZW5jbyBkZWdsaSBhbGxlZ2F0aSB1dGlsaXp6YVxyXG4gICAqIGlsIG11bHRpbGluZ3VhIG9wcHVyZSBub1xyXG4gICAqL1xyXG4gIEBJbnB1dChcImlzRXFwVGFibGVNdWx0aUxhbmd1YWdlXCIpIGlzRXFwVGFibGVNdWx0aUxhbmd1YWdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSwgaW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgc2UgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvXHJcbiAgICogZGVnbGkgYWxsZWdhdGkgZGV2ZSBlc3NlcmUgcGFnaW5hdGEgb3BwdXJlIG5vXHJcbiAgICovXHJcbiAgQElucHV0KFwidGFibGVQYWdpbmF0b3JWaXNpYmxlXCIpIHRhYmxlUGFnaW5hdG9yVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSwgaW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgc2UgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvXHJcbiAgICogZGVnbGkgYWxsZWdhdGkgZGV2ZSBjb250ZW5lcmUgaWwgY2FtcG8gZGkgcmljZXJjYSBvcHB1cmUgbm9cclxuICAgKi9cclxuICBASW5wdXQoXCJpc1RhYmxlU2VhcmNoZWFibGVcIikgaXNUYWJsZVNlYXJjaGVhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgcGVybWV0dGUgZGkgc3RhYmlsaXJlIGxhIGRpbWVuc2lvbmUgcGFnaW5hIGRpIGRlZmF1bHRcclxuICAgKiBwZXIgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvIGRlZ2xpIGFsbGVnYXRpXHJcbiAgICovXHJcbiAgQElucHV0KFwidGFibGVQYWdpbmF0b3JTaXplXCIpIHRhYmxlUGFnaW5hdG9yU2l6ZTogbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc2NlZ2xpZXJlIGlsIG1vZG8gaW4gY3VpIGkgZmlsZSBkZXZvbm8gZXNzZXJlIGNhcmljYXRpXHJcbiAgICovXHJcbiAgLy8gQElucHV0KFwidXBsb2FkVHlwZVwiKSB1cGxvYWRUeXBlOiBVcGxvYWRUeXBlRW51bSA9IFVwbG9hZFR5cGVFbnVtLkZJTEVfQU5EX0xJTks7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSBzZSBpIHB1bHNhbnRpIHBlciBpbCBjYXJpY2FtZW50byBkZWkgZmlsZSBzb25vIHNlcGFyYXRpIG8gaW4gdW4gbWVuw7kgYSB0ZW5kaW5hXHJcbiAgICovXHJcbiAgQElucHV0KFwic2VwYXJhdGVkVXBsb2FkQnV0dG9uc1wiKSBzZXBhcmF0ZWRVcGxvYWRCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHNjZWdsaWVyZSBzZSBkYXJlIGxhIHBvc3NpYmlsaXTDoCBkaSB2ZWRlcmUgbyBubyBsJ2FudGVwcmltYVxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dQcmV2aWV3XCIpIHNob3dQcmV2aWV3OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBhbGxlZ2F0byBzaW5nb2xvLCBwZXJtZXR0ZSBkaSBzY2VnbGllcmUgc2UgYWdnaXVuZ2VyZSBmaWxlIHRyYW1pdGUgZHJhZyBhbmQgZHJvcFxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNpbmdsZUF0dGFjaG1lbnREcmFnQW5kRHJvcFwiKSBzaW5nbGVBdHRhY2htZW50RHJhZ0FuZERyb3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBBcnJheSBkaSBvcHppb25pIGNoZSBzaSBwb3Nzb25vIHV0aWxpenphcmUgcGVyIGlsIGNyb3BcclxuICAgKi9cclxuICBASW5wdXQoXCJjcm9wT3B0aW9uc1wiKSBjcm9wT3B0aW9uczogQXJyYXk8Q3JvcE9wdGlvbkVudW0+ID0gWzEsIDJdO1xyXG5cclxuICAvKipcclxuICAgKiBDbGFzc2UgY3VzdG9tIGRhIGFzc2VnbmFyZSBhbCBkaWFsb2cgZGVsIGNyb3AgaW1tYWdpbmlcclxuICAgKi9cclxuICBASW5wdXQoXCJjcm9wRGlhbG9nQ2xhc3NcIikgY3JvcERpYWxvZ0NsYXNzOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIG1heEZpbGVTaXplTUI6IG51bWJlciA9IDUwMDsgLy8gRGVmYXVsdCBtYXggc2l6ZSBvZiAxMDAgTUJcclxuICBASW5wdXQoKSBjYXJkU2l6ZTogQXR0YWNobWVudENhcmRTaXplID0gJ3NtYWxsJzsgLy8gRGVmYXVsdFxyXG4gIEBJbnB1dCgpIGN1c3RvbUNhcmRXaWR0aFB4OiBudW1iZXIgPSAyMDA7IC8vIExhcmdoZXp6YSBjdXN0b20gaW4gcHhcclxuICBASW5wdXQoKSBjdXN0b21DYXJkSGVpZ2h0UHg6IG51bWJlciA9IDE4MDsgLy8gQWx0ZXp6YSBjdXN0b20gaW4gcHhcclxuXHJcbiAgQElucHV0KCkgbGF5b3V0OiAnZnVsbCcgfCAnY29tcGFjdCcgPSAnY29tcGFjdCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIElucHV0IHBlciBkZWZpbmlyZSBsZSBsYWJlbCBkYSB1c2FyZSBuZWwgY29tcG9uZW50ZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcIm9wZW5MaW5rTGFiZWxcIikgb3BlbkxpbmtMYWJlbDogc3RyaW5nID0gXCJBcHJpIGxpbmtcIjtcclxuICBASW5wdXQoXCJhZGRCdXR0b25MYWJlbFwiKSBhZGRCdXR0b25MYWJlbDogc3RyaW5nID0gXCJBZ2dpdW5naVwiO1xyXG4gIEBJbnB1dChcImRvd25sb2FkTGFiZWxcIikgZG93bmxvYWRMYWJlbDogc3RyaW5nID0gXCJEb3dubG9hZFwiO1xyXG4gIEBJbnB1dChcImRlbGV0ZUxhYmVsXCIpIGRlbGV0ZUxhYmVsOiBzdHJpbmcgPSBcIkVsaW1pbmFcIjtcclxuICBASW5wdXQoXCJmaWxlTmFtZUxhYmVsXCIpIGZpbGVOYW1lTGFiZWw6IHN0cmluZyA9IFwiTm9tZSBmaWxlXCI7XHJcbiAgQElucHV0KFwicHJldmlld0xhYmVsXCIpIHByZXZpZXdMYWJlbDogc3RyaW5nID0gXCJBbnRlcHJpbWFcIjtcclxuICBASW5wdXQoXCJ1cGxvYWRGaWxlTGFiZWxcIikgdXBsb2FkRmlsZUxhYmVsOiBzdHJpbmcgPSBcIkNhcmljYSBmaWxlXCI7XHJcbiAgQElucHV0KFwiY29uZmlybUxhYmVsXCIpIGNvbmZpcm1MYWJlbDogc3RyaW5nID0gXCJDb25mZXJtYVwiO1xyXG4gIEBJbnB1dChcImFib3J0TGFiZWxcIikgYWJvcnRMYWJlbDogc3RyaW5nID0gXCJBbm51bGxhXCI7XHJcbiAgQElucHV0KFwic2F2ZUxhYmVsXCIpIHNhdmVMYWJlbDogc3RyaW5nID0gXCJTYWx2YVwiO1xyXG4gIEBJbnB1dChcImV4aXRMYWJlbFwiKSBleGl0TGFiZWw6IHN0cmluZyA9IFwiRXNjaVwiO1xyXG4gIEBJbnB1dChcInVwbG9hZFdpdGhEcm9wYm94TGFiZWxcIikgdXBsb2FkV2l0aERyb3Bib3hMYWJlbDogc3RyaW5nID0gXCJDYXJpY2EgY29uIERyb3Bib3hcIjtcclxuICBASW5wdXQoXCJjcm9wTGFiZWxcIikgY3JvcExhYmVsOiBzdHJpbmcgPSBcIlNjZWdsaSBsZSBkaW1lbnNpb25pIGRlbGwnaW1tYWdpbmVcIjtcclxuICBASW5wdXQoXCJkZWxldGVEaWFsb2dUaXRsZVwiKSBkZWxldGVEaWFsb2dUaXRsZTogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoXCJkZWxldGVEaWFsb2dNZXNzYWdlXCIpIGRlbGV0ZURpYWxvZ01lc3NhZ2U6IHN0cmluZyA9IFwiU2VpIHNpY3VybyBkaSB2b2xlciBjYW5jZWxsYXJlIHF1ZXN0J2FsbGVnYXRvP1wiO1xyXG4gIEBJbnB1dChcIm5vSW1hZ2VTZWxlY3RlZEVycm9yTWVzc2FnZVwiKSBub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIk5vbiDDqCBwb3NzaWJpbGUgc2VsZXppb25hcmUgdW4gZmlsZSBjaGUgbm9uIHNpYSB1bidpbW1hZ2luZS5cIjtcclxuICBASW5wdXQoXCJ3cm9uZ1R5cGVTZWxlY3RlZEVycm9yTWVzc2FnZVwiKSB3cm9uZ1R5cGVTZWxlY3RlZEVycm9yTWVzc2FnZTogc3RyaW5nID1cclxuICAgIFwiTm9uIMOoIHBvc3NpYmlsZSBjYXJpY2FyZSBpbCBmaWxlIHNlbGV6aW9uYXRvLlwiO1xyXG4gIEBJbnB1dChcInZpZGVvUHJldmlld0Vycm9yTWVzc2FnZVwiKSB2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkaSB1biBmaWxlIHZpZGVvLlwiO1xyXG4gIEBJbnB1dChcInZpZGVvUHJldmlld0Vycm9yTWVzc2FnZVwiKSBhdWRpb1ByZXZpZXdFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkaSB1biBmaWxlIGF1ZGlvLlwiO1xyXG4gIEBJbnB1dChcImZsaXBIb3JpbnpvbnRhbExhYmVsXCIpIGZsaXBIb3JpbnpvbnRhbExhYmVsOiBzdHJpbmcgPSBcIkNhcG92b2xnaSBvcml6em9udGFsbWVudGVcIjtcclxuICBASW5wdXQoXCJmbGlwVmVydGljYWxMYWJlbFwiKSBmbGlwVmVydGljYWxMYWJlbDogc3RyaW5nID0gXCJDYXBvdm9sZ2kgdmVydGljYWxtZW50ZVwiO1xyXG4gIEBJbnB1dChcInJvdGF0ZVJpZ2h0TGFiZWxcIikgcm90YXRlUmlnaHRMYWJlbDogc3RyaW5nID0gXCJSdW90YSBhIGRlc3RyYVwiO1xyXG4gIEBJbnB1dChcInJvdGF0ZUxlZnRMYWJlbFwiKSByb3RhdGVMZWZ0TGFiZWw6IHN0cmluZyA9IFwiUnVvdGEgYSBzaW5pc3RyYVwiO1xyXG4gIEBJbnB1dChcImJhc2U2NExpbWl0TUJcIikgYmFzZTY0TGltaXRNQjogbnVtYmVyID0gMTAwO1xyXG4gIEBJbnB1dCgpIHVwbG9hZFRpdGxlID0gJ1VwbG9hZCBmaWxlJztcclxuICBASW5wdXQoKSB1cGxvYWRTdWJ0aXRsZSA9ICdEcmFnICYgZHJvcCBmaWxlcyBvIGNsaWNrJztcclxuICBASW5wdXQoKSBkcm9wSGVyZUxhYmVsID0gJ1JpbGFzY2lhIGkgZmlsZSBxdWknO1xyXG4gIEBJbnB1dCgpIHN1cHBvcnRlZEZvcm1hdHNMYWJlbCA9ICdGb3JtYXRpIHN1cHBvcnRhdGk6IEpQRUcsIFBORywgUERGIChNYXggMTAwTUIpJztcclxuICBASW5wdXQoKSBicm93c2VGaWxlc0xhYmVsID0gJ0NlcmNhIGkgZmlsZSc7XHJcbiAgQElucHV0KCkgdXBsb2FkU3VtbWFyeUxhYmVsID0gJ0xpc3RhIGFsbGVnYXRpJztcclxuICBASW5wdXQoKSBmaWxlc0xhYmVsID0gJ0ZpbGVzJztcclxuICBASW5wdXQoKSB0b3RhbFNpemVMYWJlbCA9ICdEaW1lbnNpb25lIHRvdGFsZSc7XHJcbiAgQElucHV0KCkgZW1wdHlTdGF0ZUxhYmVsID0gJ05vbiBzb25vIHByZXNlbnRpIGZpbGUgY2FyaWNhdGknO1xyXG4gIEBJbnB1dCgpIGFkZGVkU3VjY2Vzc2Z1bGx5TGFiZWwgPSAnZmlsZShzKSBjYXJpY2F0aSBjb24gc3VjY2Vzc28uJztcclxuICBASW5wdXQoKSByZW1vdmVkTGFiZWwgPSAnRmlsZSByaW1vc3NvJztcclxuICAvLyBASW5wdXQoKSByZW1vdmVMYWJlbCA9ICdSaW11b3ZpIGZpbGUnO1xyXG4gIEBJbnB1dCgpIGNob29zZVZpZXcgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dTdW1tYXJ5ID0gZmFsc2U7XHJcbiAgQElucHV0KFwidmlld01vZGVcIikgdmlld01vZGU6ICdjYXJkJyB8ICd0YWJsZScgPSAndGFibGUnO1xyXG4gIEBJbnB1dChcInNob3dVcGxvYWRUaXRsZVwiKSBzaG93VXBsb2FkVGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dChcInNob3dEcm9wQXJlYVwiKSBzaG93RHJvcEFyZWE6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGhpZGRlbkNvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgaGlkZGVuQWN0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICBASW5wdXQoKSBzaG93QWN0aW9uQnV0dG9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIG1vc3RyYSBpbCBkaWFsb2cgZGkgY3JvcCBwZXIgbGUgaW1tYWdpbmkgc2luZ29sZS5cclxuICAgKiBTZSBGQUxTRSBjYXJpY2EgbCdpbW1hZ2luZSBkaXJldHRhbWVudGUgKGFwcGxpY2FuZG8gY29tdW5xdWUgbGEgY29tcHJlc3Npb25lIHNlIGF0dGl2YSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwiZW5hYmxlSW1hZ2VDcm9wXCIpIGVuYWJsZUltYWdlQ3JvcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvb2sgZ2xvYmFsZTogZGVjaWRlIHNlIG5hc2NvbmRlcmUgdW7igJlhemlvbmUgcGVyIHF1ZWxsbyBzcGVjaWZpY28gYWxsZWdhdG8uXHJcbiAgICovXHJcbiAgQElucHV0KCkgYWN0aW9uSGlkZGVuRm4/OiAoYWN0aW9uS2V5OiBzdHJpbmcsIGF0dD86IElBdHRhY2htZW50RFRPKSA9PiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBIb29rIGdsb2JhbGU6IGRlY2lkZSBzZSBkaXNhYmlsaXRhcmUgdW7igJlhemlvbmUgcGVyIHF1ZWxsbyBzcGVjaWZpY28gYWxsZWdhdG8uXHJcbiAgICovXHJcbiAgQElucHV0KCkgYWN0aW9uRGlzYWJsZWRGbj86IChhY3Rpb25LZXk6IHN0cmluZywgYXR0PzogSUF0dGFjaG1lbnREVE8pID0+IGJvb2xlYW47XHJcblxyXG5cclxuICBASW5wdXQoKSB2aWRlb0NvbXByZXNzaW9uOiB7XHJcbiAgICBlbmFibGVkOiBib29sZWFuO1xyXG4gICAgbWF4V2lkdGg/OiBudW1iZXI7XHJcbiAgICBiaXRyYXRlPzogbnVtYmVyO1xyXG4gICAgY3JmPzogbnVtYmVyO1xyXG4gICAgcHJlc2V0Pzogc3RyaW5nO1xyXG4gICAgbWF4RnBzPzogbnVtYmVyO1xyXG4gICAgYXVkaW9CaXRyYXRlPzogbnVtYmVyO1xyXG4gIH0gPSB7IGVuYWJsZWQ6IGZhbHNlLCBtYXhXaWR0aDogMTI4MCwgY3JmOiAyMywgcHJlc2V0OiAndmVyeWZhc3QnLCBtYXhGcHM6IDMwLCBhdWRpb0JpdHJhdGU6IDEyODAwMCB9O1xyXG5cclxuXHJcbiAgcHJpdmF0ZSBfY3VzdG9tTWVudUFjdGlvbnM6IEF0dGFjaG1lbnRNZW51QWN0aW9uW10gPSBbXTtcclxuICBfc29ydGVkTWVudUFjdGlvbnM6IEF0dGFjaG1lbnRNZW51QWN0aW9uW10gPSBbXTtcclxuXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGN1c3RvbU1lbnVBY3Rpb25zKHZhbHVlOiBBdHRhY2htZW50TWVudUFjdGlvbltdKSB7XHJcbiAgICB0aGlzLl9jdXN0b21NZW51QWN0aW9ucyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5zZXR1cE1lbnVBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VzdG9tTWVudUFjdGlvbnMoKTogQXR0YWNobWVudE1lbnVBY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tTWVudUFjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jdXN0b21Db2x1bW5zOiBBdHRhY2htZW50RmllbGRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBTT0xPIHF1YW5kbyBbY3VzdG9tQ29sdW1uc109XCIuLi5cIiBjYW1iaWEuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgY3VzdG9tQ29sdW1ucyh2YWx1ZTogQXR0YWNobWVudEZpZWxkQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX2N1c3RvbUNvbHVtbnMgPSB2YWx1ZSB8fCBbXTtcclxuICAgIHRoaXMuc2V0dXBUYWJsZUNvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBjdXN0b21Db2x1bW5zKCk6IEF0dGFjaG1lbnRGaWVsZENvbHVtbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXN0b21Db2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBAT3V0cHV0IGRlbCBjb21wb25lbnRlXHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZXN0aXR1aXNjZSBsYSBsaXN0YSBhZ2dpb3JuYXRhIGRlZ2xpIGFsbGVnYXRpLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBsb2NhbEVkaXRlZEF0dGFjaG1lbnRzOiBFdmVudEVtaXR0ZXI8QXJyYXk8SUF0dGFjaG1lbnREVE8+PiA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8SUF0dGFjaG1lbnREVE8+PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gc2NhdGVuYXRvIGFsbGEgcHJlc3Npb25lIGRlbCBwdWxzYW50ZSBFU0NJIGRlbGxhIG1vZGFsZSBkaSBjYXJpY2FtZW50byBmaWxlLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBhYm9ydEFkZEF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBkaSBvdXRwdXQgY2hlIHJlc3RpdHVpc2NlIGwnSUF0dGFjaG1lbnREVE8gc2VsZXppb25hdG8gcGVyIGlsIGRvd25sb2FkIG5lbCBjYXNvIEZpbGVEYXRhQmFzZTY0LCBGaWxlQ29udGVudFR5cGUgbyBGaWxlTmFtZSBub24gZm9zc2VybyBzcGVjaWZpY2F0aS5cclxuICAgKi9cclxuICBAT3V0cHV0KFwiZG93bmxvYWRBdHRhY2htZW50XCIpIGRvd25sb2FkQXR0YWNobWVudDogRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUF0dGFjaG1lbnREVE8+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBkaSBvdXRwdXQgY2hlIHJlc3RpdHVpc2NlIGwnZWxlbWVudG8gZWxpbWluYXRvIHByaW1hIGNoZSBxdWVzdG8gdmVuZ2EgZWZmZXR0aXZhbWVudGUgcmlzbW9zc28gZGFsbGEgbGlzdGEuXHJcbiAgICovXHJcbiAgQE91dHB1dChcIm9uRGVsZXRlQXR0YWNobWVudFwiKSBvbkRlbGV0ZUF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFByb3ByaWV0w6AgcGVyIGdlc3Rpb25lIGNhcmljYW1lbnRvIG51b3ZvIGFsbGVnYXRvXHJcbiAgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8gPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICBuZXdNdWx0aXBsZUF0dGFjaG1lbnRzOiBBcnJheTxJQXR0YWNobWVudERUTz4gPSBbXTtcclxuICBhdHRhY2htZW50VHlwZSA9IEF0dGFjaG1lbnRUeXBlO1xyXG4gIC8vIHVwbG9hZFR5cGVFbnVtID0gVXBsb2FkVHlwZUVudW07XHJcbiAgbmV3QXR0YWNobWVudEZvcm06IEZvcm1Hcm91cDtcclxuICBzZWxlY3RlZEZpbGU6IEZpbGUgPSBudWxsO1xyXG4gIHNlbGVjdGVkRmlsZXM6IEFycmF5PEZpbGU+ID0gbnVsbDtcclxuICBzaG93Q3JvcEltYWdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ0FkZEF0dGFjaG1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQWRkQXR0YWNobWVudDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBkaWFsb2dSZWZBZGRBdHRhY2htZW50OiBNYXREaWFsb2dSZWY8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ0FkZE11bHRpcGxlQXR0YWNobWVudFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZGlhbG9nUmVmQ3JvcEltYWdlOiBNYXREaWFsb2dSZWY8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ0Nyb3BJbWFnZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dDcm9wSW1hZ2U6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2FkZGluZ0xpbmtUZW1wbGF0ZScpIGFkZGluZ0xpbmtUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFByb3ByaWV0w6AgcGVyIGdlc3Rpb25lIHJpZGltZW5zaW9uYW1lbnRvIGZpbGUgZGkgdGlwbyBpbWFnZVxyXG4gIGltYWdlQ2hhbmdlZEV2ZW50OiBhbnkgPSBcIlwiO1xyXG4gIGNyb3BwZWRJbWFnZTogYW55ID0gXCJcIjtcclxuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XHJcbiAgY2FudmFzUm90YXRpb24gPSAwO1xyXG4gIEBWaWV3Q2hpbGQoSW1hZ2VDcm9wcGVyQ29tcG9uZW50KSBpbWFnZUNyb3BwZXI6IEltYWdlQ3JvcHBlckNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwiaW1hZ2VJbnB1dFwiKSBpbWFnZUlucHV0OiBhbnk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIEF0dGFjaG1lbnRUeXBlID0gQXR0YWNobWVudFR5cGU7XHJcbiAgc2VsZWN0ZWRBdHRhY2htZW50OiBJQXR0YWNobWVudERUTztcclxuXHJcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyO1xyXG4gIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXI7XHJcbiAgY3VzdG9tV2lkdGg6IG51bWJlcjtcclxuICBjdXN0b21IZWlnaHQ6IG51bWJlcjtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlubGluZVByZXZpZXdUZW1wbGF0ZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbmxpbmVQcmV2aWV3VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ1ByZXZpZXdcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nUHJldmlldzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgaW1hZ2VGaWxlOiBGaWxlO1xyXG5cclxuICBhZGRpbmdMaW5rTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyNyZWdpb24gU2V6aW9uZSBudW92YSByZWZhY3RvcmluZ1xyXG5cclxuICAvLyBQcm9wcmlldMOgIGludGVybmEgY2hlIGNvbnRlcnLDoCBsJ2FycmF5IGZpbmFsZSBkaSBjb2xvbm5lIG9yZGluYXRlXHJcbiAgX3RhYmxlQ29sdW1uczogQXR0YWNobWVudEZpZWxkQ29sdW1uW10gPSBbXTtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0RmlsZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgZGVmYXVsdEZpbGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0QWN0aW9uc1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgZGVmYXVsdEFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLy8gU3RhdG8gZHJhZyAmIGRyb3AgZSB0b2FzdFxyXG4gIGRyYWdPdmVyID0gZmFsc2U7XHJcbiAgdG9hc3QgPSB7XHJcbiAgICB2aXNpYmxlOiBmYWxzZSBhcyBib29sZWFuLFxyXG4gICAgdHlwZTogJ3N1Y2Nlc3MnIGFzICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnaW5mbycsXHJcbiAgICB0ZXh0OiAnJyBhcyBzdHJpbmcsXHJcbiAgICB0aW1lb3V0SWQ6IDAgYXMgYW55XHJcbiAgfTtcclxuXHJcbiAgcHJvZ3Jlc3NQZXJjZW50ID0gMDtcclxuICB0b3RhbFNpemVCeXRlcyA9IDA7XHJcbiAgZ2V0IHRvdGFsU2l6ZUZvcm1hdHRlZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5mb3JtYXRGaWxlU2l6ZSh0aGlzLnRvdGFsU2l6ZUJ5dGVzKTsgfVxyXG5cclxuICAvLyBVdGlsaXR5IHBlciBmb3JtYXR0YXJlIGJ5dGVzICgyIGRlY2ltYWxpKVxyXG4gIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFieXRlcyB8fCBieXRlcyA8PSAwKSByZXR1cm4gJzAgQnl0ZXMnO1xyXG4gICAgY29uc3QgayA9IDEwMjQ7XHJcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcclxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcclxuICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDIpKX0gJHtzaXplc1tpXX1gO1xyXG4gIH1cclxuXHJcbiAgLy8gTW9zdHJhIHRvYXN0IGNvbiBhdXRv4oCRaGlkZSBlIHJlc2V0IHByb2dyZXNzIGJhciBDU1NcclxuICBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nLCB0eXBlOiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nID0gJ3N1Y2Nlc3MnLCBkdXJhdGlvbk1zID0gMzAwMCkge1xyXG4gICAgaWYgKHRoaXMudG9hc3QudmlzaWJsZSAmJiB0aGlzLnRvYXN0LnRleHQgPT09IG1lc3NhZ2UpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbmNlbGxhIGlsIHRpbWVvdXQgcHJlY2VkZW50ZSBzZSBlc2lzdGVcclxuICAgIGlmICh0aGlzLnRvYXN0LnRpbWVvdXRJZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50b2FzdC50aW1lb3V0SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGNvbGEgdW5hIGR1cmF0YSBkaW5hbWljYVxyXG4gICAgY29uc3QgZHVyYXRpb24gPSBkdXJhdGlvbk1zIHx8IE1hdGgubWF4KDQwMDAsIG1lc3NhZ2UubGVuZ3RoICogMTAwKTtcclxuXHJcbiAgICB0aGlzLnRvYXN0LnRleHQgPSBtZXNzYWdlO1xyXG4gICAgdGhpcy50b2FzdC50eXBlID0gdHlwZTtcclxuICAgIHRoaXMudG9hc3QudmlzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgLy8gSW1wb3N0YSBpbCBudW92byB0aW1lb3V0IHBlciBuYXNjb25kZXJlIGF1dG9tYXRpY2FtZW50ZSBpbCB0b2FzdFxyXG4gICAgdGhpcy50b2FzdC50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy50b2FzdC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9LCBkdXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAjZW5kcmVnaW9uXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgZXFwQXR0YWNobWVudFNlcnZpY2U6IEVxcEF0dGFjaG1lbnRTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLy8gSW5pemlhbGl6emEgbWV0cmljaGUgZSBwcm9ncmVzcyBpbiBiYXNlIGFsbG8gc3RhdG8gaW5pemlhbGVcclxuICAgIHRoaXMucmVjb21wdXRlVG90YWxzQW5kUHJvZ3Jlc3MoKTtcclxuXHJcbiAgICAvL1NlIMOoIHN0YXRhIHJpY2hpZXN0YSBsYSBnZXN0aW9uZSBkZWxsZSBzb2xlIGltbWFnaW5pIGFsbG9yYSBpbXBvc3RhIGlsIGZpbHRybyBwZXIgbGUgZXN0ZW5zaW9uaSBwb3NzaWJpbGkgZGEgY2FyaWNhcmVcclxuICAgIGlmICghdGhpcy5hY2NlcHRlZEZpbGVUeXBlcylcclxuICAgICAgaWYgKHRoaXMuYWxsb3dPbmx5SW1hZ2VzID09IHRydWUpIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPSBcImltYWdlLypcIjtcclxuICAgICAgZWxzZSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gXCIqXCI7XHJcblxyXG4gICAgLy8gU2Ugbm9uIHNvbm8gc3RhdGkgc3BlY2lmaWNhdGkgaSB0aXBpIGRhIGdlc3RpcmUgbWEgw6ggc3RhdG8gcGFzc2F0byBudWxsIG8gdW4gYXJyYXkgdnVvdG8gaW1wb3N0byBpIHRpcGkgZGkgZGVmYXVsdC5cclxuICAgIGlmICghdGhpcy5hbGxvd2VkVHlwZXMgfHwgdGhpcy5hbGxvd2VkVHlwZXMubGVuZ3RoID09IDApXHJcbiAgICAgIHRoaXMuYWxsb3dlZFR5cGVzID0gW0F0dGFjaG1lbnRUeXBlLkZJTEUsIEF0dGFjaG1lbnRUeXBlLkxJTkssIEF0dGFjaG1lbnRUeXBlLkRST1BCT1hdO1xyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuYWxsb3dlZFR5cGVzLmZpbmQoKHQpID0+IHQgIT0gQXR0YWNobWVudFR5cGUuRklMRSAmJiB0ICE9IEF0dGFjaG1lbnRUeXBlLkxJTksgJiYgdCAhPSBBdHRhY2htZW50VHlwZS5EUk9QQk9YKVxyXG4gICAgKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLldhcm5pbmcoXHJcbiAgICAgICAgJ0FsbWVubyB1bm8gZGVnbGkgQXR0YWNobWVudFR5cGUgc2VsZXppb25hdGkgbmVsIHBhcmFtZXRybyBcImFsbG93ZWRUeXBlc1wiIG5vbiBlc2lzdGUuJ1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LLCBBdHRhY2htZW50VHlwZS5EUk9QQk9YXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdHRhY2htZW50c0xpc3QgPT0gbnVsbCkgdGhpcy5hdHRhY2htZW50c0xpc3QgPSBuZXcgQXJyYXk8SUF0dGFjaG1lbnREVE8+KCk7XHJcblxyXG4gICAgLy8gU2Ugw6ggc3RhdG8gcGFzc2F0byB1biBzaW5nb2xvIGFsbGVnYXRvIGxvIGFnZ2l1bmdvIGFsbGEgbGlzdGFcclxuICAgIGlmICh0aGlzLnNpbmdsZUF0dGFjaG1lbnQgIT0gbnVsbCAmJiB0aGlzLmF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLmF0dGFjaG1lbnRzTGlzdC5wdXNoKHRoaXMuc2luZ2xlQXR0YWNobWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGVja0F0dGFjaG1lbnRJbWFnZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgICB0aGlzLmVxcEF0dGFjaG1lbnRTZXJ2aWNlLmxvYWREcm9wYm94U2NyaXB0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXR1cFRhYmxlQ29sdW1ucygpO1xyXG4gICAgdGhpcy5zZXR1cE1lbnVBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBzZXRWaWV3TW9kZShtb2RlOiAnY2FyZCcgfCAndGFibGUnKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdNb2RlID0gbW9kZTtcclxuICB9XHJcblxyXG4gIC8vIFJpY2FsY29sYSBsYSBzb21tYSBwZXNhdGEgc3VnbGkgYWxsZWdhdGkgcHJlc2VudGlcclxuICBwcml2YXRlIHJlY29tcHV0ZVRvdGFsc0FuZFByb2dyZXNzKCkge1xyXG4gICAgdGhpcy50b3RhbFNpemVCeXRlcyA9ICh0aGlzLmF0dGFjaG1lbnRzTGlzdCB8fCBbXSlcclxuICAgICAgLmZpbHRlcihhID0+ICEhYSlcclxuICAgICAgLnJlZHVjZSgoc3VtLCBhKSA9PiBzdW0gKyB0aGlzLmJ5dGVzRnJvbUJhc2U2NChhLkZpbGVEYXRhQmFzZTY0IHx8IGEuRmlsZVRodW1ibmFpbEJhc2U2NCB8fCAnJyksIDApO1xyXG5cclxuICAgIC8vIFByb2dyZXNzIGZpdHRpemlvOiAxMDAlIHNlIHByZXNlbnRpIGZpbGUsIDAgc2UgdnVvdG9cclxuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50ID0gKHRoaXMuYXR0YWNobWVudHNMaXN0ICYmIHRoaXMuYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDApID8gMTAwIDogMDtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMudG9hc3QudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy50b2FzdC50aW1lb3V0SWQpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2FsY29sYSBpIGJ5dGUgZGEgdW5hIHN0cmluZ2EgQmFzZTY0IHB1cmEgKHNlbnphIHByZWZpc3NvIGRhdGE6Li4uKVxyXG4gIHB1YmxpYyBieXRlc0Zyb21CYXNlNjQoYmFzZTY0OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKCFiYXNlNjQpIHJldHVybiAwO1xyXG4gICAgLy8gUmltdW92aSBldmVudHVhbGUgcHJlZmlzc28gZGF0YSBVUkxcclxuICAgIGNvbnN0IGNvbW1hSWR4ID0gYmFzZTY0LmluZGV4T2YoJywnKTtcclxuICAgIGNvbnN0IGI2NCA9IGNvbW1hSWR4ID49IDAgPyBiYXNlNjQuc3Vic3RyaW5nKGNvbW1hSWR4ICsgMSkgOiBiYXNlNjQ7XHJcbiAgICAvLyBDb250YSBwYWRkaW5nXHJcbiAgICBsZXQgcGFkZGluZyA9IDA7XHJcbiAgICBpZiAoYjY0LmVuZHNXaXRoKCc9PScpKSBwYWRkaW5nID0gMjtcclxuICAgIGVsc2UgaWYgKGI2NC5lbmRzV2l0aCgnPScpKSBwYWRkaW5nID0gMTtcclxuICAgIC8vIEZvcm11bGEgZXNhdHRhOiAoMyAqIChsZW4gLyA0KSkgLSBwYWRkaW5nXHJcbiAgICBjb25zdCBsZW4gPSBiNjQubGVuZ3RoO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsICgzICogTWF0aC5mbG9vcihsZW4gLyA0KSkgLSBwYWRkaW5nKTtcclxuICB9XHJcblxyXG4gIGNoZWNrQXR0YWNobWVudEltYWdlKCkge1xyXG4gICAgdGhpcy5hdHRhY2htZW50c0xpc3QuZm9yRWFjaCgoYSkgPT4ge1xyXG4gICAgICBhLklzSW1hZ2UgPSBBdHRhY2htZW50SGVscGVyU2VydmljZS5jaGVja0ltYWdlRnJvbU1pbWVUeXBlKGEuRmlsZUNvbnRlbnRUeXBlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEdlc3Rpb25lIGVsZW5jbyBhbGxlZ2F0aVxyXG5cclxuICAvKipcclxuICAgKiBFbGltaW5hIHVuIGFsbGVnYXRvIGVsaW1pbmFuZG8gYW5jaGUgaWwgZmlsZSBwcmVzZW50ZSBuZWxsbyBzdG9yYWdlIGRpIGFyY2hpdmlhemlvbmUgdXRpbGl6emF0byAoQVdTIG8gY2FydGVsbGEgcHJvZ2V0dG8pXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgSUF0dGFjaG1lbnREVE8gZGEgY2FuY2VsbGFyZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUF0dGFjaG1lbnQoZWxlbWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkNvbmZpcm0oXHJcbiAgICAgIHRoaXMuZGVsZXRlRGlhbG9nTWVzc2FnZSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQXR0YWNobWVudEZyb21MaXN0KHRoaXMuYXR0YWNobWVudHNMaXN0LmluZGV4T2YoZWxlbWVudCkpO1xyXG4gICAgICB9LFxyXG4gICAgICB0cnVlLFxyXG4gICAgICB0aGlzLmRlbGV0ZURpYWxvZ1RpdGxlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmltdW92ZSBsJ2FsbGVnYXRvIHNlbGV6aW9uYXRvIGRhbGxhIGxpc3RhIFwiYXR0YWNobWVudHNMaXN0XCIgZSBpbnZvY2EgbCdldmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsYSBsaXN0YSBhZ2dpb3JuYXRhLlxyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50SW5kZXggSW5kaWNlIGRlbGwnYXR0YWNobWVudCBkYSByaW11b3ZlcmVcclxuICAgKi9cclxuICByZW1vdmVBdHRhY2htZW50RnJvbUxpc3QoYXR0YWNobWVudEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMub25EZWxldGVBdHRhY2htZW50LmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3RbYXR0YWNobWVudEluZGV4XSk7XHJcblxyXG4gICAgdGhpcy5hdHRhY2htZW50c0xpc3Quc3BsaWNlKGF0dGFjaG1lbnRJbmRleCwgMSk7XHJcbiAgICB0aGlzLmxvY2FsRWRpdGVkQXR0YWNobWVudHMuZW1pdCh0aGlzLmF0dGFjaG1lbnRzTGlzdCk7XHJcblxyXG4gICAgdGhpcy5yZWNvbXB1dGVUb3RhbHNBbmRQcm9ncmVzcygpO1xyXG4gICAgdGhpcy5zaG93VG9hc3QodGhpcy5yZW1vdmVkTGFiZWwgfHwgJ0ZpbGUgcmVtb3ZlZCcsICdzdWNjZXNzJyk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaW11bGF0ZVByb2dyZXNzKCkge1xyXG4gICAgdGhpcy5wcm9ncmVzc1BlcmNlbnQgPSAwO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50ID0gMzA7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50ID0gNjA7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDEwMDtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgICB9LCAyMDApO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBTY2FyaWNhIGwnYWxsZWdhdG8gbyBhcHJlIGlsIGxpbmtcclxuICAgKiBAcGFyYW0gZWxlbWVudCBBbGxlZ2F0byBkYSBtb3N0cmFyZVxyXG4gICAqL1xyXG4gIHZpZXdBdHRhY2htZW50KGF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICBpZiAoYXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGF0dGFjaG1lbnQuRmlsZVBhdGgsIFwiX2JsYW5rXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dGFjaG1lbnQuTGFyZ2VGaWxlKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBhdHRhY2htZW50LkxhcmdlRmlsZTtcclxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICBsaW5rLmhyZWYgPSB1cmw7XHJcbiAgICAgIGxpbmsuZG93bmxvYWQgPSBhdHRhY2htZW50LkZpbGVOYW1lIHx8IGZpbGUubmFtZTtcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKSwgMTAwMCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCAmJiBhdHRhY2htZW50LkZpbGVDb250ZW50VHlwZSAmJiBhdHRhY2htZW50LkZpbGVOYW1lKSB7XHJcbiAgICAgIGxldCBzb3VyY2UgPSBgZGF0YToke2F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlfTtiYXNlNjQsJHthdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0fWA7XHJcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgbGluay5ocmVmID0gc291cmNlO1xyXG4gICAgICBsaW5rLmRvd25sb2FkID0gYCR7YXR0YWNobWVudC5GaWxlTmFtZX1gO1xyXG4gICAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRvd25sb2FkQXR0YWNobWVudC5lbWl0KGF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlkZWZpbmlzY2UgbCdpY29uYSBkYSBtb3N0cmFyZSBuZWxsYSBjb2xvbm5hIGRlbGwnZXFwLXRhYmxlIHBlciBvZ25pIGZpbGUuXHJcbiAgICogTCdpY29uYSB2YXJpYSBpbiBiYXNlIGFsbCdlc3RlbnNpb25lIGRlbCBmaWxlXHJcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRcclxuICAgKi9cclxuICBnZXRBdHRhY2htZW50SWNvbihhdHRhY2htZW50OiBJQXR0YWNobWVudERUTykge1xyXG4gICAgaWYgKGF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSykgcmV0dXJuIFwiZmFzIGZhLWxpbmtcIjtcclxuICAgIGVsc2UgcmV0dXJuIEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmdldEljb25Gcm9tRmlsZUV4dGVuc2lvbmUoYXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uKTtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvKipcclxuICAgKiBJbiBjYXNvIGRpIGFsbGVnYXRvIHNpbmdvbG8sIHNjZWdsaWUgcXVhbGUgbWV0b2RvIHJpY2hpYW1hcmUgaW4gYmFzZSBhbCB0aXBvIGRpIGFsbGVnYXRvXHJcbiAgICovXHJcbiAgYWRkRmlsZShhdHRhY2htZW50VHlwZTogQXR0YWNobWVudFR5cGUsIGltYWdlSW5wdXQgPSBudWxsKSB7XHJcbiAgICBpZiAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSykge1xyXG4gICAgICB0aGlzLnN3aXRjaFRvQWRkaW5nTGlua01vZGUoKTtcclxuICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgICBpbWFnZUlucHV0LmNsaWNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNob29zZURyb3Bib3hGaWxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVBdHRhY2htZW50Rm9ybSgpIHtcclxuICAgIC8vQ3JlYSBsYSBmb3JtIHBlciBsYSB2YWxpZGF6aW9uZSBkZWkgY2FtcGlcclxuICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3RoaXMubmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIG5hbWU6IFt0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZU5hbWVdLFxyXG4gICAgICBwYXRoOiBbdGhpcy5uZXdBdHRhY2htZW50LkZpbGVQYXRoXSxcclxuICAgICAgY3VzdG9tSGVpZ2h0OiBbdGhpcy5jdXN0b21IZWlnaHRdLFxyXG4gICAgICBjdXN0b21XaWR0aDogW3RoaXMuY3VzdG9tV2lkdGhdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsb3NlKGVtaXRDbG9zZUV2ZW50ID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50ID0ge30gYXMgSUF0dGFjaG1lbnREVE87XHJcbiAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPSBuZXcgQXJyYXk8SUF0dGFjaG1lbnREVE8+KCk7XHJcbiAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgaWYgKHRoaXMubmV3QXR0YWNobWVudEZvcm0pIHRoaXMubmV3QXR0YWNobWVudEZvcm0ucmVzZXQoKTtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgdGhpcy5yZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCk7XHJcblxyXG4gICAgaWYgKGVtaXRDbG9zZUV2ZW50ID09IHRydWUgJiYgdGhpcy5hYm9ydEFkZEF0dGFjaG1lbnQpIHRoaXMuYWJvcnRBZGRBdHRhY2htZW50LmVtaXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluIGJhc2UgYWwgdGlwbyBkaSBhbGxlZ2F0byBjb250cm9sbGEgc2UgZGlzYWJpbGl0YXJlIG8gbWVubyBpbCBwdWxzYW50ZSBwZXIgc2FsdmFyZS5cclxuICAgKiBGdW56aW9uZSB1c2F0YSBuZWwgW2Rpc2FibGVdIGRlbCBwdWxzYW50ZSBcIlNhbHZhXCIgZGVsIGRpYWxvZyBwZXIgbCdhZ2dpdW50YSBkaSB1biBhbGxlZ2F0by5cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGRpc2FibGVTYXZlKCkge1xyXG4gICAgaWYgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT0gdHJ1ZSkge1xyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCAmJiAhdGhpcy5uZXdBdHRhY2htZW50LkxhcmdlRmlsZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMuZmlsdGVyKFxyXG4gICAgICAgICAgKHApID0+XHJcbiAgICAgICAgICAgIChwLkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUgJiYgIXAuRmlsZURhdGFCYXNlNjQgJiYgIXAuTGFyZ2VGaWxlKSB8fFxyXG4gICAgICAgICAgICAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LICYmICFwLkZpbGVQYXRoKVxyXG4gICAgICAgICkubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uZmlybUFkZEF0dGFjaG1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LklzSW1hZ2UgJiYgdGhpcy5pbWFnZUNyb3BwZXIpIHtcclxuICAgICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5pbWFnZUNyb3BwZXIuY3JvcCgpLmJhc2U2NC5zcGxpdChcIjtiYXNlNjQsXCIpWzFdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LICYmICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZU5hbWUpXHJcbiAgICAgICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lID0gdGhpcy5uZXdBdHRhY2htZW50LkZpbGVQYXRoO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9PSBudWxsIHx8IHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QgPSB0aGlzLmF0dGFjaG1lbnRzTGlzdC5jb25jYXQodGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvY2FsRWRpdGVkQXR0YWNobWVudHMuZW1pdCh0aGlzLmF0dGFjaG1lbnRzTGlzdCk7XHJcblxyXG4gICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlKSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmQ3JvcEltYWdlLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMucmVzdG9yZU9yaWdpbmFsRGltZW5zaW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5uZXdBdHRhY2htZW50ID0ge30gYXMgSUF0dGFjaG1lbnREVE87XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnRGb3JtKSB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXNldFNlbGVjdGVkRmlsZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIDIuIFJFU0VUIFRPVEFMRTogU3Z1b3RpYW1vIGxlIHByb3ByaWV0w6AgZGkgY2xhc3NlIHBlciBldml0YXJlIGNoZSBcclxuICAvLyByZXNpZHVpIGRpIHVwbG9hZCBwcmVjZWRlbnRpIChzaW5nb2xpIG8gbXVsdGlwbGkpIHZlbmdhbm8gdHJhc2NpbmF0aS5cclxuICBwcml2YXRlIHJlc2V0U2VsZWN0ZWRGaWxlcygpIHtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudCA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG4gICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcmUgaWwgZGlhbG9nIHBlciBsJ2FudGVwcmltYSBkZWxsJ2FsbGVnYXRvIHNlbGV6aW9uYXRvLlxyXG4gICAqIEBwYXJhbSByb3dcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIG9wZW5QcmV2aWV3RGlhbG9nKHJvdzogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50ID0geyAuLi5yb3cgfTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0QXR0YWNobWVudEVuZHBvaW50ICYmIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiYgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0QXR0YWNobWVudEJ5SUQoKVxyXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gcmVzLkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlUGF0aFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidmlkZW8vXCIpICYmIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkxhcmdlRmlsZSkge1xyXG4gICAgICBjb25zdCB2aWRlb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuTGFyZ2VGaWxlKTtcclxuICAgICAgLy8gVXNpYW1vIGJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwgcGVyIGxhIHNvcmdlbnRlIGRlbCB2aWRlb1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybCh2aWRlb1VybCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChcclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSAmJlxyXG4gICAgICAhdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiZcclxuICAgICAgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVUaHVtYm5haWxCYXNlNjRcclxuICAgICkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5JbmZvKFwiSW1wb3NzaWJpbGUgYXByaXJlIGwnYW50ZXByaW1hIGRlbGwnYWxsZWdhdG8sIGZpbGUgbWFuY2FudGUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnICYmIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgYGRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwke3RoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0fWBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5Jc0ltYWdlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlUGF0aCAmJiB0aGlzLnByb2R1Y3Rpb25CYXNlVXJsKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChcclxuICAgICAgICAgIFwiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZ3ZpZXc/dXJsPVwiICtcclxuICAgICAgICAgIHRoaXMucHJvZHVjdGlvbkJhc2VVcmwgK1xyXG4gICAgICAgICAgXCIvXCIgK1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGggK1xyXG4gICAgICAgICAgXCImZW1iZWRkZWQ9dHJ1ZVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5JbmZvKFwiSW1wb3NzaWJpbGUgYXByaXJlIGwnYW50ZXByaW1hIGRlbCBkb2N1bWVudG8hXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5kaWFsb2dQcmV2aWV3LCB7XHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdlcXAtYXR0YWNobWVudHMtcHJldmlldy1kaWFsb2cnLFxyXG4gICAgICBtYXhXaWR0aDogJzk1dncnLFxyXG4gICAgICB3aWR0aDogcm93LklzSW1hZ2UgfHwgcm93LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykgPyAnYXV0bycgOiAnMTEwMHB4JyxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFB1bGl6aWEgZGVsbGEgbWVtb3JpYSBxdWFuZG8gaWwgZGlhbG9nIHNpIGNoaXVkZVxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50Py5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoXCJ2aWRlby9cIikpIHtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgYXMgYW55KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRBdHRhY2htZW50QnlJRCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJQXR0YWNobWVudERUTz4odGhpcy5nZXRBdHRhY2htZW50RW5kcG9pbnQsIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBjYXJpY2FtZW50byBmaWxlXHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBzY2F0ZW5hdG8gYWxsYSBzZWxlemlvbmUgZGVsIGZpbGUgKG8gZGVpIGZpbGUpLlxyXG4gICAqIFNlIGlsIGNhcmljYW1lbnRvIMOoIFNJTkdPTE8gbyBzZSBjb211bnF1ZSDDqCBzdGF0byBzZWxlemlvbmF0byB1biBzb2xvIGZpbGUgYWxsb3JhIHNpIG9jY3VwYSBkaSBjb250cm9sbGFyZSBzZSBzaSB0cmF0dGEgZGkgdW4gaW1tYWdpbmUgaW4gbW9kbyBkYVxyXG4gICAqIG1vc3RyYXJlIGxlIGZ1bnppb25hbGl0w6AgZGVsIGNyb3BwaWUgKHBlciByaXRhZ2xpYXJlIGwnaW1tYWdpbmUpIG9wcHVyZSBuby5cclxuICAgKiBTZSBpbCBmaWxlIGNhcmljYXRvIG5vbiDDqCB1biBpbW1hZ2luZSBhbGxvcmEgZ2VuZXJhIGRpcmV0dGFtZW50ZSBpbCBiYXNlNjQgZSBsbyBhc3NvY2lhIGFsbCdhbGxlZ2F0byBkYSBzYWx2YXJlLlxyXG4gICAqIFNlIGludmVjZSBpbCBjYXJpY2FtZW50byBkZWkgZmlsZSDDqCBNVUxUSVBMTyBlIHNvbm8gcHJlc2VudGkgcGnDuSBmaWxlIGFsbG9yYSBlc2VndWUgbGUgc3Rlc3NlIG9wZXJhemlvbmkgaWdub3JhbmRvIHBlcsOyIGlsIGNvbnRybGxvXHJcbiAgICogaW1tYWdpbmUgcGVyIGlsIGNyb3BwaWUgKGluIGNhc28gZGkgY2FyaWNhbWVudG8gbXVsdGlwbG8gbGUgZnVuemlvbmFsaXTDoCBkZWwgY3JvcHBpZSBzb25vIGRpc2FiaWxpdGF0ZSkuXHJcbiAgICovXHJcbiAgYXN5bmMgb25GaWxlQWRkZWQoZXZlbnQsIGlzRmlsZURyb3BwZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkNhcmljYW1lbnRvIGFsbGVnYXRpIG5vbiBkaXNwb25pYmlsZS5cIik7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMucmVzZXRTZWxlY3RlZEZpbGVzKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZXNPbklucHV0OiBGaWxlW10gPSBpc0ZpbGVEcm9wcGVkXHJcbiAgICAgID8gKGV2ZW50IGFzIEZpbGVbXSlcclxuICAgICAgOiBBcnJheS5mcm9tKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LmZpbGVzIHx8IFtdKTtcclxuXHJcbiAgICBjb25zdCB7IHZhbGlkRmlsZXMsIG92ZXJzaXplZEZpbGVzIH0gPSB0aGlzLnZhbGlkYXRpb25GaWxlKGZpbGVzT25JbnB1dCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZEZpbGVzIHx8IHZhbGlkRmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGlmICghaXNGaWxlRHJvcHBlZCAmJiBldmVudD8udGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xyXG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL1NlIMOoIHN0YXRvIHJpY2hpZXN0byBpbCBjYXJpY2FtZW50byBTSU5HT0xPIG9wcHVyZSBzZSBpbCBjYXJpY2FtZW50byDDqCBNVUxUSVBMTyBtYSDDqCBzdGF0byBzZWxlemlvbmF0byB1biBzb2xvIGZpbGVcclxuICAgIC8vYWxsb3JhIHZlcmlmaWNhIHNlIGlsIGZpbGUgw6ggdW4gaW1tYWdpbmUgKHBlciBtb3N0cmFyZSBpbCBDUk9QUElFKVxyXG4gICAgaWYgKFsuLi52YWxpZEZpbGVzXS5sZW5ndGggPT0gMSB8fCB0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSB2YWxpZEZpbGVzWzBdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSB2YWxpZEZpbGVzO1xyXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKSByZXR1cm47XHJcblxyXG4gICAgICAvL01lbW9yaXp6YSBpIGRhdGkgcGVyIGwnYWxsZWdhdG9cclxuICAgICAgdGhpcy5uZXdBdHRhY2htZW50ID0gYXdhaXQgdGhpcy5jcmVhdGVBdHRhY2htZW50RnJvbVVwbG9hZGVkRmlsZSh0aGlzLnNlbGVjdGVkRmlsZSwgZmFsc2UpO1xyXG4gICAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPSBuZXcgQXJyYXk8SUF0dGFjaG1lbnREVE8+KCk7XHJcbiAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5wdXNoKHRoaXMubmV3QXR0YWNobWVudCk7XHJcblxyXG4gICAgICAvL1NlIMOoIHN0YXRhIHJpY2hpZXN0YSBsYSBnZXN0aW9uZSBkZWxsZSBzb2xlIGltbWFnaW5pIG1hIHBlciBlcnJvcmUgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gZmlsZSBjaGUgbm9uIMOoIHVuIGltbWFnaW5lXHJcbiAgICAgIGxldCBjaGVja09ubHlJbWFnZSA9IHRoaXMuY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUodGhpcy5uZXdBdHRhY2htZW50KTtcclxuICAgICAgaWYgKGNoZWNrT25seUltYWdlID09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRGb3JtKCk7XHJcblxyXG4gICAgICAvL1ZlcmlmaWNhIHNlIGlsIGZpbGUgY2FyaWNhdG8gw6ggdW4naW1tYWdpbmUgb3BwdXJlIG5vLiBTZSDDqCB1biBpbW1hZ2luZSwgcHJpbWEgZGkgY2FyaWNhcmxhIG1vc3RyYSBpbCBjcm9wcGllIHBlciBpbCByZXNpemUuXHJcbiAgICAgIC8vU2Ugbm9uIMOoIHVuIGltbWFnaW5lIGFsbG9yYSBnZW5lcmEgaWwgQmFzZTY0XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuSXNJbWFnZSA9PSB0cnVlICYmIHRoaXMuZW5hYmxlSW1hZ2VDcm9wKSB7XHJcbiAgICAgICAgdGhpcy5nZXRJbWFnZURpbWVuc2lvbnModmFsaWRGaWxlc1swXSk7XHJcblxyXG4gICAgICAgIC8vTW9zdHJhIGlsIGNyb3BwaWUgZSBkaXNhYmlsaXRhIGxhIGZvcm0gZmluY2jDqCBub24gdGVybWluYSBsYSBtb2RpZmljYSBkZWxsJ2ltbWFnaW5lXHJcbiAgICAgICAgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5jb250cm9sc1tcImN1c3RvbVdpZHRoXCJdLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uY29udHJvbHNbXCJjdXN0b21IZWlnaHRcIl0uZW5hYmxlKCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5pbWFnZUZpbGUgPSBldmVudDtcclxuXHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZSA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5kaWFsb2dDcm9wSW1hZ2UsIHtcclxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgd2lkdGg6IFwiOTV2d1wiLFxyXG4gICAgICAgICAgICBtYXhXaWR0aDogXCI4MDBweFwiLFxyXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IFwiOTB2aFwiLFxyXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ2VxcC1hdHRhY2htZW50cy1kaWFsb2cnLCAnY3JvcC1kaWFsb2cnXVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaG93Q3JvcEltYWdlID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGJhc2U2NFJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0QmFzZTY0RnJvbUZpbGUodGhpcy5zZWxlY3RlZEZpbGUpO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IGJhc2U2NFJlc3VsdC5CYXNlNjRGaWxlO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBiYXNlNjRSZXN1bHQuQ29udGVudFR5cGU7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQWRkQXR0YWNobWVudCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gdmFsaWRGaWxlcztcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZXMgfHwgdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA9PSAwKSByZXR1cm47XHJcblxyXG4gICAgICBpZiAoIXRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cykgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IG5ld0F0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0gYXdhaXQgdGhpcy5jcmVhdGVBdHRhY2htZW50RnJvbVVwbG9hZGVkRmlsZShcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlc1tpXSxcclxuICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvL1NlIMOoIHN0YXRhIHJpY2hpZXN0YSBsYSBnZXN0aW9uZSBkZWxsZSBzb2xlIGltbWFnaW5pIG1hIHBlciBlcnJvcmUgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gZmlsZSBjaGUgbm9uIMOoIHVuIGltbWFnaW5lXHJcbiAgICAgICAgbGV0IGNoZWNrT25seUltYWdlID0gdGhpcy5jaGVja0FsbG93T25seUltYWdlRmlsZShuZXdBdHRhY2htZW50KTtcclxuICAgICAgICBpZiAoY2hlY2tPbmx5SW1hZ2UgPT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLnB1c2gobmV3QXR0YWNobWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb25maXJtQWRkQXR0YWNobWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVjb21wdXRlVG90YWxzQW5kUHJvZ3Jlc3MoKTtcclxuICAgIHRoaXMuc2ltdWxhdGVQcm9ncmVzcygpO1xyXG4gICAgLy8gQ2FzbyAxOiBTdWNjZXNzbyBQYXJ6aWFsZSAoYWxjdW5pIGZpbGUgdmFsaWRpLCBhbHRyaSBubylcclxuICAgIGlmIChvdmVyc2l6ZWRGaWxlcy5sZW5ndGggPiAwICYmIHZhbGlkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlTmFtZXMgPSBvdmVyc2l6ZWRGaWxlcy5qb2luKCcsICcpO1xyXG4gICAgICB0aGlzLnNob3dUb2FzdChcclxuICAgICAgICBgJHt2YWxpZEZpbGVzLmxlbmd0aH0gZmlsZSBhZ2dpdW50aS4gJHtvdmVyc2l6ZWRGaWxlcy5sZW5ndGh9IG5vbiBjYXJpY2F0aSBwZXJjaMOpIHRyb3BwbyBncmFuZGkgKCR7ZmlsZU5hbWVzfSkuYCxcclxuICAgICAgICAnZXJyb3InXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvLyBDYXNvIDI6IE5lc3N1biBmaWxlIHZhbGlkb1xyXG4gICAgZWxzZSBpZiAob3ZlcnNpemVkRmlsZXMubGVuZ3RoID4gMCAmJiB2YWxpZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgfVxyXG4gICAgLy8gQ2FzbyAzOiBUdXR0aSBpIGZpbGUgdmFsaWRpXHJcbiAgICBlbHNlIGlmIChvdmVyc2l6ZWRGaWxlcy5sZW5ndGggPT09IDAgJiYgdmFsaWRGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2hvd1RvYXN0KFxyXG4gICAgICAgIGAke3ZhbGlkRmlsZXMubGVuZ3RofSAke3RoaXMuYWRkZWRTdWNjZXNzZnVsbHlMYWJlbCB8fCAnZmlsZShzKSBhZ2dpdW50aSBjb24gc3VjY2Vzc28uJ31gLFxyXG4gICAgICAgICdzdWNjZXNzJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVzZXR0byBpbCB2YWxvcmUgZGVsIGZpbGUgaW5wdXQgaW4gbW9kbyBkYSBzY2F0ZW5hcmUgaWwgY2hhbmdlIGFuY2hlIHNlIHNpIGRvdmVzc2UgY2FyaWNhcmUgbG8gc3Rlc3NvIGZpbGVcclxuICAgIGlmICghaXNGaWxlRHJvcHBlZCkgZXZlbnQudGFyZ2V0LnZhbHVlID0gXCJcIjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGlvbkZpbGUoZmlsZXNPbklucHV0OiBGaWxlW10pIHtcclxuICAgIGNvbnN0IHZhbGlkRmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gICAgY29uc3Qgb3ZlcnNpemVkRmlsZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzT25JbnB1dCkge1xyXG4gICAgICBjb25zdCBmaWxlU2l6ZU1CID0gZmlsZS5zaXplIC8gMTAyNCAvIDEwMjQ7XHJcbiAgICAgIGlmIChmaWxlU2l6ZU1CID4gdGhpcy5tYXhGaWxlU2l6ZU1CKSB7XHJcbiAgICAgICAgb3ZlcnNpemVkRmlsZXMucHVzaChmaWxlLm5hbWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChvdmVyc2l6ZWRGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZpbGVOYW1lcyA9IG92ZXJzaXplZEZpbGVzLmpvaW4oJywgJyk7XHJcbiAgICAgIHRoaXMuc2hvd1RvYXN0KFxyXG4gICAgICAgIGBGaWxlKHMpIHRyb3BwbyBncmFuZGk6ICR7ZmlsZU5hbWVzfS4gTGltaXRlOiAke3RoaXMubWF4RmlsZVNpemVNQn1NQmAsXHJcbiAgICAgICAgJ2Vycm9yJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHZhbGlkRmlsZXMsIG92ZXJzaXplZEZpbGVzIH07XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQSBwYXJ0aXJlIGRhbCBGSUxFIHJpY2V2dXRvIGluIGlucHV0IHJpY29zdHJ1aXNjZSBsJ29nZ2V0dG8gSUF0dGFjaG1lbnREVE8gZSBsbyByZXN0aXR1aXNjZS5cclxuICAgKiBTZSBpbCBwYXJhbWV0cm8gZ2V0QmFzZTY0IHZpZW5lIHBhc3NhdG8gYSBUUlVFIGFsbG9yYSwgc2VtcHJlIGEgcGFydGlyZSBkYWwgZmlsZSxnZW5lcmEgaWwgYmFzZTY0IGVcclxuICAgKiByaWNhdmEgaWwgQ29udGVudFR5cGUgZGEgYXNzb2NpYXJlIGFsbCdvZ2dldHRvIElBdHRhY2htZW50RFRPIGRhIHJlc3RpdHVpcmVcclxuICAgKiBAcGFyYW0gY3VycmVudEZpbGUgT2dnZXR0byBGSUxFIGRhIHByb2Nlc3NhcmVcclxuICAgKiBAcGFyYW0gZ2V0QmFzZTY0IFNlIFRSVUUgYWxsb3JhIGNhbGNvbGEgYmFzZTY0IGUgQ29udGVudFR5cGUgZGVsIGZpbGUgcGFzc2F0byBpbiBpbnB1dFxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gZGkgdGlwbyBJQXR0YWNobWVudERUT1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUoXHJcbiAgICBjdXJyZW50RmlsZTogRmlsZSxcclxuICAgIGdldEJhc2U2NDogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBjcm9wRmlsZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxJQXR0YWNobWVudERUTz4ge1xyXG4gICAgbGV0IG5ld0F0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPID0ge30gYXMgSUF0dGFjaG1lbnREVE87XHJcbiAgICAvL01lbW9yaXp6YSBpIGRhdGkgcGVyIGwnYWxsZWdhdG9cclxuICAgIG5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPSBBdHRhY2htZW50VHlwZS5GSUxFO1xyXG4gICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBjdXJyZW50RmlsZS50eXBlO1xyXG4gICAgbmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IGN1cnJlbnRGaWxlLm5hbWU7XHJcbiAgICBuZXdBdHRhY2htZW50LkZpbGVFeHRlbnNpb24gPSBjdXJyZW50RmlsZS5uYW1lLnN1YnN0cihjdXJyZW50RmlsZS5uYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDEpO1xyXG4gICAgbmV3QXR0YWNobWVudC5Jc0ltYWdlID0gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuY2hlY2tJbWFnZUZyb21NaW1lVHlwZShjdXJyZW50RmlsZS50eXBlKTtcclxuXHJcbiAgICBjb25zdCBmaWxlU2l6ZU1CID0gY3VycmVudEZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xyXG4gICAgY29uc3QgaXNMYXJnZUZpbGUgPSBmaWxlU2l6ZU1CID4gdGhpcy5iYXNlNjRMaW1pdE1CO1xyXG4gICAgY29uc3QgaXNWaWRlbyA9IGN1cnJlbnRGaWxlLnR5cGUuc3RhcnRzV2l0aCgndmlkZW8nKTtcclxuXHJcbiAgICBpZiAoaXNWaWRlbykge1xyXG4gICAgICBsZXQgZmluYWxGaWxlOiBGaWxlIHwgQmxvYiA9IGN1cnJlbnRGaWxlO1xyXG5cclxuICAgICAgLy8gMS4gR2VuZXJhIGxhIG1pbmlhdHVyYSAocmltYW5lIGxhdG8gY2xpZW50IHBlcmNow6kgw6ggdW4nb3BlcmF6aW9uZSBpc3RhbnRhbmVhKVxyXG4gICAgICBuZXdBdHRhY2htZW50LkZpbGVUaHVtYm5haWxCYXNlNjQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlVmlkZW9UaHVtYm5haWwoY3VycmVudEZpbGUpO1xyXG5cclxuICAgICAgLy8gMi4gU2UgbGEgY29tcHJlc3Npb25lIMOoIGFiaWxpdGF0YSwgaW52aWFtbyBpbCBmaWxlIGFsbCdBUEkgQyNcclxuICAgICAgaWYgKHRoaXMudmlkZW9Db21wcmVzc2lvbi5lbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5zaG93VG9hc3QoXCJDb21wcmVzc2lvbmUgdmlkZW8gaW4gY29yc28uLi4gTCdvcGVyYXppb25lIHBvdHJlYmJlIHJpY2hpZWRlcmUgYWxjdW5pIG1pbnV0aS5cIiwgXCJpbmZvXCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gQ2hpYW1hdGEgYWwgbWljcm9zZXJ2aXppbyBDIyAobWV0b2RvIHJpc3RydXR0dXJhdG8gcHJlY2VkZW50ZW1lbnRlKVxyXG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZEJsb2IgPSBhd2FpdCB0aGlzLmNvbXByZXNzVmlkZW9BcGkoY3VycmVudEZpbGUsIHRoaXMudmlkZW9Db21wcmVzc2lvbik7XHJcblxyXG4gICAgICAgICAgLy8gQ3JlaWFtbyBpbCBudW92byBub21lIGZpbGUgY29uIGVzdGVuc2lvbmUgLm1wNFxyXG4gICAgICAgICAgY29uc3QgbmV3RmlsZU5hbWUgPSBjdXJyZW50RmlsZS5uYW1lLnJlcGxhY2UoL1xcLlteLy5dKyQvLCBcIlwiKSArIFwiLm1wNFwiO1xyXG5cclxuICAgICAgICAgIC8vIFRyYXNmb3JtaWFtbyBpbCBCbG9iIHJpY2V2dXRvIGluIHVuIEZpbGUgcGVyIG1hbnRlbmVyZSBsYSBjb2VyZW56YSBuZWxsJ29nZ2V0dG8gRFRPXHJcbiAgICAgICAgICBmaW5hbEZpbGUgPSBuZXcgRmlsZShbY29tcHJlc3NlZEJsb2JdLCBuZXdGaWxlTmFtZSwgeyB0eXBlOiBcInZpZGVvL21wNFwiIH0pO1xyXG5cclxuICAgICAgICAgIC8vIEFnZ2lvcm5pYW1vIGkgbWV0YWRhdGkgZGVsbCdhbGxlZ2F0b1xyXG4gICAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IG5ld0ZpbGVOYW1lO1xyXG4gICAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBcInZpZGVvL21wNFwiO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IoXCJFcnJvcmUgZHVyYW50ZSBsYSBjb21wcmVzc2lvbmUgcmVtb3RhIGRlbCB2aWRlby4gVmVycsOgIGNhcmljYXRvIGlsIGZpbGUgb3JpZ2luYWxlLlwiKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJWaWRlbyBBUEkgRXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgIC8vIEluIGNhc28gZGkgZXJyb3JlIGRlbGwnQVBJLCBmaW5hbEZpbGUgcmltYW5lIGlsIGN1cnJlbnRGaWxlIG9yaWdpbmFsZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSW1wb3N0aWFtbyBpbCBmaWxlIChjb21wcmVzc28gbyBvcmlnaW5hbGUpIGNvbWUgTGFyZ2VGaWxlXHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuTGFyZ2VGaWxlID0gZmluYWxGaWxlIGFzIEZpbGU7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuSXNMYXJnZUZpbGUgPSB0cnVlO1xyXG4gICAgICByZXR1cm4gbmV3QXR0YWNobWVudDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNMYXJnZUZpbGUpIHtcclxuICAgICAgLy8gQ0FTTyBMQVJHRSBGSUxFOlxyXG4gICAgICAvLyBQb3BvbGlhbW8gT3JpZ2luYWxGaWxlIGUgZm9yemlhbW8gaWwgQmFzZTY0IGEgbnVsbC5cclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IG51bGw7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuTGFyZ2VGaWxlID0gY3VycmVudEZpbGU7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuSXNMYXJnZUZpbGUgPSB0cnVlO1xyXG4gICAgICBnZXRCYXNlNjQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ2V0QmFzZTY0ID09IHRydWUpIHtcclxuICAgICAgbGV0IGJhc2U2NFJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0QmFzZTY0RnJvbUZpbGUoY3VycmVudEZpbGUpO1xyXG4gICAgICBuZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gYmFzZTY0UmVzdWx0LkJhc2U2NEZpbGU7XHJcbiAgICAgIGlmICghbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBiYXNlNjRSZXN1bHQuQ29udGVudFR5cGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdBdHRhY2htZW50LklzSW1hZ2UgJiYgbmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCAmJiBjcm9wRmlsZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZChgZGF0YToke2Jhc2U2NFJlc3VsdC5Db250ZW50VHlwZX07YmFzZTY0LCR7YmFzZTY0UmVzdWx0LkJhc2U2NEZpbGV9YCwgbmV3QXR0YWNobWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3QXR0YWNobWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgZmlsZSBwYXNzYXRvIGluIGlucHV0IHJlc3RpdHVpc2NlIHVuIG9nZ2V0dG9cclxuICAgKiBjb250ZW5lbnRlIGlsIGJhc2U2NCBkZWwgZmlsZSBlIGlsIHN1byBjb250ZW50VHlwZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50RmlsZSBPZ2dldHRvIEZpbGUgZGEgY3VpIGVzdHJhcG9sYXJlIGJhc2U2NCBlIGNvbnRlbnRUeXBlXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW4gb2dnZXR0byBhdmVudGUgbGUgcHJvcHJpZXTDoCBCYXNlNjRGaWxlIGUgQ29udGVudFR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGdldEJhc2U2NEZyb21GaWxlKGN1cnJlbnRGaWxlOiBGaWxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGZpbGVTaXplTUIgPSBjdXJyZW50RmlsZS5zaXplIC8gMTAyNCAvIDEwMjQ7XHJcbiAgICBpZiAoZmlsZVNpemVNQiA+IHRoaXMuYmFzZTY0TGltaXRNQikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIEJhc2U2NEZpbGU6IG51bGwsXHJcbiAgICAgICAgQ29udGVudFR5cGU6IGN1cnJlbnRGaWxlLnR5cGVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIC8vIFByb2NlZHVyYSBzdGFuZGFyZFxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJhc2U2NEZpbGUgPSBhd2FpdCB0b0Jhc2U2NChjdXJyZW50RmlsZSk7XHJcbiAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbDtcclxuICAgICAgaWYgKGJhc2U2NEZpbGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzBdLnNwbGl0KFwiOlwiKVsxXS5zcGxpdChcIjtcIilbMF07XHJcbiAgICAgICAgYmFzZTY0RmlsZSA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzFdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgQmFzZTY0RmlsZTogYmFzZTY0RmlsZSxcclxuICAgICAgICBDb250ZW50VHlwZTogY29udGVudFR5cGVcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIHJldHVybiB7IEJhc2U2NEZpbGU6IG51bGwsIENvbnRlbnRUeXBlOiBudWxsIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgaWwgZmlsZSBjaGUgc2kgc3RhIGNhcmljYW5kbyDDqCBzdXBwb3J0YXRvIGRhbCBzaXN0ZW1hLlxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FjY2VwdGVkRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICAvLyBTZSBhY2NldHRvIHR1dHRvLCBlc2NvIHN1Yml0b1xyXG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPT09IFwiKlwiKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBpc1R5cGVWYWxpZCA9IChtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIGlmICghbWltZVR5cGUpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIC8vIENvbnRyb2xsbyBjb3JyaXNwb25kZW56YSBlc2F0dGEgKGVzLiBpbWFnZS9wbmcpXHJcbiAgICAgIGlmICh0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjb25zdCB3aWxkY2FyZHMgPSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLnNwbGl0KFwiLFwiKS5maWx0ZXIodCA9PiB0LmluY2x1ZGVzKFwiKlwiKSk7XHJcbiAgICAgIGZvciAobGV0IHQgb2Ygd2lsZGNhcmRzKSB7XHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdC5zcGxpdChcIipcIilbMF07IC8vIFByZW5kZSBcImltYWdlL1wiIGRhIFwiaW1hZ2UvKlwiXHJcbiAgICAgICAgaWYgKG1pbWVUeXBlLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT09IHRydWUpIHtcclxuICAgICAgLy8gQ2FzbyBTaW5nb2xvXHJcbiAgICAgIHJldHVybiBpc1R5cGVWYWxpZCh0aGlzLnNlbGVjdGVkRmlsZS50eXBlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENhc28gTXVsdGlwbG86IFRVVFRJIGkgZmlsZSBzZWxlemlvbmF0aSBkZXZvbm8gZXNzZXJlIHZhbGlkaVxyXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkRmlsZXMpLmV2ZXJ5KGZpbGUgPT4gaXNUeXBlVmFsaWQoZmlsZS50eXBlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZSBlcXAtYXR0YWNobWVudHMgw6ggc3RhdGEgY29uZmlndXJhdGEgcGVyIGlsIGNhcmljYW1lbnRvIGRlbGxlIHNvbGUgaW1tYWdpbmkgYWxsb3JhIHZlcmlmaWNhIGNoZSBpbCBmaWxlIHBhc3NhdG8gaW5cclxuICAgKiBpbnB1dCBzaWEgZWZmZXR0aXZhbWVudGUgdW4gaW1tYWdpbmUgbyBuby5cclxuICAgKiBTZSBpbCBjb250cm9sbG8gdmEgYSBidW9uIGZpbmUgcmVzdGl0dWlzY2UgVFJVRSBhbHRyaW1lbnRpIG1vc3RyYSB1biBtZXNzYWdnaW8gZCdlcnJvcmUgZSByZXN0aXR1aXNjZSBGQUxTRVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuYWxsb3dPbmx5SW1hZ2VzID09IHRydWUgJiYgbmV3QXR0YWNobWVudC5Jc0ltYWdlICE9IHRydWUpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IodGhpcy5ub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNoZWNrQWNjZXB0ZWRGaWxlcygpKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKHRoaXMud3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmFib3J0RmlsZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgY3JvcCBmaWxlXHJcblxyXG4gIGdldEltYWdlRGltZW5zaW9ucyhpbWc6IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKHJzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEhlaWdodCA9IHJzLmN1cnJlbnRUYXJnZXRbXCJoZWlnaHRcIl07XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gcnMuY3VycmVudFRhcmdldFtcIndpZHRoXCJdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbFdpZHRoID4gMTI4MCkge1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21XaWR0aCA9IDEyODA7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKDEyODAgKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gcnMuY3VycmVudFRhcmdldFtcImhlaWdodFwiXTtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tV2lkdGggPSBycy5jdXJyZW50VGFyZ2V0W1wid2lkdGhcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGltZyk7XHJcbiAgfVxyXG5cclxuICByZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCkge1xyXG4gICAgdGhpcy5jdXN0b21XaWR0aCA9IHRoaXMub3JpZ2luYWxXaWR0aDtcclxuICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gdGhpcy5vcmlnaW5hbEhlaWdodDtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb24gPSAwO1xyXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcclxuICB9XHJcblxyXG4gIG9uRGltZW5zaW9uc0NoYW5nZShkaW1lbnNpb246IHN0cmluZykge1xyXG4gICAgaWYgKGRpbWVuc2lvbiA9PSBcIkhcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbVdpZHRoID0gTWF0aC5yb3VuZCgodGhpcy5jdXN0b21IZWlnaHQgKiB0aGlzLm9yaWdpbmFsV2lkdGgpIC8gdGhpcy5vcmlnaW5hbEhlaWdodCk7XHJcbiAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PSBcIldcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKHRoaXMuY3VzdG9tV2lkdGggKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZCh0aGlzLmNyb3BwZWRJbWFnZSwgdGhpcy5uZXdBdHRhY2htZW50KTtcclxuICB9XHJcblxyXG4gIGdldENyb3BwZWRBbmRVcGxvYWQoZmlsZSwgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICB2YXIgZmlsZTogYW55ID0gYmFzZTY0VG9GaWxlKGZpbGUpO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbXByZXNzaW9uT3B0aW9ucztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXByaW1lIGwnaW1tYWdpbmUgcGFzc2FuZG8gY29tZSBwYXJhbWV0cmkgbGUgb3B0aW9ucyBjcmVhdGUgbmVsbCdvZ2dldHRvIHNvcHJhLCBlIGlsIGZpbGUgZGFsIHJlYWRlciBwcmluY2lwYWxlXHJcbiAgICAgKi9cclxuICAgIGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucykudGhlbigoZmlsZUNvbXByZXNzZWQpID0+IHtcclxuICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgLy9GYWNjaW8gbGEgcHVzaCBkaSBvZ25pIGZpbGUgYWxsJ2ludGVybm8gZGVsbCdhcnJheSBkaSBmaWxlIGRlbGwnaXRlbSBkYSBtYW5kYXJlIGFsIHNlcnZlclxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0UmVhZGVyID0gPHN0cmluZz5maWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICB2YXIgbWFya2VyID0gXCI7YmFzZTY0LFwiO1xyXG4gICAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSByZXN1bHRSZWFkZXIuc3Vic3RyaW5nKHJlc3VsdFJlYWRlci5pbmRleE9mKG1hcmtlcikgKyBtYXJrZXIubGVuZ3RoKTtcclxuICAgICAgICBzZWxmLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2VsZi5uZXdBdHRhY2htZW50Rm9ybSkge1xyXG4gICAgICAgICAgc2VsZi5uZXdBdHRhY2htZW50Rm9ybS5lbmFibGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUNvbXByZXNzZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByb3RhdGVMZWZ0KCkge1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbi0tO1xyXG4gICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZVJpZ2h0KCkge1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xyXG4gICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xyXG4gICAgY29uc3QgZmxpcHBlZEggPSB0aGlzLnRyYW5zZm9ybS5mbGlwSDtcclxuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBIOiBmbGlwcGVkVixcclxuICAgICAgZmxpcFY6IGZsaXBwZWRIXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZmxpcEhvcml6b250YWwoKSB7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBIOiAhdGhpcy50cmFuc2Zvcm0uZmxpcEhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmbGlwVmVydGljYWwoKSB7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgIGZsaXBWOiAhdGhpcy50cmFuc2Zvcm0uZmxpcFZcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogQW5udWxsYSBsYSBzZWxlemlvbmUgZGVsIGZpbGUsIHN2dW90YW5kbyBsJ2lucHV0IGUgcmVzZXR0YW5kbyB0dXR0ZSBsZSBwcm9wcmlldMOgIGRlbGwnSUF0dGFjaG1lbnREVE9cclxuICAgKi9cclxuICBhYm9ydEZpbGUoKSB7XHJcbiAgICBpZiAodGhpcy5pbWFnZUlucHV0KSB0aGlzLmltYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID0gZmFsc2U7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBudWxsO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICB0aGlzLmN1c3RvbUhlaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmN1c3RvbVdpZHRoID0gbnVsbDtcclxuICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZkNyb3BJbWFnZS5jbG9zZSgpO1xyXG4gICAgdGhpcy5yZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgZmlsZURyb3BwZWQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcblxyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5vbkZpbGVBZGRlZCh7IHRhcmdldDogeyBmaWxlczogZmlsZXMgfSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFNlIGlsIGNhcmljYW1lbnRvIGRlbCBmaWxlIGRyb3Bib3ggdmEgYSBidW9uIGZpbmUsIGxhIGZ1bnppb25lIGRpIGNhbGxiYWNrIHJlc3RpdHVpc2NlIHVuIGFycmF5IGRpIG9nZ2V0dGkuXHJcbiAgLy8gVmllbmUgcG9pIGZhdHRhIHVuYSBYTUxIdHRwUmVxdWVzdCBjb24gcmVzcG9uc2VUeXBlICdibG9iJyBwZXIgY29udmVydGlyZSBpbCBwcmltbyBlbGVtZW50byBkZWxsYSByZXNwb25zZSBpbiB1biBCbG9iLlxyXG4gIGNob29zZURyb3Bib3hGaWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IChmaWxlczogYW55W10pID0+IHtcclxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBmaWxlc1swXS5saW5rKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke0F0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmRyb3Bib3hDcmVkZW50aWFscy5hY2Nlc3NUb2tlbn1gKTtcclxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XHJcblxyXG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBibG9iID0geGhyLnJlc3BvbnNlO1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZXNbMF0ubmFtZSwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XHJcbiAgICAgICAgICBsZXQgZmlsZXNBZGRlZCA9IFtmaWxlXTtcclxuICAgICAgICAgIHRoaXMub25GaWxlQWRkZWQoZmlsZXNBZGRlZCwgdHJ1ZSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgeGhyLnNlbmQoKTtcclxuICAgICAgfSxcclxuICAgICAgbGlua1R5cGU6IFwiZGlyZWN0XCIsXHJcbiAgICAgIG11bHRpc2VsZWN0OiBmYWxzZSxcclxuICAgICAgZXh0ZW5zaW9uczogW1wiLmpwZ1wiLCBcIi5wbmdcIiwgXCIucGRmXCIsIFwiLmRvY1wiLCBcIi5kb2N4XCIsIFwiLnR4dFwiXVxyXG4gICAgfTtcclxuICAgIERyb3Bib3guY2hvb3NlKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy8gV29ya2Fyb3VuZCBkcm9wem9uZTogZGlzYWJpbGl0byBpbCBjbGljayBkZWdsaSBlbGVtZW50aSBpbmNsdXNpIG5lbGxhIGRyb3B6b25lIHBlciBldml0YXJlIGRpIGNsaWNjYXJlIGR1ZSB2b2x0ZVxyXG4gIG9uU2VsZWN0RmlsZShldmVudCwgZmlsZUlucHV0KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhZ05hbWUgPT09IFwiQlVUVE9OXCIgfHxcclxuICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFnTmFtZSA9PT0gXCJJTlBVVFwiIHx8XHJcbiAgICAgIHRoaXMuYWRkaW5nTGlua01vZGUgPT0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZpbGVJbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXByZSBpbCBkaWFsb2dvIHBlciBsJ2luc2VyaW1lbnRvIGRlbCBsaW5rLlxyXG4gICAqL1xyXG4gIHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZmlsZU5hbWU6IFsnJ10sXHJcbiAgICAgIGZpbGVQYXRoOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oJ2h0dHBzPzovLy4rJyldXVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLmFkZGluZ0xpbmtUZW1wbGF0ZSwge1xyXG4gICAgICB3aWR0aDogJzUwMHB4JyxcclxuICAgICAgcGFuZWxDbGFzczogJ2VxcC1hdHRhY2htZW50cy1kaWFsb2cnXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIC8vIENyZWEgbCdvZ2dldHRvIHBlciBpbCBudW92byBsaW5rIGRhaSBkYXRpIGRlbCBmb3JtXHJcbiAgICAgICAgY29uc3QgbmV3TGlua09iamVjdDogSUF0dGFjaG1lbnREVE8gPSB7XHJcbiAgICAgICAgICBJRDogMCxcclxuICAgICAgICAgIEF0dGFjaG1lbnRUeXBlOiBBdHRhY2htZW50VHlwZS5MSU5LLFxyXG4gICAgICAgICAgRmlsZU5hbWU6IHJlc3VsdC5maWxlTmFtZSxcclxuICAgICAgICAgIEZpbGVQYXRoOiByZXN1bHQuZmlsZVBhdGgsXHJcbiAgICAgICAgICBJc0ltYWdlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IG5ld0xpbmtPYmplY3Q7XHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gW25ld0xpbmtPYmplY3RdO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5jb25maXJtQWRkQXR0YWNobWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gTWV0b2RvIHBlciBvdHRlbmVyZSBsZSBjbGFzc2kgQ1NTIGRpbmFtaWNoZVxyXG4gIGdldENhcmRDbGFzcyhhdHQ6IElBdHRhY2htZW50RFRPKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2ZpbGUtcHJldmlldyc6IHRydWUsXHJcbiAgICAgICd1cGxvYWRpbmcnOiAhIWF0dC5pc1VwbG9hZGluZyxcclxuICAgICAgJ2NhcmQtc21hbGwnOiB0aGlzLmNhcmRTaXplID09PSAnc21hbGwnLFxyXG4gICAgICAnY2FyZC1tZWRpdW0nOiB0aGlzLmNhcmRTaXplID09PSAnbWVkaXVtJyxcclxuICAgICAgJ2NhcmQtbGFyZ2UnOiB0aGlzLmNhcmRTaXplID09PSAnbGFyZ2UnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFF1ZXN0YSBmdW56aW9uZSBvcmEgc2kgYXBwbGljYSBhbCBjb250ZW5pdG9yZSwgbm9uIGFsbGEgc2luZ29sYSBjYXJkLlxyXG4gIGdldFByZXZpZXdzQ29udGFpbmVyU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBsZXQgbWluV2lkdGggPSAnMjAwcHgnOyAvLyBEaW1lbnNpb25lIGRpIGRlZmF1bHQgcGVyICdtZWRpdW0nXHJcblxyXG4gICAgaWYgKHRoaXMuY2FyZFNpemUgPT09ICdzbWFsbCcpIHtcclxuICAgICAgbWluV2lkdGggPSAnMTQwcHgnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhcmRTaXplID09PSAnbGFyZ2UnKSB7XHJcbiAgICAgIG1pbldpZHRoID0gJzI4MHB4JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkU2l6ZSA9PT0gJ2N1c3RvbScpIHtcclxuICAgICAgbWluV2lkdGggPSBgJHt0aGlzLmN1c3RvbUNhcmRXaWR0aFB4fXB4YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyAnLS1jYXJkLW1pbi13aWR0aCc6IG1pbldpZHRoIH07XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcmltYXJ5QWN0aW9uKGF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPKTogdm9pZCB7XHJcbiAgICAvLyBTZSBpbCBmaWxlIHB1w7IgZXNzZXJlIHZpc3VhbGl6emF0byBpbiBhbnRlcHJpbWEsIGFwcmkgaWwgZGlhbG9nXHJcbiAgICBpZiAodGhpcy5jYW5CZVByZXZpZXdlZChhdHRhY2htZW50KSkge1xyXG4gICAgICB0aGlzLm9wZW5QcmV2aWV3RGlhbG9nKGF0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gQWx0cmltZW50aSwgZXNlZ3VpIGwnYXppb25lIGRpIGRlZmF1bHQgKGRvd25sb2FkIHBlciBmaWxlLCBhcHJpIHBlciBsaW5rKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudmlld0F0dGFjaG1lbnQoYXR0YWNobWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogRGV0ZXJtaW5lcyBpZiBhbiBhdHRhY2htZW50IGNhbiBiZSBwcmV2aWV3ZWQgaW4gdGhlIGRpYWxvZy5cclxuICogQHBhcmFtIGF0dCBUaGUgYXR0YWNobWVudCB0byBjaGVjay5cclxuICogQHJldHVybnMgYHRydWVgIGlmIGEgcHJldmlldyBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxuICBjYW5CZVByZXZpZXdlZChhdHQ6IElBdHRhY2htZW50RFRPKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWF0dCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FzZSAxOiBJdCdzIGFuIGltYWdlIHdpdGggQmFzZTY0IGRhdGEuXHJcbiAgICBjb25zdCBpc1ByZXZpZXdhYmxlSW1hZ2UgPSBhdHQuSXNJbWFnZSAmJiAhIWF0dC5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAvLyBDYXNlIDI6IEl0J3MgYSBQREYgd2l0aCBCYXNlNjQgZGF0YS5cclxuICAgIGNvbnN0IGlzUHJldmlld2FibGVQZGYgPSBhdHQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiAhIWF0dC5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAvLyBDYXNlIDM6IEl0J3MgYSByZW1vdGUgZG9jdW1lbnQgd2l0aCBhIFVSTCAoZm9yIEdvb2dsZSBWaWV3ZXIpLlxyXG4gICAgY29uc3QgaXNSZW1vdGVEb2N1bWVudCA9ICFhdHQuSXNJbWFnZSAmJiAhIWF0dC5GaWxlUGF0aCAmJiAhIXRoaXMucHJvZHVjdGlvbkJhc2VVcmw7XHJcblxyXG4gICAgLy9DYXNlIDQ6IFZpZGVvIC0gw4ggdW4gdmlkZW8gZSBhYmJpYW1vIGlsIGZpbGUgYmluYXJpbyBzYWx2YXRvIGluIExhcmdlRmlsZVxyXG4gICAgY29uc3QgaXNQcmV2aWV3YWJsZVZpZGVvID0gYXR0LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykgJiYgISFhdHQuTGFyZ2VGaWxlO1xyXG5cclxuICAgIC8vIEEgcHJldmlldyBpcyBwb3NzaWJsZSBpZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZS5cclxuICAgIHJldHVybiBpc1ByZXZpZXdhYmxlSW1hZ2UgfHwgaXNQcmV2aWV3YWJsZVBkZiB8fCBpc1JlbW90ZURvY3VtZW50IHx8IGlzUHJldmlld2FibGVWaWRlbztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDb2x1bW5IaWRkZW4oY29sOiBBdHRhY2htZW50RmllbGRDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIC8vIDEpIGhpZGRlbkNvbHVtbnNcclxuICAgIGlmICh0aGlzLmhpZGRlbkNvbHVtbnM/LmluY2x1ZGVzKGNvbC5rZXkpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyAyKSBoaWRkZW4gZGVmaW5pdG8gc3VsbGEgY29sb25uYSAoYm9vbGVhbiBvIGZ1bnppb25lIHNlbnphIGFyZ3MpXHJcbiAgICBpZiAodHlwZW9mIGNvbC5oaWRkZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiAhIWNvbC5oaWRkZW4oKTtcclxuICAgIHJldHVybiAhIWNvbC5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBpc0FjdGlvbkhpZGRlbihhY3Rpb246IEF0dGFjaG1lbnRNZW51QWN0aW9uLCBhdHQ/OiBJQXR0YWNobWVudERUTyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGlkZGVuQWN0aW9ucz8uaW5jbHVkZXMoYWN0aW9uLmtleSkpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHRoaXMuYWN0aW9uSGlkZGVuRm4/LihhY3Rpb24ua2V5LCBhdHQpKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmICh0eXBlb2YgYWN0aW9uLmhpZGRlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuICEhYWN0aW9uLmhpZGRlbihhdHQpO1xyXG4gICAgcmV0dXJuICEhYWN0aW9uLmhpZGRlbjtcclxuICB9XHJcblxyXG4gIGlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uOiBBdHRhY2htZW50TWVudUFjdGlvbiwgYXR0PzogSUF0dGFjaG1lbnREVE8pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmFjdGlvbkRpc2FibGVkRm4/LihhY3Rpb24ua2V5LCBhdHQpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAodHlwZW9mIGFjdGlvbi5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuICEhYWN0aW9uLmRpc2FibGVkKGF0dCk7XHJcblxyXG4gICAgcmV0dXJuICEhYWN0aW9uLmRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgaXNEZWxldGVIaWRkZW4oYXR0OiBJQXR0YWNobWVudERUTyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uSGlkZGVuRm4/LignZGVsZXRlJywgYXR0KSB8fCB0aGlzLmhpZGRlbkFjdGlvbnM/LmluY2x1ZGVzKCdkZWxldGUnKTtcclxuICB9XHJcblxyXG4gIGlzRGVsZXRlRGlzYWJsZWQoYXR0OiBJQXR0YWNobWVudERUTyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZUFjdGlvbiB8fCAhIXRoaXMuYWN0aW9uRGlzYWJsZWRGbj8uKCdkZWxldGUnLCBhdHQpO1xyXG4gIH1cclxuXHJcbiAgaXNQcmltYXJ5QWN0aW9uSGlkZGVuKGF0dDogSUF0dGFjaG1lbnREVE8pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhpZGRlbkFjdGlvbnM/LmluY2x1ZGVzKCdkb3dubG9hZCcpIHx8IHRoaXMuaGlkZGVuQWN0aW9ucz8uaW5jbHVkZXMoJ3ByZXZpZXcnKSB8fCB0aGlzLmhpZGRlbkFjdGlvbnM/LmluY2x1ZGVzKCdwcmltYXJ5QWN0aW9uJykpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaGlkZGVuQ29sdW1ucz8uaW5jbHVkZXMoJ2Rvd25sb2FkJykgfHwgdGhpcy5oaWRkZW5Db2x1bW5zPy5pbmNsdWRlcygncHJldmlldycpIHx8IHRoaXMuaGlkZGVuQ29sdW1ucz8uaW5jbHVkZXMoJ3ByaW1hcnlBY3Rpb24nKSkgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAodGhpcy5hY3Rpb25IaWRkZW5Gbj8uKCdwcmltYXJ5QWN0aW9uJywgYXR0KSB8fCB0aGlzLmFjdGlvbkhpZGRlbkZuPy4oJ2Rvd25sb2FkJywgYXR0KSB8fCB0aGlzLmFjdGlvbkhpZGRlbkZuPy4oJ3ByZXZpZXcnLCBhdHQpKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGlzUHJpbWFyeUFjdGlvbkRpc2FibGVkKGF0dDogSUF0dGFjaG1lbnREVE8pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmFjdGlvbkRpc2FibGVkRm4/LigncHJpbWFyeUFjdGlvbicsIGF0dCkgfHwgdGhpcy5hY3Rpb25EaXNhYmxlZEZuPy4oJ2Rvd25sb2FkJywgYXR0KSB8fCB0aGlzLmFjdGlvbkRpc2FibGVkRm4/LigncHJldmlldycsIGF0dCkpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVW5pc2NlIGxlIGNvbG9ubmUgZGkgZGVmYXVsdCBjb24gcXVlbGxlIGN1c3RvbSBlIGxlIG9yZGluYS5cclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwVGFibGVDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmaW5pYW1vIGxlIGNvbG9ubmUgc3RhbmRhcmQgY29uIHVuYSBwb3NpemlvbmVcclxuICAgIGNvbnN0IGRlZmF1bHRGaWxlQ29sdW1uOiBBdHRhY2htZW50RmllbGRDb2x1bW4gPSB7XHJcbiAgICAgIGtleTogJ2ZpbGUnLFxyXG4gICAgICBkaXNwbGF5OiAnRmlsZScsXHJcbiAgICAgIHR5cGU6IFR5cGVBdHRhY2htZW50Q29sdW1uLlRFTVBMQVRFLFxyXG4gICAgICBleHRlcm5hbFRlbXBsYXRlOiB0aGlzLmRlZmF1bHRGaWxlVGVtcGxhdGUsXHJcbiAgICAgIHN0eWxlczogeyBmbGV4OiAnMSAxIDAlJyB9LFxyXG4gICAgICBwb3NpdGlvbjogMTBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbnNDb2x1bW46IEF0dGFjaG1lbnRGaWVsZENvbHVtbiA9IHtcclxuICAgICAga2V5OiAnYWN0aW9ucycsXHJcbiAgICAgIGRpc3BsYXk6ICdBemlvbmknLFxyXG4gICAgICB0eXBlOiBUeXBlQXR0YWNobWVudENvbHVtbi5URU1QTEFURSxcclxuICAgICAgZXh0ZXJuYWxUZW1wbGF0ZTogdGhpcy5kZWZhdWx0QWN0aW9uc1RlbXBsYXRlLFxyXG4gICAgICBwb3NpdGlvbjogMTAwLFxyXG4gICAgICBjbGFzczogJ2NvbC1hY3Rpb25zJyxcclxuICAgICAgc3R5bGVzOiB7IGZsZXg6ICcwIDAgMTUwcHgnIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcHJvY2Vzc2VkQ3VzdG9tQ29sdW1ucyA9IHRoaXMuX2N1c3RvbUNvbHVtbnMubWFwKGNvbCA9PiB7XHJcbiAgICAgIC8vIEZsZXggZGkgZGVmYXVsdFxyXG4gICAgICBpZiAoIWNvbC5zdHlsZXMgfHwgIWNvbC5zdHlsZXMuZmxleCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICBzdHlsZXM6IHsgLi4uY29sLnN0eWxlcywgZmxleDogJzEgMSAwJScgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbXHJcbiAgICAgIGRlZmF1bHRGaWxlQ29sdW1uLFxyXG4gICAgICBkZWZhdWx0QWN0aW9uc0NvbHVtbixcclxuICAgICAgLi4ucHJvY2Vzc2VkQ3VzdG9tQ29sdW1uc1xyXG4gICAgXTtcclxuXHJcbiAgICAvLyBPcmRpbmlhbW8gbCdhcnJheSBmaW5hbGUgaW4gYmFzZSBhbGxhIHByb3ByaWV0w6AgJ3Bvc2l0aW9uJ1xyXG4gICAgdGhpcy5fdGFibGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+ICF0aGlzLmlzQ29sdW1uSGlkZGVuKGNvbCkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24gfHwgOTk7XHJcbiAgICAgICAgcmV0dXJuIHBvc0EgLSBwb3NCO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBNZW51QWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRlZmF1bHRQcmV2aWV3QWN0aW9uOiBBdHRhY2htZW50TWVudUFjdGlvbiA9IHtcclxuICAgICAga2V5OiAncHJldmlldycsXHJcbiAgICAgIGljb246ICd2aXNpYmlsaXR5JyxcclxuICAgICAgbmFtZTogJ0FudGVwcmltYScsXHJcbiAgICAgIGZuOiAoYXR0KSA9PiB0aGlzLm9wZW5QcmV2aWV3RGlhbG9nKGF0dCksXHJcbiAgICAgIGRpc2FibGVkOiAoYXR0KSA9PiAhdGhpcy5jYW5CZVByZXZpZXdlZChhdHQpLFxyXG4gICAgICBwb3NpdGlvbjogMTBcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdERlbGV0ZUFjdGlvbjogQXR0YWNobWVudE1lbnVBY3Rpb24gPSB7XHJcbiAgICAgIGtleTogJ2RlbGV0ZScsXHJcbiAgICAgIGljb246ICdkZWxldGUnLFxyXG4gICAgICBuYW1lOiAnRWxpbWluYScsXHJcbiAgICAgIGZuOiAoYXR0KSA9PiB0aGlzLmRlbGV0ZUF0dGFjaG1lbnQoYXR0KSxcclxuICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMuZGlzYWJsZUFjdGlvbixcclxuICAgICAgcG9zaXRpb246IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gW1xyXG4gICAgICBkZWZhdWx0UHJldmlld0FjdGlvbixcclxuICAgICAgZGVmYXVsdERlbGV0ZUFjdGlvbixcclxuICAgICAgLi4udGhpcy5fY3VzdG9tTWVudUFjdGlvbnNcclxuICAgIF07XHJcblxyXG4gICAgLy8gT3JkaW5pYW1vIGwnYXJyYXkgZmluYWxlIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgICdwb3NpdGlvbidcclxuICAgIHRoaXMuX3NvcnRlZE1lbnVBY3Rpb25zID0gYWxsQWN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc0EgPSBhLnBvc2l0aW9uIHx8IDk5O1xyXG4gICAgICBjb25zdCBwb3NCID0gYi5wb3NpdGlvbiB8fCA5OTtcclxuICAgICAgcmV0dXJuIHBvc0EgLSBwb3NCO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVmlkZW9UaHVtYm5haWwoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICAvLyBDcmVhIHVuIFVSTCB0ZW1wb3JhbmVvIHBlciBpbCBmaWxlIHZpZGVvXHJcbiAgICAgIGNvbnN0IHZpZGVvVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgdmlkZW8uc3JjID0gdmlkZW9Vcmw7XHJcbiAgICAgIHZpZGVvLnByZWxvYWQgPSAnbWV0YWRhdGEnO1xyXG4gICAgICB2aWRlby5tdXRlZCA9IHRydWU7XHJcbiAgICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcclxuXHJcbiAgICAgIHZpZGVvLm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gVmFpIGFsIHNlY29uZG8gMSAocGVyIGV2aXRhcmUgaWwgZm90b2dyYW1tYSBuZXJvIGluaXppYWxlKVxyXG4gICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHZpZGVvLm9uc2Vla2VkID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIEltcG9zdGEgbGUgZGltZW5zaW9uaSBkZWwgY2FudmFzIHVndWFsaSBhbCB2aWRlb1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBEaXNlZ25hIGlsIGZvdG9ncmFtbWEgc3VsIGNhbnZhc1xyXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKHZpZGVvLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgICAgICAvLyBFc3RyYWkgaWwgQmFzZTY0IChxdWFsaXTDoCAwLjcgcGVyIHJpc3Bhcm1pYXJlIHNwYXppbylcclxuICAgICAgICBjb25zdCB0aHVtYm5haWwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgMC43KTtcclxuXHJcbiAgICAgICAgLy8gUHVsaXNjaSBsYSBtZW1vcmlhXHJcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh2aWRlb1VybCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0aHVtYm5haWwuc3BsaXQoJywnKVsxXSk7IC8vIFJlc3RpdHVpYW1vIHNvbG8gbGEgcGFydGUgQmFzZTY0XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2aWRlby5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodmlkZW9VcmwpO1xyXG4gICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbXByZXNzVmlkZW9BcGkoZmlsZTogRmlsZSwgY29uZmlnOiBhbnkpOiBQcm9taXNlPEJsb2I+IHtcclxuICAgIC8vIFByZXBhcmlhbW8gaWwgRm9ybURhdGEgcGVyIGludmlhcmUgaWwgZmlsZSBiaW5hcmlvIGUgaSBwYXJhbWV0cmkgZGkgY29uZmlndXJhemlvbmVcclxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3ZpZGVvJywgZmlsZSk7XHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ21heFdpZHRoJywgU3RyaW5nKGNvbmZpZy5tYXhXaWR0aCA/PyAxMjgwKSk7XHJcblxyXG4gICAgaWYgKGNvbmZpZy5jcmYgIT0gbnVsbCkgZm9ybURhdGEuYXBwZW5kKCdjcmYnLCBTdHJpbmcoY29uZmlnLmNyZikpO1xyXG4gICAgaWYgKGNvbmZpZy5wcmVzZXQpIGZvcm1EYXRhLmFwcGVuZCgncHJlc2V0JywgY29uZmlnLnByZXNldCk7XHJcblxyXG4gICAgaWYgKGNvbmZpZy5jcmYgPT0gbnVsbCkge1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2JpdHJhdGUnLCBTdHJpbmcoY29uZmlnLmJpdHJhdGUgPz8gMjUwMDAwMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcubWF4RnBzICE9IG51bGwpIGZvcm1EYXRhLmFwcGVuZCgnbWF4RnBzJywgU3RyaW5nKGNvbmZpZy5tYXhGcHMpKTtcclxuICAgIGlmIChjb25maWcuYXVkaW9CaXRyYXRlICE9IG51bGwpIGZvcm1EYXRhLmFwcGVuZCgnYXVkaW9CaXRyYXRlJywgU3RyaW5nKGNvbmZpZy5hdWRpb0JpdHJhdGUpKTtcclxuXHJcblxyXG4gICAgLy8gVVJMIGRlbGxhIHR1YSBBUEkgQyNcclxuICAgIGNvbnN0IGFwaVVybCA9ICdodHRwczovL3R1by1zZXJ2aXppby1hcGkuaXQvYXBpL3ZpZGVvL2NvbXByZXNzJztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBFZmZldHR1aWFtbyBsYSBjaGlhbWF0YS4gVXNpYW1vICdmZXRjaCcgcGVyIHNlbXBsaWNpdMOgIG8gSHR0cENsaWVudCBkaSBBbmd1bGFyXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXBpVXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgYm9keTogZm9ybURhdGEsXHJcbiAgICAgICAgLy8gTm90YTogTm9uIGltcG9zdGFyZSBDb250ZW50LVR5cGUsIGlsIGJyb3dzZXIgbG8gZmFyw6AgY29ycmV0dGFtZW50ZSBpbmNsdWRlbmRvIGlsIGJvdW5kYXJ5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3JlIHNlcnZlcjogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSaWNldmlhbW8gaWwgZmlsZSBjb21wcmVzc28gY29tZSBCbG9iXHJcbiAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3JlIGR1cmFudGUgbGEgY29tcHJlc3Npb25lIHJlbW90YTpcIiwgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPCEtLSBTZSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgc2luZ29sYSBtb3N0cmEgaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlIC0tPlxyXG5AaWYoc2hvd1VwbG9hZFRpdGxlID09IHRydWUgfHwgY2hvb3NlVmlldyA9PSB0cnVlKXtcclxuPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gIEBpZihzaG93VXBsb2FkVGl0bGUgPT0gdHJ1ZSl7XHJcbiAgPGg0Pnt7IHVwbG9hZFRpdGxlIH19PC9oND5cclxuICB9XHJcbiAgQGlmKGNob29zZVZpZXcgPT0gdHJ1ZSl7XHJcbiAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIFt2YWx1ZV09XCJ2aWV3TW9kZVwiIChjaGFuZ2UpPVwic2V0Vmlld01vZGUoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICBhcmlhLWxhYmVsPVwiTW9kYWxpdMOgIGRpIHZpc3VhbGl6emF6aW9uZVwiPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiY2FyZFwiPjxtYXQtaWNvbj5ncmlkX3ZpZXc8L21hdC1pY29uPjwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJ0YWJsZVwiPjxtYXQtaWNvbj52aWV3X2xpc3Q8L21hdC1pY29uPjwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICB9XHJcbjwvZGl2PlxyXG59XHJcblxyXG48IS0tIEdlc3Rpb25lIHNpbmdvbG8gLS0+XHJcbkBpZiAobXVsdGlwbGVBdHRhY2htZW50ICE9IHRydWUpIHtcclxuQGlmICghc2luZ2xlQXR0YWNobWVudERyYWdBbmREcm9wKSB7XHJcbkBpZiAoIWFkZGluZ0xpbmtNb2RlKSB7XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQXR0YWNobWVudEJ1dHRvblwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxufSBAZWxzZSB7XHJcbjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaW5nTGlua1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG59XHJcbn0gQGVsc2Uge1xyXG48aW5wdXQgI2ZpbGVJbnB1dCBpZD1cImZpbGVfYXR0YWNobWVudFwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRcIiB0eXBlPVwiZmlsZVwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIlxyXG4gIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG5cclxuQGlmIChhbGxvd2VkVHlwZXMgJiYgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDEpICYmICghYXR0YWNobWVudHNMaXN0IHx8IGF0dGFjaG1lbnRzTGlzdC5sZW5ndGggPT0gMCB8fFxyXG4oYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgIWF0dGFjaG1lbnRzTGlzdFswXSkpKSB7XHJcblxyXG5AaWYgKHNob3dEcm9wQXJlYSA9PSB0cnVlKSB7XHJcbjwhLS0gRlVMTCAtLT5cclxuQGlmIChsYXlvdXQgPT09ICdmdWxsJykge1xyXG5cclxuPGRpdiBjbGFzcz1cImRyb3Bib3hcIiBbY2xhc3MuZHJhZ292ZXJdPVwiZHJhZ092ZXIgJiYgIWlzRGlzYWJsZWRcIiBbY2xhc3MuZGlzYWJsZWQtZHJvcHpvbmVdPVwiaXNEaXNhYmxlZFwiXHJcbiAgKGRyYWdvdmVyKT1cIiFpc0Rpc2FibGVkID8gZHJhZ092ZXIgPSB0cnVlIDogbnVsbDsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoZHJhZ2xlYXZlKT1cImRyYWdPdmVyID0gZmFsc2VcIlxyXG4gIChkcm9wKT1cIiFpc0Rpc2FibGVkID8gKGRyYWdPdmVyID0gZmFsc2UpIDogbnVsbDsgZmlsZURyb3BwZWQoJGV2ZW50KVwiXHJcbiAgKGNsaWNrKT1cIiFpc0Rpc2FibGVkICYmIG9uU2VsZWN0RmlsZSgkZXZlbnQsIGZpbGVJbnB1dClcIiByb2xlPVwiYnV0dG9uXCIgW2F0dHIudGFiaW5kZXhdPVwiaXNEaXNhYmxlZCA/IC0xIDogMFwiXHJcbiAgKGtleWRvd24uZW50ZXIpPVwiIWlzRGlzYWJsZWQgJiYgZmlsZUlucHV0LmNsaWNrKClcIiAoa2V5ZG93bi5zcGFjZSk9XCIhaXNEaXNhYmxlZCAmJiBmaWxlSW5wdXQuY2xpY2soKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LWljb25cIj7wn5OBPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtdGV4dFwiPnt7IGRyb3BIZXJlTGFiZWwgfX08L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC1zdWJ0ZXh0XCI+XHJcbiAgICB7eyBzdXBwb3J0ZWRGb3JtYXRzTGFiZWwgfX1cclxuICA8L2Rpdj5cclxuICA8YnV0dG9uIGNsYXNzPVwiYnJvd3NlLWJ0blwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlxyXG4gICAge3sgYnJvd3NlRmlsZXNMYWJlbCB9fVxyXG4gIDwvYnV0dG9uPlxyXG4gIDxkaXYgY2xhc3M9XCJzZWNvbmRhcnktYWN0aW9uXCI+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpICYmIGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGEgY2xhc3M9XCJzZWNvbmRhcnktYWN0aW9uLWxpbmtcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiaXNEaXNhYmxlZCA/IG51bGwgOiBsaW5rTWVudVwiXHJcbiAgICAgIFtjbGFzcy5kaXNhYmxlZC1saW5rXT1cImlzRGlzYWJsZWRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIG8gYWdnaXVuZ2kgZGEgd2ViXHJcbiAgICA8L2E+XHJcbiAgICA8bWF0LW1lbnUgI2xpbmtNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5saW5rPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3Bhbj5BZ2dpdW5naSBkYSBsaW5rPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaG9vc2VEcm9wYm94RmlsZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmNsb3VkX3F1ZXVlPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3Bhbj5DYXJpY2EgZGEgRHJvcGJveDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1tZW51PlxyXG4gICAgfVxyXG5cclxuICAgIEBlbHNlIGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHtcclxuICAgIDxhIFtjbGFzcy5kaXNhYmxlZC1saW5rXT1cImlzRGlzYWJsZWRcIiBjbGFzcz1cInNlY29uZGFyeS1hY3Rpb24tbGlua1wiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiPlxyXG4gICAgICBhZ2dpdW5naSB1biBsaW5rXHJcbiAgICA8L2E+XHJcbiAgICB9XHJcblxyXG4gICAgQGVsc2UgaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGEgW2NsYXNzLmRpc2FibGVkLWxpbmtdPVwiaXNEaXNhYmxlZFwiIGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgY2hvb3NlRHJvcGJveEZpbGUoKVwiPlxyXG4gICAgICBjYXJpY2EgZGEgRHJvcGJveFxyXG4gICAgPC9hPlxyXG4gICAgfVxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxufUBlbHNlIHtcclxuPGRpdiBjbGFzcz1cImNvbXBhY3QtdXBsb2FkZXJcIiBbY2xhc3MuZHJhZ292ZXJdPVwiZHJhZ092ZXIgJiYgIWlzRGlzYWJsZWRcIiBbY2xhc3MuZGlzYWJsZWQtZHJvcHpvbmVdPVwiaXNEaXNhYmxlZFwiXHJcbiAgKGRyYWdvdmVyKT1cIiFpc0Rpc2FibGVkID8gZHJhZ092ZXIgPSB0cnVlIDogbnVsbDsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoZHJhZ2xlYXZlKT1cImRyYWdPdmVyID0gZmFsc2VcIlxyXG4gIChkcm9wKT1cIiFpc0Rpc2FibGVkID8gKGRyYWdPdmVyID0gZmFsc2UpIDogbnVsbDsgZmlsZURyb3BwZWQoJGV2ZW50KVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb21wYWN0LWljb25cIj48bWF0LWljb24+Zm9sZGVyX29wZW48L21hdC1pY29uPjwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb21wYWN0LXRleHRcIiAoY2xpY2spPVwiIWlzRGlzYWJsZWQgJiYgb25TZWxlY3RGaWxlKCRldmVudCwgZmlsZUlucHV0KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGl0bGVcIj5UcmFzY2luYSBpIGZpbGUgbyBzZWxlemlvbmEgZGFsIGNvbXB1dGVyPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC1zdWJ0aXRsZVwiPnt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb21wYWN0LWFjdGlvbnNcIj5cclxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZmlsZUlucHV0LmNsaWNrKClcIj5TZm9nbGlhPC9idXR0b24+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHtcclxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbXBhY3RMaW5rTWVudVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5MaW5rPC9idXR0b24+XHJcbiAgICA8bWF0LW1lbnUgI2NvbXBhY3RMaW5rTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcclxuICAgICAgICAoY2xpY2spPVwic3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCI+e3sgb3BlbkxpbmtMYWJlbCB9fTwvYnV0dG9uPiB9XHJcbiAgICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7IDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiIChjbGljayk9XCJjaG9vc2VEcm9wYm94RmlsZSgpXCI+e3tcclxuICAgICAgICB1cGxvYWRXaXRoRHJvcGJveExhYmVsIH19PC9idXR0b24+IH1cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcbn1cclxufVxyXG59XHJcblxyXG48IS0tIEF6aW9uaSBzaW5nb2xvIGVsZW1lbnRvIChjb21lIHByaW1hKSAtLT5cclxuPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgQGlmIChhdHRhY2htZW50c0xpc3QgJiYgYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA+IDAgJiYgYXR0YWNobWVudHNMaXN0WzBdICYmIHNob3dBY3Rpb25CdXR0b25zID09IHRydWUpIHtcclxuICBAaWYgKCFpc1ByaW1hcnlBY3Rpb25IaWRkZW4oYXR0YWNobWVudHNMaXN0WzBdKSkge1xyXG4gIDxidXR0b24gY2xhc3M9XCJtYi0yIG1lLTIgZXFwLWF0dGFjaG1lbnRzLWRvd25sb2FkLWJ0blwiIChjbGljayk9XCJ2aWV3QXR0YWNobWVudChhdHRhY2htZW50c0xpc3RbMF0pXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBbZGlzYWJsZWRdPVwiaXNQcmltYXJ5QWN0aW9uRGlzYWJsZWQoYXR0YWNobWVudHNMaXN0WzBdKVwiXHJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgIEBpZiAoYXR0YWNobWVudHNMaXN0WzBdLkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUpIHtcclxuICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDxtYXQtaWNvbj5vcGVuX2luX25ldzwvbWF0LWljb24+XHJcbiAgICB9XHJcbiAgICB7eyBhdHRhY2htZW50c0xpc3RbMF0uQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSA/IGRvd25sb2FkTGFiZWwgOiBvcGVuTGlua0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG5cclxuICBAaWYgKCFpc1ByaW1hcnlBY3Rpb25IaWRkZW4oYXR0YWNobWVudHNMaXN0WzBdKSAmJiBzaG93UHJldmlldyAmJiAoIWF0dGFjaG1lbnRzTGlzdFswXS5GaWxlQ29udGVudFR5cGUgfHwgKCFhdHRhY2htZW50c0xpc3RbMF0uRmlsZUNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJylcclxuICAmJiAhYXR0YWNobWVudHNMaXN0WzBdLkZpbGVDb250ZW50VHlwZS5zdGFydHNXaXRoKCdhdWRpbycpKSkgJiYgYXR0YWNobWVudHNMaXN0WzBdLklzSW1hZ2UgPT0gdHJ1ZSkge1xyXG4gIDxidXR0b24gY2xhc3M9XCJtYi0yIG1lLTIgZXFwLWF0dGFjaG1lbnRzLXByZXZpZXctYnRuXCIgKGNsaWNrKT1cIm9wZW5QcmV2aWV3RGlhbG9nKGF0dGFjaG1lbnRzTGlzdFswXSlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgIFtkaXNhYmxlZF09XCJpc1ByaW1hcnlBY3Rpb25EaXNhYmxlZChhdHRhY2htZW50c0xpc3RbMF0pXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgPG1hdC1pY29uPnZpc2liaWxpdHk8L21hdC1pY29uPiB7eyBwcmV2aWV3TGFiZWwgfX1cclxuICA8L2J1dHRvbj5cclxuICB9XHJcblxyXG4gIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVBY3Rpb25cIiBjbGFzcz1cIm1iLTIgZXFwLWF0dGFjaG1lbnRzLWRlbGV0ZS1idG5cIlxyXG4gICAgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudHNMaXN0WzBdKVwiIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxyXG4gICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+IHt7IGRlbGV0ZUxhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG48L2Rpdj5cclxufVxyXG5cclxuPCEtLSBHZXN0aW9uZSBtdWx0aXBsYSAtLT5cclxuQGlmIChtdWx0aXBsZUF0dGFjaG1lbnQgPT0gdHJ1ZSAmJiBzaG93RHJvcEFyZWEgPT0gdHJ1ZSkge1xyXG48aW5wdXQgI2ZpbGVJbnB1dCBpZD1cImZpbGVfYXR0YWNobWVudF9tdWx0aVwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRfbXVsdGlcIiB0eXBlPVwiZmlsZVwiIGhpZGRlblxyXG4gIChjaGFuZ2UpPVwib25GaWxlQWRkZWQoJGV2ZW50KVwiIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG5cclxuQGlmIChsYXlvdXQgPT09ICdmdWxsJykge1xyXG48ZGl2IGNsYXNzPVwiZHJvcGJveFwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlciAmJiAhaXNEaXNhYmxlZFwiIFtjbGFzcy5kaXNhYmxlZC1kcm9wem9uZV09XCJpc0Rpc2FibGVkXCJcclxuICAoZHJhZ292ZXIpPVwiIWlzRGlzYWJsZWQgPyBkcmFnT3ZlciA9IHRydWUgOiBudWxsOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChkcmFnbGVhdmUpPVwiZHJhZ092ZXIgPSBmYWxzZVwiXHJcbiAgKGRyb3ApPVwiIWlzRGlzYWJsZWQgPyAoZHJhZ092ZXIgPSBmYWxzZSkgOiBudWxsOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCJcclxuICAoY2xpY2spPVwiIWlzRGlzYWJsZWQgJiYgb25TZWxlY3RGaWxlKCRldmVudCwgZmlsZUlucHV0KVwiIHJvbGU9XCJidXR0b25cIiBbYXR0ci50YWJpbmRleF09XCJpc0Rpc2FibGVkID8gLTEgOiAwXCJcclxuICAoa2V5ZG93bi5lbnRlcik9XCIhaXNEaXNhYmxlZCAmJiBmaWxlSW5wdXQuY2xpY2soKVwiIChrZXlkb3duLnNwYWNlKT1cIiFpc0Rpc2FibGVkICYmIGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bib3gtaWNvblwiPvCfk4E8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGJveC10ZXh0XCI+e3sgZHJvcEhlcmVMYWJlbCB9fTwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wYm94LXN1YnRleHRcIj5cclxuICAgIHt7IHN1cHBvcnRlZEZvcm1hdHNMYWJlbCB9fVxyXG4gIDwvZGl2PlxyXG4gIDxidXR0b24gY2xhc3M9XCJicm93c2UtYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgICB7eyBicm93c2VGaWxlc0xhYmVsIH19XHJcbiAgPC9idXR0b24+XHJcbiAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHtcclxuICA8ZGl2IGNsYXNzPVwic2Vjb25kYXJ5LWFjdGlvbi1saW5rXCI+XHJcbiAgICBvIDxhIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiPmFnZ2l1bmdpIHVuIGxpbms8L2E+XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxufUBlbHNle1xyXG48ZGl2IGNsYXNzPVwiY29tcGFjdC11cGxvYWRlclwiIFtjbGFzcy5kcmFnb3Zlcl09XCJkcmFnT3ZlciAmJiAhaXNEaXNhYmxlZFwiIFtjbGFzcy5kaXNhYmxlZC1kcm9wem9uZV09XCJpc0Rpc2FibGVkXCJcclxuICAoZHJhZ292ZXIpPVwiIWlzRGlzYWJsZWQgPyBkcmFnT3ZlciA9IHRydWUgOiBudWxsOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChkcmFnbGVhdmUpPVwiZHJhZ092ZXIgPSBmYWxzZVwiXHJcbiAgKGRyb3ApPVwiIWlzRGlzYWJsZWQgPyAoZHJhZ092ZXIgPSBmYWxzZSkgOiBudWxsOyBmaWxlRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtaWNvblwiPjxtYXQtaWNvbj5mb2xkZXJfb3BlbjwvbWF0LWljb24+PC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtdGV4dFwiIChjbGljayk9XCIhaXNEaXNhYmxlZCAmJiBvblNlbGVjdEZpbGUoJGV2ZW50LCBmaWxlSW5wdXQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFjdC10aXRsZVwiPlRyYXNjaW5hIGkgZmlsZSBvIHNlbGV6aW9uYSBkYWwgY29tcHV0ZXI8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21wYWN0LXN1YnRpdGxlXCI+e3sgc3VwcG9ydGVkRm9ybWF0c0xhYmVsIH19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbXBhY3QtYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWxlSW5wdXQuY2xpY2soKVwiPlNmb2dsaWE8L2J1dHRvbj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygzKSkge1xyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29tcGFjdExpbmtNZW51XCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPkxpbms8L2J1dHRvbj5cclxuICAgIDxtYXQtbWVudSAjY29tcGFjdExpbmtNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygyKSkgeyA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJzd2l0Y2hUb0FkZGluZ0xpbmtNb2RlKClcIj57eyBvcGVuTGlua0xhYmVsIH19PC9idXR0b24+IH1cclxuICAgICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMykpIHsgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIj57e1xyXG4gICAgICAgIHVwbG9hZFdpdGhEcm9wYm94TGFiZWwgfX08L2J1dHRvbj4gfVxyXG4gICAgPC9tYXQtbWVudT5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxufVxyXG5cclxuQGlmIChhdHRhY2htZW50c0xpc3Q/Lmxlbmd0aCA+IDAgJiYgc2hvd1N1bW1hcnkpIHtcclxuPGRpdiBjbGFzcz1cInVwbG9hZC1zdGF0c1wiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic3RhdHMtaW5mb1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN0YXQtaXRlbVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdC12YWx1ZVwiPnt7IGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWxhYmVsXCI+e3sgZmlsZXNMYWJlbCB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LXZhbHVlXCI+e3sgdG90YWxTaXplRm9ybWF0dGVkIH19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWxhYmVsXCI+e3sgdG90YWxTaXplTGFiZWwgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZmlsbFwiIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbn0gQGVsc2UgaWYoYXR0YWNobWVudHNMaXN0Py5sZW5ndGggPT0gMCl7XHJcbjxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPnt7IGVtcHR5U3RhdGVMYWJlbCB9fTwvZGl2PlxyXG59XHJcblxyXG48IS0tIEdyaWdsaWEgYW50ZXByaW1lIGNhcmQgKHZhbGUgcGVyIHNpbmdvbG8gZSBtdWx0aXBsbykgLS0+XHJcbkBpZiAodmlld01vZGUgPT09ICdjYXJkJykge1xyXG5cclxuPGRpdiBjbGFzcz1cImZpbGUtcHJldmlld3NcIiBbbmdTdHlsZV09XCJnZXRQcmV2aWV3c0NvbnRhaW5lclN0eWxlKClcIj5cclxuICBAZm9yIChhdHQgb2YgYXR0YWNobWVudHNMaXN0OyB0cmFjayBhdHQuSUQpIHtcclxuICA8ZGl2IFtuZ0NsYXNzXT1cImdldENhcmRDbGFzcyhhdHQpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1pbWctY29udGFpbmVyXCIgKGNsaWNrKT1cIiFhdHQuaXNVcGxvYWRpbmcgJiYgIWlzUHJpbWFyeUFjdGlvbkhpZGRlbihhdHQpICYmICFpc1ByaW1hcnlBY3Rpb25EaXNhYmxlZChhdHQpICYmIGhhbmRsZVByaW1hcnlBY3Rpb24oYXR0KVwiPlxyXG5cclxuICAgICAgQGlmIChhdHQuSXNJbWFnZSB8fCBhdHQuRmlsZVRodW1ibmFpbEJhc2U2NCkge1xyXG4gICAgICA8aW1nIGNsYXNzPVwicHJldmlldy1pbWdcIiBbc3JjXT1cIidkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyAoYXR0LkZpbGVUaHVtYm5haWxCYXNlNjQgfHwgYXR0LkZpbGVEYXRhQmFzZTY0KVwiXHJcbiAgICAgICAgW2FsdF09XCJhdHQuRmlsZU5hbWVcIiAvPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImZpbGUtaWNvblwiPjxpIFtuZ0NsYXNzXT1cImdldEF0dGFjaG1lbnRJY29uKGF0dClcIj48L2k+PC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoIWlzUHJpbWFyeUFjdGlvbkhpZGRlbihhdHQpKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWFjdGlvbi1vdmVybGF5XCI+XHJcbiAgICAgICAgQGlmIChhdHQuRmlsZUNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd2aWRlby8nKSkge1xyXG4gICAgICAgIDxtYXQtaWNvbj5wbGF5X2Fycm93PC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKGF0dC5Jc0ltYWdlICYmIGNhbkJlUHJldmlld2VkKGF0dCkpIHtcclxuICAgICAgICA8bWF0LWljb24+dmlzaWJpbGl0eTwvbWF0LWljb24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIGlmIChhdHQuRmlsZUNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyAmJiBjYW5CZVByZXZpZXdlZChhdHQpKSB7XHJcbiAgICAgICAgPG1hdC1pY29uPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKGF0dC5BdHRhY2htZW50VHlwZSA9PT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIHtcclxuICAgICAgICA8bWF0LWljb24+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLW5hbWVcIiBbdGl0bGVdPVwiYXR0LkZpbGVOYW1lXCI+e3sgYXR0LkZpbGVOYW1lIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICBAaWYoIWlzRGVsZXRlSGlkZGVuKGF0dCkpe1xyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJyZW1vdmUtYnRuXCIgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnQoYXR0KVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJhdHQuaXNVcGxvYWRpbmcgfHwgaXNEZWxldGVEaXNhYmxlZChhdHQpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChhdHQuaXNVcGxvYWRpbmcpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG59IEBlbHNlIGlmKHZpZXdNb2RlID09PSAndGFibGUnICYmIGF0dGFjaG1lbnRzTGlzdD8ubGVuZ3RoID4gMCkge1xyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0YWJsZS12aWV3LWNvbnRhaW5lclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XHJcbiAgICBAZm9yIChjb2wgb2YgX3RhYmxlQ29sdW1uczsgdHJhY2sgY29sLmtleSkge1xyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWNlbGxcIiBbc3R5bGUuZmxleF09XCJjb2wuc3R5bGVzPy5mbGV4XCIgW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+XHJcbiAgICAgIHt7IGNvbC5kaXNwbGF5IH19XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgQGZvciAoYXR0IG9mIGF0dGFjaG1lbnRzTGlzdDsgdHJhY2sgYXR0LklEKSB7XHJcbiAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiPlxyXG5cclxuICAgIEBmb3IgKGNvbCBvZiBfdGFibGVDb2x1bW5zOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2VsbFwiIFtzdHlsZS5mbGV4XT1cImNvbC5zdHlsZXM/LmZsZXhcIiBbbmdDbGFzc109XCJjb2wuY2xhc3NcIj5cclxuXHJcbiAgICAgIEBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcblxyXG4gICAgICBAY2FzZSAoJ3RlbXBsYXRlJykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidGVtcGxhdGUtd3JhcHBlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sLmV4dGVybmFsVGVtcGxhdGVcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBhdHQgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAY2FzZSAoJ2RhdGUnKSB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWV0YWRhdGEtdmFsdWVcIj57eyBhdHRbY29sLmtleV0gfCBkYXRlOidkZC9NTS95eXl5JyB9fTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgICBAZGVmYXVsdCB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWV0YWRhdGEtdmFsdWVcIj57eyBhdHRbY29sLmtleV0gfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxufVxyXG5cclxuPCEtLSBOb3RpZmljYSB0b2FzdCAtLT5cclxuPGRpdiBjbGFzcz1cInVwbG9hZC1ub3RpZmljYXRpb25cIiBbY2xhc3Muc2hvd109XCJ0b2FzdD8udmlzaWJsZVwiIFtjbGFzcy5zdWNjZXNzXT1cInRvYXN0Py50eXBlID09PSAnc3VjY2VzcydcIlxyXG4gIFtjbGFzcy5lcnJvcl09XCJ0b2FzdD8udHlwZSA9PT0gJ2Vycm9yJ1wiPlxyXG4gIDxzcGFuPnt7IHRvYXN0Py50ZXh0IH19PC9zcGFuPlxyXG4gIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvZ3Jlc3NcIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWxlVGVtcGxhdGUgbGV0LWF0dD5cclxuICA8aSBjbGFzcz1cImZpbGUtaWNvbi1zbWFsbFwiIFtuZ0NsYXNzXT1cImdldEF0dGFjaG1lbnRJY29uKGF0dClcIj48L2k+XHJcbiAgPGRpdiBjbGFzcz1cImZpbGUtaW5mby10ZXh0XCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpbGUtbmFtZS10YWJsZVwiPnt7IGF0dC5GaWxlTmFtZSB9fTwvc3Bhbj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10eXBlLXRhYmxlXCI+e3sgYXR0LkZpbGVFeHRlbnNpb24gfHwgJ0xpbmsnIH19PC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QWN0aW9uc1RlbXBsYXRlIGxldC1hdHQ+XHJcbiAgQGlmICghaXNQcmltYXJ5QWN0aW9uSGlkZGVuKGF0dCkpIHtcclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlUHJpbWFyeUFjdGlvbihhdHQpXCIgW2Rpc2FibGVkXT1cImlzUHJpbWFyeUFjdGlvbkRpc2FibGVkKGF0dClcIlxyXG4gICAgW21hdFRvb2x0aXBdPVwiYXR0LkZpbGVDb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndmlkZW8vJykgPyAnUmlwcm9kdWNpIHZpZGVvJyA6ICdWaXN1YWxpenphL1NjYXJpY2EnXCI+XHJcblxyXG4gICAgPG1hdC1pY29uPlxyXG4gICAgICBAaWYgKGF0dC5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSB7XHJcbiAgICAgIHBsYXlfYXJyb3dcclxuICAgICAgfSBAZWxzZSB7XHJcbiAgICAgIHt7IGF0dC5BdHRhY2htZW50VHlwZSA9PT0gQXR0YWNobWVudFR5cGUuRklMRSA/ICdkb3dubG9hZCcgOiAnb3Blbl9pbl9uZXcnIH19XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG5cclxuICBAaWYgKCFoaWRkZW5BY3Rpb25zLmluY2x1ZGVzKCdhY3Rpb25zTWVudScpKSB7XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFjdGlvbnNNZW51XCIgbWF0VG9vbHRpcD1cIkFsdHJlIG9wemlvbmlcIj5cclxuICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG4gIH1cclxuXHJcbiAgPG1hdC1tZW51ICNhY3Rpb25zTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIEBmb3IgKGFjdGlvbiBvZiBfc29ydGVkTWVudUFjdGlvbnM7IHRyYWNrIGFjdGlvbi5uYW1lKSB7XHJcbiAgICBAaWYgKCFpc0FjdGlvbkhpZGRlbihhY3Rpb24sIGF0dCkpIHtcclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWN0aW9uLmZuKGF0dClcIiBbZGlzYWJsZWRdPVwiaXNBY3Rpb25EaXNhYmxlZChhY3Rpb24sIGF0dClcIj5cclxuICAgICAgPG1hdC1pY29uIFtjb2xvcl09XCJhY3Rpb24uaWNvbiA9PT0gJ2RlbGV0ZScgPyAnd2FybicgOiB1bmRlZmluZWRcIj5cclxuICAgICAgICB7eyBhY3Rpb24uaWNvbiB9fVxyXG4gICAgICA8L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj57eyBhY3Rpb24ubmFtZSB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgfVxyXG4gIDwvbWF0LW1lbnU+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dDcm9wSW1hZ2U+XHJcbiAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGhpZGRlbjsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgaGVpZ2h0OiAxMDAlOyBtaW4taGVpZ2h0OiAwOyBmbGV4OiAxIDEgYXV0bztcIlxyXG4gICAgW25nQ2xhc3NdPVwiY3JvcERpYWxvZ0NsYXNzXCI+XHJcbiAgICA8IS0tIEBpZiAoc2hvd0Nyb3BJbWFnZSA9PSB0cnVlKSB7IC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjcm9wcGllVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmb3JtOiBuZXdBdHRhY2htZW50Rm9ybSB9XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gfSAtLT5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48bmctdGVtcGxhdGUgI2lubGluZVByZXZpZXdUZW1wbGF0ZSBsZXQtcm93PVwicm93XCI+XHJcbiAgQGlmIChyb3cuQXR0YWNobWVudFR5cGUgIT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiByb3cuSXNJbWFnZSkge1xyXG4gIDxkaXYgY2xhc3M9XCJpbmxpbmUtcHJldmlldy1jb250YWluZXJcIiAoY2xpY2spPVwib3BlblByZXZpZXdEaWFsb2cocm93KVwiPlxyXG4gICAgPGltZyBbc3JjXT1cIidkYXRhOmltYWdlL3BuZztiYXNlNjQsJyArIChyb3cuRmlsZVRodW1ibmFpbEJhc2U2NCA/IHJvdy5GaWxlVGh1bWJuYWlsQmFzZTY0IDogcm93LkZpbGVEYXRhQmFzZTY0KVwiIC8+XHJcbiAgPC9kaXY+XHJcbiAgfSBAZWxzZSBpZiAocm93LkF0dGFjaG1lbnRUeXBlICE9IEF0dGFjaG1lbnRUeXBlLkxJTksgJiYgIXJvdy5Jc0ltYWdlKSB7XHJcbiAgPGRpdiBjbGFzcz1cImlubGluZS1wcmV2aWV3LWNvbnRhaW5lclwiIChjbGljayk9XCJvcGVuUHJldmlld0RpYWxvZyhyb3cpXCI+XHJcbiAgICA8aSBbbmdDbGFzc109XCJnZXRBdHRhY2htZW50SWNvbihyb3cpXCI+PC9pPlxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48bmctdGVtcGxhdGUgI2RpYWxvZ1ByZXZpZXc+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGVybi1kaWFsb2ctY29udGFpbmVyXCI+IEBpZiAoc2VsZWN0ZWRBdHRhY2htZW50KSB7XHJcbiAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJwcmV2aWV3LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtZ3JvdXBcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpbi10XCI+e3sgcHJldmlld0xhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXRcIj57eyBzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZU5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGNsYXNzPVwiY2xvc2UtYnRuXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJwcmV2aWV3LWNvbnRlbnQtYXJlYVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtdmlld2VyLXdyYXBwZXJcIj5cclxuICAgICAgICBAaWYgKHNlbGVjdGVkQXR0YWNobWVudC5Jc0ltYWdlKSB7XHJcbiAgICAgICAgPGltZyBjbGFzcz1cIm1haW4tcHJldmlldy1tZWRpYVwiXHJcbiAgICAgICAgICBbc3JjXT1cIidkYXRhOmltYWdlL3BuZztiYXNlNjQsJyArIChzZWxlY3RlZEF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgfHwgc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVUaHVtYm5haWxCYXNlNjQpXCJcclxuICAgICAgICAgIFthbHRdPVwic2VsZWN0ZWRBdHRhY2htZW50LkZpbGVOYW1lXCIgLz5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGVsc2UgaWYgKHNlbGVjdGVkQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSB7XHJcbiAgICAgICAgPHZpZGVvIGNvbnRyb2xzIGF1dG9wbGF5IHBsYXlzaW5saW5lIGNsYXNzPVwibWFpbi1wcmV2aWV3LW1lZGlhIHZpZGVvLXBsYXllclwiPlxyXG4gICAgICAgICAgPHNvdXJjZSBbc3JjXT1cInNlbGVjdGVkQXR0YWNobWVudC5UcnVzdGVkVXJsXCIgW3R5cGVdPVwic2VsZWN0ZWRBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZVwiPlxyXG4gICAgICAgICAgSWwgdHVvIGJyb3dzZXIgbm9uIHN1cHBvcnRhIGlsIHZpZGVvLlxyXG4gICAgICAgIDwvdmlkZW8+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWZyYW1lLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGlmcmFtZSBjbGFzcz1cInByZXZpZXctaWZyYW1lLW1vZGVyblwiIFtzcmNdPVwic2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmxcIlxyXG4gICAgICAgICAgICBbdGl0bGVdPVwic2VsZWN0ZWRBdHRhY2htZW50LkZpbGVOYW1lXCI+PC9pZnJhbWU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIiBjbGFzcz1cInByZXZpZXctYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cImJ0bi1jbG9zZVwiPkNoaXVkaTwvYnV0dG9uPlxyXG4gICAgICBAaWYgKHNlbGVjdGVkQXR0YWNobWVudC5BdHRhY2htZW50VHlwZSAhPT0gQXR0YWNobWVudFR5cGUuTElOSykge1xyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJ2aWV3QXR0YWNobWVudChzZWxlY3RlZEF0dGFjaG1lbnQpXCIgY2xhc3M9XCJidG4tZG93bmxvYWRcIj5cclxuICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPiA8c3Bhbj57eyBkb3dubG9hZExhYmVsIH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPCEtLSBURU1QTEFURSBQRVIgSUwgUFVMU0FOVEUgREkgQUdHSVVOVEEgTlVPVk8gQUxMRUdBVE8gLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYWRkQXR0YWNobWVudEJ1dHRvbj5cclxuICA8aW5wdXQgI2ZpbGVJbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBpZD1cImZpbGVfYXR0YWNobWVudFwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRcIiB0eXBlPVwiZmlsZVwiXHJcbiAgICAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCIgW211bHRpcGxlXT1cImxvYWRNdWx0aXBsZUZpbGVzXCIgLz5cclxuXHJcbiAgQGlmIChhbGxvd2VkVHlwZXMgJiYgYWxsb3dlZFR5cGVzLmxlbmd0aCA9PSAxICYmIChtdWx0aXBsZUF0dGFjaG1lbnQgPT0gdHJ1ZSB8fCAhYXR0YWNobWVudHNMaXN0IHx8XHJcbiAgYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA9PSAwIHx8IChhdHRhY2htZW50c0xpc3QubGVuZ3RoID4gMCAmJiAhYXR0YWNobWVudHNMaXN0WzBdKSkpIHtcclxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1iLTQgbWUtNSBlcXAtYXR0YWNobWVudHMtYWRkLWJ0blwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgKGNsaWNrKT1cImFkZEZpbGUoYWxsb3dlZFR5cGVzWzBdLCBmaWxlSW5wdXQpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIj5cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzWzBdID09IDEpIHsgPG1hdC1pY29uPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+IH1cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzWzBdID09IDIpIHsgPGkgY2xhc3M9XCJmYXMgZmEtbGlua1wiPjwvaT4gfVxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXNbMF0gPT0gMykgeyA8aSBjbGFzcz1cImZhLWJyYW5kcyBmYS1kcm9wYm94XCI+PC9pPiB9XHJcbiAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+XHJcbiAgICAgIHt7IGFsbG93ZWRUeXBlc1swXSA9PSAxID8gKGFkZEJ1dHRvbkxhYmVsICsgXCIgZmlsZVwiKSA6IGFsbG93ZWRUeXBlc1swXSA9PSAyID8gKGFkZEJ1dHRvbkxhYmVsICsgXCIgbGlua1wiKSA6XHJcbiAgICAgIHVwbG9hZFdpdGhEcm9wYm94TGFiZWwgfX1cclxuICAgIDwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuICB9XHJcblxyXG4gIEBpZiAoIXNlcGFyYXRlZFVwbG9hZEJ1dHRvbnMgJiYgYWxsb3dlZFR5cGVzICYmIGFsbG93ZWRUeXBlcy5sZW5ndGggPiAxICYmIChtdWx0aXBsZUF0dGFjaG1lbnQgPT0gdHJ1ZSB8fFxyXG4gICFhdHRhY2htZW50c0xpc3QgfHwgYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA9PSAwIHx8IChhdHRhY2htZW50c0xpc3QubGVuZ3RoID4gMCAmJiAhYXR0YWNobWVudHNMaXN0WzBdKSkpIHtcclxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1iLTQgbWUtNSBlcXAtYXR0YWNobWVudHMtYWRkLWJ0blwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImF0dGFjaG1lbnRUeXBlTWVudVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XHJcbiAgICBAaWYgKG11bHRpcGxlQXR0YWNobWVudCAhPSB0cnVlKSB7IDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPiB9IEBlbHNlIHsgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+IH1cclxuICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDBweFwiPnt7IGFkZEJ1dHRvbkxhYmVsIH19PC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8bWF0LW1lbnUgI2F0dGFjaG1lbnRUeXBlTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIDxpbnB1dCAjaW1hZ2VJbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBpZD1cImZpbGVfYXR0YWNobWVudFwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRcIiB0eXBlPVwiZmlsZVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25GaWxlQWRkZWQoJGV2ZW50KVwiIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMSkpIHtcclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiaW1hZ2VJbnB1dC5jbGljaygpXCIgY2xhc3M9XCJlcXAtYXR0YWNobWVudHMtZmlsZS1idG5cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZVwiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkZpbGU8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDIpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiAoY2xpY2spPVwic3dpdGNoVG9BZGRpbmdMaW5rTW9kZSgpXCIgY2xhc3M9XCJlcXAtYXR0YWNobWVudHMtbGluay1idG5cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbGlua1wiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkxpbms8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNob29zZURyb3Bib3hGaWxlKClcIiBjbGFzcz1cImVxcC1hdHRhY2htZW50cy1saW5rLWJ0blwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhLWJyYW5kcyBmYS1kcm9wYm94XCI+PC9pPlxyXG4gICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+RHJvcGJveDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gIDwvbWF0LW1lbnU+XHJcbiAgfVxyXG5cclxuICBAaWYgKHNlcGFyYXRlZFVwbG9hZEJ1dHRvbnMgJiYgYWxsb3dlZFR5cGVzICYmIGFsbG93ZWRUeXBlcy5sZW5ndGggPiAxICYmIChtdWx0aXBsZUF0dGFjaG1lbnQgPT0gdHJ1ZSB8fFxyXG4gICFhdHRhY2htZW50c0xpc3QgfHwgYXR0YWNobWVudHNMaXN0Lmxlbmd0aCA9PSAwIHx8IChhdHRhY2htZW50c0xpc3QubGVuZ3RoID4gMCAmJiAhYXR0YWNobWVudHNMaXN0WzBdKSkpIHtcclxuICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICBAaWYgKGFsbG93ZWRUeXBlcy5pbmNsdWRlcygxKSkge1xyXG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiaW1hZ2VJbnB1dC5jbGljaygpXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBlcXAtYXR0YWNobWVudHMtYWRkLWJ0blwiIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWNsb3VkLXVwbG9hZFwiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkZpbGU8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIDxpbnB1dCAjaW1hZ2VJbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBpZD1cImZpbGVfYXR0YWNobWVudFwiIG5hbWU9XCJmaWxlX2F0dGFjaG1lbnRcIiB0eXBlPVwiZmlsZVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25GaWxlQWRkZWQoJGV2ZW50KVwiIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIiBbbXVsdGlwbGVdPVwibG9hZE11bHRpcGxlRmlsZXNcIiAvPlxyXG4gICAgQGlmIChhbGxvd2VkVHlwZXMuaW5jbHVkZXMoMikpIHtcclxuICAgIDxidXR0b24gKGNsaWNrKT1cInN3aXRjaFRvQWRkaW5nTGlua01vZGUoKVwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZXFwLWF0dGFjaG1lbnRzLWFkZC1idG5cIiBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbGlua1wiPjwvaT5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkxpbms8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIEBpZiAoYWxsb3dlZFR5cGVzLmluY2x1ZGVzKDMpKSB7XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJjaG9vc2VEcm9wYm94RmlsZSgpXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBlcXAtYXR0YWNobWVudHMtYWRkLWJ0blwiIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhLWJyYW5kcyBmYS1kcm9wYm94XCI+PC9pPlxyXG4gICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+RHJvcGJveDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48bmctdGVtcGxhdGUgI2Nyb3BwaWVUZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwibW9kZXJuLWRpYWxvZy1jb250YWluZXJcIj5cclxuICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cInByZXZpZXctaGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaW5mb1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1ncm91cFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWluLXRcIj57eyBjcm9wTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdFwiPlJlZ29sYSBsZSBkaW1lbnNpb25pIGUgbCdvcmllbnRhbWVudG88L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFib3J0RmlsZSgpXCIgY2xhc3M9XCJjbG9zZS1idG5cIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cInByZXZpZXctY29udGVudC1hcmVhXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLXRvb2xiYXJcIj5cclxuICAgICAgICBAaWYgKGNyb3BPcHRpb25zLmluY2x1ZGVzKDEpKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdFRvb2x0aXBdPVwicm90YXRlTGVmdExhYmVsXCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3RhdGVMZWZ0KClcIj48bWF0LWljb24+cm90YXRlX2xlZnQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cInJvdGF0ZVJpZ2h0TGFiZWxcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJvdGF0ZVJpZ2h0KClcIj48bWF0LWljb24+cm90YXRlX3JpZ2h0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChjcm9wT3B0aW9ucy5pbmNsdWRlcygyKSkge1xyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cImZsaXBIb3JpbnpvbnRhbExhYmVsXCJcclxuICAgICAgICAgIChjbGljayk9XCJmbGlwSG9yaXpvbnRhbCgpXCI+PG1hdC1pY29uPmZsaXBfaG9yaXpvbnRhbDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdFRvb2x0aXBdPVwiZmxpcFZlcnRpY2FsTGFiZWxcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImZsaXBWZXJ0aWNhbCgpXCI+PG1hdC1pY29uPmZsaXBfdmVydGljYWw8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiUmVzZXRcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJlc3RvcmVPcmlnaW5hbERpbWVuc2lvbnMoKVwiPjxtYXQtaWNvbj5yZXBsYXk8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS12aWV3ZXItd3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLWNvbnRhaW5lci1tb2Rlcm5cIj5cclxuICAgICAgICAgIDxpbWFnZS1jcm9wcGVyIFtpbWFnZUZpbGVdPVwic2VsZWN0ZWRGaWxlXCIgW21haW50YWluQXNwZWN0UmF0aW9dPVwiZmFsc2VcIiBbY2FudmFzUm90YXRpb25dPVwiY2FudmFzUm90YXRpb25cIlxyXG4gICAgICAgICAgICBbdHJhbnNmb3JtXT1cInRyYW5zZm9ybVwiIGZvcm1hdD1cInBuZ1wiIChpbWFnZUNyb3BwZWQpPVwiaW1hZ2VDcm9wcGVkKCRldmVudClcIiBbcmVzaXplVG9XaWR0aF09XCJjdXN0b21XaWR0aFwiXHJcbiAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJjdXN0b21IZWlnaHRcIiBbb3V0cHV0XT1cIidiYXNlNjQnXCIgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJ0cnVlXCIgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFthbGlnbkltYWdlXT1cIidjZW50ZXInXCI+XHJcbiAgICAgICAgICA8L2ltYWdlLWNyb3BwZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiIGNsYXNzPVwicHJldmlldy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiYWJvcnRGaWxlKClcIiBjbGFzcz1cImJ0bi1jbG9zZVwiPnt7IGFib3J0TGFiZWwgfX08L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybUFkZEF0dGFjaG1lbnQoKVwiIGNsYXNzPVwiYnRuLWRvd25sb2FkXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj4ge3sgY29uZmlybUxhYmVsIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuXHJcbjwhLS0gVEVNUExBVEUgUEVSIEZPUk0gREkgQUdHSVVOVEEgREkgVU4gTElOSyAtLT5cclxuPG5nLXRlbXBsYXRlICNhZGRpbmdMaW5rVGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGVybi1kaWFsb2ctY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJwcmV2aWV3LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1pY29uLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5saW5rPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtZ3JvdXBcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpbi10XCI+QWdnaXVuZ2kgdW4gbGluazwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS10XCI+SW5zZXJpc2NpIGwnVVJMIGRlbGxhIHJpc29yc2Egd2ViPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cImNsb3NlLWJ0blwiPjxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bWF0LWRpYWxvZy1jb250ZW50IGNsYXNzPVwiYWRkLWxpbmstbW9kZXJuLWNvbnRlbnRcIj5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJuZXdBdHRhY2htZW50Rm9ybVwiIGNsYXNzPVwiYWRkLWxpbmstZm9ybVwiPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy0xMDAgbXQtM1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5VUkwgZGVsIGNvbGxlZ2FtZW50bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImZpbGVQYXRoXCIgcGxhY2Vob2xkZXI9XCJodHRwczovLy4uLlwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeD5sYW5ndWFnZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5UaXRvbG8gKG9wemlvbmFsZSk8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWxlTmFtZVwiIHBsYWNlaG9sZGVyPVwiRXMuIERvY3VtZW50byBQcm9nZXR0b1wiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeD50aXRsZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9mb3JtPlxyXG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiIGNsYXNzPVwicHJldmlldy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGNsYXNzPVwiYnRuLWNsb3NlXCI+QW5udWxsYTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFttYXQtZGlhbG9nLWNsb3NlXT1cIm5ld0F0dGFjaG1lbnRGb3JtLnZhbHVlXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwibmV3QXR0YWNobWVudEZvcm0uaW52YWxpZFwiIGNsYXNzPVwiYnRuLWRvd25sb2FkXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+IEFnZ2l1bmdpXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19