ng-tailwind 6.3.0 → 6.4.1
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/components/ngt-multi-select/ngt-multi-select.component.d.ts +2 -1
- package/fesm2022/ng-tailwind.mjs +361 -346
- package/fesm2022/ng-tailwind.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/animations/ngt-angular-animations.mjs +0 -34
- package/esm2022/base/ngt-base-ng-model.mjs +0 -90
- package/esm2022/components/ngt-action/ngt-action.component.mjs +0 -96
- package/esm2022/components/ngt-action/ngt-action.module.mjs +0 -28
- package/esm2022/components/ngt-button/ngt-button.component.mjs +0 -142
- package/esm2022/components/ngt-button/ngt-button.module.mjs +0 -28
- package/esm2022/components/ngt-checkbox/ngt-checkbox.component.mjs +0 -192
- package/esm2022/components/ngt-checkbox/ngt-checkbox.module.mjs +0 -28
- package/esm2022/components/ngt-content/ngt-content.component.mjs +0 -32
- package/esm2022/components/ngt-content/ngt-content.module.mjs +0 -20
- package/esm2022/components/ngt-context-menu/ngt-context-menu.component.mjs +0 -25
- package/esm2022/components/ngt-context-menu/ngt-context-menu.directive.mjs +0 -89
- package/esm2022/components/ngt-context-menu/ngt-context-menu.module.mjs +0 -33
- package/esm2022/components/ngt-datatable/ngt-datatable.component.mjs +0 -472
- package/esm2022/components/ngt-datatable/ngt-datatable.module.mjs +0 -99
- package/esm2022/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +0 -57
- package/esm2022/components/ngt-datatable/ngt-td/ngt-td.component.mjs +0 -62
- package/esm2022/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +0 -113
- package/esm2022/components/ngt-datatable/ngt-th/ngt-th.component.mjs +0 -228
- package/esm2022/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +0 -127
- package/esm2022/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +0 -55
- package/esm2022/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +0 -86
- package/esm2022/components/ngt-date/ngt-date.component.mjs +0 -435
- package/esm2022/components/ngt-date/ngt-date.module.mjs +0 -40
- package/esm2022/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +0 -19
- package/esm2022/components/ngt-dropdown/ngt-dropdown.component.mjs +0 -205
- package/esm2022/components/ngt-dropdown/ngt-dropdown.module.mjs +0 -21
- package/esm2022/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +0 -54
- package/esm2022/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +0 -66
- package/esm2022/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +0 -94
- package/esm2022/components/ngt-dropzone/ngt-dropzone.component.mjs +0 -496
- package/esm2022/components/ngt-dropzone/ngt-dropzone.meta.mjs +0 -24
- package/esm2022/components/ngt-dropzone/ngt-dropzone.module.mjs +0 -55
- package/esm2022/components/ngt-floating-button/ngt-floating-button.component.mjs +0 -119
- package/esm2022/components/ngt-floating-button/ngt-floating-button.module.mjs +0 -28
- package/esm2022/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +0 -22
- package/esm2022/components/ngt-form/ngt-form.component.mjs +0 -207
- package/esm2022/components/ngt-form/ngt-form.module.mjs +0 -29
- package/esm2022/components/ngt-header-nav/ngt-header-nav.component.mjs +0 -39
- package/esm2022/components/ngt-header-nav/ngt-header-nav.module.mjs +0 -20
- package/esm2022/components/ngt-helper/ngt-helper.component.mjs +0 -69
- package/esm2022/components/ngt-helper/ngt-helper.module.mjs +0 -28
- package/esm2022/components/ngt-input/ngt-input.component.mjs +0 -844
- package/esm2022/components/ngt-input/ngt-input.module.mjs +0 -47
- package/esm2022/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +0 -46
- package/esm2022/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +0 -33
- package/esm2022/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +0 -40
- package/esm2022/components/ngt-modal/ngt-modal.component.mjs +0 -122
- package/esm2022/components/ngt-modal/ngt-modal.module.mjs +0 -39
- package/esm2022/components/ngt-multi-select/ngt-multi-select.component.mjs +0 -503
- package/esm2022/components/ngt-multi-select/ngt-multi-select.module.mjs +0 -52
- package/esm2022/components/ngt-pagination/ngt-pagination.component.mjs +0 -162
- package/esm2022/components/ngt-pagination/ngt-pagination.module.mjs +0 -36
- package/esm2022/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +0 -59
- package/esm2022/components/ngt-popover/ngt-popover.component.mjs +0 -85
- package/esm2022/components/ngt-popover/ngt-popover.directive.mjs +0 -130
- package/esm2022/components/ngt-popover/ngt-popover.module.mjs +0 -36
- package/esm2022/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +0 -34
- package/esm2022/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +0 -35
- package/esm2022/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +0 -57
- package/esm2022/components/ngt-portlet/ngt-portlet.component.mjs +0 -74
- package/esm2022/components/ngt-portlet/ngt-portlet.module.mjs +0 -47
- package/esm2022/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +0 -19
- package/esm2022/components/ngt-radio-button/ngt-radio-button.component.mjs +0 -153
- package/esm2022/components/ngt-radio-button/ngt-radio-button.module.mjs +0 -29
- package/esm2022/components/ngt-section/ngt-section.component.mjs +0 -151
- package/esm2022/components/ngt-section/ngt-section.module.mjs +0 -32
- package/esm2022/components/ngt-select/ngt-select.component.mjs +0 -670
- package/esm2022/components/ngt-select/ngt-select.directive.mjs +0 -36
- package/esm2022/components/ngt-select/ngt-select.module.mjs +0 -65
- package/esm2022/components/ngt-shining/ngt-shining.component.mjs +0 -40
- package/esm2022/components/ngt-shining/ngt-shining.module.mjs +0 -20
- package/esm2022/components/ngt-sidenav/ngt-sidenav.component.mjs +0 -132
- package/esm2022/components/ngt-sidenav/ngt-sidenav.module.mjs +0 -20
- package/esm2022/components/ngt-slider/ngt-slider.component.mjs +0 -100
- package/esm2022/components/ngt-slider/ngt-slider.module.mjs +0 -24
- package/esm2022/components/ngt-svg/ngt-svg.component.mjs +0 -53
- package/esm2022/components/ngt-svg/ngt-svg.module.mjs +0 -24
- package/esm2022/components/ngt-tag/ngt-tag.component.mjs +0 -37
- package/esm2022/components/ngt-tag/ngt-tag.module.mjs +0 -24
- package/esm2022/components/ngt-textarea/ngt-textarea.component.mjs +0 -238
- package/esm2022/components/ngt-textarea/ngt-textarea.module.mjs +0 -43
- package/esm2022/components/ngt-validation/ngt-validation.component.mjs +0 -26
- package/esm2022/components/ngt-validation/ngt-validation.module.mjs +0 -20
- package/esm2022/directives/ngt-stylizable/ngt-stylizable.directive.mjs +0 -299
- package/esm2022/directives/ngt-stylizable/ngt-stylizable.module.mjs +0 -20
- package/esm2022/enums/size.enum.mjs +0 -11
- package/esm2022/helpers/enum/enum.mjs +0 -7
- package/esm2022/helpers/form/form.mjs +0 -14
- package/esm2022/helpers/input-mask/input-mask.helper.mjs +0 -26
- package/esm2022/helpers/promise/promise-helper.mjs +0 -4
- package/esm2022/helpers/routing/route.mjs +0 -11
- package/esm2022/helpers/uuid.mjs +0 -10
- package/esm2022/ng-tailwind.mjs +0 -5
- package/esm2022/public-api.mjs +0 -127
- package/esm2022/services/http/ngt-attachment-http.service.mjs +0 -3
- package/esm2022/services/http/ngt-http-form.service.mjs +0 -3
- package/esm2022/services/http/ngt-http-resource.service.mjs +0 -3
- package/esm2022/services/http/ngt-http-validation.service.mjs +0 -3
- package/esm2022/services/http/ngt-http.service.mjs +0 -3
- package/esm2022/services/http/ngt-translate.service.mjs +0 -3
- package/esm2022/services/ngt-stylizable/ngt-stylizable.service.mjs +0 -279
- package/esm2022/services/validation/ngt-ability-validation.service.mjs +0 -3
|
@@ -1,496 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Host, Input, Optional, Output, SkipSelf, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { ControlContainer, NgForm, Validators } from '@angular/forms';
|
|
3
|
-
import { NgxDropzoneComponent } from 'ngx-dropzone';
|
|
4
|
-
import { forkJoin } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import Viewer from 'viewerjs';
|
|
7
|
-
import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
|
|
8
|
-
import { getEnumFromString } from '../../helpers/enum/enum';
|
|
9
|
-
import { uuid } from '../../helpers/uuid';
|
|
10
|
-
import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
|
|
11
|
-
import { NgtDropzoneFileViewerComponent } from './ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component';
|
|
12
|
-
import { NgtDropzoneErrorType, NgtDropzonePreviewType } from './ngt-dropzone.meta';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/forms";
|
|
15
|
-
import * as i2 from "../../services/http/ngt-attachment-http.service";
|
|
16
|
-
import * as i3 from "../ngt-form/ngt-form.component";
|
|
17
|
-
import * as i4 from "../ngt-section/ngt-section.component";
|
|
18
|
-
import * as i5 from "../ngt-modal/ngt-modal.component";
|
|
19
|
-
import * as i6 from "@angular/common";
|
|
20
|
-
import * as i7 from "../ngt-validation/ngt-validation.component";
|
|
21
|
-
import * as i8 from "ngx-dropzone";
|
|
22
|
-
import * as i9 from "../ngt-helper/ngt-helper.component";
|
|
23
|
-
import * as i10 from "./ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component";
|
|
24
|
-
import * as i11 from "./ngt-dropzone-view/ngt-dropzone-view.component";
|
|
25
|
-
import * as i12 from "./custom-dropzone-preview/custom-dropzone-preview.component";
|
|
26
|
-
export class NgtDropzoneComponent extends NgtBaseNgModel {
|
|
27
|
-
;
|
|
28
|
-
;
|
|
29
|
-
constructor(formContainer, injector, changeDetector, ngtAttachmentHttpService, ngtForm, ngtSection, ngtModal) {
|
|
30
|
-
super();
|
|
31
|
-
this.formContainer = formContainer;
|
|
32
|
-
this.injector = injector;
|
|
33
|
-
this.changeDetector = changeDetector;
|
|
34
|
-
this.ngtAttachmentHttpService = ngtAttachmentHttpService;
|
|
35
|
-
this.ngtForm = ngtForm;
|
|
36
|
-
this.ngtSection = ngtSection;
|
|
37
|
-
this.ngtModal = ngtModal;
|
|
38
|
-
this.helpTextColor = 'text-green-500';
|
|
39
|
-
// Behavior
|
|
40
|
-
this.resources = [];
|
|
41
|
-
this.multipleSelection = false;
|
|
42
|
-
this.showFileName = false;
|
|
43
|
-
this.disableClick = false;
|
|
44
|
-
this.disabled = false;
|
|
45
|
-
this.viewMode = false;
|
|
46
|
-
this.removable = false;
|
|
47
|
-
this.canDownloadFile = true;
|
|
48
|
-
this.verticalExpandable = false;
|
|
49
|
-
this.acceptedFiles = '*' /** Mime type */;
|
|
50
|
-
this.previewType = NgtDropzonePreviewType.DEFAULT;
|
|
51
|
-
this.onFileSelected = new EventEmitter();
|
|
52
|
-
this.onFileSelectError = new EventEmitter();
|
|
53
|
-
this.onFileUploadFail = new EventEmitter();
|
|
54
|
-
this.onFileRemoved = new EventEmitter();
|
|
55
|
-
this.onFileUploadInit = new EventEmitter();
|
|
56
|
-
this.onFileUploaded = new EventEmitter();
|
|
57
|
-
this.onFilePreviewLoaded = new EventEmitter();
|
|
58
|
-
this.dropzoneHeight = '180px';
|
|
59
|
-
this.uploadedResources = [];
|
|
60
|
-
this.forceDisableClick = false;
|
|
61
|
-
this.nativeValue = [];
|
|
62
|
-
this.showNgtDropzoneFileViewer = false;
|
|
63
|
-
this.componentReady = false;
|
|
64
|
-
this.loading = false;
|
|
65
|
-
this.ngxElementId = uuid();
|
|
66
|
-
this.imageViewerOptions = {
|
|
67
|
-
navbar: true,
|
|
68
|
-
toolbar: {
|
|
69
|
-
zoomIn: true,
|
|
70
|
-
zoomOut: true,
|
|
71
|
-
reset: true,
|
|
72
|
-
rotateLeft: true,
|
|
73
|
-
rotateRight: true,
|
|
74
|
-
prev: true,
|
|
75
|
-
next: true,
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
this.subscriptions = [];
|
|
79
|
-
this.ngtDropzoneLoaderStyle = new NgtStylizableService();
|
|
80
|
-
this.ngtDropzoneLoaderStyle.load(this.injector, 'NgtDropzoneLoader', {
|
|
81
|
-
h: 'h-8',
|
|
82
|
-
color: {
|
|
83
|
-
text: 'text-gray-600'
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
ngOnChanges(changes) {
|
|
88
|
-
if (changes.previewType) {
|
|
89
|
-
this.previewType = getEnumFromString(changes.previewType.currentValue, NgtDropzonePreviewType);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
ngAfterContentChecked() {
|
|
93
|
-
if (this.container && this.container.nativeElement) {
|
|
94
|
-
this.dropzoneHeight = `${this.container.nativeElement.parentElement.offsetHeight}px`;
|
|
95
|
-
this.changeDetector.detectChanges();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
ngOnInit() {
|
|
99
|
-
setTimeout(() => {
|
|
100
|
-
this.componentReady = true;
|
|
101
|
-
setTimeout(() => {
|
|
102
|
-
this.initComponent();
|
|
103
|
-
});
|
|
104
|
-
}, 500);
|
|
105
|
-
}
|
|
106
|
-
ngOnDestroy() {
|
|
107
|
-
this.destroySubscriptions();
|
|
108
|
-
}
|
|
109
|
-
imagePreview(index) {
|
|
110
|
-
const images = this.uploadedResources.filter((resource) => this.isImage(resource));
|
|
111
|
-
const imagesDiv = document.createElement("div");
|
|
112
|
-
images.forEach((image) => {
|
|
113
|
-
let imageElement = document.createElement("img");
|
|
114
|
-
imageElement.src = image.file.url;
|
|
115
|
-
imagesDiv.appendChild(imageElement);
|
|
116
|
-
});
|
|
117
|
-
this.onImageClick(imagesDiv, index);
|
|
118
|
-
}
|
|
119
|
-
onImageClick(element, index) {
|
|
120
|
-
if (!this.viewMode) {
|
|
121
|
-
this.forceDisableClick = true;
|
|
122
|
-
}
|
|
123
|
-
const ngtDropzoneComponent = this;
|
|
124
|
-
if (index !== null && index !== undefined) {
|
|
125
|
-
this.imageViewerOptions = { ...this.imageViewerOptions, ...{ initialViewIndex: index } };
|
|
126
|
-
}
|
|
127
|
-
const viewer = new Viewer(element, {
|
|
128
|
-
...this.imageViewerOptions, ...{
|
|
129
|
-
hidden() {
|
|
130
|
-
ngtDropzoneComponent.forceDisableClick = false;
|
|
131
|
-
viewer.destroy();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
viewer.show();
|
|
136
|
-
}
|
|
137
|
-
onFileClick(url, name, size) {
|
|
138
|
-
this.forceDisableClick = true;
|
|
139
|
-
this.showNgtDropzoneFileViewer = true;
|
|
140
|
-
this.ngtDropzoneFileViewer.url = url;
|
|
141
|
-
this.ngtDropzoneFileViewer.fileName = name;
|
|
142
|
-
this.ngtDropzoneFileViewer.fileSize = size;
|
|
143
|
-
this.ngtDropzoneFileViewer.init();
|
|
144
|
-
this.subscriptions.push(this.ngtDropzoneFileViewer.onClose.subscribe(() => {
|
|
145
|
-
this.showNgtDropzoneFileViewer = false;
|
|
146
|
-
this.forceDisableClick = false;
|
|
147
|
-
}));
|
|
148
|
-
}
|
|
149
|
-
async onSelect(event) {
|
|
150
|
-
if (event.rejectedFiles.length) {
|
|
151
|
-
for (const rejectedFile of event.rejectedFiles) {
|
|
152
|
-
if (rejectedFile.reason == 'size') {
|
|
153
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.SIZE);
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
else if (rejectedFile.reason == 'no_multiple') {
|
|
157
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.NO_MULTIPLE);
|
|
158
|
-
break;
|
|
159
|
-
}
|
|
160
|
-
else if (rejectedFile.reason == 'type') {
|
|
161
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.DEFAULT);
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (this.itemsLimit) {
|
|
171
|
-
if (this.itemsLimit == 1 && event.addedFiles
|
|
172
|
-
&& event.addedFiles.length == this.itemsLimit && this.uploadedResources.length == this.itemsLimit) {
|
|
173
|
-
this.uploadedResources = [];
|
|
174
|
-
}
|
|
175
|
-
if (event.addedFiles
|
|
176
|
-
&& event.addedFiles.length + this.uploadedResources.length <= this.itemsLimit) {
|
|
177
|
-
this.onFileSelected.emit(event);
|
|
178
|
-
this.uploadFiles(event.addedFiles);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.ITEMS_LIMIT);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
this.onFileSelected.emit(event);
|
|
186
|
-
this.uploadFiles(event.addedFiles);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
async uploadFiles(files) {
|
|
190
|
-
if (files && files.length) {
|
|
191
|
-
const temporaryFiles = [];
|
|
192
|
-
const temporaryAttachments = [];
|
|
193
|
-
const observables = [];
|
|
194
|
-
const unacceptedFiles = [];
|
|
195
|
-
this.loading = true;
|
|
196
|
-
this.onFileUploadInit.emit();
|
|
197
|
-
files.forEach(file => {
|
|
198
|
-
if (file.type.includes(this.unacceptedFiles)) {
|
|
199
|
-
return unacceptedFiles.push(file);
|
|
200
|
-
}
|
|
201
|
-
observables.push(this.ngtAttachmentHttpService.upload(this.remoteResource, file).pipe(map((response) => {
|
|
202
|
-
if (response && response.data) {
|
|
203
|
-
if (response.data.attributes && response.data.attributes.data) {
|
|
204
|
-
file['url'] = response.data.attributes.data.url;
|
|
205
|
-
}
|
|
206
|
-
temporaryFiles.push({
|
|
207
|
-
id: response.data.id,
|
|
208
|
-
size: file.size,
|
|
209
|
-
file: file
|
|
210
|
-
});
|
|
211
|
-
response.data['loaded'] = true;
|
|
212
|
-
temporaryAttachments.push(response.data);
|
|
213
|
-
}
|
|
214
|
-
})));
|
|
215
|
-
});
|
|
216
|
-
if (!observables.length && unacceptedFiles.length) {
|
|
217
|
-
this.loading = false;
|
|
218
|
-
return this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
|
|
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
|
-
if (unacceptedFiles.length) {
|
|
231
|
-
this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
|
|
232
|
-
}
|
|
233
|
-
setTimeout(() => this.changeDetector.detectChanges(), 500);
|
|
234
|
-
}, (error) => {
|
|
235
|
-
this.onFileUploadFail.emit(error);
|
|
236
|
-
this.loading = false;
|
|
237
|
-
setTimeout(() => this.changeDetector.detectChanges(), 500);
|
|
238
|
-
}));
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
async loadFilePreview(attachments) {
|
|
242
|
-
if (attachments && attachments.length && attachments[0]) {
|
|
243
|
-
let temporaryResource = [];
|
|
244
|
-
let observables = [];
|
|
245
|
-
attachments.forEach((attachment) => {
|
|
246
|
-
if (!(attachment instanceof File) && !attachment.loaded) {
|
|
247
|
-
this.loading = true;
|
|
248
|
-
attachment['loaded'] = true;
|
|
249
|
-
observables.push(this.ngtAttachmentHttpService.preview(attachment)
|
|
250
|
-
.pipe(map((response) => {
|
|
251
|
-
temporaryResource.push({
|
|
252
|
-
id: response.data.getApiId(),
|
|
253
|
-
file: response.data.getAttribute('file')
|
|
254
|
-
});
|
|
255
|
-
})));
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
this.subscriptions.push(forkJoin(observables).subscribe((response) => {
|
|
259
|
-
this.uploadedResources.push(...temporaryResource);
|
|
260
|
-
this.onNativeChange(attachments);
|
|
261
|
-
this.onFilePreviewLoaded.emit();
|
|
262
|
-
this.loading = false;
|
|
263
|
-
setTimeout(() => this.changeDetector.detectChanges(), 500);
|
|
264
|
-
}, (error) => {
|
|
265
|
-
this.loading = false;
|
|
266
|
-
}));
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
onRemove(resource) {
|
|
270
|
-
this.uploadedResources.splice(this.uploadedResources.indexOf(resource), 1);
|
|
271
|
-
this.nativeValue = this.nativeValue.filter(element => element.id != resource.id);
|
|
272
|
-
this.onNativeChange(this.nativeValue);
|
|
273
|
-
this.onFileRemoved.emit(resource);
|
|
274
|
-
}
|
|
275
|
-
isImage(resource) {
|
|
276
|
-
return this.previewType == 'IMAGE'
|
|
277
|
-
|| (resource.file?.type
|
|
278
|
-
&& resource.file.type.includes('image')
|
|
279
|
-
&& !resource.file.type.includes('dwg'));
|
|
280
|
-
}
|
|
281
|
-
isVideo(resource) {
|
|
282
|
-
return this.previewType == 'VIDEO' || (resource.file && resource.file.type && resource.file.type.includes('video'));
|
|
283
|
-
}
|
|
284
|
-
isAudio(resource) {
|
|
285
|
-
return (resource.file && resource.file.type && resource.file.type.includes('audio'));
|
|
286
|
-
}
|
|
287
|
-
isFile(resource) {
|
|
288
|
-
return !this.isImage(resource) && !this.isAudio(resource) && !this.isVideo(resource);
|
|
289
|
-
}
|
|
290
|
-
getFormattedFileSize(resource) {
|
|
291
|
-
if (resource) {
|
|
292
|
-
let size = resource.size || resource.fileSize;
|
|
293
|
-
if (!size) {
|
|
294
|
-
if (resource.file && resource.file.size) {
|
|
295
|
-
size = resource.file.size;
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
size = 0;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
if (parseFloat(size) > 1000000) {
|
|
302
|
-
return (parseFloat(size) / 1000000).toFixed(2) + ' Mb';
|
|
303
|
-
}
|
|
304
|
-
return Math.round(parseFloat(size) / 1000) + ' Kb';
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
onNativeChange(value) {
|
|
308
|
-
if (value === undefined) {
|
|
309
|
-
this.value = [];
|
|
310
|
-
this.nativeValue = [];
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
this.nativeValue = value;
|
|
314
|
-
if (JSON.stringify(this.value) != JSON.stringify(this.nativeValue)) {
|
|
315
|
-
this.value = this.nativeValue;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
change(value) {
|
|
320
|
-
if (value && !this.viewMode) {
|
|
321
|
-
this.onNativeChange(Array.isArray(value) ? value : [value]);
|
|
322
|
-
if (this.componentReady) {
|
|
323
|
-
this.loadFilePreview(Array.isArray(value) ? value : [value]);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
downloadFile(attachment) {
|
|
328
|
-
this.ngtAttachmentHttpService.download(attachment).subscribe(() => { });
|
|
329
|
-
}
|
|
330
|
-
reset() {
|
|
331
|
-
this.uploadedResources = [];
|
|
332
|
-
this.value = [];
|
|
333
|
-
this.nativeValue = [];
|
|
334
|
-
this.initComponent();
|
|
335
|
-
}
|
|
336
|
-
openFileSelector() {
|
|
337
|
-
document.getElementById(this.ngxElementId).click();
|
|
338
|
-
}
|
|
339
|
-
isDisabled() {
|
|
340
|
-
return this.disabled || this.isDisabledByParent();
|
|
341
|
-
}
|
|
342
|
-
initComponent() {
|
|
343
|
-
if (this.viewMode) {
|
|
344
|
-
this.previewType = NgtDropzonePreviewType.DEFAULT;
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
if (this.formContainer && this.formContainer.control
|
|
348
|
-
&& (this.formControl = this.formContainer.control.get(this.name))) {
|
|
349
|
-
this.resetFilesLoad();
|
|
350
|
-
this.loadFilePreview(Array.isArray(this.value) ? this.value : [this.value]);
|
|
351
|
-
this.updateValidations();
|
|
352
|
-
if (this.value) {
|
|
353
|
-
this.formControl.markAsDirty();
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
this.formControl.markAsPristine();
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
resetFilesLoad() {
|
|
361
|
-
if (Array.isArray(this.value)) {
|
|
362
|
-
this.value.forEach(element => {
|
|
363
|
-
if (element) {
|
|
364
|
-
element['loaded'] = false;
|
|
365
|
-
}
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
updateValidations() {
|
|
370
|
-
if (!this.formControl) {
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
let syncValidators = [];
|
|
374
|
-
if (this.isRequired) {
|
|
375
|
-
syncValidators.push(Validators.required);
|
|
376
|
-
}
|
|
377
|
-
syncValidators.push();
|
|
378
|
-
setTimeout(() => {
|
|
379
|
-
this.formControl.setValidators(syncValidators);
|
|
380
|
-
this.formControl.updateValueAndValidity();
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
isDisabledByParent() {
|
|
384
|
-
return this.ngtForm?.isDisabled
|
|
385
|
-
|| this.ngtSection?.isDisabled
|
|
386
|
-
|| this.ngtModal?.isDisabled;
|
|
387
|
-
}
|
|
388
|
-
destroySubscriptions() {
|
|
389
|
-
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
390
|
-
this.subscriptions = [];
|
|
391
|
-
}
|
|
392
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgtDropzoneComponent, deps: [{ token: i1.ControlContainer, host: true, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i2.NgtAttachmentHttpService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtSectionComponent, optional: true, skipSelf: true }, { token: i5.NgtModalComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
393
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgtDropzoneComponent, selector: "ngt-dropzone", inputs: { label: "label", placeholder: "placeholder", helpTextColor: "helpTextColor", helpText: "helpText", helpTitle: "helpTitle", resources: "resources", multipleSelection: "multipleSelection", itemsLimit: "itemsLimit", showFileName: "showFileName", disableClick: "disableClick", disabled: "disabled", viewMode: "viewMode", removable: "removable", canDownloadFile: "canDownloadFile", verticalExpandable: "verticalExpandable", isRequired: "isRequired", hideNgxDropzone: "hideNgxDropzone", acceptedFiles: "acceptedFiles", unacceptedFiles: "unacceptedFiles", maxFileSize: "maxFileSize", previewType: "previewType", name: "name", remoteResource: "remoteResource" }, outputs: { onFileSelected: "onFileSelected", onFileSelectError: "onFileSelectError", onFileUploadFail: "onFileUploadFail", onFileRemoved: "onFileRemoved", onFileUploadInit: "onFileUploadInit", onFileUploaded: "onFileUploaded", onFilePreviewLoaded: "onFilePreviewLoaded" }, providers: [
|
|
394
|
-
NgtMakeProvider(NgtDropzoneComponent),
|
|
395
|
-
], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "ngxDropzone", first: true, predicate: NgxDropzoneComponent, descendants: true, static: true }, { propertyName: "ngtDropzoneFileViewer", first: true, predicate: NgtDropzoneFileViewerComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, 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 && !hideNgxDropzone\"\n 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]='isDisabled() || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #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\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\n </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>", 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"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "component", type: i8.NgxDropzoneVideoPreviewComponent, selector: "ngx-dropzone-video-preview" }, { kind: "component", type: i9.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }, { kind: "component", type: i10.NgtDropzoneFileViewerComponent, selector: "ngt-dropzone-file-viewer", inputs: ["url", "fileName", "fileSize", "disableContent", "canDownloadFile"], outputs: ["onClose"] }, { kind: "component", type: i11.NgtDropzoneViewComponent, selector: "ngt-dropzone-view", inputs: ["resources", "dropzoneHeight", "loading", "placeholder"], outputs: ["onImageClick", "onFileClick"] }, { kind: "component", type: i12.CustomDropzonePreviewComponent, selector: "custom-dropzone-preview" }], viewProviders: [
|
|
396
|
-
{ provide: ControlContainer, useExisting: NgForm }
|
|
397
|
-
], encapsulation: i0.ViewEncapsulation.None }); }
|
|
398
|
-
}
|
|
399
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgtDropzoneComponent, decorators: [{
|
|
400
|
-
type: Component,
|
|
401
|
-
args: [{ selector: 'ngt-dropzone', encapsulation: ViewEncapsulation.None, providers: [
|
|
402
|
-
NgtMakeProvider(NgtDropzoneComponent),
|
|
403
|
-
], viewProviders: [
|
|
404
|
-
{ provide: ControlContainer, useExisting: NgForm }
|
|
405
|
-
], 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 && !hideNgxDropzone\"\n 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]='isDisabled() || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #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\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\n </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>", 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"] }]
|
|
406
|
-
}], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
|
|
407
|
-
type: Optional
|
|
408
|
-
}, {
|
|
409
|
-
type: Host
|
|
410
|
-
}] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i2.NgtAttachmentHttpService, decorators: [{
|
|
411
|
-
type: Optional
|
|
412
|
-
}, {
|
|
413
|
-
type: SkipSelf
|
|
414
|
-
}] }, { type: i3.NgtFormComponent, decorators: [{
|
|
415
|
-
type: Optional
|
|
416
|
-
}, {
|
|
417
|
-
type: SkipSelf
|
|
418
|
-
}] }, { type: i4.NgtSectionComponent, decorators: [{
|
|
419
|
-
type: Optional
|
|
420
|
-
}, {
|
|
421
|
-
type: SkipSelf
|
|
422
|
-
}] }, { type: i5.NgtModalComponent, decorators: [{
|
|
423
|
-
type: Optional
|
|
424
|
-
}, {
|
|
425
|
-
type: SkipSelf
|
|
426
|
-
}] }], propDecorators: { container: [{
|
|
427
|
-
type: ViewChild,
|
|
428
|
-
args: ['container']
|
|
429
|
-
}], ngxDropzone: [{
|
|
430
|
-
type: ViewChild,
|
|
431
|
-
args: [NgxDropzoneComponent, { static: true }]
|
|
432
|
-
}], ngtDropzoneFileViewer: [{
|
|
433
|
-
type: ViewChild,
|
|
434
|
-
args: [NgtDropzoneFileViewerComponent, { static: true }]
|
|
435
|
-
}], label: [{
|
|
436
|
-
type: Input
|
|
437
|
-
}], placeholder: [{
|
|
438
|
-
type: Input
|
|
439
|
-
}], helpTextColor: [{
|
|
440
|
-
type: Input
|
|
441
|
-
}], helpText: [{
|
|
442
|
-
type: Input
|
|
443
|
-
}], helpTitle: [{
|
|
444
|
-
type: Input
|
|
445
|
-
}], resources: [{
|
|
446
|
-
type: Input
|
|
447
|
-
}], multipleSelection: [{
|
|
448
|
-
type: Input
|
|
449
|
-
}], itemsLimit: [{
|
|
450
|
-
type: Input
|
|
451
|
-
}], showFileName: [{
|
|
452
|
-
type: Input
|
|
453
|
-
}], disableClick: [{
|
|
454
|
-
type: Input
|
|
455
|
-
}], disabled: [{
|
|
456
|
-
type: Input
|
|
457
|
-
}], viewMode: [{
|
|
458
|
-
type: Input
|
|
459
|
-
}], removable: [{
|
|
460
|
-
type: Input
|
|
461
|
-
}], canDownloadFile: [{
|
|
462
|
-
type: Input
|
|
463
|
-
}], verticalExpandable: [{
|
|
464
|
-
type: Input
|
|
465
|
-
}], isRequired: [{
|
|
466
|
-
type: Input
|
|
467
|
-
}], hideNgxDropzone: [{
|
|
468
|
-
type: Input
|
|
469
|
-
}], acceptedFiles: [{
|
|
470
|
-
type: Input
|
|
471
|
-
}], unacceptedFiles: [{
|
|
472
|
-
type: Input
|
|
473
|
-
}], maxFileSize: [{
|
|
474
|
-
type: Input
|
|
475
|
-
}], previewType: [{
|
|
476
|
-
type: Input
|
|
477
|
-
}], name: [{
|
|
478
|
-
type: Input
|
|
479
|
-
}], remoteResource: [{
|
|
480
|
-
type: Input
|
|
481
|
-
}], onFileSelected: [{
|
|
482
|
-
type: Output
|
|
483
|
-
}], onFileSelectError: [{
|
|
484
|
-
type: Output
|
|
485
|
-
}], onFileUploadFail: [{
|
|
486
|
-
type: Output
|
|
487
|
-
}], onFileRemoved: [{
|
|
488
|
-
type: Output
|
|
489
|
-
}], onFileUploadInit: [{
|
|
490
|
-
type: Output
|
|
491
|
-
}], onFileUploaded: [{
|
|
492
|
-
type: Output
|
|
493
|
-
}], onFilePreviewLoaded: [{
|
|
494
|
-
type: Output
|
|
495
|
-
}] } });
|
|
496
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRyb3B6b25lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1kcm9wem9uZS9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRyb3B6b25lL25ndC1kcm9wem9uZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQTBCLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFFOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDL0csT0FBTyxFQUFFLG9CQUFvQixFQUFtQixzQkFBc0Is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dGVudENoZWNrZWQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBTa2lwU2VsZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmd4RHJvcHpvbmVDaGFuZ2VFdmVudCwgTmd4RHJvcHpvbmVDb21wb25lbnQgfSBmcm9tICduZ3gtZHJvcHpvbmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IFZpZXdlciBmcm9tICd2aWV3ZXJqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvdXVpZCc7XG5pbXBvcnQgeyBOZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1hdHRhY2htZW50LWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0RHJvcHpvbmVGaWxlVmlld2VyQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3QtZHJvcHpvbmUtZmlsZS12aWV3ZXIvbmd0LWRyb3B6b25lLWZpbGUtdmlld2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3REcm9wem9uZUVycm9yVHlwZSwgTmd0RHJvcHpvbmVGaWxlLCBOZ3REcm9wem9uZVByZXZpZXdUeXBlIH0gZnJvbSAnLi9uZ3QtZHJvcHpvbmUubWV0YSc7XG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFNlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9uZ3Qtc2VjdGlvbi9uZ3Qtc2VjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0LWRyb3B6b25lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRyb3B6b25lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LmNzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE5ndE1ha2VQcm92aWRlcihOZ3REcm9wem9uZUNvbXBvbmVudCksXG4gICAgXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3REcm9wem9uZUNvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudENoZWNrZWQge1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHB1YmxpYyBjb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChOZ3hEcm9wem9uZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5neERyb3B6b25lOiBOZ3hEcm9wem9uZUNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5ndERyb3B6b25lRmlsZVZpZXdlcjogTmd0RHJvcHpvbmVGaWxlVmlld2VyQ29tcG9uZW50O1xuXG4gICAgLy8gVmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xuXG4gICAgLy8gQmVoYXZpb3JcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVzb3VyY2VzOiBBcnJheTxOZ3REcm9wem9uZUZpbGU+ID0gW107XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpcGxlU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGltaXQ6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpbGVOYW1lOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB2aWV3TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FuRG93bmxvYWRGaWxlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmVydGljYWxFeHBhbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGhpZGVOZ3hEcm9wem9uZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYWNjZXB0ZWRGaWxlczogc3RyaW5nID0gJyonIC8qKiBNaW1lIHR5cGUgKi87XG4gICAgQElucHV0KCkgcHVibGljIHVuYWNjZXB0ZWRGaWxlczogc3RyaW5nOyAvKiogTWltZSB0eXBlICovO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhGaWxlU2l6ZTogbnVtYmVyOyAvKiogQnl0ZXMgKi87XG4gICAgQElucHV0KCkgcHVibGljIHByZXZpZXdUeXBlOiBOZ3REcm9wem9uZVByZXZpZXdUeXBlID0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZS5ERUZBVUxUO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHJlbW90ZVJlc291cmNlOiBhbnk7XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8Tmd4RHJvcHpvbmVDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVTZWxlY3RFcnJvcjogRXZlbnRFbWl0dGVyPE5ndERyb3B6b25lRXJyb3JUeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVVwbG9hZEZhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVVwbG9hZEluaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVByZXZpZXdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwdWJsaWMgZHJvcHpvbmVIZWlnaHQ6IHN0cmluZyA9ICcxODBweCc7XG4gICAgcHVibGljIHVwbG9hZGVkUmVzb3VyY2VzID0gW107XG4gICAgcHVibGljIGZvcmNlRGlzYWJsZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG5hdGl2ZVZhbHVlID0gW107XG4gICAgcHVibGljIHNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29tcG9uZW50UmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBuZ3REcm9wem9uZUxvYWRlclN0eWxlOiBOZ3RTdHlsaXphYmxlU2VydmljZTtcbiAgICBwdWJsaWMgbmd4RWxlbWVudElkOiBzdHJpbmcgPSB1dWlkKCk7XG4gICAgcHVibGljIGltYWdlVmlld2VyT3B0aW9uczogYW55ID0ge1xuICAgICAgICBuYXZiYXI6IHRydWUsXG4gICAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgICAgIHpvb21JbjogdHJ1ZSxcbiAgICAgICAgICAgIHpvb21PdXQ6IHRydWUsXG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICAgIHJvdGF0ZUxlZnQ6IHRydWUsXG4gICAgICAgICAgICByb3RhdGVSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIHByZXY6IHRydWUsXG4gICAgICAgICAgICBuZXh0OiB0cnVlLFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXG4gICAgICAgIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndEF0dGFjaG1lbnRIdHRwU2VydmljZTogTmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0Rm9ybTogTmd0Rm9ybUNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndFNlY3Rpb246IE5ndFNlY3Rpb25Db21wb25lbnQsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RNb2RhbDogTmd0TW9kYWxDb21wb25lbnRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLm5ndERyb3B6b25lTG9hZGVyU3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcblxuICAgICAgICB0aGlzLm5ndERyb3B6b25lTG9hZGVyU3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0RHJvcHpvbmVMb2FkZXInLCB7XG4gICAgICAgICAgICBoOiAnaC04JyxcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ3RleHQtZ3JheS02MDAnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnByZXZpZXdUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdUeXBlID0gZ2V0RW51bUZyb21TdHJpbmcoY2hhbmdlcy5wcmV2aWV3VHlwZS5jdXJyZW50VmFsdWUsIE5ndERyb3B6b25lUHJldmlld1R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcHpvbmVIZWlnaHQgPSBgJHt0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGltYWdlUHJldmlldyhpbmRleCkge1xuICAgICAgICBjb25zdCBpbWFnZXMgPSB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmZpbHRlcigocmVzb3VyY2UpID0+IHRoaXMuaXNJbWFnZShyZXNvdXJjZSkpO1xuICAgICAgICBjb25zdCBpbWFnZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICAgIGltYWdlcy5mb3JFYWNoKChpbWFnZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5cbiAgICAgICAgICAgIGltYWdlRWxlbWVudC5zcmMgPSBpbWFnZS5maWxlLnVybDtcblxuICAgICAgICAgICAgaW1hZ2VzRGl2LmFwcGVuZENoaWxkKGltYWdlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25JbWFnZUNsaWNrKGltYWdlc0RpdiwgaW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkltYWdlQ2xpY2soZWxlbWVudCwgaW5kZXg/KSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JjZURpc2FibGVDbGljayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZ3REcm9wem9uZUNvbXBvbmVudCA9IHRoaXM7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsICYmIGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zID0geyAuLi50aGlzLmltYWdlVmlld2VyT3B0aW9ucywgLi4ueyBpbml0aWFsVmlld0luZGV4OiBpbmRleCB9IH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aWV3ZXIgPSBuZXcgVmlld2VyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zLCAuLi57XG4gICAgICAgICAgICAgICAgaGlkZGVuKCkge1xuICAgICAgICAgICAgICAgICAgICBuZ3REcm9wem9uZUNvbXBvbmVudC5mb3JjZURpc2FibGVDbGljayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlld2VyLnNob3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWxlQ2xpY2sodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZm9yY2VEaXNhYmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLmZpbGVOYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIuZmlsZVNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci5pbml0KCk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIub25DbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcmNlRGlzYWJsZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25TZWxlY3QoZXZlbnQ6IE5neERyb3B6b25lQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlamVjdGVkRmlsZSBvZiA8YW55PmV2ZW50LnJlamVjdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVqZWN0ZWRGaWxlLnJlYXNvbiA9PSAnc2l6ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlNJWkUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ25vX211bHRpcGxlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuTk9fTVVMVElQTEUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5UWVBFKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLkRFRkFVTFQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0ID09IDEgJiYgZXZlbnQuYWRkZWRGaWxlc1xuICAgICAgICAgICAgICAgICYmIGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoID09IHRoaXMuaXRlbXNMaW1pdCAmJiB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmxlbmd0aCA9PSB0aGlzLml0ZW1zTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudC5hZGRlZEZpbGVzXG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuYWRkZWRGaWxlcy5sZW5ndGggKyB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmxlbmd0aCA8PSB0aGlzLml0ZW1zTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoZXZlbnQuYWRkZWRGaWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5JVEVNU19MSU1JVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlcyhldmVudC5hZGRlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRGaWxlcyhmaWxlczogQXJyYXk8RmlsZT4pIHtcbiAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGVtcG9yYXJ5RmlsZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBvcmFyeUF0dGFjaG1lbnRzID0gW107XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdW5hY2NlcHRlZEZpbGVzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVVwbG9hZEluaXQuZW1pdCgpO1xuXG4gICAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUuaW5jbHVkZXModGhpcy51bmFjY2VwdGVkRmlsZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKHRoaXMubmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLnVwbG9hZCh0aGlzLnJlbW90ZVJlc291cmNlLCBmaWxlKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcyAmJiByZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlWyd1cmwnXSA9IHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcy5kYXRhLnVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlGaWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGFbJ2xvYWRlZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlBdHRhY2htZW50cy5wdXNoKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb2JzZXJ2YWJsZXMubGVuZ3RoICYmIHVuYWNjZXB0ZWRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuVFlQRSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5wdXNoKC4uLnRlbXBvcmFyeUZpbGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMaW1pdCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHMsIC4uLnRoaXMubmF0aXZlVmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuYWNjZXB0ZWRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuVFlQRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCksIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRGYWlsLmVtaXQoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCksIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWRGaWxlUHJldmlldyhhdHRhY2htZW50czogYW55KSB7XG4gICAgICAgIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggJiYgYXR0YWNobWVudHNbMF0pIHtcbiAgICAgICAgICAgIGxldCB0ZW1wb3JhcnlSZXNvdXJjZSA9IFtdO1xuICAgICAgICAgICAgbGV0IG9ic2VydmFibGVzID0gW107XG5cbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goKGF0dGFjaG1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBGaWxlKSAmJiAhYXR0YWNobWVudC5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Wydsb2FkZWQnXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZXMucHVzaCh0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5wcmV2aWV3KGF0dGFjaG1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5UmVzb3VyY2UucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcmVzcG9uc2UuZGF0YS5nZXRBcGlJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogcmVzcG9uc2UuZGF0YS5nZXRBdHRyaWJ1dGUoJ2ZpbGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5wdXNoKC4uLnRlbXBvcmFyeVJlc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UoYXR0YWNobWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVQcmV2aWV3TG9hZGVkLmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblJlbW92ZShyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMuc3BsaWNlKHRoaXMudXBsb2FkZWRSZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSksIDEpO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdGhpcy5uYXRpdmVWYWx1ZS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LmlkICE9IHJlc291cmNlLmlkKTtcbiAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZSh0aGlzLm5hdGl2ZVZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkZpbGVSZW1vdmVkLmVtaXQocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ltYWdlKHJlc291cmNlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlld1R5cGUgPT0gJ0lNQUdFJ1xuICAgICAgICAgICAgfHwgKFxuICAgICAgICAgICAgICAgIHJlc291cmNlLmZpbGU/LnR5cGVcbiAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJylcbiAgICAgICAgICAgICAgICAmJiAhcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdkd2cnKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWaWRlbyhyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpZXdUeXBlID09ICdWSURFTycgfHwgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygndmlkZW8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXVkaW8ocmVzb3VyY2U6IGFueSkge1xuICAgICAgICByZXR1cm4gKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygnYXVkaW8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmlsZShyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0ltYWdlKHJlc291cmNlKSAmJiAhdGhpcy5pc0F1ZGlvKHJlc291cmNlKSAmJiAhdGhpcy5pc1ZpZGVvKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkRmlsZVNpemUocmVzb3VyY2U6IGFueSkge1xuICAgICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCBzaXplID0gcmVzb3VyY2Uuc2l6ZSB8fCByZXNvdXJjZS5maWxlU2l6ZTtcblxuICAgICAgICAgICAgaWYgKCFzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSByZXNvdXJjZS5maWxlLnNpemU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzaXplKSA+IDEwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlRmxvYXQoc2l6ZSkgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNYic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoc2l6ZSkgLyAxMDAwKSArICcgS2InO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KHRoaXMubmF0aXZlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubmF0aXZlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVhZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRGaWxlUHJldmlldyhBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQ6IGFueSkge1xuICAgICAgICB0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5kb3dubG9hZChhdHRhY2htZW50KS5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuRmlsZVNlbGVjdG9yKCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5neEVsZW1lbnRJZCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0Rpc2FibGVkQnlQYXJlbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDb21wb25lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdUeXBlID0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZS5ERUZBVUxUO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtQ29udGFpbmVyICYmIHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sXG4gICAgICAgICAgICAmJiAodGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVzTG9hZCgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkRmlsZVByZXZpZXcoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEZpbGVzTG9hZCgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50Wydsb2FkZWQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGF0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3luY1ZhbGlkYXRvcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGlzYWJsZWRCeVBhcmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmd0Rm9ybT8uaXNEaXNhYmxlZFxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RTZWN0aW9uPy5pc0Rpc2FibGVkXG4gICAgICAgICAgICB8fCB0aGlzLm5ndE1vZGFsPy5pc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGgtZnVsbCB3LWZ1bGxcIiAjY29udGFpbmVyPlxuICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJmbGV4IG1iLTIgdGV4dC1zbVwiPlxuICAgICAgICB7eyBsYWJlbCB9fTpcblxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcmVkLTUwMCBmb250LWJvbGQgdGV4dC1tZCBtbC0xXCIgKm5nSWY9XCJpc1JlcXVpcmVkXCI+Kjwvc3Bhbj5cblxuICAgICAgICA8bmd0LWhlbHBlciAqbmdJZj1cImhlbHBUZXh0XCIgW2hlbHBUaXRsZV09XCJoZWxwVGl0bGVcIiBbaWNvbkNvbG9yXT1cImhlbHBUZXh0Q29sb3JcIiBjbGFzcz1cIm1sLTFcIj5cbiAgICAgICAgICAgIHt7IGhlbHBUZXh0IH19XG4gICAgICAgIDwvbmd0LWhlbHBlcj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGRpdiAqbmdJZj1cIiF2aWV3TW9kZVwiIGNsYXNzPVwiaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZyAmJiAhaGlkZU5neERyb3B6b25lXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhYnNvbHV0ZSBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdy1mdWxsIGgtZnVsbCBjdXJzb3Itd2FpdCB6LTEwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxvYWRlclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmd4LWRyb3B6b25lIFtpZF09XCJuZ3hFbGVtZW50SWRcIiBbbXVsdGlwbGVdPSdtdWx0aXBsZVNlbGVjdGlvbicgW21heEZpbGVTaXplXT0nbWF4RmlsZVNpemUnXG4gICAgICAgICAgICAoY2hhbmdlKT0nb25TZWxlY3QoJGV2ZW50KScgW2NsYXNzLnNpbmdsZS1hdHRhY2htZW50XT0naXRlbXNMaW1pdCA9PSAxJyBbYWNjZXB0XT0nYWNjZXB0ZWRGaWxlcydcbiAgICAgICAgICAgIFtkaXNhYmxlZF09J2lzRGlzYWJsZWQoKSB8fCBsb2FkaW5nJyBbZXhwYW5kYWJsZV09J3ZlcnRpY2FsRXhwYW5kYWJsZSdcbiAgICAgICAgICAgIFtkaXNhYmxlQ2xpY2tdPSdkaXNhYmxlQ2xpY2sgfHwgZm9yY2VEaXNhYmxlQ2xpY2snIFtuZ1N0eWxlXT1cInsgJ2hlaWdodCc6IGRyb3B6b25lSGVpZ2h0IH1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGlkZGVuJzpoaWRlTmd4RHJvcHpvbmUgfVwiICNuZ3hEcm9wem9uZT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtbGFiZWwgKm5nSWY9XCIhdXBsb2FkZWRSZXNvdXJjZXM/Lmxlbmd0aFwiIGNsYXNzPVwicHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgICAgICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVzb3VyY2Ugb2YgdXBsb2FkZWRSZXNvdXJjZXM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctNDggbXgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJlc291cmNlPy5maWxlPy5uYW1lIHx8ICcnIH19ICh7eyBnZXRGb3JtYXR0ZWRGaWxlU2l6ZShyZXNvdXJjZSkgfX0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y3VzdG9tLWRyb3B6b25lLXByZXZpZXcgKm5nSWY9XCJwcmV2aWV3VHlwZSA9PSAnREVGQVVMVCcgJiYgaXNGaWxlKHJlc291cmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVdPSdyZXNvdXJjZS5maWxlJyBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRmlsZUNsaWNrKHJlc291cmNlLmZpbGUudXJsLCByZXNvdXJjZS5maWxlLm5hbWUsIHJlc291cmNlLmZpbGUuc2l6ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY3VzdG9tLWRyb3B6b25lLXByZXZpZXc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ltYWdlKHJlc291cmNlKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiaW1hZ2VQcmV2aWV3KGluZGV4KVwiICNnYWxsZXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldyBjbGFzcz1cImltYWdlLXByZXZpZXctZGVmYXVsdC1jbGFzc1wiIFtmaWxlXT1cInJlc291cmNlLmZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1kcm9wem9uZS12aWRlby1wcmV2aWV3ICpuZ0lmPVwiaXNWaWRlbyhyZXNvdXJjZSkgfHwgaXNBdWRpbyhyZXNvdXJjZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlXT1cInJlc291cmNlLmZpbGVcIiBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtZHJvcHpvbmUtdmlkZW8tcHJldmlldz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzaG93RmlsZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHRydW5jYXRlIHRleHQtZ3JheS01MDAgdGV4dC1jZW50ZXIgdGV4dC1zbSBmb250LW1vbm8gbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlc291cmNlPy5maWxlPy5uYW1lIHx8ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmd4LWRyb3B6b25lPlxuICAgIDwvZGl2PlxuXG4gICAgPG5ndC1kcm9wem9uZS12aWV3ICpuZ0lmPVwidmlld01vZGVcIiBjbGFzcz1cImgtZnVsbCB3LWZ1bGxcIiBbcmVzb3VyY2VzXT1cInJlc291cmNlc1wiIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbZHJvcHpvbmVIZWlnaHRdPVwiZHJvcHpvbmVIZWlnaHRcIlxuICAgICAgICAob25GaWxlQ2xpY2spPVwib25GaWxlQ2xpY2soJGV2ZW50LnByZXZpZXdVcmwsICRldmVudC5uYW1lLCAkZXZlbnQuZmlsZVNpemUpXCJcbiAgICAgICAgKG9uSW1hZ2VDbGljayk9XCJvbkltYWdlQ2xpY2soJGV2ZW50LmRpdiwgJGV2ZW50LmluZGV4KVwiPlxuICAgIDwvbmd0LWRyb3B6b25lLXZpZXc+XG5cbiAgICA8bmd0LWRyb3B6b25lLWZpbGUtdmlld2VyIFtoaWRkZW5dPVwiIXNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXJcIiAob25DbG9zZSk9XCJmb3JjZURpc2FibGVDbGljayA9IGZhbHNlXCJcbiAgICAgICAgW2NhbkRvd25sb2FkRmlsZV09XCJjYW5Eb3dubG9hZEZpbGVcIiBbZGlzYWJsZUNvbnRlbnRdPVwiY2FuRG93bmxvYWRGaWxlID8gJ25vbmUnIDogJ3BvcG91dCdcIj5cbiAgICA8L25ndC1kcm9wem9uZS1maWxlLXZpZXdlcj5cblxuICAgIDxpbnB1dCAqbmdJZj0nY29tcG9uZW50UmVhZHknIHR5cGU9XCJoaWRkZW5cIiBbbmdNb2RlbF09XCJ2YWx1ZVwiIFtuYW1lXT1cIm5hbWVcIiBbdmFsdWVdPVwidmFsdWVcIj5cbiAgICA8bmd0LXZhbGlkYXRpb24gW2NvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiBbY29udGFpbmVyXT1cImZvcm1Db250YWluZXJcIj48L25ndC12YWxpZGF0aW9uPlxuPC9kaXY+Il19
|