bpm-core 0.0.49 → 0.0.51
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/esm2022/lib/app/app.component.mjs +6 -6
- package/esm2022/lib/components/app-component-sections/activities/activities.component.mjs +6 -5
- package/esm2022/lib/components/app-component-sections/approvals/approvals.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/approvals-workflow/approvals-workflow.component.mjs +5 -5
- package/esm2022/lib/components/app-component-sections/faq-sidenav/faq-sidenav.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/faqs/faqs.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/feedback-section/feedback-section.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/layout/header/header.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/layout/layout.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/layout/side-nav/side-nav.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/main-request-details/main-request-details.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/previous-requests/previous-requests.component.mjs +128 -24
- package/esm2022/lib/components/app-component-sections/profile-section/profile-section.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/status/status.component.mjs +4 -4
- package/esm2022/lib/components/app-component-sections/workflow-section/workflow-section.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/action-buttons/action-buttons.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/confirmation-popup/confirmation-popup.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/delete-popup/delete-popup.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/dialogs/confirm-dialog/confirm-dialog.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/dialogs/delete-dialog/delete-dialog.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.mjs +42 -20
- package/esm2022/lib/components/shared-components/form-field/attachment-section/attachment-section.component.mjs +5 -5
- package/esm2022/lib/components/shared-components/form-field/base-component/base-component.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/checkbox/checkbox.component.mjs +9 -15
- package/esm2022/lib/components/shared-components/form-field/control-value-accessor.directive.mjs +36 -39
- package/esm2022/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.mjs +13 -25
- package/esm2022/lib/components/shared-components/form-field/date-picker/date-picker.component.mjs +60 -67
- package/esm2022/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.mjs +75 -80
- package/esm2022/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.mjs +579 -0
- package/esm2022/lib/components/shared-components/form-field/form-label/form-label.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/info-item/info-item.component.mjs +6 -8
- package/esm2022/lib/components/shared-components/form-field/input/input.component.mjs +11 -10
- package/esm2022/lib/components/shared-components/form-field/input-currency/input-currency.component.mjs +6 -8
- package/esm2022/lib/components/shared-components/form-field/input-email/input-email.component.mjs +5 -7
- package/esm2022/lib/components/shared-components/form-field/input-mask/input-mask.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/input-number/input-number.component.mjs +5 -8
- package/esm2022/lib/components/shared-components/form-field/input-telephone/input-telephone.component.mjs +23 -131
- package/esm2022/lib/components/shared-components/form-field/radio/radio.component.mjs +29 -27
- package/esm2022/lib/components/shared-components/form-field/repeated-list/repeated-list.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/search-employee/search-employee.component.mjs +87 -78
- package/esm2022/lib/components/shared-components/form-field/select/select.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/shared-imports.mjs +14 -0
- package/esm2022/lib/components/shared-components/form-field/table-list/table-list.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/textarea/special-chars.directive.mjs +4 -4
- package/esm2022/lib/components/shared-components/form-field/textarea/textarea.component.mjs +10 -9
- package/esm2022/lib/components/shared-components/form-field/toggle-button/toggle-button.component.mjs +33 -32
- package/esm2022/lib/components/shared-components/form-field/validation-errors/validation-errors.component.mjs +7 -6
- package/esm2022/lib/components/shared-components/index.mjs +1 -2
- package/esm2022/lib/components/shared-components/terms-conditions/terms-conditions.component.mjs +4 -4
- package/esm2022/lib/components/shared-components/title-section/title-section.component.mjs +4 -4
- package/esm2022/lib/directives/ar.directive.mjs +4 -4
- package/esm2022/lib/directives/currency.directive.mjs +4 -4
- package/esm2022/lib/directives/en.directive.mjs +4 -4
- package/esm2022/lib/directives/number.directive.mjs +4 -4
- package/esm2022/lib/i18n/ar.mjs +7 -1
- package/esm2022/lib/i18n/en.mjs +7 -1
- package/esm2022/lib/pipes/currency.pipe.mjs +4 -4
- package/esm2022/lib/pipes/format-as-password.pipe.mjs +4 -4
- package/esm2022/lib/pipes/status-style.pipe.mjs +4 -4
- package/esm2022/lib/services/action.service.ts.mjs +4 -4
- package/esm2022/lib/services/core.service.ts.mjs +63 -100
- package/esm2022/lib/services/feedBack.service.mjs +4 -4
- package/esm2022/lib/services/i18n.service.mjs +4 -4
- package/esm2022/lib/services/sidenav.service.mjs +4 -4
- package/esm2022/lib/testComponent/general-approver-section/general-approver-section.component.mjs +4 -4
- package/esm2022/lib/testComponent/request-details-section/request-details-section.component.mjs +28 -21
- package/esm2022/lib/testComponent/services/i18n.service.mjs +4 -4
- package/esm2022/lib/testComponent/services/segment-dynamic-loader.service.mjs +4 -4
- package/esm2022/lib/validators/string-to-boolean.pipe.mjs +4 -4
- package/esm2022/lib/validators/text.directive.mjs +4 -4
- package/esm2022/lib/validators/timer.pipe.mjs +4 -4
- package/fesm2022/bpm-core.mjs +2568 -2697
- package/fesm2022/bpm-core.mjs.map +1 -1
- package/lib/app/app.component.d.ts +1 -1
- package/lib/components/app-component-sections/previous-requests/previous-requests.component.d.ts +27 -6
- package/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.d.ts +9 -5
- package/lib/components/shared-components/form-field/checkbox/checkbox.component.d.ts +1 -3
- package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +15 -7
- package/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.d.ts +2 -5
- package/lib/components/shared-components/form-field/date-picker/date-picker.component.d.ts +3 -4
- package/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.d.ts +6 -6
- package/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.d.ts +131 -0
- package/lib/components/shared-components/form-field/input-telephone/input-telephone.component.d.ts +5 -27
- package/lib/components/shared-components/form-field/radio/radio.component.d.ts +5 -8
- package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +4 -6
- package/lib/components/shared-components/form-field/shared-imports.d.ts +5 -0
- package/lib/components/shared-components/form-field/toggle-button/toggle-button.component.d.ts +7 -8
- package/lib/components/shared-components/form-field/validation-errors/validation-errors.component.d.ts +1 -0
- package/lib/components/shared-components/index.d.ts +0 -1
- package/lib/i18n/ar.d.ts +6 -0
- package/lib/i18n/en.d.ts +6 -0
- package/lib/services/core.service.ts.d.ts +9 -4
- package/lib/testComponent/request-details-section/request-details-section.component.d.ts +1 -0
- package/package.json +2 -3
- package/src/lib/assets/scss/_general.scss +1 -0
- package/src/lib/assets/scss/input-telephone.scss +133 -159
package/esm2022/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.mjs
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { DeleteDialogComponent } from '../../dialogs/delete-dialog/delete-dialog.component';
|
|
2
|
+
import { NoopScrollStrategy } from '@angular/cdk/overlay';
|
|
3
|
+
/* eslint-disable @angular-eslint/use-lifecycle-interface */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
/* eslint-disable @angular-eslint/component-selector */
|
|
6
|
+
import { Component, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
|
|
7
|
+
import * as FileSaver from 'file-saver';
|
|
8
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
9
|
+
import { NgClass, NgForOf, NgIf, NgTemplateOutlet } from "@angular/common";
|
|
10
|
+
import { MatError, MatHint } from "@angular/material/form-field";
|
|
11
|
+
import { ControlValueAccessorDirective } from '../control-value-accessor.directive';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
export class DocsUploaderComponent extends ControlValueAccessorDirective {
|
|
14
|
+
maxSizeFlag = true;
|
|
15
|
+
maxSizeValue;
|
|
16
|
+
wrongExtensionFlag = true;
|
|
17
|
+
useCrop;
|
|
18
|
+
formKey;
|
|
19
|
+
showLabel = true;
|
|
20
|
+
downloadLink = false;
|
|
21
|
+
showActions = true;
|
|
22
|
+
styleHeight = ''; // medium, mini
|
|
23
|
+
fileInputHeight = ''; // medium, mini
|
|
24
|
+
styleWidth = '6';
|
|
25
|
+
hints;
|
|
26
|
+
allowedExtensions = '';
|
|
27
|
+
callApi;
|
|
28
|
+
tooltip;
|
|
29
|
+
attachments;
|
|
30
|
+
optional = false;
|
|
31
|
+
display = '';
|
|
32
|
+
validExtension = true;
|
|
33
|
+
attachType = '';
|
|
34
|
+
error;
|
|
35
|
+
displayedFiles = [];
|
|
36
|
+
selectedTemplateAttachment = new EventEmitter();
|
|
37
|
+
fileNotDuplicated = true;
|
|
38
|
+
allowedFileSize = true;
|
|
39
|
+
getDataFromTemplate = false;
|
|
40
|
+
allowFileContentsWithMultiAttachments = false;
|
|
41
|
+
accept;
|
|
42
|
+
filesize;
|
|
43
|
+
wrongFile = {
|
|
44
|
+
mimeType: "",
|
|
45
|
+
fileContents: "",
|
|
46
|
+
fileName: this.i18n.language == 'ar' ? "امتداد الملف خاطىء" : "Wrong File Extension"
|
|
47
|
+
};
|
|
48
|
+
allAttachments = [];
|
|
49
|
+
uploadForm;
|
|
50
|
+
signType = 'Sign';
|
|
51
|
+
showSignButton = false;
|
|
52
|
+
printType = 'Print';
|
|
53
|
+
showPrintButton = false;
|
|
54
|
+
downloadType = 'Download';
|
|
55
|
+
showDownloadButton = false;
|
|
56
|
+
preventFileContents = false;
|
|
57
|
+
addSignatureClicked = new EventEmitter();
|
|
58
|
+
printActionClicked = new EventEmitter();
|
|
59
|
+
downloadActionClicked = new EventEmitter();
|
|
60
|
+
maxSize = '10';
|
|
61
|
+
inputFile;
|
|
62
|
+
dialog;
|
|
63
|
+
validImageTypes = {
|
|
64
|
+
jpg: ['image/jpeg', 'image/pjpeg'],
|
|
65
|
+
JPG: ['image/jpeg', 'image/pjpeg'],
|
|
66
|
+
jpeg: ['image/jpeg', 'image/pjpeg'],
|
|
67
|
+
png: ['image/png']
|
|
68
|
+
};
|
|
69
|
+
validImgPdfTypes = {
|
|
70
|
+
pdf: ['application/pdf'],
|
|
71
|
+
jpg: ['image/jpeg', 'image/pjpeg'],
|
|
72
|
+
JPG: ['image/jpeg', 'image/pjpeg'],
|
|
73
|
+
jpeg: ['image/jpeg', 'image/pjpeg'],
|
|
74
|
+
bmp: ['image/bmp', 'image/x-windows-bmp'],
|
|
75
|
+
png: ['image/png']
|
|
76
|
+
};
|
|
77
|
+
validFileTypes = {
|
|
78
|
+
'pdf': ['application/pdf'],
|
|
79
|
+
'doc': ['application/msword'],
|
|
80
|
+
'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
|
|
81
|
+
'ppt': ['application/vnd.ms-powerpoint'],
|
|
82
|
+
'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],
|
|
83
|
+
'pps': ['application/vnd.ms-powerpoint'],
|
|
84
|
+
'ppsx': ['application/vnd.openxmlformats-officedocument.presentationml.slideshow'],
|
|
85
|
+
'odt': ['application/vnd.oasis.opendocument.text'],
|
|
86
|
+
'xls': ['application/vnd.ms-excel'],
|
|
87
|
+
'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
|
|
88
|
+
'zip': ['application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/zip'],
|
|
89
|
+
'msg': ['application/vnd.ms-outlook', 'application/msg'],
|
|
90
|
+
'csv': ['text/csv'],
|
|
91
|
+
'txt': ['text/plain'],
|
|
92
|
+
'rtf': ['application/rtf', 'application/x-rtf', 'text/richtext'],
|
|
93
|
+
'html': ['text/html'],
|
|
94
|
+
// 'mp4': ['video/mp4'],
|
|
95
|
+
// 'm4v': ['video/mp4'],
|
|
96
|
+
'mov': ['video/quicktime'],
|
|
97
|
+
'wmv': ['video/x-ms-wmv'],
|
|
98
|
+
// 'avi': ['video/x-msvideo'],
|
|
99
|
+
'mpg': ['mpg'],
|
|
100
|
+
'rmvb': ['rmvb'],
|
|
101
|
+
// 'ogv': ['video/ogg'],
|
|
102
|
+
// '3gp': ['video/3gpp', 'audio/3gpp'],
|
|
103
|
+
// '3g2': ['video/3gpp2', 'audio/3gpp'],
|
|
104
|
+
'jpg': ['image/jpeg', 'image/pjpeg'],
|
|
105
|
+
'jpeg': ['image/jpeg', 'image/pjpeg'],
|
|
106
|
+
'png': ['image/png'],
|
|
107
|
+
'gif': ['image/gif'],
|
|
108
|
+
'bmp': ['image/bmp', 'image/x-windows-bmp']
|
|
109
|
+
};
|
|
110
|
+
validPdfTypes = {
|
|
111
|
+
'pdf': ['application/pdf'],
|
|
112
|
+
};
|
|
113
|
+
uploading;
|
|
114
|
+
lengthError;
|
|
115
|
+
downloadUrl;
|
|
116
|
+
ngOnChanges(changes) {
|
|
117
|
+
if (this.attachments?.length) {
|
|
118
|
+
this.allAttachments = [...this.attachments];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ngOnInit(): void {
|
|
122
|
+
/* this.resetPropagator.subscribe(this, this.resetAttachmentData);
|
|
123
|
+
this.uploadForm = this.fb.group({
|
|
124
|
+
file: [''],
|
|
125
|
+
name: '',
|
|
126
|
+
});*/
|
|
127
|
+
// }
|
|
128
|
+
resetAttachmentData() {
|
|
129
|
+
if (!this.isReadOnly) {
|
|
130
|
+
if (this.multiple) {
|
|
131
|
+
this.displayedFiles = [];
|
|
132
|
+
this.allAttachments = [];
|
|
133
|
+
this.emit(this.displayedFiles);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const emptyObj = {
|
|
137
|
+
mimeType: "",
|
|
138
|
+
fileContents: "",
|
|
139
|
+
fileName: "",
|
|
140
|
+
};
|
|
141
|
+
this.emit(emptyObj);
|
|
142
|
+
this.selectedTemplateAttachment.emit(null);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
getFileType(attachment) {
|
|
147
|
+
if (!attachment.fileName?.includes('.') && attachment.mimeType.includes('.')) {
|
|
148
|
+
return this.checkFileType(attachment.mimeType);
|
|
149
|
+
}
|
|
150
|
+
else if (attachment.fileName) {
|
|
151
|
+
return this.checkFileType(attachment.fileName);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
return attachment.mimeType;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
checkFileType(attachmentData) {
|
|
158
|
+
if (attachmentData.split('.').pop() == 'msg') {
|
|
159
|
+
return 'email-icon';
|
|
160
|
+
}
|
|
161
|
+
else if (attachmentData.split('.').pop() == 'jpeg') {
|
|
162
|
+
return 'jpg';
|
|
163
|
+
}
|
|
164
|
+
else if (attachmentData.split('.').pop() == 'xlsx' || attachmentData.split('.').pop() == 'xls') {
|
|
165
|
+
return 'application/vnd.ms-excel;charset=utf-8';
|
|
166
|
+
}
|
|
167
|
+
return attachmentData.split('.').pop();
|
|
168
|
+
}
|
|
169
|
+
attch(type, index, field) {
|
|
170
|
+
if (type == "download") {
|
|
171
|
+
if (this.downloadLink) {
|
|
172
|
+
window.open(field?.attachmentId, '_blank', 'top=0,left=0,height=auto,width=auto');
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
if (field && field.attachmentId) {
|
|
176
|
+
this.downloadFile(type, field);
|
|
177
|
+
}
|
|
178
|
+
else if (field && field.fileContents) {
|
|
179
|
+
this.downloadFileNew(field);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (type == "delete") {
|
|
184
|
+
if (this.validExtension) {
|
|
185
|
+
if (this.multiple) {
|
|
186
|
+
this.confirmDelete(index);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this.removeAttachedFile();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.validExtension = true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
confirmDelete(index) {
|
|
198
|
+
const dialogRef = this.dialog.open(DeleteDialogComponent, {
|
|
199
|
+
panelClass: ['main-popup', 'confirm-dialog'],
|
|
200
|
+
scrollStrategy: new NoopScrollStrategy(),
|
|
201
|
+
});
|
|
202
|
+
dialogRef.afterClosed().subscribe((returnValue) => {
|
|
203
|
+
if (returnValue == 'yes') {
|
|
204
|
+
this.removeMulti(index);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
removeMulti(index) {
|
|
209
|
+
this.displayedFiles.splice(index, 1);
|
|
210
|
+
this.allAttachments.splice(index, 1);
|
|
211
|
+
}
|
|
212
|
+
downloadFileNew(fileData) {
|
|
213
|
+
const fileType = this.getFileType(fileData);
|
|
214
|
+
const blob = new Blob([fileData.fileContents], { type: fileType });
|
|
215
|
+
FileSaver.saveAs(blob, `${fileData.fileName}`);
|
|
216
|
+
}
|
|
217
|
+
onValueChange(event) {
|
|
218
|
+
if (event?.target?.files?.length > 0) {
|
|
219
|
+
if (this.formKey == 'TSV') {
|
|
220
|
+
const input = event.target;
|
|
221
|
+
this.selectedTemplateAttachment.emit(input.files[0]); ///// test
|
|
222
|
+
}
|
|
223
|
+
const file = event.target.files[0];
|
|
224
|
+
let fileType;
|
|
225
|
+
if (file.name !== null && file.name !== undefined && file.name.endsWith(".msg")) {
|
|
226
|
+
fileType = 'application/vnd.ms-outlook';
|
|
227
|
+
}
|
|
228
|
+
if (this.accept?.length) {
|
|
229
|
+
if (!this.accept.includes(file.type) && !this.accept.includes(fileType)) {
|
|
230
|
+
alert(this.i18n.translate('thisIsInvalidFile'));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
this.uploadForm?.get('file')?.setValue(file);
|
|
235
|
+
this.uploadForm?.get('name')?.setValue(file?.name);
|
|
236
|
+
}
|
|
237
|
+
if (!this.uploading) {
|
|
238
|
+
const input = event.target;
|
|
239
|
+
if (this.maxSize) {
|
|
240
|
+
this.filesize = ((input.files[0].size / 1024) / 1024).toFixed(4); // MB
|
|
241
|
+
this.maxSizeValue = this.maxSize;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
this.filesize = ((input.files[0].size / 1024) / 1024).toFixed(4); // MB
|
|
245
|
+
this.maxSizeValue = 1;
|
|
246
|
+
}
|
|
247
|
+
this.maxSizeFlag = +this.filesize < +this.maxSize;
|
|
248
|
+
this.lengthError = this.displayedFiles?.length >= +this.maxLength;
|
|
249
|
+
this.wrongExtensionFlag = this.isValidMimeType(input.files[0].type);
|
|
250
|
+
this.validExtension = this.isValidExtension(input.files[0].name.split('.').pop(), this.type);
|
|
251
|
+
if (!this.lengthError) {
|
|
252
|
+
if (+this.filesize < +this.maxSize) {
|
|
253
|
+
this.allowedFileSize = true;
|
|
254
|
+
if (this.validExtension) {
|
|
255
|
+
if (this.getDataFromTemplate) {
|
|
256
|
+
this.selectedTemplateAttachment.emit(event);
|
|
257
|
+
}
|
|
258
|
+
const obj = new AttatchmentFile(input.files[0].name, input.files[0].name, input.files[0].type, '', this.filesize);
|
|
259
|
+
this.value = new AttatchmentFile(input.files[0].name, input.files[0].name, input.files[0].type, '', this.filesize);
|
|
260
|
+
const reader = new FileReader();
|
|
261
|
+
reader.onload = () => {
|
|
262
|
+
obj.fileContents = reader.result.split(',')[1];
|
|
263
|
+
obj.filesize = this.filesize;
|
|
264
|
+
if (!this.multiple) {
|
|
265
|
+
this.fileNotDuplicated = this.checkFileExistance(obj);
|
|
266
|
+
if (!this.fileNotDuplicated) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
this.value.fileContents = reader.result.split(',')[1];
|
|
270
|
+
this.control.setValue(this.value);
|
|
271
|
+
if (this.callApi) {
|
|
272
|
+
this.addAttachments();
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
this.selectedTemplateAttachment.emit(event);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
this.fileNotDuplicated = this.checkFileExistance(obj);
|
|
280
|
+
if (this.fileNotDuplicated) {
|
|
281
|
+
this.addMultiAttachments(obj);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
reader.readAsDataURL(input.files[0]);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
if (this.multiple) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const emptyObj = {
|
|
292
|
+
mimeType: "",
|
|
293
|
+
fileContents: "",
|
|
294
|
+
fileName: "",
|
|
295
|
+
};
|
|
296
|
+
this.emit(emptyObj);
|
|
297
|
+
this.selectedTemplateAttachment.emit(null);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
this.allowedFileSize = false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
event.target.value = '';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
addAttachments() {
|
|
308
|
+
const data = {
|
|
309
|
+
"fileDescription": "",
|
|
310
|
+
"attachmentcomment": "",
|
|
311
|
+
"fileName": this.control.value.fileName,
|
|
312
|
+
"mimeType": this.control.value.mimeType,
|
|
313
|
+
"fileContents": this.control.value.fileContents,
|
|
314
|
+
};
|
|
315
|
+
this.uploading = true;
|
|
316
|
+
this.coreService.getAttachments(data).subscribe({
|
|
317
|
+
next: (form) => {
|
|
318
|
+
const newObj = {
|
|
319
|
+
"fileName": this.control.value.fileName,
|
|
320
|
+
"name": this.control.value.fileName,
|
|
321
|
+
"attachmentId": form.attachment.attachmentId,
|
|
322
|
+
"mimeType": form.attachment.mimeType
|
|
323
|
+
};
|
|
324
|
+
this.control.setValue(newObj);
|
|
325
|
+
this.uploading = false;
|
|
326
|
+
/*this.field = newObj
|
|
327
|
+
this.selectedTemplateAttachment.emit(this.field);
|
|
328
|
+
this.emit(this.field)*/
|
|
329
|
+
},
|
|
330
|
+
error: (err) => {
|
|
331
|
+
this.uploading = false;
|
|
332
|
+
/* this.noError = false;
|
|
333
|
+
this.loading['form'] = false
|
|
334
|
+
this.errorMessage = err?.error?.meta?.messages*/
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
addMultiAttachments(field) {
|
|
339
|
+
const data = {
|
|
340
|
+
"fileDescription": "",
|
|
341
|
+
"attachmentcomment": "",
|
|
342
|
+
"fileName": field.fileName,
|
|
343
|
+
"mimeType": field.mimeType,
|
|
344
|
+
"fileContents": field.fileContents,
|
|
345
|
+
};
|
|
346
|
+
this.uploading = true;
|
|
347
|
+
this.coreService.getAttachments(data).subscribe({
|
|
348
|
+
next: (form) => {
|
|
349
|
+
const newObj = {
|
|
350
|
+
"fileName": field.fileName,
|
|
351
|
+
"attachmentId": form.attachment.attachmentId,
|
|
352
|
+
"mimeType": field.mimeType
|
|
353
|
+
};
|
|
354
|
+
if (this.allowFileContentsWithMultiAttachments)
|
|
355
|
+
newObj['fileContents'] = field.fileContents;
|
|
356
|
+
this.displayedFiles = this.displayedFiles?.length ? this.displayedFiles : [];
|
|
357
|
+
this.displayedFiles.push(newObj);
|
|
358
|
+
this.allAttachments.push(newObj);
|
|
359
|
+
this.emit(this.displayedFiles);
|
|
360
|
+
this.control.setValue(newObj);
|
|
361
|
+
/*this.field = newObj
|
|
362
|
+
this.selectedTemplateAttachment.emit(this.field);
|
|
363
|
+
this.emit(this.field)*/
|
|
364
|
+
},
|
|
365
|
+
error: (err) => {
|
|
366
|
+
/* this.noError = false;
|
|
367
|
+
this.loading['form'] = false
|
|
368
|
+
this.errorMessage = err?.error?.meta?.messages*/
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
checkFileExistance(file) {
|
|
373
|
+
if (this.allAttachments?.length) {
|
|
374
|
+
return this.allAttachments?.findIndex(($file) => (file.fileName === $file.fileName)) === -1;
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
isValidMimeType(value) {
|
|
381
|
+
if (this.attachType == 'pdf') {
|
|
382
|
+
return [].concat(...Object.values(this.validPdfTypes)).includes(value);
|
|
383
|
+
}
|
|
384
|
+
else if (this.attachType == 'image') {
|
|
385
|
+
return [].concat(...Object.values(this.validImageTypes)).includes(value);
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
isValidExtension(value, type) {
|
|
392
|
+
if (type == 'image') {
|
|
393
|
+
return [].concat(...Object.keys(this.validImageTypes)).includes(value.toLowerCase());
|
|
394
|
+
}
|
|
395
|
+
else if (type == "imagePdf") {
|
|
396
|
+
return [].concat(...Object.keys(this.validImgPdfTypes)).includes(value.toLowerCase());
|
|
397
|
+
}
|
|
398
|
+
else if (type === "pdf") {
|
|
399
|
+
return [].concat(...Object.keys(this.validPdfTypes)).includes(value.toLowerCase());
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
return [].concat(...Object.keys(this.validFileTypes)).includes(value.toLowerCase());
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
removeAttachedFile() {
|
|
406
|
+
// this.field = this.value = new AttatchmentFile(null, null, null, null, null);
|
|
407
|
+
this.control.setValue(new AttatchmentFile(null, null, null, null, null));
|
|
408
|
+
if (this.inputFile) {
|
|
409
|
+
this.inputFile.nativeElement.value = null;
|
|
410
|
+
}
|
|
411
|
+
// this.controller.setValue(this.field);
|
|
412
|
+
this.emit(this.value);
|
|
413
|
+
this.selectedTemplateAttachment.emit(null);
|
|
414
|
+
}
|
|
415
|
+
downloadFile(event, field) {
|
|
416
|
+
this.coreService.loadFile(field.attachmentId).subscribe((responseObject) => {
|
|
417
|
+
const fileInformation = responseObject.body;
|
|
418
|
+
const fileBlob = this.coreService.dataURItoBlob(fileInformation.fileContents);
|
|
419
|
+
const file = new File([fileBlob], fileInformation.fileName, { type: fileInformation.mimeType });
|
|
420
|
+
const blobUrl = URL.createObjectURL(file);
|
|
421
|
+
const link = document.createElement('a');
|
|
422
|
+
link.href = blobUrl;
|
|
423
|
+
link.download = fileInformation.fileName;
|
|
424
|
+
link.click();
|
|
425
|
+
URL.revokeObjectURL(blobUrl);
|
|
426
|
+
}, error => {
|
|
427
|
+
this.toasterService.error(error.error?.['message']);
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
addSignature(event) {
|
|
431
|
+
const obj = {
|
|
432
|
+
type: 'openPopupDialog'
|
|
433
|
+
};
|
|
434
|
+
this.addSignatureClicked.emit(obj);
|
|
435
|
+
event?.stopPropagation();
|
|
436
|
+
event?.preventDefault();
|
|
437
|
+
}
|
|
438
|
+
printFileData(event) {
|
|
439
|
+
this.printActionClicked.emit({ event, field: this.control.value });
|
|
440
|
+
}
|
|
441
|
+
downloadFileData(event) {
|
|
442
|
+
this.downloadActionClicked.emit({ event, field: this.control.value });
|
|
443
|
+
}
|
|
444
|
+
getExtension(attachment) {
|
|
445
|
+
if (attachment) {
|
|
446
|
+
if (attachment.split('.').pop() == 'msg') {
|
|
447
|
+
return 'email-icon';
|
|
448
|
+
}
|
|
449
|
+
else if (attachment.split('.').pop() == 'jpeg') {
|
|
450
|
+
return 'jpg';
|
|
451
|
+
}
|
|
452
|
+
return attachment.split('.').pop();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
emit(value) {
|
|
456
|
+
if (this.preventFileContents) {
|
|
457
|
+
value = JSON.parse(JSON.stringify(value));
|
|
458
|
+
this.deleteFileContents(value);
|
|
459
|
+
}
|
|
460
|
+
// this.emitedValue.emit(value);
|
|
461
|
+
}
|
|
462
|
+
deleteFileContents(data) {
|
|
463
|
+
if (typeof data === 'object' && 'fileContents' in data) {
|
|
464
|
+
delete data.fileContents;
|
|
465
|
+
}
|
|
466
|
+
else if (Array.isArray(data)) {
|
|
467
|
+
data.forEach(elem => this.deleteFileContents(elem));
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DocsUploaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
471
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: DocsUploaderComponent, isStandalone: true, selector: "app-file-uploader", inputs: { useCrop: "useCrop", formKey: "formKey", showLabel: "showLabel", downloadLink: "downloadLink", showActions: "showActions", styleHeight: "styleHeight", fileInputHeight: "fileInputHeight", styleWidth: "styleWidth", hints: "hints", allowedExtensions: "allowedExtensions", callApi: "callApi", tooltip: "tooltip", attachments: "attachments", optional: "optional", display: "display", attachType: "attachType", error: "error", displayedFiles: "displayedFiles", getDataFromTemplate: "getDataFromTemplate", allowFileContentsWithMultiAttachments: "allowFileContentsWithMultiAttachments", accept: "accept", signType: "signType", showSignButton: "showSignButton", printType: "printType", showPrintButton: "showPrintButton", downloadType: "downloadType", showDownloadButton: "showDownloadButton", preventFileContents: "preventFileContents", maxSize: "maxSize" }, outputs: { selectedTemplateAttachment: "selectedTemplateAttachment", addSignatureClicked: "addSignatureClicked", printActionClicked: "printActionClicked", downloadActionClicked: "downloadActionClicked" }, providers: [
|
|
472
|
+
{
|
|
473
|
+
provide: NG_VALUE_ACCESSOR,
|
|
474
|
+
useExisting: forwardRef(() => DocsUploaderComponent),
|
|
475
|
+
multi: true,
|
|
476
|
+
},
|
|
477
|
+
], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!isReadOnly) {\r\n <ng-container>\r\n @if (label) {\r\n <div class=\"d-flex justify-content-between mb-1\">\r\n <span class=\"form-label mb-0\">{{ label }}</span>\r\n @if (!required) {\r\n <span class=\"fs-11 fc-dark-gray\">\r\n {{ i18n.translate('Optional') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n\r\n\r\n <section\r\n [ngClass]=\"insideTable ? 'file-uploader-table' : 'file-uploader'\" class=\" mb-2\"\r\n [class.insideTableStyle]=\"insideTable\">\r\n <div\r\n [ngClass]=\"insideTable ? 'file-uploader-table-dev' : ''\" class=\"file-uploader-input\"\r\n (click)=\"fileAttached.click()\">\r\n @if (!uploading) {\r\n <div class=\"icon mb-1\">\r\n <svg\r\n [ngClass]=\"insideTable ? 'file-uploader-table-svg' : ''\" width=\"41\" height=\"38\" viewBox=\"0 0 41 38\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0 22.1947V20.6736C0.0971303 20.1019 0.070094 19.5141 0.276371 18.9533C1.28372 16.2086 3.21231 14.5023 6.0421 13.8094C6.70499 13.6472 6.68497 13.6632 6.69899 12.9843C6.73203 11.3321 6.99839 9.71992 7.62423 8.17986C8.86289 5.13678 10.9467 2.83969 13.8816 1.39175C17.168 -0.230424 20.5956 -0.450719 24.0553 0.81598C27.4929 2.07467 29.9622 4.41581 31.4802 7.74828C31.7786 8.40316 32.027 9.08307 32.1712 9.79202C32.2402 10.1315 32.4035 10.2566 32.7529 10.3107C36.7012 10.9165 39.3358 13.1255 40.6946 16.8735C40.9069 17.4603 40.9199 18.0731 40.9599 18.6829C40.9649 18.7601 40.9389 18.8442 41 18.9113V20.5124C40.9109 20.995 40.969 21.4937 40.8608 21.9734C40.5244 23.4614 39.8454 24.7821 38.8501 25.9297C37.4522 27.5418 35.7059 28.5882 33.6161 29.0519C32.791 29.2351 31.9499 29.2521 31.1117 29.2922C30.6571 29.3142 30.584 29.193 30.592 28.7484C30.6451 25.8446 29.802 23.2571 27.8624 21.0591C25.9979 18.9463 23.6597 17.7167 20.867 17.4012C18.8553 17.1739 16.9057 17.4593 15.0612 18.3395C11.8319 19.8816 9.81416 22.4069 8.96102 25.8696C8.74273 26.7538 8.68265 27.658 8.70568 28.5702C8.7217 29.2111 8.60254 29.3122 7.95968 29.2972C5.95098 29.2511 4.10551 28.7234 2.58146 27.3596C1.07644 26.0168 0.0680913 24.3996 0.0400537 22.3028C0.0400537 22.2607 0.0250336 22.2257 0 22.1937V22.1947Z\"\r\n fill=\"#DEE0E2\"/>\r\n <path\r\n d=\"M29.0303 28.2632C29.0604 33.4031 24.8657 37.6187 19.6838 37.6548C14.5169 37.6908 10.2852 33.4952 10.2521 28.3042C10.2201 23.1403 14.4297 18.9126 19.6227 18.8946C24.8037 18.8766 28.9993 23.0542 29.0303 28.2632Z\"\r\n fill=\"#8E9AA0\"/>\r\n <path\r\n d=\"M20.5573 25.2644C20.4622 25.4477 20.5012 25.5939 20.5012 25.734C20.4982 28.2154 20.5002 30.6957 20.4982 33.177C20.4982 33.8099 20.2339 34.1704 19.7462 34.2234C19.2645 34.2765 18.88 33.9831 18.8169 33.5025C18.7959 33.3443 18.7969 33.183 18.7969 33.0238C18.7959 30.5826 18.7969 28.1423 18.7969 25.701C18.7969 25.5728 18.7969 25.4447 18.7969 25.2003C18.1971 25.8031 17.6774 26.3288 17.1527 26.8505C17.0115 26.9907 16.8683 27.1349 16.7061 27.2471C16.3566 27.4864 15.9341 27.4413 15.6457 27.154C15.3643 26.8746 15.3203 26.442 15.5486 26.0925C15.6207 25.9824 15.7128 25.8832 15.8069 25.7891C16.8613 24.7307 17.9167 23.6733 18.9732 22.6179C19.4017 22.1893 19.8784 22.1763 20.3039 22.5988C21.3914 23.6803 22.4739 24.7667 23.5533 25.8572C23.9809 26.2898 24.0129 26.8065 23.6534 27.167C23.299 27.5214 22.7753 27.4844 22.3437 27.0568C21.7499 26.47 21.1661 25.8732 20.5603 25.2644H20.5573Z\"\r\n fill=\"#F9F9F9\"/>\r\n </svg>\r\n </div>\r\n }\r\n @if (uploading) {\r\n <ds-icon class=\"sfi sfi-spinner d-inline-block spin fc-coral fs-30-imp\"></ds-icon>\r\n }\r\n\r\n <div class=\"f-14 fc-black fw-normal\">\r\n <span class=\"fc-coral fw-medium\">{{ i18n.translate('browse') }}</span>\r\n </div>\r\n <div class=\"fs-10 fc-dark-gray\">\r\n {{ allowedExtensions ? allowedExtensions : '' }}\r\n </div>\r\n\r\n <input type=\"file\" #inputFile [accept]=\"accept\" class=\"d-none\" #fileAttached (change)=\"onValueChange($event)\">\r\n </div>\r\n\r\n </section>\r\n\r\n @if (hints) {\r\n <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n @for (hint of hints; track hint) {\r\n <ng-container>\r\n <div class=\"d-flex align-items-center gap-1 fs-12\">\r\n <ds-icon\r\n icon=\"{{hint.valid ? 'check-circle-f' : 'check-circle-o'}}\"\r\n class=\"fs-24 {{hint.valid ? 'fc-green' : 'fc-dark-gray'}}\"></ds-icon>\r\n <span class=\"{{hint.valid ? 'fc-black' : 'fc-dark-gray'}}\">{{ hint.label }}</span>\r\n </div>\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hint) {\r\n <mat-hint class=\"d-flex align-items-center gap-1\">\r\n <ds-icon icon=\"info\" class=\"fs-17 fc-dark-gray\"></ds-icon>\r\n <span class=\"fs-12 fc-black line-height-1\">{{ hint }}</span>\r\n </mat-hint>\r\n }\r\n\r\n\r\n @if (multiple) {\r\n <section class=\"files-list\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [file]=\"file\"\r\n (downloadEvent)=\"attch('download',i,file)\"\r\n (deleteEvent)=\"attch('delete',i,file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n }\r\n\r\n </section>\r\n }\r\n\r\n @if (!multiple && (control.value?.fileContents || control.value?.attachmentId)) {\r\n <section class=\"files-list\">\r\n\r\n <!-- {{field | json }} -->\r\n <div class=\"file-item-container file-item-container-actions\">\r\n <ds-attachments\r\n [file]=\"control.value\"\r\n (downloadEvent)=\"attch('download',null,control.value)\"\r\n (deleteEvent)=\"attch('delete',null,control.value)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n\r\n\r\n </section>\r\n }\r\n <div class=\"attachments-error\">\r\n\r\n <!-- (!validExtension ) && !multiple -->\r\n @if ((!validExtension)) {\r\n <section class=\"files-list mt-2\">\r\n <div class=\"file-item-container \">\r\n <ds-attachments\r\n [file]=\"wrongFile\" error [showActions]=\"false\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n @if (!allowedFileSize) {\r\n <mat-error class=\"fs-12 my-2\">\r\n {{ maxSize === \"0.3\" ? i18n.translate('support3') : i18n.translate('support2') + maxSize + i18n.translate('mb') }}\r\n </mat-error>\r\n }\r\n @if ((!fileNotDuplicated)) {\r\n <mat-error class=\"fs-12 my-2\">{{ i18n.translate('duplicated-error') }}</mat-error>\r\n }\r\n @if (lengthError) {\r\n <mat-error class=\"fs-12\">{{ i18n.translate('lengthError') }} :{{ maxLength }}</mat-error>\r\n }\r\n @if (showErrorMessage) {\r\n <!-- <mat-error class=\"fs-12\">{{errorMessage}} </mat-error> -->\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n}\r\n\r\n\r\n@if (isReadOnly) {\r\n <ng-container>\r\n @if (multiple && displayedFiles) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n @if (displayedFiles?.length) {\r\n <span class=\"disc\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n class=\"my-2\" [file]=\"file\" readOnly (attachmentEvent)=\"downloadFile($event,file)\"\r\n [showActions]=\"showActions\">\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </div>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </span>\r\n }\r\n @if (!displayedFiles?.length) {\r\n <span class=\"disc\">\r\n {{ i18n.translate('NoAttachments') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n }\r\n\r\n @if (!multiple && (control.value?.attachmentId || control.value?.fileContents)) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n <div class=\"disc file-item-container file-item-container-actions\" [ngClass]=\"{'insideTableWidth':insideTable}\">\r\n @if (control.value?.attachmentId || control.value?.fileContents) {\r\n <ds-attachments\r\n [matTooltip]=\"control.value?.fileName\" [file]=\"control.value\" [showActions]=\"showActions\"\r\n (attachmentEvent)=\"attch($event,null,control.value)\" readOnly>\r\n </ds-attachments>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n }\r\n </ng-container>\r\n}\r\n\r\n<ng-template #attachmentCustomActions>\r\n @if (!isDisabled) {\r\n <div class=\"uploaded-file-actions\">\r\n @if (showSignButton) {\r\n <ds-button shape=\"outline\" (click)=\"addSignature($event)\" color=\"red\">\r\n {{ signType }}\r\n </ds-button>\r\n }\r\n @if (showDownloadButton) {\r\n <ds-button shape=\"outline\" (click)=\"downloadFileData($event)\" color=\"red\">\r\n {{ downloadType }}\r\n </ds-button>\r\n }\r\n\r\n @if (showDownloadButton) {\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n }\r\n @if (showPrintButton) {\r\n <ds-button shape=\"outline\" (click)=\"printFileData($event)\" color=\"red\">\r\n {{ printType }}\r\n </ds-button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n", styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer}.insideTableWidth{width:250px!important}.file-uploader-table{--uploader-height: 45PX;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 0 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;DISPLAY:FLEX;ALIGN-ITEMS:CENTER;JUSTIFY-CONTENT:CENTER}.file-uploader-table-dev{DISPLAY:FLEX;ALIGN-ITEMS:CENTER;GAP:1REM}.file-uploader-table-svg{width:70%}.insideTableStyle{width:272px}.files-list{--file-item-width: 300px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media (max-width: 768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.files-list .file-item-container .uploaded-file-actions{margin-inline-start:20px}.files-list .file-item-container .uploaded-file-actions .button__wrapper{font-size:15px}.files-list .file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.files-list .file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.files-list .file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.files-list .file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}.file-item-container-actions{display:flex;align-items:center}.file-item-container-actions .uploaded-file-actions{display:flex;align-items:center;gap:10px;margin-inline-start:25px}.file-item-container-actions .uploaded-file-actions .button__wrapper{font-size:15px}::ng-deep .file-item .name-size{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:120px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
|
|
478
|
+
}
|
|
479
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DocsUploaderComponent, decorators: [{
|
|
480
|
+
type: Component,
|
|
481
|
+
args: [{ selector: 'app-file-uploader', schemas: [CUSTOM_ELEMENTS_SCHEMA], standalone: true, imports: [
|
|
482
|
+
NgIf,
|
|
483
|
+
NgClass,
|
|
484
|
+
NgForOf,
|
|
485
|
+
MatError,
|
|
486
|
+
NgTemplateOutlet,
|
|
487
|
+
MatHint
|
|
488
|
+
], providers: [
|
|
489
|
+
{
|
|
490
|
+
provide: NG_VALUE_ACCESSOR,
|
|
491
|
+
useExisting: forwardRef(() => DocsUploaderComponent),
|
|
492
|
+
multi: true,
|
|
493
|
+
},
|
|
494
|
+
], template: "@if (!isReadOnly) {\r\n <ng-container>\r\n @if (label) {\r\n <div class=\"d-flex justify-content-between mb-1\">\r\n <span class=\"form-label mb-0\">{{ label }}</span>\r\n @if (!required) {\r\n <span class=\"fs-11 fc-dark-gray\">\r\n {{ i18n.translate('Optional') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n\r\n\r\n <section\r\n [ngClass]=\"insideTable ? 'file-uploader-table' : 'file-uploader'\" class=\" mb-2\"\r\n [class.insideTableStyle]=\"insideTable\">\r\n <div\r\n [ngClass]=\"insideTable ? 'file-uploader-table-dev' : ''\" class=\"file-uploader-input\"\r\n (click)=\"fileAttached.click()\">\r\n @if (!uploading) {\r\n <div class=\"icon mb-1\">\r\n <svg\r\n [ngClass]=\"insideTable ? 'file-uploader-table-svg' : ''\" width=\"41\" height=\"38\" viewBox=\"0 0 41 38\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0 22.1947V20.6736C0.0971303 20.1019 0.070094 19.5141 0.276371 18.9533C1.28372 16.2086 3.21231 14.5023 6.0421 13.8094C6.70499 13.6472 6.68497 13.6632 6.69899 12.9843C6.73203 11.3321 6.99839 9.71992 7.62423 8.17986C8.86289 5.13678 10.9467 2.83969 13.8816 1.39175C17.168 -0.230424 20.5956 -0.450719 24.0553 0.81598C27.4929 2.07467 29.9622 4.41581 31.4802 7.74828C31.7786 8.40316 32.027 9.08307 32.1712 9.79202C32.2402 10.1315 32.4035 10.2566 32.7529 10.3107C36.7012 10.9165 39.3358 13.1255 40.6946 16.8735C40.9069 17.4603 40.9199 18.0731 40.9599 18.6829C40.9649 18.7601 40.9389 18.8442 41 18.9113V20.5124C40.9109 20.995 40.969 21.4937 40.8608 21.9734C40.5244 23.4614 39.8454 24.7821 38.8501 25.9297C37.4522 27.5418 35.7059 28.5882 33.6161 29.0519C32.791 29.2351 31.9499 29.2521 31.1117 29.2922C30.6571 29.3142 30.584 29.193 30.592 28.7484C30.6451 25.8446 29.802 23.2571 27.8624 21.0591C25.9979 18.9463 23.6597 17.7167 20.867 17.4012C18.8553 17.1739 16.9057 17.4593 15.0612 18.3395C11.8319 19.8816 9.81416 22.4069 8.96102 25.8696C8.74273 26.7538 8.68265 27.658 8.70568 28.5702C8.7217 29.2111 8.60254 29.3122 7.95968 29.2972C5.95098 29.2511 4.10551 28.7234 2.58146 27.3596C1.07644 26.0168 0.0680913 24.3996 0.0400537 22.3028C0.0400537 22.2607 0.0250336 22.2257 0 22.1937V22.1947Z\"\r\n fill=\"#DEE0E2\"/>\r\n <path\r\n d=\"M29.0303 28.2632C29.0604 33.4031 24.8657 37.6187 19.6838 37.6548C14.5169 37.6908 10.2852 33.4952 10.2521 28.3042C10.2201 23.1403 14.4297 18.9126 19.6227 18.8946C24.8037 18.8766 28.9993 23.0542 29.0303 28.2632Z\"\r\n fill=\"#8E9AA0\"/>\r\n <path\r\n d=\"M20.5573 25.2644C20.4622 25.4477 20.5012 25.5939 20.5012 25.734C20.4982 28.2154 20.5002 30.6957 20.4982 33.177C20.4982 33.8099 20.2339 34.1704 19.7462 34.2234C19.2645 34.2765 18.88 33.9831 18.8169 33.5025C18.7959 33.3443 18.7969 33.183 18.7969 33.0238C18.7959 30.5826 18.7969 28.1423 18.7969 25.701C18.7969 25.5728 18.7969 25.4447 18.7969 25.2003C18.1971 25.8031 17.6774 26.3288 17.1527 26.8505C17.0115 26.9907 16.8683 27.1349 16.7061 27.2471C16.3566 27.4864 15.9341 27.4413 15.6457 27.154C15.3643 26.8746 15.3203 26.442 15.5486 26.0925C15.6207 25.9824 15.7128 25.8832 15.8069 25.7891C16.8613 24.7307 17.9167 23.6733 18.9732 22.6179C19.4017 22.1893 19.8784 22.1763 20.3039 22.5988C21.3914 23.6803 22.4739 24.7667 23.5533 25.8572C23.9809 26.2898 24.0129 26.8065 23.6534 27.167C23.299 27.5214 22.7753 27.4844 22.3437 27.0568C21.7499 26.47 21.1661 25.8732 20.5603 25.2644H20.5573Z\"\r\n fill=\"#F9F9F9\"/>\r\n </svg>\r\n </div>\r\n }\r\n @if (uploading) {\r\n <ds-icon class=\"sfi sfi-spinner d-inline-block spin fc-coral fs-30-imp\"></ds-icon>\r\n }\r\n\r\n <div class=\"f-14 fc-black fw-normal\">\r\n <span class=\"fc-coral fw-medium\">{{ i18n.translate('browse') }}</span>\r\n </div>\r\n <div class=\"fs-10 fc-dark-gray\">\r\n {{ allowedExtensions ? allowedExtensions : '' }}\r\n </div>\r\n\r\n <input type=\"file\" #inputFile [accept]=\"accept\" class=\"d-none\" #fileAttached (change)=\"onValueChange($event)\">\r\n </div>\r\n\r\n </section>\r\n\r\n @if (hints) {\r\n <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n @for (hint of hints; track hint) {\r\n <ng-container>\r\n <div class=\"d-flex align-items-center gap-1 fs-12\">\r\n <ds-icon\r\n icon=\"{{hint.valid ? 'check-circle-f' : 'check-circle-o'}}\"\r\n class=\"fs-24 {{hint.valid ? 'fc-green' : 'fc-dark-gray'}}\"></ds-icon>\r\n <span class=\"{{hint.valid ? 'fc-black' : 'fc-dark-gray'}}\">{{ hint.label }}</span>\r\n </div>\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hint) {\r\n <mat-hint class=\"d-flex align-items-center gap-1\">\r\n <ds-icon icon=\"info\" class=\"fs-17 fc-dark-gray\"></ds-icon>\r\n <span class=\"fs-12 fc-black line-height-1\">{{ hint }}</span>\r\n </mat-hint>\r\n }\r\n\r\n\r\n @if (multiple) {\r\n <section class=\"files-list\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [file]=\"file\"\r\n (downloadEvent)=\"attch('download',i,file)\"\r\n (deleteEvent)=\"attch('delete',i,file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n }\r\n\r\n </section>\r\n }\r\n\r\n @if (!multiple && (control.value?.fileContents || control.value?.attachmentId)) {\r\n <section class=\"files-list\">\r\n\r\n <!-- {{field | json }} -->\r\n <div class=\"file-item-container file-item-container-actions\">\r\n <ds-attachments\r\n [file]=\"control.value\"\r\n (downloadEvent)=\"attch('download',null,control.value)\"\r\n (deleteEvent)=\"attch('delete',null,control.value)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n\r\n\r\n </section>\r\n }\r\n <div class=\"attachments-error\">\r\n\r\n <!-- (!validExtension ) && !multiple -->\r\n @if ((!validExtension)) {\r\n <section class=\"files-list mt-2\">\r\n <div class=\"file-item-container \">\r\n <ds-attachments\r\n [file]=\"wrongFile\" error [showActions]=\"false\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n @if (!allowedFileSize) {\r\n <mat-error class=\"fs-12 my-2\">\r\n {{ maxSize === \"0.3\" ? i18n.translate('support3') : i18n.translate('support2') + maxSize + i18n.translate('mb') }}\r\n </mat-error>\r\n }\r\n @if ((!fileNotDuplicated)) {\r\n <mat-error class=\"fs-12 my-2\">{{ i18n.translate('duplicated-error') }}</mat-error>\r\n }\r\n @if (lengthError) {\r\n <mat-error class=\"fs-12\">{{ i18n.translate('lengthError') }} :{{ maxLength }}</mat-error>\r\n }\r\n @if (showErrorMessage) {\r\n <!-- <mat-error class=\"fs-12\">{{errorMessage}} </mat-error> -->\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n}\r\n\r\n\r\n@if (isReadOnly) {\r\n <ng-container>\r\n @if (multiple && displayedFiles) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n @if (displayedFiles?.length) {\r\n <span class=\"disc\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n class=\"my-2\" [file]=\"file\" readOnly (attachmentEvent)=\"downloadFile($event,file)\"\r\n [showActions]=\"showActions\">\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </div>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </span>\r\n }\r\n @if (!displayedFiles?.length) {\r\n <span class=\"disc\">\r\n {{ i18n.translate('NoAttachments') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n }\r\n\r\n @if (!multiple && (control.value?.attachmentId || control.value?.fileContents)) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n <div class=\"disc file-item-container file-item-container-actions\" [ngClass]=\"{'insideTableWidth':insideTable}\">\r\n @if (control.value?.attachmentId || control.value?.fileContents) {\r\n <ds-attachments\r\n [matTooltip]=\"control.value?.fileName\" [file]=\"control.value\" [showActions]=\"showActions\"\r\n (attachmentEvent)=\"attch($event,null,control.value)\" readOnly>\r\n </ds-attachments>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n }\r\n </ng-container>\r\n}\r\n\r\n<ng-template #attachmentCustomActions>\r\n @if (!isDisabled) {\r\n <div class=\"uploaded-file-actions\">\r\n @if (showSignButton) {\r\n <ds-button shape=\"outline\" (click)=\"addSignature($event)\" color=\"red\">\r\n {{ signType }}\r\n </ds-button>\r\n }\r\n @if (showDownloadButton) {\r\n <ds-button shape=\"outline\" (click)=\"downloadFileData($event)\" color=\"red\">\r\n {{ downloadType }}\r\n </ds-button>\r\n }\r\n\r\n @if (showDownloadButton) {\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n }\r\n @if (showPrintButton) {\r\n <ds-button shape=\"outline\" (click)=\"printFileData($event)\" color=\"red\">\r\n {{ printType }}\r\n </ds-button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n", styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer}.insideTableWidth{width:250px!important}.file-uploader-table{--uploader-height: 45PX;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 0 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;DISPLAY:FLEX;ALIGN-ITEMS:CENTER;JUSTIFY-CONTENT:CENTER}.file-uploader-table-dev{DISPLAY:FLEX;ALIGN-ITEMS:CENTER;GAP:1REM}.file-uploader-table-svg{width:70%}.insideTableStyle{width:272px}.files-list{--file-item-width: 300px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media (max-width: 768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.files-list .file-item-container .uploaded-file-actions{margin-inline-start:20px}.files-list .file-item-container .uploaded-file-actions .button__wrapper{font-size:15px}.files-list .file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.files-list .file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.files-list .file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.files-list .file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}.file-item-container-actions{display:flex;align-items:center}.file-item-container-actions .uploaded-file-actions{display:flex;align-items:center;gap:10px;margin-inline-start:25px}.file-item-container-actions .uploaded-file-actions .button__wrapper{font-size:15px}::ng-deep .file-item .name-size{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:120px}\n"] }]
|
|
495
|
+
}], propDecorators: { useCrop: [{
|
|
496
|
+
type: Input
|
|
497
|
+
}], formKey: [{
|
|
498
|
+
type: Input
|
|
499
|
+
}], showLabel: [{
|
|
500
|
+
type: Input
|
|
501
|
+
}], downloadLink: [{
|
|
502
|
+
type: Input
|
|
503
|
+
}], showActions: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], styleHeight: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], fileInputHeight: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}], styleWidth: [{
|
|
510
|
+
type: Input
|
|
511
|
+
}], hints: [{
|
|
512
|
+
type: Input
|
|
513
|
+
}], allowedExtensions: [{
|
|
514
|
+
type: Input
|
|
515
|
+
}], callApi: [{
|
|
516
|
+
type: Input
|
|
517
|
+
}], tooltip: [{
|
|
518
|
+
type: Input
|
|
519
|
+
}], attachments: [{
|
|
520
|
+
type: Input
|
|
521
|
+
}], optional: [{
|
|
522
|
+
type: Input
|
|
523
|
+
}], display: [{
|
|
524
|
+
type: Input
|
|
525
|
+
}], attachType: [{
|
|
526
|
+
type: Input
|
|
527
|
+
}], error: [{
|
|
528
|
+
type: Input
|
|
529
|
+
}], displayedFiles: [{
|
|
530
|
+
type: Input
|
|
531
|
+
}], selectedTemplateAttachment: [{
|
|
532
|
+
type: Output
|
|
533
|
+
}], getDataFromTemplate: [{
|
|
534
|
+
type: Input
|
|
535
|
+
}], allowFileContentsWithMultiAttachments: [{
|
|
536
|
+
type: Input
|
|
537
|
+
}], accept: [{
|
|
538
|
+
type: Input
|
|
539
|
+
}], signType: [{
|
|
540
|
+
type: Input
|
|
541
|
+
}], showSignButton: [{
|
|
542
|
+
type: Input
|
|
543
|
+
}], printType: [{
|
|
544
|
+
type: Input
|
|
545
|
+
}], showPrintButton: [{
|
|
546
|
+
type: Input
|
|
547
|
+
}], downloadType: [{
|
|
548
|
+
type: Input
|
|
549
|
+
}], showDownloadButton: [{
|
|
550
|
+
type: Input
|
|
551
|
+
}], preventFileContents: [{
|
|
552
|
+
type: Input
|
|
553
|
+
}], addSignatureClicked: [{
|
|
554
|
+
type: Output
|
|
555
|
+
}], printActionClicked: [{
|
|
556
|
+
type: Output
|
|
557
|
+
}], downloadActionClicked: [{
|
|
558
|
+
type: Output
|
|
559
|
+
}], maxSize: [{
|
|
560
|
+
type: Input
|
|
561
|
+
}], inputFile: [{
|
|
562
|
+
type: ViewChild,
|
|
563
|
+
args: ['inputFile']
|
|
564
|
+
}] } });
|
|
565
|
+
class AttatchmentFile {
|
|
566
|
+
fileName;
|
|
567
|
+
name;
|
|
568
|
+
mimeType;
|
|
569
|
+
fileContents;
|
|
570
|
+
filesize;
|
|
571
|
+
constructor(fileName, name, mimeType, fileContents, filesize) {
|
|
572
|
+
this.fileName = fileName;
|
|
573
|
+
this.name = name;
|
|
574
|
+
this.mimeType = mimeType;
|
|
575
|
+
this.fileContents = fileContents;
|
|
576
|
+
this.filesize = filesize;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC9kb2MtdXBsb2FkZXIvZG9jcy11cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC9kb2MtdXBsb2FkZXIvZG9jcy11cGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUMxRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCw0REFBNEQ7QUFDNUQsdURBQXVEO0FBQ3ZELHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0wsU0FBUyxFQUNULHNCQUFzQixFQUV0QixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE9BQU8sRUFBWSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0scUNBQXFDLENBQUM7O0FBMkJsRixNQUFNLE9BQU8scUJBQTRCLFNBQVEsNkJBQW1DO0lBQ2xGLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsWUFBWSxDQUFNO0lBQ2xCLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUNqQixPQUFPLENBQVU7SUFDakIsT0FBTyxDQUFVO0lBQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ25CLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxlQUFlO0lBQ2pDLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQyxlQUFlO0lBQ3JDLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDakIsS0FBSyxDQUFPO0lBQ1osaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sQ0FBVTtJQUNqQixPQUFPLENBQVU7SUFDakIsV0FBVyxDQUFTO0lBQ3BCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUN0QixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ2IsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLENBQVU7SUFDZixjQUFjLEdBQW1CLEVBQUUsQ0FBQztJQUNuQywwQkFBMEIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzFELGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QixlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2QsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQzVCLHFDQUFxQyxHQUFHLEtBQUssQ0FBQztJQUM5QyxNQUFNLENBQVc7SUFDMUIsUUFBUSxDQUFTO0lBQ2pCLFNBQVMsR0FBRztRQUNWLFFBQVEsRUFBRSxFQUFFO1FBQ1osWUFBWSxFQUFFLEVBQUU7UUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtLQUNyRixDQUFBO0lBQ0QsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUVwQixVQUFVLENBQVk7SUFDYixRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQ2xCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUNwQixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDMUIsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUMzQixtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3pDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDeEMscUJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM1QyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ0EsU0FBUyxDQUFhO0lBQzlDLE1BQU0sQ0FBVztJQUdBLGVBQWUsR0FBRztRQUNqQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ2xDLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUNuQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDbkIsQ0FBQTtJQUVELGdCQUFnQixHQUFHO1FBQ2pCLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQ3hCLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7UUFDbEMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUNsQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ25DLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQztRQUN6QyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDbkIsQ0FBQTtJQUVELGNBQWMsR0FBRztRQUNmLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQzFCLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDO1FBQzdCLE1BQU0sRUFBRSxDQUFDLHlFQUF5RSxDQUFDO1FBQ25GLEtBQUssRUFBRSxDQUFDLCtCQUErQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxDQUFDLDJFQUEyRSxDQUFDO1FBQ3JGLEtBQUssRUFBRSxDQUFDLCtCQUErQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxDQUFDLHdFQUF3RSxDQUFDO1FBQ2xGLEtBQUssRUFBRSxDQUFDLHlDQUF5QyxDQUFDO1FBQ2xELEtBQUssRUFBRSxDQUFDLDBCQUEwQixDQUFDO1FBQ25DLE1BQU0sRUFBRSxDQUFDLG1FQUFtRSxDQUFDO1FBQzdFLEtBQUssRUFBRSxDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO1FBQ2hHLEtBQUssRUFBRSxDQUFDLDRCQUE0QixFQUFFLGlCQUFpQixDQUFDO1FBQ3hELEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNuQixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNyQix3QkFBd0I7UUFDeEIsd0JBQXdCO1FBQ3hCLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQzFCLEtBQUssRUFBRSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pCLDhCQUE4QjtRQUM5QixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDZCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEIsd0JBQXdCO1FBQ3hCLHVDQUF1QztRQUN2Qyx3Q0FBd0M7UUFDeEMsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUNwQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ3JDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNwQixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDcEIsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLHFCQUFxQixDQUFDO0tBQzVDLENBQUE7SUFHZ0IsYUFBYSxHQUFHO1FBQy9CLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQzNCLENBQUE7SUFDRCxTQUFTLENBQVU7SUFDbkIsV0FBVyxDQUFVO0lBQ3JCLFdBQVcsQ0FBVTtJQUVyQixXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQjs7OztXQUlPO0lBRVAsSUFBSTtJQUVKLG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFFBQVEsR0FBRztvQkFDZixRQUFRLEVBQUUsRUFBRTtvQkFDWixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsUUFBUSxFQUFFLEVBQUU7aUJBQ2IsQ0FBQTtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNuQixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxVQUFlO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsY0FBc0I7UUFDMUMsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdDLE9BQU8sWUFBWSxDQUFBO1FBQ3JCLENBQUM7YUFBTSxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO2FBQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLE1BQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ2pHLE9BQU8sd0NBQXdDLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVMsRUFBRSxLQUFhLEVBQUUsS0FBVTtRQUN4QyxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO3FCQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUMzQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWE7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDeEQsVUFBVSxFQUFFLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDO1lBQzVDLGNBQWMsRUFBRSxJQUFJLGtCQUFrQixFQUFFO1NBQ3pDLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNoRCxJQUFJLFdBQVcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZUFBZSxDQUFDLFFBQWE7UUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1FBQ2pFLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDM0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxVQUFVO1lBQ2pFLENBQUM7WUFFRCxNQUFNLElBQUksR0FBUyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLFFBQVEsQ0FBQTtZQUNaLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsUUFBUSxHQUFHLDRCQUE0QixDQUFBO1lBQ3pDLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN4RSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxPQUFPO2dCQUNULENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUN2RSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBRWxELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRWxFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3RixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7b0JBQzVCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN4QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOzRCQUM3QixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM5QyxDQUFDO3dCQUNELE1BQU0sR0FBRyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ2xILElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDbkgsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7NEJBQ25CLEdBQUcsQ0FBQyxZQUFZLEdBQUksTUFBTSxDQUFDLE1BQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMzRCxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7NEJBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQ0FDNUIsT0FBTztnQ0FDVCxDQUFDO2dDQUNELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dDQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQ0FDakIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dDQUN2QixDQUFDO3FDQUFNLENBQUM7b0NBQ04sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDOUMsQ0FBQzs0QkFDSCxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDdEQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQ0FDM0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFBO2dDQUMvQixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQyxDQUFDO3dCQUNGLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO3lCQUFNLENBQUM7d0JBRU4sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ2xCLE9BQU07d0JBQ1IsQ0FBQzt3QkFDRCxNQUFNLFFBQVEsR0FBRzs0QkFDZixRQUFRLEVBQUUsRUFBRTs0QkFDWixZQUFZLEVBQUUsRUFBRTs0QkFDaEIsUUFBUSxFQUFFLEVBQUU7eUJBQ2IsQ0FBQTt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO3dCQUNuQixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QyxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDL0IsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxJQUFJLEdBQUc7WUFDWCxpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLG1CQUFtQixFQUFFLEVBQUU7WUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFDdkMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFDdkMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVk7U0FDaEQsQ0FBQTtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5QyxJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDbEIsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVE7b0JBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRO29CQUNuQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZO29CQUM1QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO2lCQUNyQyxDQUFBO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkI7O3VDQUV1QjtZQUN6QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCOztpRUFFaUQ7WUFDbkQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLE1BQU0sSUFBSSxHQUFHO1lBQ1gsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMxQixVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDMUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxZQUFZO1NBQ25DLENBQUE7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUMsSUFBSSxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2xCLE1BQU0sTUFBTSxHQUFHO29CQUNiLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtvQkFDMUIsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWTtvQkFDNUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRO2lCQUMzQixDQUFBO2dCQUNELElBQUksSUFBSSxDQUFDLHFDQUFxQztvQkFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDNUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO2dCQUM1RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDN0I7O3VDQUV1QjtZQUN6QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2I7O2lFQUVpRDtZQUNuRCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELGtCQUFrQixDQUFDLElBQXFCO1FBQ3RDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdCLE9BQVEsRUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxFQUFFLENBQUM7WUFDdEMsT0FBUSxFQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekYsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDMUMsSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7WUFDcEIsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQzthQUFNLElBQUksSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3hFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDNUMsQ0FBQztRQUNELHdDQUF3QztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUs7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FDckQsQ0FBQyxjQUE4QixFQUFFLEVBQUU7WUFDakMsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUNsRCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBWTtRQUN2QixNQUFNLEdBQUcsR0FBRztZQUNWLElBQUksRUFBRSxpQkFBaUI7U0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVU7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQWU7UUFDMUIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxZQUFZLENBQUE7WUFDckIsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ2pELE9BQU8sS0FBSyxDQUFBO1lBQ2QsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLElBQUksQ0FBSSxLQUFjO1FBQzVCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsZ0NBQWdDO0lBQ2xDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFpQjtRQUMxQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7dUdBM2RVLHFCQUFxQjsyRkFBckIscUJBQXFCLHltQ0FSckI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO2dCQUNwRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsOEtDaERILDhoVkFzT0EseW5GRGxNSSxPQUFPLG9GQUVQLFFBQVEsa0ZBQ1IsZ0JBQWdCLG9KQUNoQixPQUFPOzsyRkFVRSxxQkFBcUI7a0JBdEJqQyxTQUFTOytCQUNFLG1CQUFtQixXQUdwQixDQUFDLHNCQUFzQixDQUFDLGNBQ3JCLElBQUksV0FDUDt3QkFDUCxJQUFJO3dCQUNKLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLGdCQUFnQjt3QkFDaEIsT0FBTztxQkFDUixhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDOzRCQUNwRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs4QkFNUSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUdFLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQ0FBcUM7c0JBQTdDLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQVVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNFLE9BQU87c0JBQWYsS0FBSztnQkFDa0IsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXOztBQTZheEIsTUFBTSxlQUFlO0lBRVY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUxULFlBQ1MsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLFFBQWdCO1FBSmhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUNyQixDQUFDO0NBQ04iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlbGV0ZURpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9kZWxldGUtZGlhbG9nL2RlbGV0ZS1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHtOb29wU2Nyb2xsU3RyYXRlZ3l9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3VzZS1saWZlY3ljbGUtaW50ZXJmYWNlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQge0RvY3VtZW50RmlsZX0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7Rm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge05nQ2xhc3MsIE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRFcnJvciwgTWF0SGludH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvckRpcmVjdGl2ZX0gZnJvbSAnLi4vY29udHJvbC12YWx1ZS1hY2Nlc3Nvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtTYWZlVXJsfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWZpbGUtdXBsb2FkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NzLXVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kb2NzLXVwbG9hZGVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdJZixcclxuICAgIE5nQ2xhc3MsXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTWF0RXJyb3IsXHJcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxyXG4gICAgTWF0SGludFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEb2NzVXBsb2FkZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG9jc1VwbG9hZGVyQ29tcG9uZW50PFR5cGU+IGV4dGVuZHMgQ29udHJvbFZhbHVlQWNjZXNzb3JEaXJlY3RpdmU8VHlwZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgbWF4U2l6ZUZsYWcgPSB0cnVlO1xyXG4gIG1heFNpemVWYWx1ZTogYW55O1xyXG4gIHdyb25nRXh0ZW5zaW9uRmxhZyA9IHRydWU7XHJcbiAgQElucHV0KCkgdXNlQ3JvcDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBmb3JtS2V5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dMYWJlbCA9IHRydWU7XHJcbiAgQElucHV0KCkgZG93bmxvYWRMaW5rID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbnMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHN0eWxlSGVpZ2h0ID0gJyc7IC8vIG1lZGl1bSwgbWluaVxyXG4gIEBJbnB1dCgpIGZpbGVJbnB1dEhlaWdodCA9ICcnOyAvLyBtZWRpdW0sIG1pbmlcclxuICBASW5wdXQoKSBzdHlsZVdpZHRoID0gJzYnO1xyXG4gIEBJbnB1dCgpIGhpbnRzITogYW55O1xyXG4gIEBJbnB1dCgpIGFsbG93ZWRFeHRlbnNpb25zID0gJyc7XHJcbiAgQElucHV0KCkgY2FsbEFwaTogYm9vbGVhbjtcclxuICBASW5wdXQoKSB0b29sdGlwITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRzITogYW55W107XHJcbiAgQElucHV0KCkgb3B0aW9uYWwgPSBmYWxzZTtcclxuICBASW5wdXQoKSBkaXNwbGF5ID0gJyc7XHJcbiAgdmFsaWRFeHRlbnNpb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGF0dGFjaFR5cGUgPSAnJztcclxuICBASW5wdXQoKSBlcnJvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNwbGF5ZWRGaWxlczogRG9jdW1lbnRGaWxlW10gPSBbXTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRUZW1wbGF0ZUF0dGFjaG1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgZmlsZU5vdER1cGxpY2F0ZWQgPSB0cnVlO1xyXG4gIGFsbG93ZWRGaWxlU2l6ZSA9IHRydWU7XHJcbiAgQElucHV0KCkgZ2V0RGF0YUZyb21UZW1wbGF0ZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFsbG93RmlsZUNvbnRlbnRzV2l0aE11bHRpQXR0YWNobWVudHMgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZ1tdO1xyXG4gIGZpbGVzaXplOiBzdHJpbmc7XHJcbiAgd3JvbmdGaWxlID0ge1xyXG4gICAgbWltZVR5cGU6IFwiXCIsXHJcbiAgICBmaWxlQ29udGVudHM6IFwiXCIsXHJcbiAgICBmaWxlTmFtZTogdGhpcy5pMThuLmxhbmd1YWdlID09ICdhcicgPyBcItin2YXYqtiv2KfYryDYp9mE2YXZhNmBINiu2KfYt9mJ2KFcIiA6IFwiV3JvbmcgRmlsZSBFeHRlbnNpb25cIlxyXG4gIH1cclxuICBhbGxBdHRhY2htZW50cyA9IFtdO1xyXG5cclxuICB1cGxvYWRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgc2lnblR5cGUgPSAnU2lnbic7XHJcbiAgQElucHV0KCkgc2hvd1NpZ25CdXR0b24gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwcmludFR5cGUgPSAnUHJpbnQnO1xyXG4gIEBJbnB1dCgpIHNob3dQcmludEJ1dHRvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRvd25sb2FkVHlwZSA9ICdEb3dubG9hZCc7XHJcbiAgQElucHV0KCkgc2hvd0Rvd25sb2FkQnV0dG9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHJldmVudEZpbGVDb250ZW50cyA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBhZGRTaWduYXR1cmVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBwcmludEFjdGlvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRvd25sb2FkQWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBtYXhTaXplID0gJzEwJztcclxuICBAVmlld0NoaWxkKCdpbnB1dEZpbGUnKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbiAgZGlhbG9nOiBNYXREaWFsb2dcclxuXHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRJbWFnZVR5cGVzID0ge1xyXG4gICAganBnOiBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXSxcclxuICAgIEpQRzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBqcGVnOiBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXSxcclxuICAgIHBuZzogWydpbWFnZS9wbmcnXVxyXG4gIH1cclxuXHJcbiAgdmFsaWRJbWdQZGZUeXBlcyA9IHtcclxuICAgIHBkZjogWydhcHBsaWNhdGlvbi9wZGYnXSxcclxuICAgIGpwZzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBKUEc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAganBlZzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBibXA6IFsnaW1hZ2UvYm1wJywgJ2ltYWdlL3gtd2luZG93cy1ibXAnXSxcclxuICAgIHBuZzogWydpbWFnZS9wbmcnXVxyXG4gIH1cclxuXHJcbiAgdmFsaWRGaWxlVHlwZXMgPSB7XHJcbiAgICAncGRmJzogWydhcHBsaWNhdGlvbi9wZGYnXSxcclxuICAgICdkb2MnOiBbJ2FwcGxpY2F0aW9uL21zd29yZCddLFxyXG4gICAgJ2RvY3gnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50J10sXHJcbiAgICAncHB0JzogWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCddLFxyXG4gICAgJ3BwdHgnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcclxuICAgICdwcHMnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXHJcbiAgICAncHBzeCc6IFsnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyddLFxyXG4gICAgJ29kdCc6IFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0J10sXHJcbiAgICAneGxzJzogWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcclxuICAgICd4bHN4JzogWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCddLFxyXG4gICAgJ3ppcCc6IFsnYXBwbGljYXRpb24vemlwJywgJ2FwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQnLCAnbXVsdGlwYXJ0L3gtemlwJywgJ2FwcGxpY2F0aW9uL3ppcCddLFxyXG4gICAgJ21zZyc6IFsnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snLCAnYXBwbGljYXRpb24vbXNnJ10sXHJcbiAgICAnY3N2JzogWyd0ZXh0L2NzdiddLFxyXG4gICAgJ3R4dCc6IFsndGV4dC9wbGFpbiddLFxyXG4gICAgJ3J0Zic6IFsnYXBwbGljYXRpb24vcnRmJywgJ2FwcGxpY2F0aW9uL3gtcnRmJywgJ3RleHQvcmljaHRleHQnXSxcclxuICAgICdodG1sJzogWyd0ZXh0L2h0bWwnXSxcclxuICAgIC8vICdtcDQnOiBbJ3ZpZGVvL21wNCddLFxyXG4gICAgLy8gJ200dic6IFsndmlkZW8vbXA0J10sXHJcbiAgICAnbW92JzogWyd2aWRlby9xdWlja3RpbWUnXSxcclxuICAgICd3bXYnOiBbJ3ZpZGVvL3gtbXMtd212J10sXHJcbiAgICAvLyAnYXZpJzogWyd2aWRlby94LW1zdmlkZW8nXSxcclxuICAgICdtcGcnOiBbJ21wZyddLFxyXG4gICAgJ3JtdmInOiBbJ3JtdmInXSxcclxuICAgIC8vICdvZ3YnOiBbJ3ZpZGVvL29nZyddLFxyXG4gICAgLy8gJzNncCc6IFsndmlkZW8vM2dwcCcsICdhdWRpby8zZ3BwJ10sXHJcbiAgICAvLyAnM2cyJzogWyd2aWRlby8zZ3BwMicsICdhdWRpby8zZ3BwJ10sXHJcbiAgICAnanBnJzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICAnanBlZyc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAgJ3BuZyc6IFsnaW1hZ2UvcG5nJ10sXHJcbiAgICAnZ2lmJzogWydpbWFnZS9naWYnXSxcclxuICAgICdibXAnOiBbJ2ltYWdlL2JtcCcsICdpbWFnZS94LXdpbmRvd3MtYm1wJ11cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkUGRmVHlwZXMgPSB7XHJcbiAgICAncGRmJzogWydhcHBsaWNhdGlvbi9wZGYnXSxcclxuICB9XHJcbiAgdXBsb2FkaW5nOiBib29sZWFuO1xyXG4gIGxlbmd0aEVycm9yOiBib29sZWFuO1xyXG4gIGRvd25sb2FkVXJsOiBTYWZlVXJsO1xyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdHRhY2htZW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYWxsQXR0YWNobWVudHMgPSBbLi4udGhpcy5hdHRhY2htZW50c107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvKiAgdGhpcy5yZXNldFByb3BhZ2F0b3Iuc3Vic2NyaWJlKHRoaXMsIHRoaXMucmVzZXRBdHRhY2htZW50RGF0YSk7XHJcbiAgICB0aGlzLnVwbG9hZEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZmlsZTogWycnXSxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICB9KTsqL1xyXG5cclxuICAvLyB9XHJcblxyXG4gIHJlc2V0QXR0YWNobWVudERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNSZWFkT25seSkge1xyXG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkRmlsZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmFsbEF0dGFjaG1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5lbWl0KHRoaXMuZGlzcGxheWVkRmlsZXMpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZW1wdHlPYmogPSB7XHJcbiAgICAgICAgICBtaW1lVHlwZTogXCJcIixcclxuICAgICAgICAgIGZpbGVDb250ZW50czogXCJcIixcclxuICAgICAgICAgIGZpbGVOYW1lOiBcIlwiLFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoZW1wdHlPYmopXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlVHlwZShhdHRhY2htZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFhdHRhY2htZW50LmZpbGVOYW1lPy5pbmNsdWRlcygnLicpICYmIGF0dGFjaG1lbnQubWltZVR5cGUuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGVja0ZpbGVUeXBlKGF0dGFjaG1lbnQubWltZVR5cGUpO1xyXG4gICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmZpbGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrRmlsZVR5cGUoYXR0YWNobWVudC5maWxlTmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYXR0YWNobWVudC5taW1lVHlwZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tGaWxlVHlwZShhdHRhY2htZW50RGF0YTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChhdHRhY2htZW50RGF0YS5zcGxpdCgnLicpLnBvcCgpID09ICdtc2cnKSB7XHJcbiAgICAgIHJldHVybiAnZW1haWwtaWNvbidcclxuICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudERhdGEuc3BsaXQoJy4nKS5wb3AoKSA9PSAnanBlZycpIHtcclxuICAgICAgcmV0dXJuICdqcGcnXHJcbiAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnREYXRhLnNwbGl0KCcuJykucG9wKCkgPT0gJ3hsc3gnIHx8IGF0dGFjaG1lbnREYXRhLnNwbGl0KCcuJykucG9wKCkgPT0gJ3hscycpIHtcclxuICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWw7Y2hhcnNldD11dGYtOCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXR0YWNobWVudERhdGEuc3BsaXQoJy4nKS5wb3AoKTtcclxuICB9XHJcblxyXG4gIGF0dGNoKHR5cGU6IGFueSwgaW5kZXg6IG51bWJlciwgZmllbGQ6IGFueSkge1xyXG4gICAgaWYgKHR5cGUgPT0gXCJkb3dubG9hZFwiKSB7XHJcbiAgICAgIGlmICh0aGlzLmRvd25sb2FkTGluaykge1xyXG4gICAgICAgIHdpbmRvdy5vcGVuKGZpZWxkPy5hdHRhY2htZW50SWQsICdfYmxhbmsnLCAndG9wPTAsbGVmdD0wLGhlaWdodD1hdXRvLHdpZHRoPWF1dG8nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuYXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgICB0aGlzLmRvd25sb2FkRmlsZSh0eXBlLCBmaWVsZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZCAmJiBmaWVsZC5maWxlQ29udGVudHMpIHtcclxuICAgICAgICAgIHRoaXMuZG93bmxvYWRGaWxlTmV3KGZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlID09IFwiZGVsZXRlXCIpIHtcclxuICAgICAgaWYgKHRoaXMudmFsaWRFeHRlbnNpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgdGhpcy5jb25maXJtRGVsZXRlKGluZGV4KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dGFjaGVkRmlsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsaWRFeHRlbnNpb24gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnbWFpbi1wb3B1cCcsICdjb25maXJtLWRpYWxvZyddLFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogbmV3IE5vb3BTY3JvbGxTdHJhdGVneSgpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXR1cm5WYWx1ZSkgPT4ge1xyXG4gICAgICBpZiAocmV0dXJuVmFsdWUgPT0gJ3llcycpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZU11bHRpKGluZGV4KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU11bHRpKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlzcGxheWVkRmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuYWxsQXR0YWNobWVudHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkRmlsZU5ldyhmaWxlRGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBmaWxlVHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGUoZmlsZURhdGEpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlRGF0YS5maWxlQ29udGVudHNdLCB7dHlwZTogZmlsZVR5cGV9KTtcclxuICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7ZmlsZURhdGEuZmlsZU5hbWV9YCk7XHJcbiAgfVxyXG5cclxuICBvblZhbHVlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudD8udGFyZ2V0Py5maWxlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5mb3JtS2V5ID09ICdUU1YnKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGlucHV0LmZpbGVzWzBdKSAvLy8vLyB0ZXN0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICAgIGxldCBmaWxlVHlwZVxyXG4gICAgICBpZiAoZmlsZS5uYW1lICE9PSBudWxsICYmIGZpbGUubmFtZSAhPT0gdW5kZWZpbmVkICYmIGZpbGUubmFtZS5lbmRzV2l0aChcIi5tc2dcIikpIHtcclxuICAgICAgICBmaWxlVHlwZSA9ICdhcHBsaWNhdGlvbi92bmQubXMtb3V0bG9vaydcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5hY2NlcHQ/Lmxlbmd0aCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hY2NlcHQuaW5jbHVkZXMoZmlsZS50eXBlKSAmJiAhdGhpcy5hY2NlcHQuaW5jbHVkZXMoZmlsZVR5cGUpKSB7XHJcbiAgICAgICAgICBhbGVydCh0aGlzLmkxOG4udHJhbnNsYXRlKCd0aGlzSXNJbnZhbGlkRmlsZScpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGxvYWRGb3JtPy5nZXQoJ2ZpbGUnKT8uc2V0VmFsdWUoZmlsZSk7XHJcbiAgICAgIHRoaXMudXBsb2FkRm9ybT8uZ2V0KCduYW1lJyk/LnNldFZhbHVlKGZpbGU/Lm5hbWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnVwbG9hZGluZykge1xyXG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgaWYgKHRoaXMubWF4U2l6ZSkge1xyXG4gICAgICAgIHRoaXMuZmlsZXNpemUgPSAoKGlucHV0LmZpbGVzWzBdLnNpemUgLyAxMDI0KSAvIDEwMjQpLnRvRml4ZWQoNCk7IC8vIE1CXHJcbiAgICAgICAgdGhpcy5tYXhTaXplVmFsdWUgPSB0aGlzLm1heFNpemU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWxlc2l6ZSA9ICgoaW5wdXQuZmlsZXNbMF0uc2l6ZSAvIDEwMjQpIC8gMTAyNCkudG9GaXhlZCg0KTsgLy8gTUJcclxuICAgICAgICB0aGlzLm1heFNpemVWYWx1ZSA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXhTaXplRmxhZyA9ICt0aGlzLmZpbGVzaXplIDwgK3RoaXMubWF4U2l6ZTtcclxuXHJcbiAgICAgIHRoaXMubGVuZ3RoRXJyb3IgPSB0aGlzLmRpc3BsYXllZEZpbGVzPy5sZW5ndGggPj0gK3RoaXMubWF4TGVuZ3RoO1xyXG5cclxuICAgICAgdGhpcy53cm9uZ0V4dGVuc2lvbkZsYWcgPSB0aGlzLmlzVmFsaWRNaW1lVHlwZShpbnB1dC5maWxlc1swXS50eXBlKTtcclxuICAgICAgdGhpcy52YWxpZEV4dGVuc2lvbiA9IHRoaXMuaXNWYWxpZEV4dGVuc2lvbihpbnB1dC5maWxlc1swXS5uYW1lLnNwbGl0KCcuJykucG9wKCksIHRoaXMudHlwZSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMubGVuZ3RoRXJyb3IpIHtcclxuICAgICAgICBpZiAoK3RoaXMuZmlsZXNpemUgPCArdGhpcy5tYXhTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLmFsbG93ZWRGaWxlU2l6ZSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy52YWxpZEV4dGVuc2lvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXREYXRhRnJvbVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBvYmogPSBuZXcgQXR0YXRjaG1lbnRGaWxlKGlucHV0LmZpbGVzWzBdLm5hbWUsIGlucHV0LmZpbGVzWzBdLm5hbWUsIGlucHV0LmZpbGVzWzBdLnR5cGUsICcnLCB0aGlzLmZpbGVzaXplKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBdHRhdGNobWVudEZpbGUoaW5wdXQuZmlsZXNbMF0ubmFtZSwgaW5wdXQuZmlsZXNbMF0ubmFtZSwgaW5wdXQuZmlsZXNbMF0udHlwZSwgJycsIHRoaXMuZmlsZXNpemUpO1xyXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIG9iai5maWxlQ29udGVudHMgPSAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpLnNwbGl0KCcsJylbMV07XHJcbiAgICAgICAgICAgICAgb2JqLmZpbGVzaXplID0gdGhpcy5maWxlc2l6ZTtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5vdER1cGxpY2F0ZWQgPSB0aGlzLmNoZWNrRmlsZUV4aXN0YW5jZShvYmopO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVOb3REdXBsaWNhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuZmlsZUNvbnRlbnRzID0gKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKS5zcGxpdCgnLCcpWzFdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMudmFsdWUpXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsQXBpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQXR0YWNobWVudHMoKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTm90RHVwbGljYXRlZCA9IHRoaXMuY2hlY2tGaWxlRXhpc3RhbmNlKG9iaik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxlTm90RHVwbGljYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZE11bHRpQXR0YWNobWVudHMob2JqKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoaW5wdXQuZmlsZXNbMF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZW1wdHlPYmogPSB7XHJcbiAgICAgICAgICAgICAgbWltZVR5cGU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnRzOiBcIlwiLFxyXG4gICAgICAgICAgICAgIGZpbGVOYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChlbXB0eU9iailcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KG51bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFsbG93ZWRGaWxlU2l6ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQXR0YWNobWVudHMoKSB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBcImZpbGVEZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICBcImF0dGFjaG1lbnRjb21tZW50XCI6IFwiXCIsXHJcbiAgICAgIFwiZmlsZU5hbWVcIjogdGhpcy5jb250cm9sLnZhbHVlLmZpbGVOYW1lLFxyXG4gICAgICBcIm1pbWVUeXBlXCI6IHRoaXMuY29udHJvbC52YWx1ZS5taW1lVHlwZSxcclxuICAgICAgXCJmaWxlQ29udGVudHNcIjogdGhpcy5jb250cm9sLnZhbHVlLmZpbGVDb250ZW50cyxcclxuICAgIH1cclxuICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29yZVNlcnZpY2UuZ2V0QXR0YWNobWVudHMoZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGZvcm06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcclxuICAgICAgICAgIFwiZmlsZU5hbWVcIjogdGhpcy5jb250cm9sLnZhbHVlLmZpbGVOYW1lLFxyXG4gICAgICAgICAgXCJuYW1lXCI6IHRoaXMuY29udHJvbC52YWx1ZS5maWxlTmFtZSxcclxuICAgICAgICAgIFwiYXR0YWNobWVudElkXCI6IGZvcm0uYXR0YWNobWVudC5hdHRhY2htZW50SWQsXHJcbiAgICAgICAgICBcIm1pbWVUeXBlXCI6IGZvcm0uYXR0YWNobWVudC5taW1lVHlwZVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobmV3T2JqKVxyXG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgLyp0aGlzLmZpZWxkID0gbmV3T2JqXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KHRoaXMuZmllbGQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmZpZWxkKSovXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAvKiB0aGlzLm5vRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgdGhpcy5sb2FkaW5nWydmb3JtJ10gPSBmYWxzZVxyXG4gICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycj8uZXJyb3I/Lm1ldGE/Lm1lc3NhZ2VzKi9cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNdWx0aUF0dGFjaG1lbnRzKGZpZWxkOiBhbnkpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIFwiZmlsZURlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgIFwiYXR0YWNobWVudGNvbW1lbnRcIjogXCJcIixcclxuICAgICAgXCJmaWxlTmFtZVwiOiBmaWVsZC5maWxlTmFtZSxcclxuICAgICAgXCJtaW1lVHlwZVwiOiBmaWVsZC5taW1lVHlwZSxcclxuICAgICAgXCJmaWxlQ29udGVudHNcIjogZmllbGQuZmlsZUNvbnRlbnRzLFxyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb3JlU2VydmljZS5nZXRBdHRhY2htZW50cyhkYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZm9ybTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV3T2JqID0ge1xyXG4gICAgICAgICAgXCJmaWxlTmFtZVwiOiBmaWVsZC5maWxlTmFtZSxcclxuICAgICAgICAgIFwiYXR0YWNobWVudElkXCI6IGZvcm0uYXR0YWNobWVudC5hdHRhY2htZW50SWQsXHJcbiAgICAgICAgICBcIm1pbWVUeXBlXCI6IGZpZWxkLm1pbWVUeXBlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmFsbG93RmlsZUNvbnRlbnRzV2l0aE11bHRpQXR0YWNobWVudHMpIG5ld09ialsnZmlsZUNvbnRlbnRzJ10gPSBmaWVsZC5maWxlQ29udGVudHM7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRGaWxlcyA9IHRoaXMuZGlzcGxheWVkRmlsZXM/Lmxlbmd0aCA/IHRoaXMuZGlzcGxheWVkRmlsZXMgOiBbXVxyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkRmlsZXMucHVzaChuZXdPYmopO1xyXG4gICAgICAgIHRoaXMuYWxsQXR0YWNobWVudHMucHVzaChuZXdPYmopO1xyXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRpc3BsYXllZEZpbGVzKVxyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXdPYmopXHJcbiAgICAgICAgLyp0aGlzLmZpZWxkID0gbmV3T2JqXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KHRoaXMuZmllbGQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmZpZWxkKSovXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgLyogdGhpcy5ub0Vycm9yID0gZmFsc2U7XHJcbiAgICAgICAgIHRoaXMubG9hZGluZ1snZm9ybSddID0gZmFsc2VcclxuICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnI/LmVycm9yPy5tZXRhPy5tZXNzYWdlcyovXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNoZWNrRmlsZUV4aXN0YW5jZShmaWxlOiBBdHRhdGNobWVudEZpbGUpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmFsbEF0dGFjaG1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWxsQXR0YWNobWVudHM/LmZpbmRJbmRleCgoJGZpbGUpID0+IChmaWxlLmZpbGVOYW1lID09PSAkZmlsZS5maWxlTmFtZSkpID09PSAtMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGlzVmFsaWRNaW1lVHlwZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5hdHRhY2hUeXBlID09ICdwZGYnKSB7XHJcbiAgICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKHRoaXMudmFsaWRQZGZUeXBlcykpLmluY2x1ZGVzKHZhbHVlKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5hdHRhY2hUeXBlID09ICdpbWFnZScpIHtcclxuICAgICAgcmV0dXJuIChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KC4uLk9iamVjdC52YWx1ZXModGhpcy52YWxpZEltYWdlVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNWYWxpZEV4dGVuc2lvbih2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIGlmICh0eXBlID09ICdpbWFnZScpIHtcclxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyh0aGlzLnZhbGlkSW1hZ2VUeXBlcykpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiaW1hZ2VQZGZcIikge1xyXG4gICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKHRoaXMudmFsaWRJbWdQZGZUeXBlcykpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInBkZlwiKSB7XHJcbiAgICAgIHJldHVybiBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXModGhpcy52YWxpZFBkZlR5cGVzKSkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKHRoaXMudmFsaWRGaWxlVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUF0dGFjaGVkRmlsZSgpIHtcclxuICAgIC8vIHRoaXMuZmllbGQgPSB0aGlzLnZhbHVlID0gbmV3IEF0dGF0Y2htZW50RmlsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXcgQXR0YXRjaG1lbnRGaWxlKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKVxyXG4gICAgaWYgKHRoaXMuaW5wdXRGaWxlKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMuZmllbGQpO1xyXG4gICAgdGhpcy5lbWl0KHRoaXMudmFsdWUpXHJcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVBdHRhY2htZW50LmVtaXQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGUoZXZlbnQsIGZpZWxkKSB7XHJcbiAgICB0aGlzLmNvcmVTZXJ2aWNlLmxvYWRGaWxlKGZpZWxkLmF0dGFjaG1lbnRJZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2VPYmplY3Q6IHsgYm9keTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsZUluZm9ybWF0aW9uID0gcmVzcG9uc2VPYmplY3QuYm9keTtcclxuICAgICAgICBjb25zdCBmaWxlQmxvYiA9IHRoaXMuY29yZVNlcnZpY2UuZGF0YVVSSXRvQmxvYihmaWxlSW5mb3JtYXRpb24uZmlsZUNvbnRlbnRzKTtcclxuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2ZpbGVCbG9iXSwgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lLCB7dHlwZTogZmlsZUluZm9ybWF0aW9uLm1pbWVUeXBlfSk7XHJcbiAgICAgICAgY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICBsaW5rLmhyZWYgPSBibG9iVXJsO1xyXG4gICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlSW5mb3JtYXRpb24uZmlsZU5hbWU7XHJcbiAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVycm9yLmVycm9yPy5bJ21lc3NhZ2UnXSlcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFkZFNpZ25hdHVyZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9iaiA9IHtcclxuICAgICAgdHlwZTogJ29wZW5Qb3B1cERpYWxvZydcclxuICAgIH07XHJcbiAgICB0aGlzLmFkZFNpZ25hdHVyZUNsaWNrZWQuZW1pdChvYmopO1xyXG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBwcmludEZpbGVEYXRhKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucHJpbnRBY3Rpb25DbGlja2VkLmVtaXQoe2V2ZW50LCBmaWVsZDogdGhpcy5jb250cm9sLnZhbHVlfSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGVEYXRhKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZG93bmxvYWRBY3Rpb25DbGlja2VkLmVtaXQoe2V2ZW50LCBmaWVsZDogdGhpcy5jb250cm9sLnZhbHVlfSk7XHJcbiAgfVxyXG5cclxuICBnZXRFeHRlbnNpb24oYXR0YWNobWVudDogYW55KSB7XHJcbiAgICBpZiAoYXR0YWNobWVudCkge1xyXG4gICAgICBpZiAoYXR0YWNobWVudC5zcGxpdCgnLicpLnBvcCgpID09ICdtc2cnKSB7XHJcbiAgICAgICAgcmV0dXJuICdlbWFpbC1pY29uJ1xyXG4gICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQuc3BsaXQoJy4nKS5wb3AoKSA9PSAnanBlZycpIHtcclxuICAgICAgICByZXR1cm4gJ2pwZydcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXR0YWNobWVudC5zcGxpdCgnLicpLnBvcCgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXQ8VD4odmFsdWU6IFQgfCBUW10pIHtcclxuICAgIGlmICh0aGlzLnByZXZlbnRGaWxlQ29udGVudHMpIHtcclxuICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgIHRoaXMuZGVsZXRlRmlsZUNvbnRlbnRzKHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW1pdGVkVmFsdWUuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGV0ZUZpbGVDb250ZW50cyhkYXRhOiBhbnkgfCBhbnlbXSkge1xyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAnZmlsZUNvbnRlbnRzJyBpbiBkYXRhKSB7XHJcbiAgICAgIGRlbGV0ZSBkYXRhLmZpbGVDb250ZW50cztcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICBkYXRhLmZvckVhY2goZWxlbSA9PiB0aGlzLmRlbGV0ZUZpbGVDb250ZW50cyhlbGVtKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBBdHRhdGNobWVudEZpbGUge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGZpbGVOYW1lOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxyXG4gICAgcHVibGljIG1pbWVUeXBlOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgZmlsZUNvbnRlbnRzOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgZmlsZXNpemU6IHN0cmluZ1xyXG4gICkgeyB9XHJcbn1cclxuIiwiQGlmICghaXNSZWFkT25seSkge1xyXG4gIDxuZy1jb250YWluZXI+XHJcbiAgICBAaWYgKGxhYmVsKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItMVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0wXCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgQGlmICghcmVxdWlyZWQpIHtcclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMTEgZmMtZGFyay1ncmF5XCI+XHJcbiAgICAgICAgICAgIHt7IGkxOG4udHJhbnNsYXRlKCdPcHRpb25hbCcpIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICA8c2VjdGlvblxyXG4gICAgICBbbmdDbGFzc109XCJpbnNpZGVUYWJsZSA/ICdmaWxlLXVwbG9hZGVyLXRhYmxlJyA6ICdmaWxlLXVwbG9hZGVyJ1wiIGNsYXNzPVwiIG1iLTJcIlxyXG4gICAgICBbY2xhc3MuaW5zaWRlVGFibGVTdHlsZV09XCJpbnNpZGVUYWJsZVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgW25nQ2xhc3NdPVwiaW5zaWRlVGFibGUgPyAnZmlsZS11cGxvYWRlci10YWJsZS1kZXYnIDogJydcIiBjbGFzcz1cImZpbGUtdXBsb2FkZXItaW5wdXRcIlxyXG4gICAgICAgIChjbGljayk9XCJmaWxlQXR0YWNoZWQuY2xpY2soKVwiPlxyXG4gICAgICAgIEBpZiAoIXVwbG9hZGluZykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gbWItMVwiPlxyXG4gICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW5zaWRlVGFibGUgPyAnZmlsZS11cGxvYWRlci10YWJsZS1zdmcnIDogJydcIiB3aWR0aD1cIjQxXCIgaGVpZ2h0PVwiMzhcIiB2aWV3Qm94PVwiMCAwIDQxIDM4XCJcclxuICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0wIDIyLjE5NDdWMjAuNjczNkMwLjA5NzEzMDMgMjAuMTAxOSAwLjA3MDA5NCAxOS41MTQxIDAuMjc2MzcxIDE4Ljk1MzNDMS4yODM3MiAxNi4yMDg2IDMuMjEyMzEgMTQuNTAyMyA2LjA0MjEgMTMuODA5NEM2LjcwNDk5IDEzLjY0NzIgNi42ODQ5NyAxMy42NjMyIDYuNjk4OTkgMTIuOTg0M0M2LjczMjAzIDExLjMzMjEgNi45OTgzOSA5LjcxOTkyIDcuNjI0MjMgOC4xNzk4NkM4Ljg2Mjg5IDUuMTM2NzggMTAuOTQ2NyAyLjgzOTY5IDEzLjg4MTYgMS4zOTE3NUMxNy4xNjggLTAuMjMwNDI0IDIwLjU5NTYgLTAuNDUwNzE5IDI0LjA1NTMgMC44MTU5OEMyNy40OTI5IDIuMDc0NjcgMjkuOTYyMiA0LjQxNTgxIDMxLjQ4MDIgNy43NDgyOEMzMS43Nzg2IDguNDAzMTYgMzIuMDI3IDkuMDgzMDcgMzIuMTcxMiA5Ljc5MjAyQzMyLjI0MDIgMTAuMTMxNSAzMi40MDM1IDEwLjI1NjYgMzIuNzUyOSAxMC4zMTA3QzM2LjcwMTIgMTAuOTE2NSAzOS4zMzU4IDEzLjEyNTUgNDAuNjk0NiAxNi44NzM1QzQwLjkwNjkgMTcuNDYwMyA0MC45MTk5IDE4LjA3MzEgNDAuOTU5OSAxOC42ODI5QzQwLjk2NDkgMTguNzYwMSA0MC45Mzg5IDE4Ljg0NDIgNDEgMTguOTExM1YyMC41MTI0QzQwLjkxMDkgMjAuOTk1IDQwLjk2OSAyMS40OTM3IDQwLjg2MDggMjEuOTczNEM0MC41MjQ0IDIzLjQ2MTQgMzkuODQ1NCAyNC43ODIxIDM4Ljg1MDEgMjUuOTI5N0MzNy40NTIyIDI3LjU0MTggMzUuNzA1OSAyOC41ODgyIDMzLjYxNjEgMjkuMDUxOUMzMi43OTEgMjkuMjM1MSAzMS45NDk5IDI5LjI1MjEgMzEuMTExNyAyOS4yOTIyQzMwLjY1NzEgMjkuMzE0MiAzMC41ODQgMjkuMTkzIDMwLjU5MiAyOC43NDg0QzMwLjY0NTEgMjUuODQ0NiAyOS44MDIgMjMuMjU3MSAyNy44NjI0IDIxLjA1OTFDMjUuOTk3OSAxOC45NDYzIDIzLjY1OTcgMTcuNzE2NyAyMC44NjcgMTcuNDAxMkMxOC44NTUzIDE3LjE3MzkgMTYuOTA1NyAxNy40NTkzIDE1LjA2MTIgMTguMzM5NUMxMS44MzE5IDE5Ljg4MTYgOS44MTQxNiAyMi40MDY5IDguOTYxMDIgMjUuODY5NkM4Ljc0MjczIDI2Ljc1MzggOC42ODI2NSAyNy42NTggOC43MDU2OCAyOC41NzAyQzguNzIxNyAyOS4yMTExIDguNjAyNTQgMjkuMzEyMiA3Ljk1OTY4IDI5LjI5NzJDNS45NTA5OCAyOS4yNTExIDQuMTA1NTEgMjguNzIzNCAyLjU4MTQ2IDI3LjM1OTZDMS4wNzY0NCAyNi4wMTY4IDAuMDY4MDkxMyAyNC4zOTk2IDAuMDQwMDUzNyAyMi4zMDI4QzAuMDQwMDUzNyAyMi4yNjA3IDAuMDI1MDMzNiAyMi4yMjU3IDAgMjIuMTkzN1YyMi4xOTQ3WlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0RFRTBFMlwiLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0yOS4wMzAzIDI4LjI2MzJDMjkuMDYwNCAzMy40MDMxIDI0Ljg2NTcgMzcuNjE4NyAxOS42ODM4IDM3LjY1NDhDMTQuNTE2OSAzNy42OTA4IDEwLjI4NTIgMzMuNDk1MiAxMC4yNTIxIDI4LjMwNDJDMTAuMjIwMSAyMy4xNDAzIDE0LjQyOTcgMTguOTEyNiAxOS42MjI3IDE4Ljg5NDZDMjQuODAzNyAxOC44NzY2IDI4Ljk5OTMgMjMuMDU0MiAyOS4wMzAzIDI4LjI2MzJaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjOEU5QUEwXCIvPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTIwLjU1NzMgMjUuMjY0NEMyMC40NjIyIDI1LjQ0NzcgMjAuNTAxMiAyNS41OTM5IDIwLjUwMTIgMjUuNzM0QzIwLjQ5ODIgMjguMjE1NCAyMC41MDAyIDMwLjY5NTcgMjAuNDk4MiAzMy4xNzdDMjAuNDk4MiAzMy44MDk5IDIwLjIzMzkgMzQuMTcwNCAxOS43NDYyIDM0LjIyMzRDMTkuMjY0NSAzNC4yNzY1IDE4Ljg4IDMzLjk4MzEgMTguODE2OSAzMy41MDI1QzE4Ljc5NTkgMzMuMzQ0MyAxOC43OTY5IDMzLjE4MyAxOC43OTY5IDMzLjAyMzhDMTguNzk1OSAzMC41ODI2IDE4Ljc5NjkgMjguMTQyMyAxOC43OTY5IDI1LjcwMUMxOC43OTY5IDI1LjU3MjggMTguNzk2OSAyNS40NDQ3IDE4Ljc5NjkgMjUuMjAwM0MxOC4xOTcxIDI1LjgwMzEgMTcuNjc3NCAyNi4zMjg4IDE3LjE1MjcgMjYuODUwNUMxNy4wMTE1IDI2Ljk5MDcgMTYuODY4MyAyNy4xMzQ5IDE2LjcwNjEgMjcuMjQ3MUMxNi4zNTY2IDI3LjQ4NjQgMTUuOTM0MSAyNy40NDEzIDE1LjY0NTcgMjcuMTU0QzE1LjM2NDMgMjYuODc0NiAxNS4zMjAzIDI2LjQ0MiAxNS41NDg2IDI2LjA5MjVDMTUuNjIwNyAyNS45ODI0IDE1LjcxMjggMjUuODgzMiAxNS44MDY5IDI1Ljc4OTFDMTYuODYxMyAyNC43MzA3IDE3LjkxNjcgMjMuNjczMyAxOC45NzMyIDIyLjYxNzlDMTkuNDAxNyAyMi4xODkzIDE5Ljg3ODQgMjIuMTc2MyAyMC4zMDM5IDIyLjU5ODhDMjEuMzkxNCAyMy42ODAzIDIyLjQ3MzkgMjQuNzY2NyAyMy41NTMzIDI1Ljg1NzJDMjMuOTgwOSAyNi4yODk4IDI0LjAxMjkgMjYuODA2NSAyMy42NTM0IDI3LjE2N0MyMy4yOTkgMjcuNTIxNCAyMi43NzUzIDI3LjQ4NDQgMjIuMzQzNyAyNy4wNTY4QzIxLjc0OTkgMjYuNDcgMjEuMTY2MSAyNS44NzMyIDIwLjU2MDMgMjUuMjY0NEgyMC41NTczWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5RjlGOVwiLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmICh1cGxvYWRpbmcpIHtcclxuICAgICAgICAgIDxkcy1pY29uIGNsYXNzPVwic2ZpIHNmaS1zcGlubmVyIGQtaW5saW5lLWJsb2NrIHNwaW4gZmMtY29yYWwgZnMtMzAtaW1wXCI+PC9kcy1pY29uPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImYtMTQgZmMtYmxhY2sgZnctbm9ybWFsXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZjLWNvcmFsIGZ3LW1lZGl1bVwiPnt7IGkxOG4udHJhbnNsYXRlKCdicm93c2UnKSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTAgZmMtZGFyay1ncmF5XCI+XHJcbiAgICAgICAgICB7eyBhbGxvd2VkRXh0ZW5zaW9ucyA/IGFsbG93ZWRFeHRlbnNpb25zIDogJycgfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgI2lucHV0RmlsZSBbYWNjZXB0XT1cImFjY2VwdFwiIGNsYXNzPVwiZC1ub25lXCIgI2ZpbGVBdHRhY2hlZCAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgQGlmIChoaW50cykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBtYi0zXCI+XHJcbiAgICAgICAgQGZvciAoaGludCBvZiBoaW50czsgdHJhY2sgaGludCkge1xyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgZnMtMTJcIj5cclxuICAgICAgICAgICAgICA8ZHMtaWNvblxyXG4gICAgICAgICAgICAgICAgaWNvbj1cInt7aGludC52YWxpZCA/ICdjaGVjay1jaXJjbGUtZicgOiAnY2hlY2stY2lyY2xlLW8nfX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmcy0yNCB7e2hpbnQudmFsaWQgPyAnZmMtZ3JlZW4nIDogJ2ZjLWRhcmstZ3JheSd9fVwiPjwvZHMtaWNvbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInt7aGludC52YWxpZCA/ICdmYy1ibGFjaycgOiAnZmMtZGFyay1ncmF5J319XCI+e3sgaGludC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoaGludCkge1xyXG4gICAgICA8bWF0LWhpbnQgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgPGRzLWljb24gaWNvbj1cImluZm9cIiBjbGFzcz1cImZzLTE3IGZjLWRhcmstZ3JheVwiPjwvZHMtaWNvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZzLTEyIGZjLWJsYWNrIGxpbmUtaGVpZ2h0LTFcIj57eyBoaW50IH19PC9zcGFuPlxyXG4gICAgICA8L21hdC1oaW50PlxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBAaWYgKG11bHRpcGxlKSB7XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZmlsZXMtbGlzdFwiPlxyXG4gICAgICAgIEBmb3IgKGZpbGUgb2YgZGlzcGxheWVkRmlsZXM7IHRyYWNrIGZpbGU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICBbZmlsZV09XCJmaWxlXCJcclxuICAgICAgICAgICAgICAoZG93bmxvYWRFdmVudCk9XCJhdHRjaCgnZG93bmxvYWQnLGksZmlsZSlcIlxyXG4gICAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJhdHRjaCgnZGVsZXRlJyxpLGZpbGUpXCJcclxuICAgICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgICAgPC9kcy1hdHRhY2htZW50cz5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGNsYXNzPVwiaGlkZGVuLXBsYWNlaG9sZGVyXCI+PC9hPlxyXG4gICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgY2xhc3M9XCJmcy0xMlwiPlRlc3QgZXJyb3IgPC9tYXQtZXJyb3I+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoIW11bHRpcGxlICYmIChjb250cm9sLnZhbHVlPy5maWxlQ29udGVudHMgfHwgY29udHJvbC52YWx1ZT8uYXR0YWNobWVudElkKSkge1xyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImZpbGVzLWxpc3RcIj5cclxuXHJcbiAgICAgICAgPCEtLSB7e2ZpZWxkIHwganNvbiB9fSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lciBmaWxlLWl0ZW0tY29udGFpbmVyLWFjdGlvbnNcIj5cclxuICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICBbZmlsZV09XCJjb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgKGRvd25sb2FkRXZlbnQpPVwiYXR0Y2goJ2Rvd25sb2FkJyxudWxsLGNvbnRyb2wudmFsdWUpXCJcclxuICAgICAgICAgICAgKGRlbGV0ZUV2ZW50KT1cImF0dGNoKCdkZWxldGUnLG51bGwsY29udHJvbC52YWx1ZSlcIlxyXG4gICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJoaWRkZW4tcGxhY2Vob2xkZXJcIj48L2E+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudEN1c3RvbUFjdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciBjbGFzcz1cImZzLTEyXCI+VGVzdCBlcnJvciA8L21hdC1lcnJvcj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnRzLWVycm9yXCI+XHJcblxyXG4gICAgICA8IS0tICghdmFsaWRFeHRlbnNpb24gKSAgJiYgIW11bHRpcGxlIC0tPlxyXG4gICAgICBAaWYgKCghdmFsaWRFeHRlbnNpb24pKSB7XHJcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJmaWxlcy1saXN0IG10LTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWl0ZW0tY29udGFpbmVyIFwiPlxyXG4gICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICBbZmlsZV09XCJ3cm9uZ0ZpbGVcIiBlcnJvciBbc2hvd0FjdGlvbnNdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgPC9kcy1hdHRhY2htZW50cz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmICghYWxsb3dlZEZpbGVTaXplKSB7XHJcbiAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImZzLTEyIG15LTJcIj5cclxuICAgICAgICAgIHt7IG1heFNpemUgPT09IFwiMC4zXCIgPyBpMThuLnRyYW5zbGF0ZSgnc3VwcG9ydDMnKSA6IGkxOG4udHJhbnNsYXRlKCdzdXBwb3J0MicpICsgbWF4U2l6ZSArIGkxOG4udHJhbnNsYXRlKCdtYicpIH19XHJcbiAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIH1cclxuICAgICAgQGlmICgoIWZpbGVOb3REdXBsaWNhdGVkKSkge1xyXG4gICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJmcy0xMiBteS0yXCI+e3sgaTE4bi50cmFuc2xhdGUoJ2R1cGxpY2F0ZWQtZXJyb3InKSB9fTwvbWF0LWVycm9yPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAobGVuZ3RoRXJyb3IpIHtcclxuICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiZnMtMTJcIj57eyBpMThuLnRyYW5zbGF0ZSgnbGVuZ3RoRXJyb3InKSB9fSA6e3sgbWF4TGVuZ3RoIH19PC9tYXQtZXJyb3I+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChzaG93RXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgPCEtLSA8bWF0LWVycm9yIGNsYXNzPVwiZnMtMTJcIj57e2Vycm9yTWVzc2FnZX19IDwvbWF0LWVycm9yPiAtLT5cclxuICAgICAgfVxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG59XHJcblxyXG5cclxuQGlmIChpc1JlYWRPbmx5KSB7XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuICAgIEBpZiAobXVsdGlwbGUgJiYgZGlzcGxheWVkRmlsZXMpIHtcclxuICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1pdGVtXCI+XHJcbiAgICAgICAgICBAaWYgKGxhYmVsKSB7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmIChkaXNwbGF5ZWRGaWxlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlzY1wiPlxyXG4gICAgICAgICAgICAgIEBmb3IgKGZpbGUgb2YgZGlzcGxheWVkRmlsZXM7IHRyYWNrIGZpbGU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LTJcIiBbZmlsZV09XCJmaWxlXCIgcmVhZE9ubHkgKGF0dGFjaG1lbnRFdmVudCk9XCJkb3dubG9hZEZpbGUoJGV2ZW50LGZpbGUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJoaWRkZW4tcGxhY2Vob2xkZXJcIj48L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJcIiBjbGFzcz1cImhpZGRlbi1wbGFjZWhvbGRlclwiPjwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGNsYXNzPVwiaGlkZGVuLXBsYWNlaG9sZGVyXCI+PC9hPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBAaWYgKCFkaXNwbGF5ZWRGaWxlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlzY1wiPlxyXG4gICAgICAgICAge3sgaTE4bi50cmFuc2xhdGUoJ05vQXR0YWNobWVudHMnKSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoIW11bHRpcGxlICYmIChjb250cm9sLnZhbHVlPy5hdHRhY2htZW50SWQgfHwgY29udHJvbC52YWx1ZT8uZmlsZUNvbnRlbnRzKSkge1xyXG4gICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWl0ZW1cIj5cclxuICAgICAgICAgIEBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzYyBmaWxlLWl0ZW0tY29udGFpbmVyIGZpbGUtaXRlbS1jb250YWluZXItYWN0aW9uc1wiIFtuZ0NsYXNzXT1cInsnaW5zaWRlVGFibGVXaWR0aCc6aW5zaWRlVGFibGV9XCI+XHJcbiAgICAgICAgICAgIEBpZiAoY29udHJvbC52YWx1ZT8uYXR0YWNobWVudElkIHx8IGNvbnRyb2wudmFsdWU/LmZpbGVDb250ZW50cykge1xyXG4gICAgICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiY29udHJvbC52YWx1ZT8uZmlsZU5hbWVcIiBbZmlsZV09XCJjb250cm9sLnZhbHVlXCIgW3Nob3dBY3Rpb25zXT1cInNob3dBY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgIChhdHRhY2htZW50RXZlbnQpPVwiYXR0Y2goJGV2ZW50LG51bGwsY29udHJvbC52YWx1ZSlcIiByZWFkT25seT5cclxuICAgICAgICAgICAgICA8L2RzLWF0dGFjaG1lbnRzPlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJoaWRkZW4tcGxhY2Vob2xkZXJcIj48L2E+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhdHRhY2htZW50Q3VzdG9tQWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgfVxyXG4gIDwvbmctY29udGFpbmVyPlxyXG59XHJcblxyXG48bmctdGVtcGxhdGUgI2F0dGFjaG1lbnRDdXN0b21BY3Rpb25zPlxyXG4gIEBpZiAoIWlzRGlzYWJsZWQpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWRlZC1maWxlLWFjdGlvbnNcIj5cclxuICAgICAgQGlmIChzaG93U2lnbkJ1dHRvbikge1xyXG4gICAgICAgIDxkcy1idXR0b24gc2hhcGU9XCJvdXRsaW5lXCIgKGNsaWNrKT1cImFkZFNpZ25hdHVyZSgkZXZlbnQpXCIgY29sb3I9XCJyZWRcIj5cclxuICAgICAgICAgIHt7IHNpZ25UeXBlIH19XHJcbiAgICAgICAgPC9kcy1idXR0b24+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChzaG93RG93bmxvYWRCdXR0b24pIHtcclxuICAgICAgICA8ZHMtYnV0dG9uIHNoYXBlPVwib3V0bGluZVwiIChjbGljayk9XCJkb3dubG9hZEZpbGVEYXRhKCRldmVudClcIiBjb2xvcj1cInJlZFwiPlxyXG4gICAgICAgICAge3sgZG93bmxvYWRUeXBlIH19XHJcbiAgICAgICAgPC9kcy1idXR0b24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoc2hvd0Rvd25sb2FkQnV0dG9uKSB7XHJcbiAgICAgICAgPGEgaHJlZj1cIlwiIGNsYXNzPVwiaGlkZGVuLXBsYWNlaG9sZGVyXCI+PC9hPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAoc2hvd1ByaW50QnV0dG9uKSB7XHJcbiAgICAgICAgPGRzLWJ1dHRvbiBzaGFwZT1cIm91dGxpbmVcIiAoY2xpY2spPVwicHJpbnRGaWxlRGF0YSgkZXZlbnQpXCIgY29sb3I9XCJyZWRcIj5cclxuICAgICAgICAgIHt7IHByaW50VHlwZSB9fVxyXG4gICAgICAgIDwvZHMtYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|