ng-tailwind 3.30.368 → 4.0.0
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.
- package/README.md +24 -24
- package/animations/ngt-angular-animations.d.ts +5 -5
- package/base/ngt-base-ng-model.d.ts +32 -32
- package/bundles/ng-tailwind.umd.js +7689 -7631
- package/bundles/ng-tailwind.umd.js.map +1 -1
- package/components/ngt-action/ngt-action.component.d.ts +13 -13
- package/components/ngt-action/ngt-action.module.d.ts +2 -2
- package/components/ngt-button/ngt-button.component.d.ts +22 -22
- package/components/ngt-button/ngt-button.module.d.ts +2 -2
- package/components/ngt-checkbox/ngt-checkbox.component.d.ts +41 -41
- package/components/ngt-checkbox/ngt-checkbox.module.d.ts +2 -2
- package/components/ngt-content/ngt-content.component.d.ts +9 -9
- package/components/ngt-content/ngt-content.module.d.ts +2 -2
- package/components/ngt-datatable/ngt-datatable.component.d.ts +114 -114
- package/components/ngt-datatable/ngt-datatable.module.d.ts +2 -2
- package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +11 -11
- package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +11 -11
- package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +26 -26
- package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +48 -48
- package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +19 -19
- package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +10 -10
- package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +17 -17
- package/components/ngt-date/ngt-date.component.d.ts +75 -75
- package/components/ngt-date/ngt-date.module.d.ts +2 -2
- package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +5 -5
- package/components/ngt-dropdown/ngt-dropdown.component.d.ts +48 -48
- package/components/ngt-dropdown/ngt-dropdown.module.d.ts +2 -2
- package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +11 -11
- package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +22 -22
- package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +21 -21
- package/components/ngt-dropzone/ngt-dropzone.component.d.ts +108 -108
- package/components/ngt-dropzone/ngt-dropzone.module.d.ts +2 -2
- package/components/ngt-floating-button/ngt-floating-button.component.d.ts +32 -32
- package/components/ngt-floating-button/ngt-floating-button.module.d.ts +2 -2
- package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +7 -7
- package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.d.ts +2 -2
- package/components/ngt-form/ngt-form.component.d.ts +52 -52
- package/components/ngt-form/ngt-form.module.d.ts +2 -2
- package/components/ngt-header-nav/ngt-header-nav.component.d.ts +11 -11
- package/components/ngt-header-nav/ngt-header-nav.module.d.ts +2 -2
- package/components/ngt-helper/ngt-helper.component.d.ts +20 -20
- package/components/ngt-helper/ngt-helper.module.d.ts +2 -2
- package/components/ngt-input/ngt-input.component.d.ts +116 -116
- package/components/ngt-input/ngt-input.module.d.ts +2 -2
- package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +2 -2
- package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +2 -2
- package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +12 -12
- package/components/ngt-modal/ngt-modal.component.d.ts +19 -19
- package/components/ngt-modal/ngt-modal.module.d.ts +2 -2
- package/components/ngt-multi-select/ngt-multi-select.component.d.ts +97 -97
- package/components/ngt-multi-select/ngt-multi-select.module.d.ts +2 -2
- package/components/ngt-pagination/ngt-pagination.component.d.ts +40 -40
- package/components/ngt-pagination/ngt-pagination.module.d.ts +2 -2
- package/components/ngt-popover/ngt-popover.component.d.ts +28 -28
- package/components/ngt-popover/ngt-popover.module.d.ts +2 -2
- package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +9 -9
- package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +9 -9
- package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +14 -14
- package/components/ngt-portlet/ngt-portlet.component.d.ts +17 -17
- package/components/ngt-portlet/ngt-portlet.module.d.ts +2 -2
- package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +6 -6
- package/components/ngt-radio-button/ngt-radio-button.component.d.ts +32 -32
- package/components/ngt-radio-button/ngt-radio-button.module.d.ts +2 -2
- package/components/ngt-section/ngt-section.component.d.ts +26 -26
- package/components/ngt-section/ngt-section.module.d.ts +2 -2
- package/components/ngt-select/ngt-select.component.d.ts +131 -131
- package/components/ngt-select/ngt-select.directive.d.ts +13 -13
- package/components/ngt-select/ngt-select.module.d.ts +2 -2
- package/components/ngt-shining/ngt-shining.component.d.ts +16 -16
- package/components/ngt-shining/ngt-shining.module.d.ts +2 -2
- package/components/ngt-sidenav/ngt-sidenav.component.d.ts +29 -29
- package/components/ngt-sidenav/ngt-sidenav.module.d.ts +2 -2
- package/components/ngt-slider/ngt-slider.component.d.ts +31 -31
- package/components/ngt-slider/ngt-slider.module.d.ts +2 -2
- package/components/ngt-svg/ngt-svg.component.d.ts +10 -10
- package/components/ngt-svg/ngt-svg.module.d.ts +2 -2
- package/components/ngt-tag/ngt-tag.component.d.ts +10 -10
- package/components/ngt-tag/ngt-tag.module.d.ts +2 -2
- package/components/ngt-textarea/ngt-textarea.component.d.ts +46 -46
- package/components/ngt-textarea/ngt-textarea.module.d.ts +2 -2
- package/components/ngt-validation/ngt-validation.component.d.ts +10 -10
- package/components/ngt-validation/ngt-validation.module.d.ts +2 -2
- package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +65 -65
- package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +2 -2
- package/enums/size.enum.d.ts +8 -8
- package/esm2015/animations/ngt-angular-animations.js +34 -34
- package/esm2015/base/ngt-base-ng-model.js +90 -90
- package/esm2015/components/ngt-action/ngt-action.component.js +49 -49
- package/esm2015/components/ngt-action/ngt-action.module.js +19 -19
- package/esm2015/components/ngt-button/ngt-button.component.js +106 -106
- package/esm2015/components/ngt-button/ngt-button.module.js +19 -19
- package/esm2015/components/ngt-checkbox/ngt-checkbox.component.js +139 -139
- package/esm2015/components/ngt-checkbox/ngt-checkbox.module.js +19 -19
- package/esm2015/components/ngt-content/ngt-content.component.js +33 -33
- package/esm2015/components/ngt-content/ngt-content.module.js +15 -15
- package/esm2015/components/ngt-datatable/ngt-datatable.component.js +409 -409
- package/esm2015/components/ngt-datatable/ngt-datatable.module.js +58 -58
- package/esm2015/components/ngt-datatable/ngt-tbody/ngt-tbody.component.js +58 -58
- package/esm2015/components/ngt-datatable/ngt-td/ngt-td.component.js +63 -63
- package/esm2015/components/ngt-datatable/ngt-td-check/ngt-td-check.component.js +105 -105
- package/esm2015/components/ngt-datatable/ngt-th/ngt-th.component.js +195 -195
- package/esm2015/components/ngt-datatable/ngt-th-check/ngt-th-check.component.js +87 -87
- package/esm2015/components/ngt-datatable/ngt-thead/ngt-thead.component.js +56 -56
- package/esm2015/components/ngt-datatable/ngt-tr/ngt-tr.component.js +76 -76
- package/esm2015/components/ngt-date/ngt-date.component.js +380 -380
- package/esm2015/components/ngt-date/ngt-date.module.js +25 -25
- package/esm2015/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.js +20 -20
- package/esm2015/components/ngt-dropdown/ngt-dropdown.component.js +185 -185
- package/esm2015/components/ngt-dropdown/ngt-dropdown.module.js +16 -16
- package/esm2015/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.js +50 -50
- package/esm2015/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.js +59 -59
- package/esm2015/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.js +67 -67
- package/esm2015/components/ngt-dropzone/ngt-dropzone.component.js +434 -434
- package/esm2015/components/ngt-dropzone/ngt-dropzone.module.js +37 -37
- package/esm2015/components/ngt-floating-button/ngt-floating-button.component.js +94 -94
- package/esm2015/components/ngt-floating-button/ngt-floating-button.module.js +19 -19
- package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.js +23 -23
- package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.js +15 -15
- package/esm2015/components/ngt-form/ngt-form.component.js +181 -181
- package/esm2015/components/ngt-form/ngt-form.module.js +17 -17
- package/esm2015/components/ngt-header-nav/ngt-header-nav.component.js +38 -38
- package/esm2015/components/ngt-header-nav/ngt-header-nav.module.js +15 -15
- package/esm2015/components/ngt-helper/ngt-helper.component.js +51 -51
- package/esm2015/components/ngt-helper/ngt-helper.module.js +19 -19
- package/esm2015/components/ngt-input/ngt-input.component.js +680 -680
- package/esm2015/components/ngt-input/ngt-input.module.js +28 -28
- package/esm2015/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.js +11 -11
- package/esm2015/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.js +11 -11
- package/esm2015/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.js +40 -40
- package/esm2015/components/ngt-modal/ngt-modal.component.js +79 -79
- package/esm2015/components/ngt-modal/ngt-modal.module.js +28 -28
- package/esm2015/components/ngt-multi-select/ngt-multi-select.component.js +394 -394
- package/esm2015/components/ngt-multi-select/ngt-multi-select.module.js +33 -33
- package/esm2015/components/ngt-pagination/ngt-pagination.component.js +172 -172
- package/esm2015/components/ngt-pagination/ngt-pagination.module.js +23 -23
- package/esm2015/components/ngt-popover/ngt-popover.component.js +73 -73
- package/esm2015/components/ngt-popover/ngt-popover.module.js +17 -17
- package/esm2015/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.js +34 -34
- package/esm2015/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.js +33 -33
- package/esm2015/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.js +47 -47
- package/esm2015/components/ngt-portlet/ngt-portlet.component.js +58 -58
- package/esm2015/components/ngt-portlet/ngt-portlet.module.js +32 -32
- package/esm2015/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.js +19 -19
- package/esm2015/components/ngt-radio-button/ngt-radio-button.component.js +103 -103
- package/esm2015/components/ngt-radio-button/ngt-radio-button.module.js +20 -20
- package/esm2015/components/ngt-section/ngt-section.component.js +101 -101
- package/esm2015/components/ngt-section/ngt-section.module.js +21 -21
- package/esm2015/components/ngt-select/ngt-select.component.js +488 -488
- package/esm2015/components/ngt-select/ngt-select.directive.js +35 -35
- package/esm2015/components/ngt-select/ngt-select.module.js +40 -40
- package/esm2015/components/ngt-shining/ngt-shining.component.js +41 -41
- package/esm2015/components/ngt-shining/ngt-shining.module.js +15 -15
- package/esm2015/components/ngt-sidenav/ngt-sidenav.component.js +123 -123
- package/esm2015/components/ngt-sidenav/ngt-sidenav.module.js +15 -15
- package/esm2015/components/ngt-slider/ngt-slider.component.js +82 -82
- package/esm2015/components/ngt-slider/ngt-slider.module.js +17 -17
- package/esm2015/components/ngt-svg/ngt-svg.component.js +52 -52
- package/esm2015/components/ngt-svg/ngt-svg.module.js +19 -19
- package/esm2015/components/ngt-tag/ngt-tag.component.js +36 -36
- package/esm2015/components/ngt-tag/ngt-tag.module.js +17 -17
- package/esm2015/components/ngt-textarea/ngt-textarea.component.js +210 -210
- package/esm2015/components/ngt-textarea/ngt-textarea.module.js +26 -26
- package/esm2015/components/ngt-validation/ngt-validation.component.js +24 -24
- package/esm2015/components/ngt-validation/ngt-validation.module.js +15 -15
- package/esm2015/directives/ngt-stylizable/ngt-stylizable.directive.js +227 -227
- package/esm2015/directives/ngt-stylizable/ngt-stylizable.module.js +15 -15
- package/esm2015/enums/size.enum.js +11 -11
- package/esm2015/helpers/enum/enum.js +7 -7
- package/esm2015/helpers/form/form.js +14 -14
- package/esm2015/helpers/routing/route.js +11 -11
- package/esm2015/helpers/uuid.js +10 -10
- package/esm2015/ng-tailwind.js +10 -10
- package/esm2015/public-api.js +120 -120
- package/esm2015/services/http/ngt-attachment-http.service.js +3 -3
- package/esm2015/services/http/ngt-http-form.service.js +3 -3
- package/esm2015/services/http/ngt-http-resource.service.js +3 -3
- package/esm2015/services/http/ngt-http-validation.service.js +3 -3
- package/esm2015/services/http/ngt-http.service.js +3 -3
- package/esm2015/services/http/ngt-translate.service.js +3 -3
- package/esm2015/services/ngt-stylizable/ngt-stylizable.service.js +273 -273
- package/fesm2015/ng-tailwind.js +6690 -6690
- package/fesm2015/ng-tailwind.js.map +1 -1
- package/helpers/enum/enum.d.ts +1 -1
- package/helpers/form/form.d.ts +4 -4
- package/helpers/routing/route.d.ts +2 -2
- package/helpers/uuid.d.ts +1 -1
- package/ng-tailwind.d.ts +10 -10
- package/ng-tailwind.metadata.json +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +82 -82
- package/services/http/ngt-attachment-http.service.d.ts +10 -10
- package/services/http/ngt-http-form.service.d.ts +5 -5
- package/services/http/ngt-http-resource.service.d.ts +12 -12
- package/services/http/ngt-http-validation.service.d.ts +11 -11
- package/services/http/ngt-http.service.d.ts +27 -27
- package/services/http/ngt-translate.service.d.ts +29 -29
- package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -96
|
@@ -1,434 +1,434 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { ChangeDetectorRef, Component, EventEmitter, Host, Injector, Input, Optional, Output, SkipSelf, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
3
|
-
import { ControlContainer, NgForm, Validators } from '@angular/forms';
|
|
4
|
-
import { NgxDropzoneComponent } from 'ngx-dropzone';
|
|
5
|
-
import { forkJoin } from 'rxjs';
|
|
6
|
-
import { map } from 'rxjs/operators';
|
|
7
|
-
import Viewer from 'viewerjs';
|
|
8
|
-
import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
|
|
9
|
-
import { getEnumFromString } from '../../helpers/enum/enum';
|
|
10
|
-
import { uuid } from '../../helpers/uuid';
|
|
11
|
-
import { NgtAttachmentHttpService } from '../../services/http/ngt-attachment-http.service';
|
|
12
|
-
import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
|
|
13
|
-
import { NgtDropzoneFileViewerComponent } from './ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component';
|
|
14
|
-
;
|
|
15
|
-
export var NgtDropzoneFileTypeEnum;
|
|
16
|
-
(function (NgtDropzoneFileTypeEnum) {
|
|
17
|
-
NgtDropzoneFileTypeEnum["DOC"] = "DOC";
|
|
18
|
-
NgtDropzoneFileTypeEnum["PDF"] = "PDF";
|
|
19
|
-
NgtDropzoneFileTypeEnum["XLS"] = "XLS";
|
|
20
|
-
NgtDropzoneFileTypeEnum["DWG"] = "DWG";
|
|
21
|
-
NgtDropzoneFileTypeEnum["OTHER"] = "OTHER";
|
|
22
|
-
})(NgtDropzoneFileTypeEnum || (NgtDropzoneFileTypeEnum = {}));
|
|
23
|
-
export var NgtDropzonePreviewType;
|
|
24
|
-
(function (NgtDropzonePreviewType) {
|
|
25
|
-
NgtDropzonePreviewType["DEFAULT"] = "DEFAULT";
|
|
26
|
-
NgtDropzonePreviewType["IMAGE"] = "IMAGE";
|
|
27
|
-
NgtDropzonePreviewType["VIDEO"] = "VIDEO";
|
|
28
|
-
})(NgtDropzonePreviewType || (NgtDropzonePreviewType = {}));
|
|
29
|
-
export var NgtDropzoneErrorType;
|
|
30
|
-
(function (NgtDropzoneErrorType) {
|
|
31
|
-
NgtDropzoneErrorType["DEFAULT"] = "DEFAULT";
|
|
32
|
-
NgtDropzoneErrorType["SIZE"] = "SIZE";
|
|
33
|
-
NgtDropzoneErrorType["NO_MULTIPLE"] = "NO_MULTIPLE";
|
|
34
|
-
NgtDropzoneErrorType["ITEMS_LIMIT"] = "ITEMS_LIMIT";
|
|
35
|
-
NgtDropzoneErrorType["TYPE"] = "TYPE";
|
|
36
|
-
})(NgtDropzoneErrorType || (NgtDropzoneErrorType = {}));
|
|
37
|
-
export class NgtDropzoneComponent extends NgtBaseNgModel {
|
|
38
|
-
constructor(formContainer, ngtAttachmentHttpService, injector, changeDetector) {
|
|
39
|
-
super();
|
|
40
|
-
this.formContainer = formContainer;
|
|
41
|
-
this.ngtAttachmentHttpService = ngtAttachmentHttpService;
|
|
42
|
-
this.injector = injector;
|
|
43
|
-
this.changeDetector = changeDetector;
|
|
44
|
-
this.helpTextColor = 'text-green-500';
|
|
45
|
-
// Behavior
|
|
46
|
-
this.resources = [];
|
|
47
|
-
this.multipleSelection = false;
|
|
48
|
-
this.showFileName = false;
|
|
49
|
-
this.disableClick = false;
|
|
50
|
-
this.disabled = false;
|
|
51
|
-
this.viewMode = false;
|
|
52
|
-
this.removable = false;
|
|
53
|
-
this.canDownloadFile = true;
|
|
54
|
-
this.verticalExpandable = false;
|
|
55
|
-
this.acceptedFiles = '*' /** Mime type */;
|
|
56
|
-
this.previewType = NgtDropzonePreviewType.DEFAULT;
|
|
57
|
-
this.isRequired = false;
|
|
58
|
-
this.onFileSelected = new EventEmitter();
|
|
59
|
-
this.onFileSelectError = new EventEmitter();
|
|
60
|
-
this.onFileUploadFail = new EventEmitter();
|
|
61
|
-
this.onFileRemoved = new EventEmitter();
|
|
62
|
-
this.onFileUploadInit = new EventEmitter();
|
|
63
|
-
this.onFileUploaded = new EventEmitter();
|
|
64
|
-
this.onFilePreviewLoaded = new EventEmitter();
|
|
65
|
-
this.dropzoneHeight = '180px';
|
|
66
|
-
this.uploadedResources = [];
|
|
67
|
-
this.forceDisableClick = false;
|
|
68
|
-
this.nativeValue = [];
|
|
69
|
-
this.showNgtDropzoneFileViewer = false;
|
|
70
|
-
this.componentReady = false;
|
|
71
|
-
this.loading = false;
|
|
72
|
-
this.ngxElementId = uuid();
|
|
73
|
-
this.imageViewerOptions = {
|
|
74
|
-
navbar: true,
|
|
75
|
-
toolbar: {
|
|
76
|
-
zoomIn: true,
|
|
77
|
-
zoomOut: true,
|
|
78
|
-
reset: true,
|
|
79
|
-
rotateLeft: true,
|
|
80
|
-
rotateRight: true,
|
|
81
|
-
prev: true,
|
|
82
|
-
next: true,
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
this.subscriptions = [];
|
|
86
|
-
this.ngtDropzoneLoaderStyle = new NgtStylizableService();
|
|
87
|
-
this.ngtDropzoneLoaderStyle.load(this.injector, 'NgtDropzoneLoader', {
|
|
88
|
-
h: 'h-8',
|
|
89
|
-
color: {
|
|
90
|
-
text: 'text-gray-600'
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
ngOnChanges(changes) {
|
|
95
|
-
if (changes.previewType) {
|
|
96
|
-
this.previewType = getEnumFromString(changes.previewType.currentValue, NgtDropzonePreviewType);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
ngAfterContentChecked() {
|
|
100
|
-
if (this.container && this.container.nativeElement) {
|
|
101
|
-
this.dropzoneHeight = `${this.container.nativeElement.parentElement.offsetHeight}px`;
|
|
102
|
-
this.changeDetector.detectChanges();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
ngOnInit() {
|
|
106
|
-
setTimeout(() => {
|
|
107
|
-
this.componentReady = true;
|
|
108
|
-
setTimeout(() => {
|
|
109
|
-
this.initComponent();
|
|
110
|
-
});
|
|
111
|
-
}, 500);
|
|
112
|
-
}
|
|
113
|
-
ngOnDestroy() {
|
|
114
|
-
this.destroySubscriptions();
|
|
115
|
-
}
|
|
116
|
-
imagePreview(index) {
|
|
117
|
-
const images = this.uploadedResources.filter((resource) => this.isImage(resource));
|
|
118
|
-
const imagesDiv = document.createElement("div");
|
|
119
|
-
images.forEach((image) => {
|
|
120
|
-
let imageElement = document.createElement("img");
|
|
121
|
-
imageElement.src = image.file.url;
|
|
122
|
-
imagesDiv.appendChild(imageElement);
|
|
123
|
-
});
|
|
124
|
-
this.onImageClick(imagesDiv, index);
|
|
125
|
-
}
|
|
126
|
-
onImageClick(element, index) {
|
|
127
|
-
if (!this.viewMode) {
|
|
128
|
-
this.forceDisableClick = true;
|
|
129
|
-
}
|
|
130
|
-
const ngtDropzoneComponent = this;
|
|
131
|
-
if (index) {
|
|
132
|
-
this.imageViewerOptions = Object.assign(Object.assign({}, this.imageViewerOptions), { initialViewIndex: index });
|
|
133
|
-
}
|
|
134
|
-
const viewer = new Viewer(element, Object.assign(Object.assign({}, this.imageViewerOptions), {
|
|
135
|
-
hidden() {
|
|
136
|
-
ngtDropzoneComponent.forceDisableClick = false;
|
|
137
|
-
viewer.destroy();
|
|
138
|
-
}
|
|
139
|
-
}));
|
|
140
|
-
viewer.show();
|
|
141
|
-
}
|
|
142
|
-
onFileClick(url, name, size) {
|
|
143
|
-
this.forceDisableClick = true;
|
|
144
|
-
this.showNgtDropzoneFileViewer = true;
|
|
145
|
-
this.ngtDropzoneFileViewer.url = url;
|
|
146
|
-
this.ngtDropzoneFileViewer.fileName = name;
|
|
147
|
-
this.ngtDropzoneFileViewer.fileSize = size;
|
|
148
|
-
this.ngtDropzoneFileViewer.init();
|
|
149
|
-
this.subscriptions.push(this.ngtDropzoneFileViewer.onClose.subscribe(() => {
|
|
150
|
-
this.showNgtDropzoneFileViewer = false;
|
|
151
|
-
this.forceDisableClick = false;
|
|
152
|
-
}));
|
|
153
|
-
}
|
|
154
|
-
onSelect(event) {
|
|
155
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
-
if (event.rejectedFiles.length) {
|
|
157
|
-
for (const rejectedFile of event.rejectedFiles) {
|
|
158
|
-
if (rejectedFile.reason == 'size') {
|
|
159
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.SIZE);
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
else if (rejectedFile.reason == 'no_multiple') {
|
|
163
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.NO_MULTIPLE);
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
else if (rejectedFile.reason == 'type') {
|
|
167
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.DEFAULT);
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
if (this.itemsLimit) {
|
|
177
|
-
if (this.itemsLimit == 1 && event.addedFiles
|
|
178
|
-
&& event.addedFiles.length == this.itemsLimit && this.uploadedResources.length == this.itemsLimit) {
|
|
179
|
-
this.uploadedResources = [];
|
|
180
|
-
}
|
|
181
|
-
if (event.addedFiles
|
|
182
|
-
&& event.addedFiles.length + this.uploadedResources.length <= this.itemsLimit) {
|
|
183
|
-
this.onFileSelected.emit(event);
|
|
184
|
-
this.uploadFiles(event.addedFiles);
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.ITEMS_LIMIT);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
this.onFileSelected.emit(event);
|
|
192
|
-
this.uploadFiles(event.addedFiles);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
uploadFiles(files) {
|
|
197
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
198
|
-
if (files && files.length) {
|
|
199
|
-
let temporaryFiles = [];
|
|
200
|
-
let temporaryAttachments = [];
|
|
201
|
-
let observables = [];
|
|
202
|
-
this.loading = true;
|
|
203
|
-
this.onFileUploadInit.emit();
|
|
204
|
-
files.forEach(file => {
|
|
205
|
-
observables.push(this.ngtAttachmentHttpService.upload(this.remoteResource, file).pipe(map((response) => {
|
|
206
|
-
if (response && response.data) {
|
|
207
|
-
if (response.data.attributes && response.data.attributes.data) {
|
|
208
|
-
file['url'] = response.data.attributes.data.url;
|
|
209
|
-
}
|
|
210
|
-
temporaryFiles.push({
|
|
211
|
-
id: response.data.id,
|
|
212
|
-
size: file.size,
|
|
213
|
-
file: file
|
|
214
|
-
});
|
|
215
|
-
response.data['loaded'] = true;
|
|
216
|
-
temporaryAttachments.push(response.data);
|
|
217
|
-
}
|
|
218
|
-
})));
|
|
219
|
-
});
|
|
220
|
-
this.subscriptions.push(forkJoin(observables).subscribe((response) => {
|
|
221
|
-
this.uploadedResources.push(...temporaryFiles);
|
|
222
|
-
if (this.itemsLimit == 1) {
|
|
223
|
-
this.onNativeChange([...temporaryAttachments]);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this.onNativeChange([...temporaryAttachments, ...this.nativeValue]);
|
|
227
|
-
}
|
|
228
|
-
this.onFileUploaded.emit();
|
|
229
|
-
this.loading = false;
|
|
230
|
-
}, (error) => {
|
|
231
|
-
this.onFileUploadFail.emit(error);
|
|
232
|
-
this.loading = false;
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
loadFilePreview(attachments) {
|
|
238
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
239
|
-
if (attachments && attachments.length && attachments[0]) {
|
|
240
|
-
let temporaryResource = [];
|
|
241
|
-
let observables = [];
|
|
242
|
-
attachments.forEach(attachment => {
|
|
243
|
-
if (!(attachment instanceof File) && !attachment.loaded) {
|
|
244
|
-
this.loading = true;
|
|
245
|
-
attachment['loaded'] = true;
|
|
246
|
-
observables.push(this.ngtAttachmentHttpService.thumbnail(attachment).pipe(map((response) => {
|
|
247
|
-
temporaryResource.push({
|
|
248
|
-
id: response.data.getApiId(),
|
|
249
|
-
file: response.data.getAttribute('file')
|
|
250
|
-
});
|
|
251
|
-
})));
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
this.subscriptions.push(forkJoin(observables).subscribe((response) => {
|
|
255
|
-
this.uploadedResources.push(...temporaryResource);
|
|
256
|
-
this.onNativeChange(attachments);
|
|
257
|
-
this.onFilePreviewLoaded.emit();
|
|
258
|
-
this.loading = false;
|
|
259
|
-
}, (error) => {
|
|
260
|
-
this.loading = false;
|
|
261
|
-
}));
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
onRemove(resource) {
|
|
266
|
-
this.uploadedResources.splice(this.uploadedResources.indexOf(resource), 1);
|
|
267
|
-
this.nativeValue = this.nativeValue.filter(element => element.id != resource.id);
|
|
268
|
-
this.onNativeChange(this.nativeValue);
|
|
269
|
-
this.onFileRemoved.emit(resource);
|
|
270
|
-
}
|
|
271
|
-
isImage(resource) {
|
|
272
|
-
return this.previewType == 'IMAGE'
|
|
273
|
-
|| (resource.file && resource.file.type
|
|
274
|
-
&& resource.file.type.includes('image')
|
|
275
|
-
&& !resource.file.type.includes('dwg'));
|
|
276
|
-
}
|
|
277
|
-
isVideo(resource) {
|
|
278
|
-
return this.previewType == 'VIDEO' || (resource.file && resource.file.type && resource.file.type.includes('video'));
|
|
279
|
-
}
|
|
280
|
-
isAudio(resource) {
|
|
281
|
-
return (resource.file && resource.file.type && resource.file.type.includes('audio'));
|
|
282
|
-
}
|
|
283
|
-
isFile(resource) {
|
|
284
|
-
return !this.isImage(resource) && !this.isAudio(resource) && !this.isVideo(resource);
|
|
285
|
-
}
|
|
286
|
-
getFormattedFileSize(resource) {
|
|
287
|
-
if (resource) {
|
|
288
|
-
let size = resource.size || resource.fileSize;
|
|
289
|
-
if (!size) {
|
|
290
|
-
if (resource.file && resource.file.size) {
|
|
291
|
-
size = resource.file.size;
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
size = 0;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
if (parseFloat(size) > 1000000) {
|
|
298
|
-
return (parseFloat(size) / 1000000).toFixed(2) + ' Mb';
|
|
299
|
-
}
|
|
300
|
-
return Math.round(parseFloat(size) / 1000) + ' Kb';
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
onNativeChange(value) {
|
|
304
|
-
if (value === undefined) {
|
|
305
|
-
this.value = [];
|
|
306
|
-
this.nativeValue = [];
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
this.nativeValue = value;
|
|
310
|
-
if (JSON.stringify(this.value) != JSON.stringify(this.nativeValue)) {
|
|
311
|
-
this.value = this.nativeValue;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
change(value) {
|
|
316
|
-
if (value && !this.viewMode) {
|
|
317
|
-
this.onNativeChange(Array.isArray(value) ? value : [value]);
|
|
318
|
-
if (this.componentReady) {
|
|
319
|
-
this.loadFilePreview(Array.isArray(value) ? value : [value]);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
downloadFile(attachment) {
|
|
324
|
-
this.ngtAttachmentHttpService.download(attachment).subscribe(() => { });
|
|
325
|
-
}
|
|
326
|
-
reset() {
|
|
327
|
-
this.uploadedResources = [];
|
|
328
|
-
this.value = [];
|
|
329
|
-
this.nativeValue = [];
|
|
330
|
-
this.initComponent();
|
|
331
|
-
}
|
|
332
|
-
openFileSelector() {
|
|
333
|
-
document.getElementById(this.ngxElementId).click();
|
|
334
|
-
}
|
|
335
|
-
initComponent() {
|
|
336
|
-
if (this.viewMode) {
|
|
337
|
-
this.previewType = NgtDropzonePreviewType.DEFAULT;
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
if (this.formContainer && this.formContainer.control
|
|
341
|
-
&& (this.formControl = this.formContainer.control.get(this.name))) {
|
|
342
|
-
this.resetFilesLoad();
|
|
343
|
-
this.loadFilePreview(Array.isArray(this.value) ? this.value : [this.value]);
|
|
344
|
-
this.updateValidations();
|
|
345
|
-
if (this.value) {
|
|
346
|
-
this.formControl.markAsDirty();
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
this.formControl.markAsPristine();
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
resetFilesLoad() {
|
|
354
|
-
if (Array.isArray(this.value)) {
|
|
355
|
-
this.value.forEach(element => {
|
|
356
|
-
if (element) {
|
|
357
|
-
element['loaded'] = false;
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
updateValidations() {
|
|
363
|
-
if (!this.formControl) {
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
let syncValidators = [];
|
|
367
|
-
if (this.isRequired) {
|
|
368
|
-
syncValidators.push(Validators.required);
|
|
369
|
-
}
|
|
370
|
-
syncValidators.push();
|
|
371
|
-
setTimeout(() => {
|
|
372
|
-
this.formControl.setValidators(syncValidators);
|
|
373
|
-
this.formControl.updateValueAndValidity();
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
destroySubscriptions() {
|
|
377
|
-
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
378
|
-
this.subscriptions = [];
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
NgtDropzoneComponent.decorators = [
|
|
382
|
-
{ type: Component, args: [{
|
|
383
|
-
selector: 'ngt-dropzone',
|
|
384
|
-
template: "<div class=\"flex flex-col h-full w-full\" #container>\
|
|
385
|
-
encapsulation: ViewEncapsulation.None,
|
|
386
|
-
providers: [
|
|
387
|
-
NgtMakeProvider(NgtDropzoneComponent),
|
|
388
|
-
],
|
|
389
|
-
viewProviders: [
|
|
390
|
-
{ provide: ControlContainer, useExisting: NgForm }
|
|
391
|
-
],
|
|
392
|
-
styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"]
|
|
393
|
-
},] }
|
|
394
|
-
];
|
|
395
|
-
NgtDropzoneComponent.ctorParameters = () => [
|
|
396
|
-
{ type: ControlContainer, decorators: [{ type: Optional }, { type: Host }] },
|
|
397
|
-
{ type: NgtAttachmentHttpService, decorators: [{ type: Optional }, { type: SkipSelf }] },
|
|
398
|
-
{ type: Injector },
|
|
399
|
-
{ type: ChangeDetectorRef }
|
|
400
|
-
];
|
|
401
|
-
NgtDropzoneComponent.propDecorators = {
|
|
402
|
-
container: [{ type: ViewChild, args: ['container',] }],
|
|
403
|
-
ngxDropzone: [{ type: ViewChild, args: [NgxDropzoneComponent, { static: true },] }],
|
|
404
|
-
ngtDropzoneFileViewer: [{ type: ViewChild, args: [NgtDropzoneFileViewerComponent, { static: true },] }],
|
|
405
|
-
label: [{ type: Input }],
|
|
406
|
-
placeholder: [{ type: Input }],
|
|
407
|
-
helpTextColor: [{ type: Input }],
|
|
408
|
-
helpText: [{ type: Input }],
|
|
409
|
-
helpTitle: [{ type: Input }],
|
|
410
|
-
resources: [{ type: Input }],
|
|
411
|
-
multipleSelection: [{ type: Input }],
|
|
412
|
-
itemsLimit: [{ type: Input }],
|
|
413
|
-
showFileName: [{ type: Input }],
|
|
414
|
-
disableClick: [{ type: Input }],
|
|
415
|
-
disabled: [{ type: Input }],
|
|
416
|
-
viewMode: [{ type: Input }],
|
|
417
|
-
removable: [{ type: Input }],
|
|
418
|
-
canDownloadFile: [{ type: Input }],
|
|
419
|
-
verticalExpandable: [{ type: Input }],
|
|
420
|
-
acceptedFiles: [{ type: Input }],
|
|
421
|
-
maxFileSize: [{ type: Input }],
|
|
422
|
-
previewType: [{ type: Input }],
|
|
423
|
-
isRequired: [{ type: Input }],
|
|
424
|
-
name: [{ type: Input }],
|
|
425
|
-
remoteResource: [{ type: Input }],
|
|
426
|
-
onFileSelected: [{ type: Output }],
|
|
427
|
-
onFileSelectError: [{ type: Output }],
|
|
428
|
-
onFileUploadFail: [{ type: Output }],
|
|
429
|
-
onFileRemoved: [{ type: Output }],
|
|
430
|
-
onFileUploadInit: [{ type: Output }],
|
|
431
|
-
onFileUploaded: [{ type: Output }],
|
|
432
|
-
onFilePreviewLoaded: [{ type: Output }]
|
|
433
|
-
};
|
|
434
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRyb3B6b25lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1kcm9wem9uZS9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFFBQVEsRUFDUixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBMEIsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUU5QixPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM1RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVM5RyxDQUFDO0FBRUYsTUFBTSxDQUFOLElBQVksdUJBTVg7QUFORCxXQUFZLHVCQUF1QjtJQUMvQixz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Q0wsS0FBSzt5QkFDTCxLQUFLO21CQUNMLEtBQUs7NkJBQ0wsS0FBSzs2QkFFTCxNQUFNO2dDQUNOLE1BQU07K0JBQ04sTUFBTTs0QkFDTixNQUFNOytCQUNOLE1BQU07NkJBQ04sTUFBTTtrQ0FDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyQ29udGVudENoZWNrZWQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0LFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFNraXBTZWxmLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmd4RHJvcHpvbmVDaGFuZ2VFdmVudCwgTmd4RHJvcHpvbmVDb21wb25lbnQgfSBmcm9tICduZ3gtZHJvcHpvbmUnO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IFZpZXdlciBmcm9tICd2aWV3ZXJqcyc7XHJcblxyXG5pbXBvcnQgeyBOZ3RCYXNlTmdNb2RlbCwgTmd0TWFrZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vYmFzZS9uZ3QtYmFzZS1uZy1tb2RlbCc7XHJcbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xyXG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vaGVscGVycy91dWlkJztcclxuaW1wb3J0IHsgTmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtYXR0YWNobWVudC1odHRwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3REcm9wem9uZUZpbGVWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuL25ndC1kcm9wem9uZS1maWxlLXZpZXdlci9uZ3QtZHJvcHpvbmUtZmlsZS12aWV3ZXIuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmd0RHJvcHpvbmVGaWxlIHtcclxuICAgIGRvd25sb2FkVXJsOiBzdHJpbmc7XHJcbiAgICBwcmV2aWV3VXJsOiBzdHJpbmc7XHJcbiAgICB0aHVtYm5haWxVcmw6IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIG1pbWVUeXBlOiBzdHJpbmc7XHJcbiAgICBmaWxlU2l6ZTogYW55O1xyXG59O1xyXG5cclxuZXhwb3J0IGVudW0gTmd0RHJvcHpvbmVGaWxlVHlwZUVudW0ge1xyXG4gICAgRE9DID0gJ0RPQycsXHJcbiAgICBQREYgPSAnUERGJyxcclxuICAgIFhMUyA9ICdYTFMnLFxyXG4gICAgRFdHID0gJ0RXRycsXHJcbiAgICBPVEhFUiA9ICdPVEhFUidcclxufVxyXG5cclxuZXhwb3J0IGVudW0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSB7XHJcbiAgICBERUZBVUxUID0gJ0RFRkFVTFQnLFxyXG4gICAgSU1BR0UgPSAnSU1BR0UnLFxyXG4gICAgVklERU8gPSAnVklERU8nXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5ndERyb3B6b25lRXJyb3JUeXBlIHtcclxuICAgIERFRkFVTFQgPSAnREVGQVVMVCcsXHJcbiAgICBTSVpFID0gJ1NJWkUnLFxyXG4gICAgTk9fTVVMVElQTEUgPSAnTk9fTVVMVElQTEUnLFxyXG4gICAgSVRFTVNfTElNSVQgPSAnSVRFTVNfTElNSVQnLFxyXG4gICAgVFlQRSA9ICdUWVBFJ1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd0LWRyb3B6b25lJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtZHJvcHpvbmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWRyb3B6b25lLmNvbXBvbmVudC5jc3MnXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBOZ3RNYWtlUHJvdmlkZXIoTmd0RHJvcHpvbmVDb21wb25lbnQpLFxyXG4gICAgXSxcclxuICAgIHZpZXdQcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd0RHJvcHpvbmVDb21wb25lbnQgZXh0ZW5kcyBOZ3RCYXNlTmdNb2RlbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRDaGVja2VkIHtcclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHB1YmxpYyBjb250YWluZXI6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKE5neERyb3B6b25lQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmd4RHJvcHpvbmU6IE5neERyb3B6b25lQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZChOZ3REcm9wem9uZUZpbGVWaWV3ZXJDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuZ3REcm9wem9uZUZpbGVWaWV3ZXI6IE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudDtcclxuXHJcbiAgICAvLyBWaXN1YWxcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHRDb2xvcjogc3RyaW5nID0gJ3RleHQtZ3JlZW4tNTAwJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIC8vIEJlaGF2aW9yXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVzb3VyY2VzOiBBcnJheTxOZ3REcm9wem9uZUZpbGU+ID0gW107XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGVTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0xpbWl0OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpbGVOYW1lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyB2aWV3TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIHJlbW92YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNhbkRvd25sb2FkRmlsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdmVydGljYWxFeHBhbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYWNjZXB0ZWRGaWxlczogc3RyaW5nID0gJyonIC8qKiBNaW1lIHR5cGUgKi87XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4RmlsZVNpemU6IG51bWJlcjsgLyoqIEJ5dGVzICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcHJldmlld1R5cGU6IE5ndERyb3B6b25lUHJldmlld1R5cGUgPSBOZ3REcm9wem9uZVByZXZpZXdUeXBlLkRFRkFVTFQ7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xyXG5cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxOZ3hEcm9wem9uZUNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlU2VsZWN0RXJyb3I6IEV2ZW50RW1pdHRlcjxOZ3REcm9wem9uZUVycm9yVHlwZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVVwbG9hZEZhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRJbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlUHJldmlld0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBwdWJsaWMgZHJvcHpvbmVIZWlnaHQ6IHN0cmluZyA9ICcxODBweCc7XHJcbiAgICBwdWJsaWMgdXBsb2FkZWRSZXNvdXJjZXMgPSBbXTtcclxuICAgIHB1YmxpYyBmb3JjZURpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG5hdGl2ZVZhbHVlID0gW107XHJcbiAgICBwdWJsaWMgc2hvd05ndERyb3B6b25lRmlsZVZpZXdlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG5ndERyb3B6b25lTG9hZGVyU3R5bGU6IE5ndFN0eWxpemFibGVTZXJ2aWNlO1xyXG4gICAgcHVibGljIG5neEVsZW1lbnRJZDogc3RyaW5nID0gdXVpZCgpO1xyXG4gICAgcHVibGljIGltYWdlVmlld2VyT3B0aW9uczogYW55ID0ge1xyXG4gICAgICAgIG5hdmJhcjogdHJ1ZSxcclxuICAgICAgICB0b29sYmFyOiB7XHJcbiAgICAgICAgICAgIHpvb21JbjogdHJ1ZSxcclxuICAgICAgICAgICAgem9vbU91dDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJvdGF0ZUxlZnQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJvdGF0ZVJpZ2h0OiB0cnVlLFxyXG4gICAgICAgICAgICBwcmV2OiB0cnVlLFxyXG4gICAgICAgICAgICBuZXh0OiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBIb3N0KClcclxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlOiBOZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLm5ndERyb3B6b25lTG9hZGVyU3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUxvYWRlclN0eWxlLmxvYWQodGhpcy5pbmplY3RvciwgJ05ndERyb3B6b25lTG9hZGVyJywge1xyXG4gICAgICAgICAgICBoOiAnaC04JyxcclxuICAgICAgICAgICAgY29sb3I6IHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICd0ZXh0LWdyYXktNjAwJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5wcmV2aWV3VHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZXZpZXdUeXBlID0gZ2V0RW51bUZyb21TdHJpbmcoY2hhbmdlcy5wcmV2aWV3VHlwZS5jdXJyZW50VmFsdWUsIE5ndERyb3B6b25lUHJldmlld1R5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcHpvbmVIZWlnaHQgPSBgJHt0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbWFnZVByZXZpZXcoaW5kZXgpIHtcclxuICAgICAgICBjb25zdCBpbWFnZXMgPSB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmZpbHRlcigocmVzb3VyY2UpID0+IHRoaXMuaXNJbWFnZShyZXNvdXJjZSkpO1xyXG4gICAgICAgIGNvbnN0IGltYWdlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGltYWdlcy5mb3JFYWNoKChpbWFnZSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaW1hZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlRWxlbWVudC5zcmMgPSBpbWFnZS5maWxlLnVybDtcclxuXHJcbiAgICAgICAgICAgIGltYWdlc0Rpdi5hcHBlbmRDaGlsZChpbWFnZUVsZW1lbnQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9uSW1hZ2VDbGljayhpbWFnZXNEaXYsIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25JbWFnZUNsaWNrKGVsZW1lbnQsIGluZGV4Pykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcmNlRGlzYWJsZUNsaWNrID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ndERyb3B6b25lQ29tcG9uZW50ID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKGluZGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zID0geyAuLi50aGlzLmltYWdlVmlld2VyT3B0aW9ucywgLi4ueyBpbml0aWFsVmlld0luZGV4OiBpbmRleCB9IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2aWV3ZXIgPSBuZXcgVmlld2VyKGVsZW1lbnQsIHtcclxuICAgICAgICAgICAgLi4udGhpcy5pbWFnZVZpZXdlck9wdGlvbnMsIC4uLntcclxuICAgICAgICAgICAgICAgIGhpZGRlbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZ3REcm9wem9uZUNvbXBvbmVudC5mb3JjZURpc2FibGVDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmlld2VyLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25GaWxlQ2xpY2sodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5mb3JjZURpc2FibGVDbGljayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci51cmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIuZmlsZU5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLmZpbGVTaXplID0gc2l6ZTtcclxuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci5pbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLm9uQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VEaXNhYmxlQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG9uU2VsZWN0KGV2ZW50OiBOZ3hEcm9wem9uZUNoYW5nZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVqZWN0ZWRGaWxlIG9mIDxhbnk+ZXZlbnQucmVqZWN0ZWRGaWxlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ3NpemUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlNJWkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZEZpbGUucmVhc29uID09ICdub19tdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuTk9fTVVMVElQTEUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZEZpbGUucmVhc29uID09ICd0eXBlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5UWVBFKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGltaXQgPT0gMSAmJiBldmVudC5hZGRlZEZpbGVzXHJcbiAgICAgICAgICAgICAgICAmJiBldmVudC5hZGRlZEZpbGVzLmxlbmd0aCA9PSB0aGlzLml0ZW1zTGltaXQgJiYgdGhpcy51cGxvYWRlZFJlc291cmNlcy5sZW5ndGggPT0gdGhpcy5pdGVtc0xpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5hZGRlZEZpbGVzXHJcbiAgICAgICAgICAgICAgICAmJiBldmVudC5hZGRlZEZpbGVzLmxlbmd0aCArIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMubGVuZ3RoIDw9IHRoaXMuaXRlbXNMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoZXZlbnQuYWRkZWRGaWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuSVRFTVNfTElNSVQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlcyhldmVudC5hZGRlZEZpbGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHVwbG9hZEZpbGVzKGZpbGVzOiBBcnJheTxGaWxlPikge1xyXG4gICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IHRlbXBvcmFyeUZpbGVzID0gW107XHJcbiAgICAgICAgICAgIGxldCB0ZW1wb3JhcnlBdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgb2JzZXJ2YWJsZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub25GaWxlVXBsb2FkSW5pdC5lbWl0KCk7XHJcblxyXG4gICAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2YWJsZXMucHVzaCh0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS51cGxvYWQodGhpcy5yZW1vdGVSZXNvdXJjZSwgZmlsZSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMgJiYgcmVzcG9uc2UuZGF0YS5hdHRyaWJ1dGVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlWyd1cmwnXSA9IHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcy5kYXRhLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlGaWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcmVzcG9uc2UuZGF0YS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhWydsb2FkZWQnXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlBdHRhY2htZW50cy5wdXNoKHJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5wdXNoKC4uLnRlbXBvcmFyeUZpbGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGltaXQgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHNdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UoWy4uLnRlbXBvcmFyeUF0dGFjaG1lbnRzLCAuLi50aGlzLm5hdGl2ZVZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlVXBsb2FkZWQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVVwbG9hZEZhaWwuZW1pdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZVByZXZpZXcoYXR0YWNobWVudHM6IGFueSkge1xyXG4gICAgICAgIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggJiYgYXR0YWNobWVudHNbMF0pIHtcclxuICAgICAgICAgICAgbGV0IHRlbXBvcmFyeVJlc291cmNlID0gW107XHJcbiAgICAgICAgICAgIGxldCBvYnNlcnZhYmxlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBGaWxlKSAmJiAhYXR0YWNobWVudC5sb2FkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRbJ2xvYWRlZCddID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKHRoaXMubmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLnRodW1ibmFpbChhdHRhY2htZW50KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeVJlc291cmNlLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByZXNwb25zZS5kYXRhLmdldEFwaUlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogcmVzcG9uc2UuZGF0YS5nZXRBdHRyaWJ1dGUoJ2ZpbGUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLnB1c2goLi4udGVtcG9yYXJ5UmVzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKGF0dGFjaG1lbnRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVQcmV2aWV3TG9hZGVkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uUmVtb3ZlKHJlc291cmNlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLnNwbGljZSh0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmluZGV4T2YocmVzb3VyY2UpLCAxKTtcclxuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdGhpcy5uYXRpdmVWYWx1ZS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LmlkICE9IHJlc291cmNlLmlkKTtcclxuICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKHRoaXMubmF0aXZlVmFsdWUpO1xyXG4gICAgICAgIHRoaXMub25GaWxlUmVtb3ZlZC5lbWl0KHJlc291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNJbWFnZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlld1R5cGUgPT0gJ0lNQUdFJ1xyXG4gICAgICAgICAgICB8fCAoXHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZS5maWxlICYmIHJlc291cmNlLmZpbGUudHlwZVxyXG4gICAgICAgICAgICAgICAgJiYgcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdpbWFnZScpXHJcbiAgICAgICAgICAgICAgICAmJiAhcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdkd2cnKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1ZpZGVvKHJlc291cmNlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aWV3VHlwZSA9PSAnVklERU8nIHx8IChyZXNvdXJjZS5maWxlICYmIHJlc291cmNlLmZpbGUudHlwZSAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ3ZpZGVvJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0F1ZGlvKHJlc291cmNlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygnYXVkaW8nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRmlsZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzSW1hZ2UocmVzb3VyY2UpICYmICF0aGlzLmlzQXVkaW8ocmVzb3VyY2UpICYmICF0aGlzLmlzVmlkZW8ocmVzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRGaWxlU2l6ZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHJlc291cmNlKSB7XHJcbiAgICAgICAgICAgIGxldCBzaXplID0gcmVzb3VyY2Uuc2l6ZSB8fCByZXNvdXJjZS5maWxlU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICghc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHJlc291cmNlLmZpbGUuc2l6ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNpemUpID4gMTAwMDAwMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUZsb2F0KHNpemUpIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWInO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHNpemUpIC8gMTAwMCkgKyAnIEtiJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkgIT0gSlNPTi5zdHJpbmdpZnkodGhpcy5uYXRpdmVWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm5hdGl2ZVZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ2UodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy52aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRGaWxlUHJldmlldyhBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRvd25sb2FkRmlsZShhdHRhY2htZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5kb3dubG9hZChhdHRhY2htZW50KS5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XHJcbiAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5GaWxlU2VsZWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uZ3hFbGVtZW50SWQpLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJldmlld1R5cGUgPSBOZ3REcm9wem9uZVByZXZpZXdUeXBlLkRFRkFVTFQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mb3JtQ29udGFpbmVyICYmIHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sXHJcbiAgICAgICAgICAgICYmICh0aGlzLmZvcm1Db250cm9sID0gdGhpcy5mb3JtQ29udGFpbmVyLmNvbnRyb2wuZ2V0KHRoaXMubmFtZSkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlc0xvYWQoKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkRmlsZVByZXZpZXcoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV0pO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRGaWxlc0xvYWQoKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50Wydsb2FkZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGF0aW9ucygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN5bmNWYWxpZGF0b3JzID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhzeW5jVmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { ChangeDetectorRef, Component, EventEmitter, Host, Injector, Input, Optional, Output, SkipSelf, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
3
|
+
import { ControlContainer, NgForm, Validators } from '@angular/forms';
|
|
4
|
+
import { NgxDropzoneComponent } from 'ngx-dropzone';
|
|
5
|
+
import { forkJoin } from 'rxjs';
|
|
6
|
+
import { map } from 'rxjs/operators';
|
|
7
|
+
import Viewer from 'viewerjs';
|
|
8
|
+
import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
|
|
9
|
+
import { getEnumFromString } from '../../helpers/enum/enum';
|
|
10
|
+
import { uuid } from '../../helpers/uuid';
|
|
11
|
+
import { NgtAttachmentHttpService } from '../../services/http/ngt-attachment-http.service';
|
|
12
|
+
import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
|
|
13
|
+
import { NgtDropzoneFileViewerComponent } from './ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component';
|
|
14
|
+
;
|
|
15
|
+
export var NgtDropzoneFileTypeEnum;
|
|
16
|
+
(function (NgtDropzoneFileTypeEnum) {
|
|
17
|
+
NgtDropzoneFileTypeEnum["DOC"] = "DOC";
|
|
18
|
+
NgtDropzoneFileTypeEnum["PDF"] = "PDF";
|
|
19
|
+
NgtDropzoneFileTypeEnum["XLS"] = "XLS";
|
|
20
|
+
NgtDropzoneFileTypeEnum["DWG"] = "DWG";
|
|
21
|
+
NgtDropzoneFileTypeEnum["OTHER"] = "OTHER";
|
|
22
|
+
})(NgtDropzoneFileTypeEnum || (NgtDropzoneFileTypeEnum = {}));
|
|
23
|
+
export var NgtDropzonePreviewType;
|
|
24
|
+
(function (NgtDropzonePreviewType) {
|
|
25
|
+
NgtDropzonePreviewType["DEFAULT"] = "DEFAULT";
|
|
26
|
+
NgtDropzonePreviewType["IMAGE"] = "IMAGE";
|
|
27
|
+
NgtDropzonePreviewType["VIDEO"] = "VIDEO";
|
|
28
|
+
})(NgtDropzonePreviewType || (NgtDropzonePreviewType = {}));
|
|
29
|
+
export var NgtDropzoneErrorType;
|
|
30
|
+
(function (NgtDropzoneErrorType) {
|
|
31
|
+
NgtDropzoneErrorType["DEFAULT"] = "DEFAULT";
|
|
32
|
+
NgtDropzoneErrorType["SIZE"] = "SIZE";
|
|
33
|
+
NgtDropzoneErrorType["NO_MULTIPLE"] = "NO_MULTIPLE";
|
|
34
|
+
NgtDropzoneErrorType["ITEMS_LIMIT"] = "ITEMS_LIMIT";
|
|
35
|
+
NgtDropzoneErrorType["TYPE"] = "TYPE";
|
|
36
|
+
})(NgtDropzoneErrorType || (NgtDropzoneErrorType = {}));
|
|
37
|
+
export class NgtDropzoneComponent extends NgtBaseNgModel {
|
|
38
|
+
constructor(formContainer, ngtAttachmentHttpService, injector, changeDetector) {
|
|
39
|
+
super();
|
|
40
|
+
this.formContainer = formContainer;
|
|
41
|
+
this.ngtAttachmentHttpService = ngtAttachmentHttpService;
|
|
42
|
+
this.injector = injector;
|
|
43
|
+
this.changeDetector = changeDetector;
|
|
44
|
+
this.helpTextColor = 'text-green-500';
|
|
45
|
+
// Behavior
|
|
46
|
+
this.resources = [];
|
|
47
|
+
this.multipleSelection = false;
|
|
48
|
+
this.showFileName = false;
|
|
49
|
+
this.disableClick = false;
|
|
50
|
+
this.disabled = false;
|
|
51
|
+
this.viewMode = false;
|
|
52
|
+
this.removable = false;
|
|
53
|
+
this.canDownloadFile = true;
|
|
54
|
+
this.verticalExpandable = false;
|
|
55
|
+
this.acceptedFiles = '*' /** Mime type */;
|
|
56
|
+
this.previewType = NgtDropzonePreviewType.DEFAULT;
|
|
57
|
+
this.isRequired = false;
|
|
58
|
+
this.onFileSelected = new EventEmitter();
|
|
59
|
+
this.onFileSelectError = new EventEmitter();
|
|
60
|
+
this.onFileUploadFail = new EventEmitter();
|
|
61
|
+
this.onFileRemoved = new EventEmitter();
|
|
62
|
+
this.onFileUploadInit = new EventEmitter();
|
|
63
|
+
this.onFileUploaded = new EventEmitter();
|
|
64
|
+
this.onFilePreviewLoaded = new EventEmitter();
|
|
65
|
+
this.dropzoneHeight = '180px';
|
|
66
|
+
this.uploadedResources = [];
|
|
67
|
+
this.forceDisableClick = false;
|
|
68
|
+
this.nativeValue = [];
|
|
69
|
+
this.showNgtDropzoneFileViewer = false;
|
|
70
|
+
this.componentReady = false;
|
|
71
|
+
this.loading = false;
|
|
72
|
+
this.ngxElementId = uuid();
|
|
73
|
+
this.imageViewerOptions = {
|
|
74
|
+
navbar: true,
|
|
75
|
+
toolbar: {
|
|
76
|
+
zoomIn: true,
|
|
77
|
+
zoomOut: true,
|
|
78
|
+
reset: true,
|
|
79
|
+
rotateLeft: true,
|
|
80
|
+
rotateRight: true,
|
|
81
|
+
prev: true,
|
|
82
|
+
next: true,
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
this.subscriptions = [];
|
|
86
|
+
this.ngtDropzoneLoaderStyle = new NgtStylizableService();
|
|
87
|
+
this.ngtDropzoneLoaderStyle.load(this.injector, 'NgtDropzoneLoader', {
|
|
88
|
+
h: 'h-8',
|
|
89
|
+
color: {
|
|
90
|
+
text: 'text-gray-600'
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
ngOnChanges(changes) {
|
|
95
|
+
if (changes.previewType) {
|
|
96
|
+
this.previewType = getEnumFromString(changes.previewType.currentValue, NgtDropzonePreviewType);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
ngAfterContentChecked() {
|
|
100
|
+
if (this.container && this.container.nativeElement) {
|
|
101
|
+
this.dropzoneHeight = `${this.container.nativeElement.parentElement.offsetHeight}px`;
|
|
102
|
+
this.changeDetector.detectChanges();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
ngOnInit() {
|
|
106
|
+
setTimeout(() => {
|
|
107
|
+
this.componentReady = true;
|
|
108
|
+
setTimeout(() => {
|
|
109
|
+
this.initComponent();
|
|
110
|
+
});
|
|
111
|
+
}, 500);
|
|
112
|
+
}
|
|
113
|
+
ngOnDestroy() {
|
|
114
|
+
this.destroySubscriptions();
|
|
115
|
+
}
|
|
116
|
+
imagePreview(index) {
|
|
117
|
+
const images = this.uploadedResources.filter((resource) => this.isImage(resource));
|
|
118
|
+
const imagesDiv = document.createElement("div");
|
|
119
|
+
images.forEach((image) => {
|
|
120
|
+
let imageElement = document.createElement("img");
|
|
121
|
+
imageElement.src = image.file.url;
|
|
122
|
+
imagesDiv.appendChild(imageElement);
|
|
123
|
+
});
|
|
124
|
+
this.onImageClick(imagesDiv, index);
|
|
125
|
+
}
|
|
126
|
+
onImageClick(element, index) {
|
|
127
|
+
if (!this.viewMode) {
|
|
128
|
+
this.forceDisableClick = true;
|
|
129
|
+
}
|
|
130
|
+
const ngtDropzoneComponent = this;
|
|
131
|
+
if (index) {
|
|
132
|
+
this.imageViewerOptions = Object.assign(Object.assign({}, this.imageViewerOptions), { initialViewIndex: index });
|
|
133
|
+
}
|
|
134
|
+
const viewer = new Viewer(element, Object.assign(Object.assign({}, this.imageViewerOptions), {
|
|
135
|
+
hidden() {
|
|
136
|
+
ngtDropzoneComponent.forceDisableClick = false;
|
|
137
|
+
viewer.destroy();
|
|
138
|
+
}
|
|
139
|
+
}));
|
|
140
|
+
viewer.show();
|
|
141
|
+
}
|
|
142
|
+
onFileClick(url, name, size) {
|
|
143
|
+
this.forceDisableClick = true;
|
|
144
|
+
this.showNgtDropzoneFileViewer = true;
|
|
145
|
+
this.ngtDropzoneFileViewer.url = url;
|
|
146
|
+
this.ngtDropzoneFileViewer.fileName = name;
|
|
147
|
+
this.ngtDropzoneFileViewer.fileSize = size;
|
|
148
|
+
this.ngtDropzoneFileViewer.init();
|
|
149
|
+
this.subscriptions.push(this.ngtDropzoneFileViewer.onClose.subscribe(() => {
|
|
150
|
+
this.showNgtDropzoneFileViewer = false;
|
|
151
|
+
this.forceDisableClick = false;
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
onSelect(event) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
if (event.rejectedFiles.length) {
|
|
157
|
+
for (const rejectedFile of event.rejectedFiles) {
|
|
158
|
+
if (rejectedFile.reason == 'size') {
|
|
159
|
+
this.onFileSelectError.emit(NgtDropzoneErrorType.SIZE);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
else if (rejectedFile.reason == 'no_multiple') {
|
|
163
|
+
this.onFileSelectError.emit(NgtDropzoneErrorType.NO_MULTIPLE);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
else if (rejectedFile.reason == 'type') {
|
|
167
|
+
this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.onFileSelectError.emit(NgtDropzoneErrorType.DEFAULT);
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (this.itemsLimit) {
|
|
177
|
+
if (this.itemsLimit == 1 && event.addedFiles
|
|
178
|
+
&& event.addedFiles.length == this.itemsLimit && this.uploadedResources.length == this.itemsLimit) {
|
|
179
|
+
this.uploadedResources = [];
|
|
180
|
+
}
|
|
181
|
+
if (event.addedFiles
|
|
182
|
+
&& event.addedFiles.length + this.uploadedResources.length <= this.itemsLimit) {
|
|
183
|
+
this.onFileSelected.emit(event);
|
|
184
|
+
this.uploadFiles(event.addedFiles);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
this.onFileSelectError.emit(NgtDropzoneErrorType.ITEMS_LIMIT);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this.onFileSelected.emit(event);
|
|
192
|
+
this.uploadFiles(event.addedFiles);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
uploadFiles(files) {
|
|
197
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
198
|
+
if (files && files.length) {
|
|
199
|
+
let temporaryFiles = [];
|
|
200
|
+
let temporaryAttachments = [];
|
|
201
|
+
let observables = [];
|
|
202
|
+
this.loading = true;
|
|
203
|
+
this.onFileUploadInit.emit();
|
|
204
|
+
files.forEach(file => {
|
|
205
|
+
observables.push(this.ngtAttachmentHttpService.upload(this.remoteResource, file).pipe(map((response) => {
|
|
206
|
+
if (response && response.data) {
|
|
207
|
+
if (response.data.attributes && response.data.attributes.data) {
|
|
208
|
+
file['url'] = response.data.attributes.data.url;
|
|
209
|
+
}
|
|
210
|
+
temporaryFiles.push({
|
|
211
|
+
id: response.data.id,
|
|
212
|
+
size: file.size,
|
|
213
|
+
file: file
|
|
214
|
+
});
|
|
215
|
+
response.data['loaded'] = true;
|
|
216
|
+
temporaryAttachments.push(response.data);
|
|
217
|
+
}
|
|
218
|
+
})));
|
|
219
|
+
});
|
|
220
|
+
this.subscriptions.push(forkJoin(observables).subscribe((response) => {
|
|
221
|
+
this.uploadedResources.push(...temporaryFiles);
|
|
222
|
+
if (this.itemsLimit == 1) {
|
|
223
|
+
this.onNativeChange([...temporaryAttachments]);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
this.onNativeChange([...temporaryAttachments, ...this.nativeValue]);
|
|
227
|
+
}
|
|
228
|
+
this.onFileUploaded.emit();
|
|
229
|
+
this.loading = false;
|
|
230
|
+
}, (error) => {
|
|
231
|
+
this.onFileUploadFail.emit(error);
|
|
232
|
+
this.loading = false;
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
loadFilePreview(attachments) {
|
|
238
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
239
|
+
if (attachments && attachments.length && attachments[0]) {
|
|
240
|
+
let temporaryResource = [];
|
|
241
|
+
let observables = [];
|
|
242
|
+
attachments.forEach(attachment => {
|
|
243
|
+
if (!(attachment instanceof File) && !attachment.loaded) {
|
|
244
|
+
this.loading = true;
|
|
245
|
+
attachment['loaded'] = true;
|
|
246
|
+
observables.push(this.ngtAttachmentHttpService.thumbnail(attachment).pipe(map((response) => {
|
|
247
|
+
temporaryResource.push({
|
|
248
|
+
id: response.data.getApiId(),
|
|
249
|
+
file: response.data.getAttribute('file')
|
|
250
|
+
});
|
|
251
|
+
})));
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
this.subscriptions.push(forkJoin(observables).subscribe((response) => {
|
|
255
|
+
this.uploadedResources.push(...temporaryResource);
|
|
256
|
+
this.onNativeChange(attachments);
|
|
257
|
+
this.onFilePreviewLoaded.emit();
|
|
258
|
+
this.loading = false;
|
|
259
|
+
}, (error) => {
|
|
260
|
+
this.loading = false;
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
onRemove(resource) {
|
|
266
|
+
this.uploadedResources.splice(this.uploadedResources.indexOf(resource), 1);
|
|
267
|
+
this.nativeValue = this.nativeValue.filter(element => element.id != resource.id);
|
|
268
|
+
this.onNativeChange(this.nativeValue);
|
|
269
|
+
this.onFileRemoved.emit(resource);
|
|
270
|
+
}
|
|
271
|
+
isImage(resource) {
|
|
272
|
+
return this.previewType == 'IMAGE'
|
|
273
|
+
|| (resource.file && resource.file.type
|
|
274
|
+
&& resource.file.type.includes('image')
|
|
275
|
+
&& !resource.file.type.includes('dwg'));
|
|
276
|
+
}
|
|
277
|
+
isVideo(resource) {
|
|
278
|
+
return this.previewType == 'VIDEO' || (resource.file && resource.file.type && resource.file.type.includes('video'));
|
|
279
|
+
}
|
|
280
|
+
isAudio(resource) {
|
|
281
|
+
return (resource.file && resource.file.type && resource.file.type.includes('audio'));
|
|
282
|
+
}
|
|
283
|
+
isFile(resource) {
|
|
284
|
+
return !this.isImage(resource) && !this.isAudio(resource) && !this.isVideo(resource);
|
|
285
|
+
}
|
|
286
|
+
getFormattedFileSize(resource) {
|
|
287
|
+
if (resource) {
|
|
288
|
+
let size = resource.size || resource.fileSize;
|
|
289
|
+
if (!size) {
|
|
290
|
+
if (resource.file && resource.file.size) {
|
|
291
|
+
size = resource.file.size;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
size = 0;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (parseFloat(size) > 1000000) {
|
|
298
|
+
return (parseFloat(size) / 1000000).toFixed(2) + ' Mb';
|
|
299
|
+
}
|
|
300
|
+
return Math.round(parseFloat(size) / 1000) + ' Kb';
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
onNativeChange(value) {
|
|
304
|
+
if (value === undefined) {
|
|
305
|
+
this.value = [];
|
|
306
|
+
this.nativeValue = [];
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
this.nativeValue = value;
|
|
310
|
+
if (JSON.stringify(this.value) != JSON.stringify(this.nativeValue)) {
|
|
311
|
+
this.value = this.nativeValue;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
change(value) {
|
|
316
|
+
if (value && !this.viewMode) {
|
|
317
|
+
this.onNativeChange(Array.isArray(value) ? value : [value]);
|
|
318
|
+
if (this.componentReady) {
|
|
319
|
+
this.loadFilePreview(Array.isArray(value) ? value : [value]);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
downloadFile(attachment) {
|
|
324
|
+
this.ngtAttachmentHttpService.download(attachment).subscribe(() => { });
|
|
325
|
+
}
|
|
326
|
+
reset() {
|
|
327
|
+
this.uploadedResources = [];
|
|
328
|
+
this.value = [];
|
|
329
|
+
this.nativeValue = [];
|
|
330
|
+
this.initComponent();
|
|
331
|
+
}
|
|
332
|
+
openFileSelector() {
|
|
333
|
+
document.getElementById(this.ngxElementId).click();
|
|
334
|
+
}
|
|
335
|
+
initComponent() {
|
|
336
|
+
if (this.viewMode) {
|
|
337
|
+
this.previewType = NgtDropzonePreviewType.DEFAULT;
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (this.formContainer && this.formContainer.control
|
|
341
|
+
&& (this.formControl = this.formContainer.control.get(this.name))) {
|
|
342
|
+
this.resetFilesLoad();
|
|
343
|
+
this.loadFilePreview(Array.isArray(this.value) ? this.value : [this.value]);
|
|
344
|
+
this.updateValidations();
|
|
345
|
+
if (this.value) {
|
|
346
|
+
this.formControl.markAsDirty();
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
this.formControl.markAsPristine();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
resetFilesLoad() {
|
|
354
|
+
if (Array.isArray(this.value)) {
|
|
355
|
+
this.value.forEach(element => {
|
|
356
|
+
if (element) {
|
|
357
|
+
element['loaded'] = false;
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
updateValidations() {
|
|
363
|
+
if (!this.formControl) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
let syncValidators = [];
|
|
367
|
+
if (this.isRequired) {
|
|
368
|
+
syncValidators.push(Validators.required);
|
|
369
|
+
}
|
|
370
|
+
syncValidators.push();
|
|
371
|
+
setTimeout(() => {
|
|
372
|
+
this.formControl.setValidators(syncValidators);
|
|
373
|
+
this.formControl.updateValueAndValidity();
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
destroySubscriptions() {
|
|
377
|
+
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
378
|
+
this.subscriptions = [];
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
NgtDropzoneComponent.decorators = [
|
|
382
|
+
{ type: Component, args: [{
|
|
383
|
+
selector: 'ngt-dropzone',
|
|
384
|
+
template: "<div class=\"flex flex-col h-full w-full\" #container>\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\n {{ label }}:\n\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n </label>\n\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\n <div *ngIf=\"loading\" class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\n <div class=\"div-loader\"></div>\n </div>\n\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\n [disabled]='disabled || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\" #ngxDropzone>\n <ng-container *ngIf=\"!loading\">\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\n {{ placeholder }}\n </ngx-dropzone-label>\n\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\n <div class=\"flex flex-col w-48 mx-4\"\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\n ngProjectAs=\"ngx-dropzone-preview\">\n </custom-dropzone-preview>\n\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-image-preview>\n </div>\n\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-video-preview>\n\n <p *ngIf=\"showFileName\"\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\n {{ resource?.file?.name || '' }}\n </p>\n </div>\n </ng-container>\n </ng-container>\n </ngx-dropzone>\n </div>\n\n <ngt-dropzone-view *ngIf=\"viewMode\" [resources]=\"resources\" class=\"h-full w-full\"></ngt-dropzone-view>\n\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\n </ngt-dropzone-file-viewer>\n\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\n</div>",
|
|
385
|
+
encapsulation: ViewEncapsulation.None,
|
|
386
|
+
providers: [
|
|
387
|
+
NgtMakeProvider(NgtDropzoneComponent),
|
|
388
|
+
],
|
|
389
|
+
viewProviders: [
|
|
390
|
+
{ provide: ControlContainer, useExisting: NgForm }
|
|
391
|
+
],
|
|
392
|
+
styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"]
|
|
393
|
+
},] }
|
|
394
|
+
];
|
|
395
|
+
NgtDropzoneComponent.ctorParameters = () => [
|
|
396
|
+
{ type: ControlContainer, decorators: [{ type: Optional }, { type: Host }] },
|
|
397
|
+
{ type: NgtAttachmentHttpService, decorators: [{ type: Optional }, { type: SkipSelf }] },
|
|
398
|
+
{ type: Injector },
|
|
399
|
+
{ type: ChangeDetectorRef }
|
|
400
|
+
];
|
|
401
|
+
NgtDropzoneComponent.propDecorators = {
|
|
402
|
+
container: [{ type: ViewChild, args: ['container',] }],
|
|
403
|
+
ngxDropzone: [{ type: ViewChild, args: [NgxDropzoneComponent, { static: true },] }],
|
|
404
|
+
ngtDropzoneFileViewer: [{ type: ViewChild, args: [NgtDropzoneFileViewerComponent, { static: true },] }],
|
|
405
|
+
label: [{ type: Input }],
|
|
406
|
+
placeholder: [{ type: Input }],
|
|
407
|
+
helpTextColor: [{ type: Input }],
|
|
408
|
+
helpText: [{ type: Input }],
|
|
409
|
+
helpTitle: [{ type: Input }],
|
|
410
|
+
resources: [{ type: Input }],
|
|
411
|
+
multipleSelection: [{ type: Input }],
|
|
412
|
+
itemsLimit: [{ type: Input }],
|
|
413
|
+
showFileName: [{ type: Input }],
|
|
414
|
+
disableClick: [{ type: Input }],
|
|
415
|
+
disabled: [{ type: Input }],
|
|
416
|
+
viewMode: [{ type: Input }],
|
|
417
|
+
removable: [{ type: Input }],
|
|
418
|
+
canDownloadFile: [{ type: Input }],
|
|
419
|
+
verticalExpandable: [{ type: Input }],
|
|
420
|
+
acceptedFiles: [{ type: Input }],
|
|
421
|
+
maxFileSize: [{ type: Input }],
|
|
422
|
+
previewType: [{ type: Input }],
|
|
423
|
+
isRequired: [{ type: Input }],
|
|
424
|
+
name: [{ type: Input }],
|
|
425
|
+
remoteResource: [{ type: Input }],
|
|
426
|
+
onFileSelected: [{ type: Output }],
|
|
427
|
+
onFileSelectError: [{ type: Output }],
|
|
428
|
+
onFileUploadFail: [{ type: Output }],
|
|
429
|
+
onFileRemoved: [{ type: Output }],
|
|
430
|
+
onFileUploadInit: [{ type: Output }],
|
|
431
|
+
onFileUploaded: [{ type: Output }],
|
|
432
|
+
onFilePreviewLoaded: [{ type: Output }]
|
|
433
|
+
};
|
|
434
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRyb3B6b25lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1kcm9wem9uZS9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFFBQVEsRUFDUixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBMEIsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUU5QixPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM1RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVM5RyxDQUFDO0FBRUYsTUFBTSxDQUFOLElBQVksdUJBTVg7QUFORCxXQUFZLHVCQUF1QjtJQUMvQixz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Q0wsS0FBSzt5QkFDTCxLQUFLO21CQUNMLEtBQUs7NkJBQ0wsS0FBSzs2QkFFTCxNQUFNO2dDQUNOLE1BQU07K0JBQ04sTUFBTTs0QkFDTixNQUFNOytCQUNOLE1BQU07NkJBQ04sTUFBTTtrQ0FDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neERyb3B6b25lQ2hhbmdlRXZlbnQsIE5neERyb3B6b25lQ29tcG9uZW50IH0gZnJvbSAnbmd4LWRyb3B6b25lJztcbmltcG9ydCB7IGZvcmtKb2luLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBWaWV3ZXIgZnJvbSAndmlld2VyanMnO1xuXG5pbXBvcnQgeyBOZ3RCYXNlTmdNb2RlbCwgTmd0TWFrZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vYmFzZS9uZ3QtYmFzZS1uZy1tb2RlbCc7XG5pbXBvcnQgeyBnZXRFbnVtRnJvbVN0cmluZyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bS9lbnVtJztcbmltcG9ydCB7IHV1aWQgfSBmcm9tICcuLi8uLi9oZWxwZXJzL3V1aWQnO1xuaW1wb3J0IHsgTmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtYXR0YWNobWVudC1odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0U3R5bGl6YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZ3Qtc3R5bGl6YWJsZS9uZ3Qtc3R5bGl6YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudCB9IGZyb20gJy4vbmd0LWRyb3B6b25lLWZpbGUtdmlld2VyL25ndC1kcm9wem9uZS1maWxlLXZpZXdlci5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndERyb3B6b25lRmlsZSB7XG4gICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICBwcmV2aWV3VXJsOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsVXJsOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1pbWVUeXBlOiBzdHJpbmc7XG4gICAgZmlsZVNpemU6IGFueTtcbn07XG5cbmV4cG9ydCBlbnVtIE5ndERyb3B6b25lRmlsZVR5cGVFbnVtIHtcbiAgICBET0MgPSAnRE9DJyxcbiAgICBQREYgPSAnUERGJyxcbiAgICBYTFMgPSAnWExTJyxcbiAgICBEV0cgPSAnRFdHJyxcbiAgICBPVEhFUiA9ICdPVEhFUidcbn1cblxuZXhwb3J0IGVudW0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSB7XG4gICAgREVGQVVMVCA9ICdERUZBVUxUJyxcbiAgICBJTUFHRSA9ICdJTUFHRScsXG4gICAgVklERU8gPSAnVklERU8nXG59XG5cbmV4cG9ydCBlbnVtIE5ndERyb3B6b25lRXJyb3JUeXBlIHtcbiAgICBERUZBVUxUID0gJ0RFRkFVTFQnLFxuICAgIFNJWkUgPSAnU0laRScsXG4gICAgTk9fTVVMVElQTEUgPSAnTk9fTVVMVElQTEUnLFxuICAgIElURU1TX0xJTUlUID0gJ0lURU1TX0xJTUlUJyxcbiAgICBUWVBFID0gJ1RZUEUnXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0LWRyb3B6b25lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRyb3B6b25lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LmNzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE5ndE1ha2VQcm92aWRlcihOZ3REcm9wem9uZUNvbXBvbmVudCksXG4gICAgXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3REcm9wem9uZUNvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudENoZWNrZWQge1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHB1YmxpYyBjb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChOZ3hEcm9wem9uZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5neERyb3B6b25lOiBOZ3hEcm9wem9uZUNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5ndERyb3B6b25lRmlsZVZpZXdlcjogTmd0RHJvcHpvbmVGaWxlVmlld2VyQ29tcG9uZW50O1xuXG4gICAgLy8gVmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xuXG4gICAgLy8gQmVoYXZpb3JcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVzb3VyY2VzOiBBcnJheTxOZ3REcm9wem9uZUZpbGU+ID0gW107XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpcGxlU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGltaXQ6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpbGVOYW1lOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB2aWV3TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FuRG93bmxvYWRGaWxlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmVydGljYWxFeHBhbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGFjY2VwdGVkRmlsZXM6IHN0cmluZyA9ICcqJyAvKiogTWltZSB0eXBlICovO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhGaWxlU2l6ZTogbnVtYmVyOyAvKiogQnl0ZXMgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcHJldmlld1R5cGU6IE5ndERyb3B6b25lUHJldmlld1R5cGUgPSBOZ3REcm9wem9uZVByZXZpZXdUeXBlLkRFRkFVTFQ7XG4gICAgQElucHV0KCkgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVTZWxlY3RlZDogRXZlbnRFbWl0dGVyPE5neERyb3B6b25lQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlU2VsZWN0RXJyb3I6IEV2ZW50RW1pdHRlcjxOZ3REcm9wem9uZUVycm9yVHlwZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRGYWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRJbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlVXBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVQcmV2aWV3TG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGRyb3B6b25lSGVpZ2h0OiBzdHJpbmcgPSAnMTgwcHgnO1xuICAgIHB1YmxpYyB1cGxvYWRlZFJlc291cmNlcyA9IFtdO1xuICAgIHB1YmxpYyBmb3JjZURpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBuYXRpdmVWYWx1ZSA9IFtdO1xuICAgIHB1YmxpYyBzaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5ID0gZmFsc2U7XG4gICAgcHVibGljIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbmd0RHJvcHpvbmVMb2FkZXJTdHlsZTogTmd0U3R5bGl6YWJsZVNlcnZpY2U7XG4gICAgcHVibGljIG5neEVsZW1lbnRJZDogc3RyaW5nID0gdXVpZCgpO1xuICAgIHB1YmxpYyBpbWFnZVZpZXdlck9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgbmF2YmFyOiB0cnVlLFxuICAgICAgICB0b29sYmFyOiB7XG4gICAgICAgICAgICB6b29tSW46IHRydWUsXG4gICAgICAgICAgICB6b29tT3V0OiB0cnVlLFxuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgICAgICByb3RhdGVMZWZ0OiB0cnVlLFxuICAgICAgICAgICAgcm90YXRlUmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBwcmV2OiB0cnVlLFxuICAgICAgICAgICAgbmV4dDogdHJ1ZSxcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKVxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RBdHRhY2htZW50SHR0cFNlcnZpY2U6IE5ndEF0dGFjaG1lbnRIdHRwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVMb2FkZXJTdHlsZSA9IG5ldyBOZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuXG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVMb2FkZXJTdHlsZS5sb2FkKHRoaXMuaW5qZWN0b3IsICdOZ3REcm9wem9uZUxvYWRlcicsIHtcbiAgICAgICAgICAgIGg6ICdoLTgnLFxuICAgICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgICAgICB0ZXh0OiAndGV4dC1ncmF5LTYwMCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMucHJldmlld1R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlld1R5cGUgPSBnZXRFbnVtRnJvbVN0cmluZyhjaGFuZ2VzLnByZXZpZXdUeXBlLmN1cnJlbnRWYWx1ZSwgTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wem9uZUhlaWdodCA9IGAke3RoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW1hZ2VQcmV2aWV3KGluZGV4KSB7XG4gICAgICAgIGNvbnN0IGltYWdlcyA9IHRoaXMudXBsb2FkZWRSZXNvdXJjZXMuZmlsdGVyKChyZXNvdXJjZSkgPT4gdGhpcy5pc0ltYWdlKHJlc291cmNlKSk7XG4gICAgICAgIGNvbnN0IGltYWdlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgICAgaW1hZ2VzLmZvckVhY2goKGltYWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgaW1hZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblxuICAgICAgICAgICAgaW1hZ2VFbGVtZW50LnNyYyA9IGltYWdlLmZpbGUudXJsO1xuXG4gICAgICAgICAgICBpbWFnZXNEaXYuYXBwZW5kQ2hpbGQoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbkltYWdlQ2xpY2soaW1hZ2VzRGl2LCBpbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW1hZ2VDbGljayhlbGVtZW50LCBpbmRleD8pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcmNlRGlzYWJsZUNsaWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ndERyb3B6b25lQ29tcG9uZW50ID0gdGhpcztcblxuICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zID0geyAuLi50aGlzLmltYWdlVmlld2VyT3B0aW9ucywgLi4ueyBpbml0aWFsVmlld0luZGV4OiBpbmRleCB9IH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aWV3ZXIgPSBuZXcgVmlld2VyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zLCAuLi57XG4gICAgICAgICAgICAgICAgaGlkZGVuKCkge1xuICAgICAgICAgICAgICAgICAgICBuZ3REcm9wem9uZUNvbXBvbmVudC5mb3JjZURpc2FibGVDbGljayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlld2VyLnNob3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWxlQ2xpY2sodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZm9yY2VEaXNhYmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLmZpbGVOYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIuZmlsZVNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci5pbml0KCk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIub25DbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcmNlRGlzYWJsZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25TZWxlY3QoZXZlbnQ6IE5neERyb3B6b25lQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlamVjdGVkRmlsZSBvZiA8YW55PmV2ZW50LnJlamVjdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVqZWN0ZWRGaWxlLnJlYXNvbiA9PSAnc2l6ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlNJWkUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ25vX211bHRpcGxlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuTk9fTVVMVElQTEUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5UWVBFKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLkRFRkFVTFQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0ID09IDEgJiYgZXZlbnQuYWRkZWRGaWxlc1xuICAgICAgICAgICAgICAgICYmIGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoID09IHRoaXMuaXRlbXNMaW1pdCAmJiB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmxlbmd0aCA9PSB0aGlzLml0ZW1zTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudC5hZGRlZEZpbGVzXG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuYWRkZWRGaWxlcy5sZW5ndGggKyB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmxlbmd0aCA8PSB0aGlzLml0ZW1zTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoZXZlbnQuYWRkZWRGaWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5JVEVNU19MSU1JVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlcyhldmVudC5hZGRlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRGaWxlcyhmaWxlczogQXJyYXk8RmlsZT4pIHtcbiAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHRlbXBvcmFyeUZpbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGVtcG9yYXJ5QXR0YWNobWVudHMgPSBbXTtcbiAgICAgICAgICAgIGxldCBvYnNlcnZhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRJbml0LmVtaXQoKTtcblxuICAgICAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKHRoaXMubmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLnVwbG9hZCh0aGlzLnJlbW90ZVJlc291cmNlLCBmaWxlKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcyAmJiByZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlWyd1cmwnXSA9IHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcy5kYXRhLnVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlGaWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGFbJ2xvYWRlZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlBdHRhY2htZW50cy5wdXNoKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5wdXNoKC4uLnRlbXBvcmFyeUZpbGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMaW1pdCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHMsIC4uLnRoaXMubmF0aXZlVmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVVwbG9hZEZhaWwuZW1pdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZEZpbGVQcmV2aWV3KGF0dGFjaG1lbnRzOiBhbnkpIHtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRzICYmIGF0dGFjaG1lbnRzLmxlbmd0aCAmJiBhdHRhY2htZW50c1swXSkge1xuICAgICAgICAgICAgbGV0IHRlbXBvcmFyeVJlc291cmNlID0gW107XG4gICAgICAgICAgICBsZXQgb2JzZXJ2YWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgRmlsZSkgJiYgIWF0dGFjaG1lbnQubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRbJ2xvYWRlZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZXMucHVzaCh0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS50aHVtYm5haWwoYXR0YWNobWVudCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeVJlc291cmNlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcmVzcG9uc2UuZGF0YS5nZXRBcGlJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiByZXNwb25zZS5kYXRhLmdldEF0dHJpYnV0ZSgnZmlsZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLnB1c2goLi4udGVtcG9yYXJ5UmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShhdHRhY2htZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVByZXZpZXdMb2FkZWQuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVtb3ZlKHJlc291cmNlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5zcGxpY2UodGhpcy51cGxvYWRlZFJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKSwgMSk7XG4gICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB0aGlzLm5hdGl2ZVZhbHVlLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaWQgIT0gcmVzb3VyY2UuaWQpO1xuICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKHRoaXMubmF0aXZlVmFsdWUpO1xuICAgICAgICB0aGlzLm9uRmlsZVJlbW92ZWQuZW1pdChyZXNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW1hZ2UocmVzb3VyY2U6IGFueSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aWV3VHlwZSA9PSAnSU1BR0UnXG4gICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UuZmlsZSAmJiByZXNvdXJjZS5maWxlLnR5cGVcbiAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJylcbiAgICAgICAgICAgICAgICAmJiAhcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdkd2cnKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWaWRlbyhyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpZXdUeXBlID09ICdWSURFTycgfHwgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygndmlkZW8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXVkaW8ocmVzb3VyY2U6IGFueSkge1xuICAgICAgICByZXR1cm4gKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygnYXVkaW8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmlsZShyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0ltYWdlKHJlc291cmNlKSAmJiAhdGhpcy5pc0F1ZGlvKHJlc291cmNlKSAmJiAhdGhpcy5pc1ZpZGVvKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkRmlsZVNpemUocmVzb3VyY2U6IGFueSkge1xuICAgICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCBzaXplID0gcmVzb3VyY2Uuc2l6ZSB8fCByZXNvdXJjZS5maWxlU2l6ZTtcblxuICAgICAgICAgICAgaWYgKCFzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSByZXNvdXJjZS5maWxlLnNpemU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzaXplKSA+IDEwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlRmxvYXQoc2l6ZSkgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNYic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoc2l6ZSkgLyAxMDAwKSArICcgS2InO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KHRoaXMubmF0aXZlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubmF0aXZlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVhZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRGaWxlUHJldmlldyhBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQ6IGFueSkge1xuICAgICAgICB0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5kb3dubG9hZChhdHRhY2htZW50KS5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuRmlsZVNlbGVjdG9yKCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5neEVsZW1lbnRJZCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDb21wb25lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdUeXBlID0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZS5ERUZBVUxUO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtQ29udGFpbmVyICYmIHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sXG4gICAgICAgICAgICAmJiAodGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVzTG9hZCgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkRmlsZVByZXZpZXcoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEZpbGVzTG9hZCgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50Wydsb2FkZWQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGF0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3luY1ZhbGlkYXRvcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG59XG4iXX0=
|