@alfresco/adf-content-services
Version:
Alfresco ADF content services
112 lines • 20.3 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { EXTENDIBLE_COMPONENT, FileUtils, NotificationService } from '@alfresco/adf-core';
import { Component, forwardRef, ViewEncapsulation, inject } from '@angular/core';
import { UploadBase } from './base-upload/upload-base';
import { AllowableOperationsEnum } from '../../common/models/allowable-operations.enum';
import { ContentService } from '../../common/services/content.service';
import { FileDraggableDirective } from '../directives/file-draggable.directive';
import * as i0 from "@angular/core";
export class UploadDragAreaComponent extends UploadBase {
constructor() {
super(...arguments);
this.notificationService = inject(NotificationService);
this.contentService = inject(ContentService);
}
/**
* Method called when files are dropped in the drag area.
*
* @param files - files dropped in the drag area.
*/
onFilesDropped(files) {
if (!this.disabled && files.length) {
this.uploadFiles(files);
}
}
/**
* Called when a folder are dropped in the drag area
*
* @param folder - name of the dropped folder
*/
onFolderEntityDropped(folder) {
if (!this.disabled && folder.isDirectory) {
FileUtils.flatten(folder).then((filesInfo) => {
this.uploadFilesInfo(filesInfo);
});
}
}
/**
* Show undo notification bar.
*
* @param latestFilesAdded - files in the upload queue enriched with status flag and xhr object.
*/
showUndoNotificationBar(latestFilesAdded) {
const messageTranslate = this.translationService.instant('FILE_UPLOAD.MESSAGES.PROGRESS');
const actionTranslate = this.translationService.instant('FILE_UPLOAD.ACTION.UNDO');
this.notificationService
.openSnackMessageAction(messageTranslate, actionTranslate)
.onAction()
.subscribe(() => {
this.uploadService.cancelUpload(...latestFilesAdded);
});
}
/**
* Check if content is droppable
*
* @returns `true` or `false` considering the component options and node permissions
*/
isDroppable() {
return !this.disabled;
}
/**
* Handles 'upload-files' events raised by child components.
*
* @param event DOM event
*/
onUploadFiles(event) {
event.stopPropagation();
event.preventDefault();
const node = event.detail.data.obj.entry;
const files = event.detail?.files || [];
const isAllowed = this.isTargetNodeFolder(node)
? this.contentService.hasAllowableOperations(node, AllowableOperationsEnum.CREATE)
: this.contentService.hasAllowableOperations(node, AllowableOperationsEnum.UPDATE);
if (isAllowed) {
if (!this.isTargetNodeFolder(node) && files.length === 1) {
this.updateFileVersion.emit(event);
}
else {
if (this.isTargetNodeFolder(node)) {
files.forEach((file) => (file.relativeFolder = node.name ? node.name.concat(file.relativeFolder) : file.relativeFolder));
}
if (files?.length > 0) {
this.uploadFilesInfo(files);
}
}
}
}
isTargetNodeFolder(node) {
return !!node?.isFolder;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: UploadDragAreaComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: UploadDragAreaComponent, isStandalone: true, selector: "adf-upload-drag-area", host: { classAttribute: "adf-upload-drag-area" }, usesInheritance: true, ngImport: i0, template: "<div [adf-file-draggable]=\"isDroppable()\" class=\"adf-upload-border\"\n (filesDropped)=\"onFilesDropped($event)\"\n (folderEntityDropped)=\"onFolderEntityDropped($event)\"\n (upload-files)=\"onUploadFiles($any($event))\"\n dropzone=\"\" webkitdropzone=\"*\" #droparea>\n <ng-content />\n</div>\n", styles: ["adf-upload-drag-area{display:flex;flex-direction:column;flex:1;height:100%;overflow:hidden;min-height:0}adf-upload-drag-area .adf-upload-border{display:flex;flex-direction:column;height:100%;overflow:hidden;min-height:0;vertical-align:unset;text-align:unset;width:100%;box-sizing:border-box}adf-upload-drag-area .adf-file-draggable-input-focus{color:#2196f3;border:1px dashed #2196f3}adf-upload-drag-area .adf-file-draggable-input-focus adf-document-list{background:#e3f2fd}adf-upload-drag-area .adf-file-draggable-input-focus adf-document-list adf-datatable>table{background:inherit}adf-upload-drag-area .adf-upload__dragging{background:#e3f2fd;color:#2196f3}adf-upload-drag-area .adf-upload__dragging td{border-top:1px dashed #2196f3!important;border-bottom:1px dashed #2196f3!important}adf-upload-drag-area .adf-upload__dragging td:first-child{border-left:1px dashed #2196f3!important}adf-upload-drag-area .adf-upload__dragging td:last-child{border-right:1px dashed #2196f3!important}adf-upload-drag-area:first-child>div adf-upload-drag-area .adf-file-draggable-input-focus{color:#2196f3;border:1px dashed #2196f3!important;margin-left:0!important}adf-upload-drag-area:first-child .adf-upload-border{vertical-align:inherit!important;text-align:inherit!important}adf-upload-drag-area:first-child .adf-file-draggable-input-focus{color:#2196f3!important;border:1px dashed #2196f3!important;margin-left:0!important}adf-upload-drag-area:first-child .adf-file-draggable-input-focus adf-upload-drag-area>div{color:#2196f3;border:1px dashed #2196f3!important;margin-left:0!important}\n"], dependencies: [{ kind: "directive", type: FileDraggableDirective, selector: "[adf-file-draggable]", inputs: ["adf-file-draggable"], outputs: ["filesDropped", "folderEntityDropped"] }], viewProviders: [{ provide: EXTENDIBLE_COMPONENT, useExisting: forwardRef(() => UploadDragAreaComponent) }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: UploadDragAreaComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-upload-drag-area', standalone: true, imports: [FileDraggableDirective], host: { class: 'adf-upload-drag-area' }, viewProviders: [{ provide: EXTENDIBLE_COMPONENT, useExisting: forwardRef(() => UploadDragAreaComponent) }], encapsulation: ViewEncapsulation.None, template: "<div [adf-file-draggable]=\"isDroppable()\" class=\"adf-upload-border\"\n (filesDropped)=\"onFilesDropped($event)\"\n (folderEntityDropped)=\"onFolderEntityDropped($event)\"\n (upload-files)=\"onUploadFiles($any($event))\"\n dropzone=\"\" webkitdropzone=\"*\" #droparea>\n <ng-content />\n</div>\n", styles: ["adf-upload-drag-area{display:flex;flex-direction:column;flex:1;height:100%;overflow:hidden;min-height:0}adf-upload-drag-area .adf-upload-border{display:flex;flex-direction:column;height:100%;overflow:hidden;min-height:0;vertical-align:unset;text-align:unset;width:100%;box-sizing:border-box}adf-upload-drag-area .adf-file-draggable-input-focus{color:#2196f3;border:1px dashed #2196f3}adf-upload-drag-area .adf-file-draggable-input-focus adf-document-list{background:#e3f2fd}adf-upload-drag-area .adf-file-draggable-input-focus adf-document-list adf-datatable>table{background:inherit}adf-upload-drag-area .adf-upload__dragging{background:#e3f2fd;color:#2196f3}adf-upload-drag-area .adf-upload__dragging td{border-top:1px dashed #2196f3!important;border-bottom:1px dashed #2196f3!important}adf-upload-drag-area .adf-upload__dragging td:first-child{border-left:1px dashed #2196f3!important}adf-upload-drag-area .adf-upload__dragging td:last-child{border-right:1px dashed #2196f3!important}adf-upload-drag-area:first-child>div adf-upload-drag-area .adf-file-draggable-input-focus{color:#2196f3;border:1px dashed #2196f3!important;margin-left:0!important}adf-upload-drag-area:first-child .adf-upload-border{vertical-align:inherit!important;text-align:inherit!important}adf-upload-drag-area:first-child .adf-file-draggable-input-focus{color:#2196f3!important;border:1px dashed #2196f3!important;margin-left:0!important}adf-upload-drag-area:first-child .adf-file-draggable-input-focus adf-upload-drag-area>div{color:#2196f3;border:1px dashed #2196f3!important;margin-left:0!important}\n"] }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRyYWctYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3VwbG9hZC9jb21wb25lbnRzL3VwbG9hZC1kcmFnLWFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi91cGxvYWQvY29tcG9uZW50cy91cGxvYWQtZHJhZy1hcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBWSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUd2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFZaEYsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFVBQVU7SUFWdkQ7O1FBV1ksd0JBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FxRm5EO0lBbkZHOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsS0FBYTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxL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SUFBSSxFQUFFLFFBQVEsQ0FBQztJQUM1QixDQUFDOzhHQXRGUSx1QkFBdUI7a0dBQXZCLHVCQUF1Qix5SkNyQ3BDLDhUQU9BLHNtRER1QmMsc0JBQXNCLHdJQUlqQixDQUFDLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDOzsyRkFHakcsdUJBQXVCO2tCQVZuQyxTQUFTOytCQUNJLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxzQkFBc0IsQ0FBQyxRQUczQixFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxpQkFDeEIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsaUJBQzNGLGlCQUFpQixDQUFDLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEVYVEVORElCTEVfQ09NUE9ORU5ULCBGaWxlSW5mbywgRmlsZVV0aWxzLCBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZUFsbG93YWJsZU9wZXJhdGlvblN1YmplY3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL25vZGUtYWxsb3dhYmxlLW9wZXJhdGlvbi1zdWJqZWN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBVcGxvYWRCYXNlIH0gZnJvbSAnLi9iYXNlLXVwbG9hZC91cGxvYWQtYmFzZSc7XG5pbXBvcnQgeyBBbGxvd2FibGVPcGVyYXRpb25zRW51bSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvYWxsb3dhYmxlLW9wZXJhdGlvbnMuZW51bSc7XG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJ2aWNlcy9jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9maWxlLm1vZGVsJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IEZpbGVEcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2ZpbGUtZHJhZ2dhYmxlLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLXVwbG9hZC1kcmFnLWFyZWEnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0ZpbGVEcmFnZ2FibGVEaXJlY3RpdmVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZHJhZy1hcmVhLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi91cGxvYWQtZHJhZy1hcmVhLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDogeyBjbGFzczogJ2FkZi11cGxvYWQtZHJhZy1hcmVhJyB9LFxuICAgIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IEVYVEVORElCTEVfQ09NUE9ORU5ULCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBVcGxvYWREcmFnQXJlYUNvbXBvbmVudCkgfV0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBVcGxvYWREcmFnQXJlYUNvbXBvbmVudCBleHRlbmRzIFVwbG9hZEJhc2UgaW1wbGVtZW50cyBOb2RlQWxsb3dhYmxlT3BlcmF0aW9uU3ViamVjdCB7XG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICAgIHByaXZhdGUgY29udGVudFNlcnZpY2UgPSBpbmplY3QoQ29udGVudFNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGNhbGxlZCB3aGVuIGZpbGVzIGFyZSBkcm9wcGVkIGluIHRoZSBkcmFnIGFyZWEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZXMgLSBmaWxlcyBkcm9wcGVkIGluIHRoZSBkcmFnIGFyZWEuXG4gICAgICovXG4gICAgb25GaWxlc0Ryb3BwZWQoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKGZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgZm9sZGVyIGFyZSBkcm9wcGVkIGluIHRoZSBkcmFnIGFyZWFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb2xkZXIgLSBuYW1lIG9mIHRoZSBkcm9wcGVkIGZvbGRlclxuICAgICAqL1xuICAgIG9uRm9sZGVyRW50aXR5RHJvcHBlZChmb2xkZXI6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgZm9sZGVyLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICBGaWxlVXRpbHMuZmxhdHRlbihmb2xkZXIpLnRoZW4oKGZpbGVzSW5mbykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXNJbmZvKGZpbGVzSW5mbyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgdW5kbyBub3RpZmljYXRpb24gYmFyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhdGVzdEZpbGVzQWRkZWQgLSBmaWxlcyBpbiB0aGUgdXBsb2FkIHF1ZXVlIGVucmljaGVkIHdpdGggc3RhdHVzIGZsYWcgYW5kIHhociBvYmplY3QuXG4gICAgICovXG4gICAgc2hvd1VuZG9Ob3RpZmljYXRpb25CYXIobGF0ZXN0RmlsZXNBZGRlZDogRmlsZU1vZGVsW10pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVRyYW5zbGF0ZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQoJ0ZJTEVfVVBMT0FELk1FU1NBR0VTLlBST0dSRVNTJyk7XG4gICAgICAgIGNvbnN0IGFjdGlvblRyYW5zbGF0ZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQoJ0ZJTEVfVVBMT0FELkFDVElPTi5VTkRPJyk7XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAub3BlblNuYWNrTWVzc2FnZUFjdGlvbihtZXNzYWdlVHJhbnNsYXRlLCBhY3Rpb25UcmFuc2xhdGUpXG4gICAgICAgICAgICAub25BY3Rpb24oKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbFVwbG9hZCguLi5sYXRlc3RGaWxlc0FkZGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGNvbnRlbnQgaXMgZHJvcHBhYmxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYCBjb25zaWRlcmluZyB0aGUgY29tcG9uZW50IG9wdGlvbnMgYW5kIG5vZGUgcGVybWlzc2lvbnNcbiAgICAgKi9cbiAgICBpc0Ryb3BwYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgJ3VwbG9hZC1maWxlcycgZXZlbnRzIHJhaXNlZCBieSBjaGlsZCBjb21wb25lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IERPTSBldmVudFxuICAgICAqL1xuICAgIG9uVXBsb2FkRmlsZXMoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSBldmVudC5kZXRhaWwuZGF0YS5vYmouZW50cnk7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlSW5mb1tdID0gZXZlbnQuZGV0YWlsPy5maWxlcyB8fCBbXTtcblxuICAgICAgICBjb25zdCBpc0FsbG93ZWQ6IGJvb2xlYW4gPSB0aGlzLmlzVGFyZ2V0Tm9kZUZvbGRlcihub2RlKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZSwgQWxsb3dhYmxlT3BlcmF0aW9uc0VudW0uQ1JFQVRFKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZSwgQWxsb3dhYmxlT3BlcmF0aW9uc0VudW0uVVBEQVRFKTtcblxuICAgICAgICBpZiAoaXNBbGxvd2VkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXJnZXROb2RlRm9sZGVyKG5vZGUpICYmIGZpbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsZVZlcnNpb24uZW1pdChldmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVGFyZ2V0Tm9kZUZvbGRlcihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiAoZmlsZS5yZWxhdGl2ZUZvbGRlciA9IG5vZGUubmFtZSA/IG5vZGUubmFtZS5jb25jYXQoZmlsZS5yZWxhdGl2ZUZvbGRlcikgOiBmaWxlLnJlbGF0aXZlRm9sZGVyKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzSW5mbyhmaWxlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1RhcmdldE5vZGVGb2xkZXIobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFub2RlPy5pc0ZvbGRlcjtcbiAgICB9XG59XG4iLCI8ZGl2IFthZGYtZmlsZS1kcmFnZ2FibGVdPVwiaXNEcm9wcGFibGUoKVwiIGNsYXNzPVwiYWRmLXVwbG9hZC1ib3JkZXJcIlxuICAgICAoZmlsZXNEcm9wcGVkKT1cIm9uRmlsZXNEcm9wcGVkKCRldmVudClcIlxuICAgICAoZm9sZGVyRW50aXR5RHJvcHBlZCk9XCJvbkZvbGRlckVudGl0eURyb3BwZWQoJGV2ZW50KVwiXG4gICAgICh1cGxvYWQtZmlsZXMpPVwib25VcGxvYWRGaWxlcygkYW55KCRldmVudCkpXCJcbiAgICAgZHJvcHpvbmU9XCJcIiB3ZWJraXRkcm9wem9uZT1cIipcIiAjZHJvcGFyZWE+XG4gICAgPG5nLWNvbnRlbnQgLz5cbjwvZGl2PlxuIl19