@rlucan/ui 14.2.5 → 14.2.6

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.
Files changed (105) hide show
  1. package/{esm2020 → esm2022}/lib/action-button/action-button.component.mjs +99 -99
  2. package/esm2022/lib/action-icon/action-icon.component.mjs +37 -0
  3. package/esm2022/lib/autocomplete/autocomplete.component.mjs +391 -0
  4. package/esm2022/lib/avatar/avatar.component.mjs +34 -0
  5. package/esm2022/lib/button/button.component.mjs +57 -0
  6. package/esm2022/lib/checkbox/checkbox.component.mjs +39 -0
  7. package/{esm2020 → esm2022}/lib/checkbox-group/checkbox-group.component.mjs +91 -91
  8. package/esm2022/lib/currency/currency.component.mjs +151 -0
  9. package/esm2022/lib/date/date.component.mjs +68 -0
  10. package/{esm2020 → esm2022}/lib/dialog/dialog.component.mjs +37 -37
  11. package/esm2022/lib/directives/force-visibility/force-visibility.directive.mjs +104 -0
  12. package/esm2022/lib/editor/editor.component.mjs +119 -0
  13. package/{esm2020 → esm2022}/lib/elements/burger/burger.component.mjs +21 -21
  14. package/{esm2020 → esm2022}/lib/elements/expander/expander.component.mjs +28 -28
  15. package/{esm2020 → esm2022}/lib/elements/validation-message/validation-message.component.mjs +47 -47
  16. package/esm2022/lib/file/file.component.mjs +145 -0
  17. package/esm2022/lib/file-uploader/ui-file-uploader.component.mjs +405 -0
  18. package/esm2022/lib/input/input.component.mjs +265 -0
  19. package/esm2022/lib/input-autocomplete/input-autocomplete.component.mjs +277 -0
  20. package/esm2022/lib/layouts/base/ui-base-layout.component.mjs +22 -0
  21. package/esm2022/lib/layouts/base/ui-base.component.mjs +74 -0
  22. package/esm2022/lib/layouts/simple/ui-simple-layout.component.mjs +18 -0
  23. package/esm2022/lib/layouts/simple/ui-simple.component.mjs +166 -0
  24. package/{esm2020 → esm2022}/lib/radio/radio.component.mjs +21 -21
  25. package/esm2022/lib/radio-group/radio-group.component.mjs +53 -0
  26. package/esm2022/lib/select/select.component.mjs +115 -0
  27. package/{esm2020 → esm2022}/lib/services/message-box.service.mjs +112 -112
  28. package/{esm2020 → esm2022}/lib/services/toast.service.mjs +23 -23
  29. package/{esm2020 → esm2022}/lib/services/ui-file.service.mjs +71 -71
  30. package/{esm2020 → esm2022}/lib/services/ui-translate.service.mjs +32 -32
  31. package/{esm2020 → esm2022}/lib/submit-button/submit-button.component.mjs +72 -72
  32. package/esm2022/lib/table/table.component.mjs +97 -0
  33. package/esm2022/lib/text-area/text-area.component.mjs +46 -0
  34. package/{esm2020 → esm2022}/lib/ui.model.mjs +1 -1
  35. package/esm2022/lib/ui.module.mjs +269 -0
  36. package/esm2022/public-api.mjs +35 -0
  37. package/{esm2020 → esm2022}/rlucan-ui.mjs +4 -4
  38. package/fesm2022/rlucan-ui.mjs +3442 -0
  39. package/fesm2022/rlucan-ui.mjs.map +1 -0
  40. package/index.d.ts +5 -5
  41. package/lib/action-button/action-button.component.d.ts +32 -32
  42. package/lib/action-icon/action-icon.component.d.ts +15 -15
  43. package/lib/autocomplete/autocomplete.component.d.ts +57 -57
  44. package/lib/avatar/avatar.component.d.ts +14 -14
  45. package/lib/button/button.component.d.ts +18 -18
  46. package/lib/checkbox/checkbox.component.d.ts +15 -15
  47. package/lib/checkbox-group/checkbox-group.component.d.ts +18 -18
  48. package/lib/currency/currency.component.d.ts +31 -30
  49. package/lib/date/date.component.d.ts +24 -24
  50. package/lib/dialog/dialog.component.d.ts +13 -13
  51. package/lib/directives/force-visibility/force-visibility.directive.d.ts +22 -20
  52. package/lib/editor/editor.component.d.ts +24 -0
  53. package/lib/elements/burger/burger.component.d.ts +9 -9
  54. package/lib/elements/expander/expander.component.d.ts +10 -10
  55. package/lib/elements/validation-message/validation-message.component.d.ts +12 -12
  56. package/lib/file/file.component.d.ts +35 -35
  57. package/lib/file-uploader/ui-file-uploader.component.d.ts +102 -102
  58. package/lib/input/input.component.d.ts +42 -41
  59. package/lib/input-autocomplete/input-autocomplete.component.d.ts +44 -0
  60. package/lib/{base → layouts/base}/ui-base-layout.component.d.ts +8 -8
  61. package/lib/{base → layouts/base}/ui-base.component.d.ts +23 -23
  62. package/lib/{simple → layouts/simple}/ui-simple-layout.component.d.ts +8 -7
  63. package/lib/{simple → layouts/simple}/ui-simple.component.d.ts +40 -39
  64. package/lib/radio/radio.component.d.ts +8 -8
  65. package/lib/radio-group/radio-group.component.d.ts +18 -18
  66. package/lib/select/select.component.d.ts +35 -33
  67. package/lib/services/message-box.service.d.ts +58 -58
  68. package/lib/services/toast.service.d.ts +13 -13
  69. package/lib/services/ui-file.service.d.ts +33 -33
  70. package/lib/services/ui-translate.service.d.ts +11 -11
  71. package/lib/submit-button/submit-button.component.d.ts +21 -21
  72. package/lib/table/table.component.d.ts +36 -36
  73. package/lib/text-area/text-area.component.d.ts +18 -18
  74. package/lib/ui.model.d.ts +2 -2
  75. package/lib/ui.module.d.ts +59 -56
  76. package/package.json +22 -24
  77. package/public-api.d.ts +29 -27
  78. package/scss/ui-defaults.scss +1 -1
  79. package/src/js/editorjs.mjs +9634 -0
  80. package/ui.scss +41 -14
  81. package/esm2020/lib/action-icon/action-icon.component.mjs +0 -37
  82. package/esm2020/lib/autocomplete/autocomplete.component.mjs +0 -391
  83. package/esm2020/lib/avatar/avatar.component.mjs +0 -34
  84. package/esm2020/lib/base/ui-base-layout.component.mjs +0 -22
  85. package/esm2020/lib/base/ui-base.component.mjs +0 -74
  86. package/esm2020/lib/button/button.component.mjs +0 -57
  87. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -39
  88. package/esm2020/lib/currency/currency.component.mjs +0 -148
  89. package/esm2020/lib/date/date.component.mjs +0 -68
  90. package/esm2020/lib/directives/force-visibility/force-visibility.directive.mjs +0 -96
  91. package/esm2020/lib/file/file.component.mjs +0 -145
  92. package/esm2020/lib/file-uploader/ui-file-uploader.component.mjs +0 -394
  93. package/esm2020/lib/input/input.component.mjs +0 -258
  94. package/esm2020/lib/radio-group/radio-group.component.mjs +0 -53
  95. package/esm2020/lib/select/select.component.mjs +0 -91
  96. package/esm2020/lib/simple/ui-simple-layout.component.mjs +0 -15
  97. package/esm2020/lib/simple/ui-simple.component.mjs +0 -154
  98. package/esm2020/lib/table/table.component.mjs +0 -97
  99. package/esm2020/lib/text-area/text-area.component.mjs +0 -46
  100. package/esm2020/lib/ui.module.mjs +0 -255
  101. package/esm2020/public-api.mjs +0 -33
  102. package/fesm2015/rlucan-ui.mjs +0 -3017
  103. package/fesm2015/rlucan-ui.mjs.map +0 -1
  104. package/fesm2020/rlucan-ui.mjs +0 -2982
  105. package/fesm2020/rlucan-ui.mjs.map +0 -1
@@ -1,394 +0,0 @@
1
- import { Component, EventEmitter, Host, Inject, Input, Optional, Output, SkipSelf } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { UI_FILESERVICE } from '../services/ui-file.service';
4
- import { UiSimpleComponent } from '../simple/ui-simple.component';
5
- import { UI_TRANSLATESERVICE } from '../services/ui-translate.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/forms";
8
- import * as i2 from "../services/ui-file.service";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "@angular/material/icon";
11
- import * as i5 from "@angular/material/tooltip";
12
- import * as i6 from "ngx-uploader";
13
- import * as i7 from "@angular/material/progress-spinner";
14
- import * as i8 from "ngx-image-cropper";
15
- import * as i9 from "../file/file.component";
16
- export class UiFileUploaderComponent extends UiSimpleComponent {
17
- constructor(fileServiceConfig, translateService, controlContainer, fileService) {
18
- super(null, controlContainer);
19
- this.fileServiceConfig = fileServiceConfig;
20
- this.translateService = translateService;
21
- this.controlContainer = controlContainer;
22
- this.fileService = fileService;
23
- this.maxFiles = 1;
24
- this.multiple = true;
25
- this.crop = false;
26
- this.cropRounded = false;
27
- this.fileSize = 'default';
28
- this.customFileMenu = false;
29
- this.newFilePosition = 'last';
30
- this.templates = {};
31
- this.previewPosition = 'bottom';
32
- this.imageCropped = new EventEmitter();
33
- this.fileEvent = new EventEmitter();
34
- this.uploadOptions = {
35
- concurrency: this.fileServiceConfig.concurrentUploads
36
- };
37
- this.uploading = false;
38
- this.showCropper = false;
39
- this.showCropPreview = {};
40
- this.cropPreviewTimeouts = {};
41
- this.cropSourceImages = {};
42
- this.cropperImageLoaded = {};
43
- this.imagesDone = {};
44
- this.transform = {};
45
- this.canvasRotation = {};
46
- this.refreshAddInput = false;
47
- this.patchingValues = false;
48
- this.inputArray = false;
49
- this.dragging = false;
50
- this.uploaderId = Math.round(Math.random() * 1000000);
51
- this.croppedImages = {};
52
- this.fileService.uploadSubscription.next({ action: 'register', data: this });
53
- this.fileService.uploadSubscription.subscribe((v) => {
54
- switch (v.action) {
55
- case 'uploadStarted':
56
- this.uploading = true;
57
- break;
58
- case 'uploadFailed':
59
- case 'uploadSuccess':
60
- setTimeout(() => {
61
- this.uploading = false;
62
- });
63
- this.patchValues();
64
- }
65
- });
66
- }
67
- get menuTemplate() {
68
- return this.templates?.menuTemplate;
69
- }
70
- get addFileTemplate() {
71
- return this.templates?.addFileTemplate;
72
- }
73
- get fileTemplate() {
74
- return this.templates?.fileTemplate;
75
- }
76
- get uploadInput() {
77
- return this.fileService.uploadInput;
78
- }
79
- get editable() {
80
- return this.componentFormControl.enabled;
81
- }
82
- get ngAddStyle() {
83
- return {
84
- width: Math.abs(this.fileServiceConfig.imageSizes[this.fileSize][0]) + 'px',
85
- height: Math.abs(this.fileServiceConfig.imageSizes[this.fileSize][1]) + 'px',
86
- };
87
- }
88
- get aspectRatio() {
89
- return this.fileServiceConfig.imageSizes[this.fileSize][0] / this.fileServiceConfig.imageSizes[this.fileSize][1];
90
- }
91
- get addFileImgSrc() {
92
- return this.fileServiceConfig.addFileImgSrc;
93
- }
94
- cropDone(f) {
95
- return !f.$newFile || this.imagesDone[f.$newFile.id];
96
- }
97
- // ngOnInit(): void {
98
- // super.ngOnInit();
99
- // }
100
- ngOnDestroy() {
101
- this.fileService.uploadSubscription.next({ action: 'destroy', data: this });
102
- }
103
- remove(f) {
104
- if (f.$newFile) {
105
- this.uploadInput.emit({ type: 'remove', id: f.$newFile.id });
106
- }
107
- this.files.splice(this.files.indexOf(f), 1);
108
- this.prepareResponse();
109
- // this.onChange(this.inputArray ? this.files : (this.files.length > 0 ? this.files[0] : null));
110
- this.fileEvent.emit({ message: 'fileRemoved', data: f });
111
- // this.patchValues();
112
- }
113
- patchValues() {
114
- this.patchingValues = true;
115
- // if (this.inputArray) {
116
- // this.componentFormControl.setValue(this.files.map(f => f.custom));
117
- // } else {
118
- // this.componentFormControl.setValue(this.files.length === 0 ? null : this.files[0].custom);
119
- // }
120
- this.patchingValues = false;
121
- }
122
- get hasFilesToUpload() {
123
- return !!this.files.find(f => f.$newFile && f.$newFile.progress.status !== 2);
124
- }
125
- canImagePreview(type) {
126
- return type.startsWith('image/') || type.startsWith('video/');
127
- }
128
- onUploadOutput($event, skipCustomValidation = false) {
129
- // console.log($event);
130
- switch ($event.type) {
131
- case 'start':
132
- break;
133
- case 'dragOver':
134
- this.dragging = true;
135
- break;
136
- case 'dragOut':
137
- case 'drop':
138
- this.dragging = false;
139
- break;
140
- case 'addedToQueue':
141
- if (this.crop && !$event.file.type.startsWith('image/')) {
142
- this.uploadInput.emit({ type: 'remove', id: $event.file.id });
143
- this.fileEvent.emit({ message: 'cropInvalidFileType', data: $event.file });
144
- return;
145
- }
146
- if (!skipCustomValidation && this.fileServiceConfig.fileValidation) {
147
- this.fileServiceConfig.fileValidation(this.fileSize, $event.file).then(valid => {
148
- if (valid) {
149
- this.onUploadOutput($event, true);
150
- }
151
- else {
152
- this.uploadInput.emit({ type: 'remove', id: $event.file.id });
153
- // this.fileEvent.emit({ message: 'cropInvalidFileType', data: $event.file });
154
- }
155
- });
156
- }
157
- else {
158
- let f;
159
- if (this.changeFileIndex !== undefined) {
160
- f = this.files[this.changeFileIndex];
161
- if (f.$newFile) {
162
- this.uploadInput.emit({ type: 'remove', id: f.$newFile.id });
163
- }
164
- f.$newFile = $event.file;
165
- f.custom = $event.file;
166
- this.changeFileIndex = undefined;
167
- }
168
- else {
169
- f = { custom: $event.file, $newFile: $event.file };
170
- if (this.newFilePosition === 'last') {
171
- this.files.push(f);
172
- }
173
- else {
174
- this.files.unshift(f);
175
- }
176
- }
177
- if (this.canImagePreview($event.file.type)) {
178
- if (this.crop) {
179
- this.canvasRotation[$event.file.id] = 0;
180
- this.cropSourceImages[$event.file.id] = $event.file.nativeFile;
181
- this.cropperImageLoaded[$event.file.id] = false;
182
- }
183
- }
184
- this.prepareResponse();
185
- this.fileEvent.emit({ message: 'fileAdded', data: f });
186
- }
187
- break;
188
- case 'done':
189
- const df = this.files.find(f => f.$newFile === $event.file);
190
- if (df) {
191
- if (df.$newFile.responseStatus === 200) {
192
- this.files[this.files.indexOf(df)].custom = df.$newFile.response;
193
- df.$newFile = null;
194
- }
195
- else {
196
- // console.log('error on upload', df.$event);
197
- }
198
- }
199
- if (!this.hasFilesToUpload) {
200
- this.prepareResponse(false);
201
- this.fileService.uploadSubscription.next({
202
- action: this.files.find(f => !!f.$newFile) ? 'uploadControlFailed' : 'uploadControlSuccess'
203
- });
204
- }
205
- break;
206
- }
207
- }
208
- prepareResponse(doemit = true) {
209
- if (this.inputArray) {
210
- if (!this.responseFiles) {
211
- this.responseFiles = [];
212
- }
213
- this.responseFiles.length = 0;
214
- this.files.forEach(f => this.responseFiles.push({ ...f.custom, $newFile: f.$newFile }));
215
- }
216
- else {
217
- if (this.files.length === 0) {
218
- this.responseFiles = null;
219
- }
220
- else {
221
- if (!this.responseFiles) {
222
- this.responseFiles = {};
223
- }
224
- Object.keys(this.files[0].custom).forEach(k => {
225
- this.responseFiles[k] = this.files[0].custom[k];
226
- });
227
- this.responseFiles.$newFile = this.files[0].$newFile;
228
- }
229
- }
230
- if (doemit) {
231
- this.onChange(this.responseFiles);
232
- }
233
- // console.log('emit', this.files[1], { ...this.files[1].custom, $newFile: this.files[1].$newFile });
234
- // this.onChange(this.inputArray ?
235
- // this.files.map(f => ({ ...f.custom, $newFile: f.$newFile})) :
236
- // (this.files.length > 0 ? { ...this.files[0].custom, $newFile: this.files[0].$newFile } : null));
237
- // this.onChange(this.inputArray ?
238
- // this.files :
239
- // (this.files.length > 0 ? this.files[0] : null));
240
- }
241
- beforeSave() {
242
- return new Promise((res, rej) => {
243
- this.files.forEach(f => {
244
- if (f.$newFile && f.$newFile.progress.status === 2) {
245
- f.$newFile.progress.status = 0;
246
- }
247
- if (this.crop && f.$newFile && !this.imagesDone[f.$newFile.id]) {
248
- this.cropperDone(f.$newFile.id);
249
- }
250
- });
251
- setTimeout(() => {
252
- res('done');
253
- }, 250);
254
- });
255
- }
256
- fileChangeEvent(event, f) {
257
- this.changeFileIndex = this.files.indexOf(f);
258
- }
259
- startCropPreview(id) {
260
- clearTimeout(this.cropPreviewTimeouts[id]);
261
- this.showCropPreview[id] = !!this.cropSourceImages[id];
262
- }
263
- stopCropPreview(id) {
264
- this.cropPreviewTimeouts[id] = setTimeout(() => {
265
- this.showCropPreview[id] = false;
266
- }, 250);
267
- }
268
- zoomCroppedImage(dir, id) {
269
- let scale = this.transform[id].scale;
270
- scale += dir;
271
- if (scale < 0.1) {
272
- scale = 0.1;
273
- }
274
- this.transform[id] = {
275
- ...this.transform[id],
276
- scale
277
- };
278
- }
279
- rotateCroppedImage(dir, id) {
280
- this.canvasRotation[id] += dir;
281
- const flippedH = this.transform[id].flipH;
282
- const flippedV = this.transform[id].flipV;
283
- this.transform[id] = {
284
- ...this.transform[id],
285
- flipH: flippedV,
286
- flipV: flippedH
287
- };
288
- }
289
- onImageCropped(event, id) {
290
- this.croppedImages[id] = event.base64;
291
- this.imageCropped.emit(event.base64);
292
- }
293
- imageLoaded(id) {
294
- this.showCropper = true;
295
- setTimeout(() => {
296
- this.transform[id] = {
297
- scale: 1
298
- };
299
- });
300
- }
301
- cropperReady(sourceImageDimensions, id) {
302
- this.cropperImageLoaded[id] = true;
303
- }
304
- loadImageFailed() {
305
- }
306
- toggleMenuVisibility(f) {
307
- this.fileMenuOpened = f;
308
- }
309
- menuClick() {
310
- this.fileMenuOpened = undefined;
311
- }
312
- writeValue(obj) {
313
- this.inputArray = obj instanceof Array;
314
- if (this.inputArray) {
315
- this.files = obj.map(f => ({ custom: f, $newFile: null }));
316
- }
317
- else {
318
- this.files = obj ? [{ custom: obj, $newFile: null }] : [];
319
- }
320
- this.cropSourceImages = {};
321
- }
322
- cropperDone(id) {
323
- const f = this.files.find(fx => fx.$newFile && fx.$newFile.id === id);
324
- if (f) {
325
- const url = this.croppedImages[id];
326
- fetch(url)
327
- .then(res => res.blob())
328
- .then(blob => {
329
- f.$newFile.nativeFile = new File([blob], 'crop.png', {
330
- type: 'image/png'
331
- });
332
- f.$newFile.name = 'crop.png';
333
- f.$newFile.size = f.$newFile.nativeFile.size;
334
- f.$newFile.type = f.$newFile.nativeFile.type;
335
- this.imagesDone[id] = true;
336
- });
337
- }
338
- }
339
- }
340
- UiFileUploaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: UiFileUploaderComponent, deps: [{ token: UI_FILESERVICE, optional: true }, { token: UI_TRANSLATESERVICE }, { token: i1.ControlContainer, host: true, optional: true, skipSelf: true }, { token: i2.UiFileService }], target: i0.ɵɵFactoryTarget.Component });
341
- UiFileUploaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: UiFileUploaderComponent, selector: "ui-file-uploader", inputs: { maxFiles: "maxFiles", multiple: "multiple", crop: "crop", cropRounded: "cropRounded", cropMaxWidth: "cropMaxWidth", fileSize: "fileSize", customFileMenu: "customFileMenu", addHint: "addHint", newFilePosition: "newFilePosition", templates: "templates", previewPosition: "previewPosition" }, outputs: { imageCropped: "imageCropped", fileEvent: "fileEvent" }, providers: [{
342
- provide: NG_VALUE_ACCESSOR,
343
- multi: true,
344
- useExisting: UiFileUploaderComponent,
345
- }], usesInheritance: true, ngImport: i0, template: "<div class=\"label\" *ngIf=\"label\">\r\n <div class=\"text-container\" [matTooltip]=\"required ? translateService.instant('ui.controls.validation.required') : undefined\" [matTooltipPosition]=\"'above'\">\r\n <div class=\"text\">{{label}}</div>\r\n <div *ngIf=\"required\" class=\"required\">*</div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"files-container\" [ngClass]=\"{dragging: dragging, disabled: uploading || !editable}\">\r\n\r\n <div class=\"existing-files\">\r\n\r\n <div class=\"file-container\" *ngFor=\"let f of files\">\r\n\r\n <div class=\"file-menu\" (click)=\"toggleMenuVisibility(f)\" *ngIf=\"!customFileMenu && editable && !uploading\">\r\n <mat-icon>menu</mat-icon>\r\n </div>\r\n <div class=\"file-menu-container mat-elevation-z2\" [ngClass]=\"{visible: f === fileMenuOpened}\" (click)=\"menuClick()\" (mouseleave)=\"menuClick()\">\r\n <ng-container *ngIf=\"!menuTemplate\">\r\n <label class=\"menu-item\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.change') }}\r\n <input *ngIf=\"!refreshAddInput\" style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <div class=\"menu-item\" (click)=\"remove(f)\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.delete') }}</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"menuTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"menuTemplate\" [ngTemplateOutletContext]=\"{fileInput: fileInput}\"></ng-template>\r\n <ng-template #fileInput>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"crop && !cropDone(f)\" (mouseenter)=\"startCropPreview(f.$newFile.id)\" (mouseleave)=\"stopCropPreview(f.$newFile.id)\">\r\n <div class=\"crop-container\" [ngStyle]=\"ngAddStyle\">\r\n\r\n <ui-file *ngIf=\"false && files.length > 0 && !cropSourceImages\" [fileSize]=\"fileSize\" [srcData]=\"files[0].custom\" [ngClass]=\"{rounded: cropRounded}\"></ui-file>\r\n\r\n <mat-spinner *ngIf=\"!cropperImageLoaded[f.$newFile.id] && cropSourceImages[f.$newFile.id]\" [diameter]=\"75\"></mat-spinner>\r\n\r\n <image-cropper *ngIf=\"cropSourceImages[f.$newFile.id]\"\r\n [imageFile]=\"cropSourceImages[f.$newFile.id]\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"false\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"cropMaxWidth\"\r\n [onlyScaleDown]=\"false\"\r\n [roundCropper]=\"cropRounded\"\r\n [canvasRotation]=\"canvasRotation[f.$newFile.id]\"\r\n [transform]=\"transform[f.$newFile.id]\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n [format]=\"'png'\"\r\n (imageCropped)=\"onImageCropped($event, f.$newFile.id)\"\r\n (imageLoaded)=\"imageLoaded(f.$newFile.id)\"\r\n (cropperReady)=\"cropperReady($event, f.$newFile.id)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n ></image-cropper>\r\n\r\n <div class=\"crop-preview mat-elevation-z2\" [class]=\"previewPosition\" *ngIf=\"true || (showCropPreview[f.$newFile.id] && cropperImageLoaded[f.$newFile.id])\">\r\n <div class=\"crop-menu\">\r\n <mat-icon (click)=\"zoomCroppedImage(.1, f.$newFile.id)\">zoom_in</mat-icon>\r\n <mat-icon (click)=\"zoomCroppedImage(- .1, f.$newFile.id)\">zoom_out</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(-1, f.$newFile.id)\">rotate_left</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(1, f.$newFile.id)\">rotate_right</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <label class=\"menu-item\">\r\n <mat-icon>upload_file</mat-icon>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <mat-icon (click)=\"remove(f)\">delete_outline</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <mat-icon (click)=\"cropperDone(f.$newFile.id)\">done</mat-icon>\r\n </div>\r\n <img [src]=\"croppedImages[f.$newFile.id]\" [ngClass]=\"{rounded: cropRounded}\"/>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n\r\n <ng-container *ngIf=\"!crop || cropDone(f)\">\r\n <ng-container *ngIf=\"fileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"fileTemplate\" [ngTemplateOutletContext]=\"{file: f, fileInput: fileInput2}\"></ng-template>\r\n <ng-template #fileInput2>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ui-file *ngIf=\"!fileTemplate\" [fileSize]=\"fileSize\" [srcData]=\"f.$newFile ? f.$newFile: f.custom\" [ngClass]=\"{rounded: crop && cropRounded}\">\r\n </ui-file>\r\n\r\n <ng-container *ngIf=\"f.$newFile\">\r\n <div *ngIf=\"f.$newFile.responseStatus && f.$newFile.responseStatus !== 200\" class=\"progress-container error\">\r\n {{ translateService.instant('ui.controls.ui-file-uploader.uploadError', f.$newFile.response) }}\r\n </div>\r\n <div *ngIf=\"!f.$newFile.responseStatus && f.$newFile.progress.status === 1\" class=\"progress-container\">\r\n <div class=\"progress\" [ngStyle]=\"{width: f.$newFile.progress.data.percentage + '%'}\"></div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-container add\" ngFileDrop [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [ngClass]=\"{visible: files.length < maxFiles || maxFiles === 0}\" [ngStyle]=\"addFileTemplate ? {} : ngAddStyle\">\r\n <label>\r\n <ng-container *ngIf=\"addFileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"addFileTemplate\"></ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"!addFileTemplate\">\r\n <div class=\"upload-image-container\"></div>\r\n <img [src]=\"addFileImgSrc\" [ngClass]=\"{'with-hint': addHint}\" />\r\n <div *ngIf=\"addHint\" class=\"add-hint\">{{addHint}}</div>\r\n </ng-container>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [multiple]=\"maxFiles === 0 && multiple\">\r\n </label>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:flex;flex-wrap:wrap}:host .label .text{font-size:.9em;line-height:1em;padding:6px 0 4px}:host .files-container{display:flex;flex-wrap:wrap;border-style:solid}:host .files-container .existing-files{display:flex;flex-wrap:wrap}:host .files-container.dragging .add label{border:2px dashed grey;background-color:#0000001a}:host .files-container.disabled .add{opacity:.5;pointer-events:none}:host .file-container{max-width:100%;max-height:100%;position:relative;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container{position:absolute;bottom:0;left:1px;right:1px;height:20%;max-height:20px;background-color:#0000001a}:host .file-container .progress-container.error{background-color:red;color:#fff;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container .progress{background-color:#0000004d;height:100%}:host .file-container.add{display:flex;align-items:center;flex-direction:column;transition:opacity .25s;cursor:pointer}:host .file-container.add:not(.visible){display:none}:host .file-container.add img{max-width:100%;max-height:100%}:host .file-container.add img.with-hint{max-height:75%}:host .file-container.add .add-hint{margin-top:8px;font-size:80%;text-align:center}:host .file-container.add label{position:absolute;inset:0;cursor:pointer;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center}:host .file-container.add .upload-image-container{display:none}:host .file-container .file-menu-container{display:none;position:absolute;left:calc(100% - 45px);top:27px;z-index:1000}:host .file-container .file-menu-container ::ng-deep .menu-item{position:relative;padding:12px 24px;cursor:pointer;display:block}:host .file-container .file-menu-container.visible{display:block}:host .file-container .file-menu{display:flex;position:absolute;flex-direction:column;align-items:center;justify-content:center;padding:12px;right:10px;top:10px;background-color:#fff9;border-radius:50%;cursor:pointer;transition:all .25s;z-index:999}:host .file-container:hover .file-menu{background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .file-container mat-progress-bar{position:absolute;bottom:0;height:6px;left:0;right:0;z-index:1000}:host image-cropper{padding:0}:host ui-file.rounded ::ng-deep img{border-radius:50%}:host .crop-container{display:flex;align-items:center;justify-content:center;position:relative}:host .crop-container mat-spinner{position:absolute;z-index:1}:host .crop-container .crop-preview{position:absolute;top:100%;left:0;right:0;padding:6px;border:1px solid transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1000;max-width:350px;margin-right:auto;margin-left:auto}:host .crop-container .crop-preview.left{right:calc(100% + 6px);left:unset;top:0}:host .crop-container .crop-preview.above{bottom:100%;top:unset}:host .crop-container .crop-preview .crop-menu{width:100%;flex:0 0 auto;display:flex}:host .crop-container .crop-preview .crop-menu mat-icon{margin:0 3px;width:calc(1em + 6px);height:1em;font-size:2em;cursor:pointer;user-select:none;flex:1 1 100%}:host .crop-container .crop-preview img{margin:16px 0;max-width:256px;max-height:256px}:host .crop-container .crop-preview img.rounded{border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i6.NgFileDropDirective, selector: "[ngFileDrop]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i6.NgFileSelectDirective, selector: "[ngFileSelect]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "component", type: i9.FileComponent, selector: "ui-file", inputs: ["fileSize", "srcOptions", "srcData", "srcUrl"] }] });
346
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: UiFileUploaderComponent, decorators: [{
347
- type: Component,
348
- args: [{ selector: 'ui-file-uploader', providers: [{
349
- provide: NG_VALUE_ACCESSOR,
350
- multi: true,
351
- useExisting: UiFileUploaderComponent,
352
- }], template: "<div class=\"label\" *ngIf=\"label\">\r\n <div class=\"text-container\" [matTooltip]=\"required ? translateService.instant('ui.controls.validation.required') : undefined\" [matTooltipPosition]=\"'above'\">\r\n <div class=\"text\">{{label}}</div>\r\n <div *ngIf=\"required\" class=\"required\">*</div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"files-container\" [ngClass]=\"{dragging: dragging, disabled: uploading || !editable}\">\r\n\r\n <div class=\"existing-files\">\r\n\r\n <div class=\"file-container\" *ngFor=\"let f of files\">\r\n\r\n <div class=\"file-menu\" (click)=\"toggleMenuVisibility(f)\" *ngIf=\"!customFileMenu && editable && !uploading\">\r\n <mat-icon>menu</mat-icon>\r\n </div>\r\n <div class=\"file-menu-container mat-elevation-z2\" [ngClass]=\"{visible: f === fileMenuOpened}\" (click)=\"menuClick()\" (mouseleave)=\"menuClick()\">\r\n <ng-container *ngIf=\"!menuTemplate\">\r\n <label class=\"menu-item\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.change') }}\r\n <input *ngIf=\"!refreshAddInput\" style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <div class=\"menu-item\" (click)=\"remove(f)\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.delete') }}</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"menuTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"menuTemplate\" [ngTemplateOutletContext]=\"{fileInput: fileInput}\"></ng-template>\r\n <ng-template #fileInput>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"crop && !cropDone(f)\" (mouseenter)=\"startCropPreview(f.$newFile.id)\" (mouseleave)=\"stopCropPreview(f.$newFile.id)\">\r\n <div class=\"crop-container\" [ngStyle]=\"ngAddStyle\">\r\n\r\n <ui-file *ngIf=\"false && files.length > 0 && !cropSourceImages\" [fileSize]=\"fileSize\" [srcData]=\"files[0].custom\" [ngClass]=\"{rounded: cropRounded}\"></ui-file>\r\n\r\n <mat-spinner *ngIf=\"!cropperImageLoaded[f.$newFile.id] && cropSourceImages[f.$newFile.id]\" [diameter]=\"75\"></mat-spinner>\r\n\r\n <image-cropper *ngIf=\"cropSourceImages[f.$newFile.id]\"\r\n [imageFile]=\"cropSourceImages[f.$newFile.id]\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"false\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"cropMaxWidth\"\r\n [onlyScaleDown]=\"false\"\r\n [roundCropper]=\"cropRounded\"\r\n [canvasRotation]=\"canvasRotation[f.$newFile.id]\"\r\n [transform]=\"transform[f.$newFile.id]\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n [format]=\"'png'\"\r\n (imageCropped)=\"onImageCropped($event, f.$newFile.id)\"\r\n (imageLoaded)=\"imageLoaded(f.$newFile.id)\"\r\n (cropperReady)=\"cropperReady($event, f.$newFile.id)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n ></image-cropper>\r\n\r\n <div class=\"crop-preview mat-elevation-z2\" [class]=\"previewPosition\" *ngIf=\"true || (showCropPreview[f.$newFile.id] && cropperImageLoaded[f.$newFile.id])\">\r\n <div class=\"crop-menu\">\r\n <mat-icon (click)=\"zoomCroppedImage(.1, f.$newFile.id)\">zoom_in</mat-icon>\r\n <mat-icon (click)=\"zoomCroppedImage(- .1, f.$newFile.id)\">zoom_out</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(-1, f.$newFile.id)\">rotate_left</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(1, f.$newFile.id)\">rotate_right</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <label class=\"menu-item\">\r\n <mat-icon>upload_file</mat-icon>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <mat-icon (click)=\"remove(f)\">delete_outline</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <mat-icon (click)=\"cropperDone(f.$newFile.id)\">done</mat-icon>\r\n </div>\r\n <img [src]=\"croppedImages[f.$newFile.id]\" [ngClass]=\"{rounded: cropRounded}\"/>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n\r\n <ng-container *ngIf=\"!crop || cropDone(f)\">\r\n <ng-container *ngIf=\"fileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"fileTemplate\" [ngTemplateOutletContext]=\"{file: f, fileInput: fileInput2}\"></ng-template>\r\n <ng-template #fileInput2>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ui-file *ngIf=\"!fileTemplate\" [fileSize]=\"fileSize\" [srcData]=\"f.$newFile ? f.$newFile: f.custom\" [ngClass]=\"{rounded: crop && cropRounded}\">\r\n </ui-file>\r\n\r\n <ng-container *ngIf=\"f.$newFile\">\r\n <div *ngIf=\"f.$newFile.responseStatus && f.$newFile.responseStatus !== 200\" class=\"progress-container error\">\r\n {{ translateService.instant('ui.controls.ui-file-uploader.uploadError', f.$newFile.response) }}\r\n </div>\r\n <div *ngIf=\"!f.$newFile.responseStatus && f.$newFile.progress.status === 1\" class=\"progress-container\">\r\n <div class=\"progress\" [ngStyle]=\"{width: f.$newFile.progress.data.percentage + '%'}\"></div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-container add\" ngFileDrop [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [ngClass]=\"{visible: files.length < maxFiles || maxFiles === 0}\" [ngStyle]=\"addFileTemplate ? {} : ngAddStyle\">\r\n <label>\r\n <ng-container *ngIf=\"addFileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"addFileTemplate\"></ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"!addFileTemplate\">\r\n <div class=\"upload-image-container\"></div>\r\n <img [src]=\"addFileImgSrc\" [ngClass]=\"{'with-hint': addHint}\" />\r\n <div *ngIf=\"addHint\" class=\"add-hint\">{{addHint}}</div>\r\n </ng-container>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [multiple]=\"maxFiles === 0 && multiple\">\r\n </label>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:flex;flex-wrap:wrap}:host .label .text{font-size:.9em;line-height:1em;padding:6px 0 4px}:host .files-container{display:flex;flex-wrap:wrap;border-style:solid}:host .files-container .existing-files{display:flex;flex-wrap:wrap}:host .files-container.dragging .add label{border:2px dashed grey;background-color:#0000001a}:host .files-container.disabled .add{opacity:.5;pointer-events:none}:host .file-container{max-width:100%;max-height:100%;position:relative;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container{position:absolute;bottom:0;left:1px;right:1px;height:20%;max-height:20px;background-color:#0000001a}:host .file-container .progress-container.error{background-color:red;color:#fff;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container .progress{background-color:#0000004d;height:100%}:host .file-container.add{display:flex;align-items:center;flex-direction:column;transition:opacity .25s;cursor:pointer}:host .file-container.add:not(.visible){display:none}:host .file-container.add img{max-width:100%;max-height:100%}:host .file-container.add img.with-hint{max-height:75%}:host .file-container.add .add-hint{margin-top:8px;font-size:80%;text-align:center}:host .file-container.add label{position:absolute;inset:0;cursor:pointer;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center}:host .file-container.add .upload-image-container{display:none}:host .file-container .file-menu-container{display:none;position:absolute;left:calc(100% - 45px);top:27px;z-index:1000}:host .file-container .file-menu-container ::ng-deep .menu-item{position:relative;padding:12px 24px;cursor:pointer;display:block}:host .file-container .file-menu-container.visible{display:block}:host .file-container .file-menu{display:flex;position:absolute;flex-direction:column;align-items:center;justify-content:center;padding:12px;right:10px;top:10px;background-color:#fff9;border-radius:50%;cursor:pointer;transition:all .25s;z-index:999}:host .file-container:hover .file-menu{background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .file-container mat-progress-bar{position:absolute;bottom:0;height:6px;left:0;right:0;z-index:1000}:host image-cropper{padding:0}:host ui-file.rounded ::ng-deep img{border-radius:50%}:host .crop-container{display:flex;align-items:center;justify-content:center;position:relative}:host .crop-container mat-spinner{position:absolute;z-index:1}:host .crop-container .crop-preview{position:absolute;top:100%;left:0;right:0;padding:6px;border:1px solid transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1000;max-width:350px;margin-right:auto;margin-left:auto}:host .crop-container .crop-preview.left{right:calc(100% + 6px);left:unset;top:0}:host .crop-container .crop-preview.above{bottom:100%;top:unset}:host .crop-container .crop-preview .crop-menu{width:100%;flex:0 0 auto;display:flex}:host .crop-container .crop-preview .crop-menu mat-icon{margin:0 3px;width:calc(1em + 6px);height:1em;font-size:2em;cursor:pointer;user-select:none;flex:1 1 100%}:host .crop-container .crop-preview img{margin:16px 0;max-width:256px;max-height:256px}:host .crop-container .crop-preview img.rounded{border-radius:50%}\n"] }]
353
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
354
- type: Optional
355
- }, {
356
- type: Inject,
357
- args: [UI_FILESERVICE]
358
- }] }, { type: undefined, decorators: [{
359
- type: Inject,
360
- args: [UI_TRANSLATESERVICE]
361
- }] }, { type: i1.ControlContainer, decorators: [{
362
- type: Optional
363
- }, {
364
- type: Host
365
- }, {
366
- type: SkipSelf
367
- }] }, { type: i2.UiFileService }]; }, propDecorators: { maxFiles: [{
368
- type: Input
369
- }], multiple: [{
370
- type: Input
371
- }], crop: [{
372
- type: Input
373
- }], cropRounded: [{
374
- type: Input
375
- }], cropMaxWidth: [{
376
- type: Input
377
- }], fileSize: [{
378
- type: Input
379
- }], customFileMenu: [{
380
- type: Input
381
- }], addHint: [{
382
- type: Input
383
- }], newFilePosition: [{
384
- type: Input
385
- }], templates: [{
386
- type: Input
387
- }], previewPosition: [{
388
- type: Input
389
- }], imageCropped: [{
390
- type: Output
391
- }], fileEvent: [{
392
- type: Output
393
- }] } });
394
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUtdXBsb2FkZXIvdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUtdXBsb2FkZXIvdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsT0FBTyxFQUEwQyxjQUFjLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7QUFFcEgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUF1QixtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7OztBQTJCNUYsTUFBTSxPQUFPLHVCQUF3QixTQUFRLGlCQUFpQjtJQWdFNUQsWUFBd0QsaUJBQWlDLEVBQ3pDLGdCQUFxQyxFQUMvQixnQkFBa0MsRUFDcEUsV0FBMEI7UUFFNUMsS0FBSyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBTHdCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZ0I7UUFDekMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFxQjtRQUMvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ3BFLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBakVyQyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixTQUFJLEdBQUcsS0FB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Vm5DLFNBQVM7K0JBQ0Usa0JBQWtCLGFBR2pCLENBQUM7NEJBQ1YsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsS0FBSyxFQUFFLElBQUk7NEJBQ1gsV0FBVyx5QkFBeUI7eUJBQ3JDLENBQUM7OzBCQWtFVyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQUNqQyxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLFFBQVE7OzBCQUFJLElBQUk7OzBCQUFJLFFBQVE7d0VBaEVoQyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFjRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0LFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBTa2lwU2VsZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVXBsb2FkZXJPcHRpb25zLCBVcGxvYWRGaWxlLCBVcGxvYWRJbnB1dCwgVXBsb2FkT3V0cHV0IH0gZnJvbSAnbmd4LXVwbG9hZGVyJztcclxuaW1wb3J0IHsgSVVpRmlsZVNlcnZpY2UsIElVaUZpbGVTZXJ2aWNlTWVzc2FnZXMsIFVJX0ZJTEVTRVJWSUNFLCBVaUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdWktZmlsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGltZW5zaW9ucywgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSAnbmd4LWltYWdlLWNyb3BwZXInO1xyXG5pbXBvcnQgeyBVaVNpbXBsZUNvbXBvbmVudCB9IGZyb20gJy4uL3NpbXBsZS91aS1zaW1wbGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSVVpVHJhbnNsYXRlU2VydmljZSwgVUlfVFJBTlNMQVRFU0VSVklDRSB9IGZyb20gJy4uL3NlcnZpY2VzL3VpLXRyYW5zbGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRPdXRwdXRFeCBleHRlbmRzIFVwbG9hZE91dHB1dCB7XHJcbiAgZmlsZTogVXBsb2FkRmlsZUV4O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZEZpbGVFeCBleHRlbmRzIFVwbG9hZEZpbGUge1xyXG4gIGltYWdlUHJldmlldz86IGFueTtcclxuICBiYXNlNjQ/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVVpVXBsb2FkZXJVc2VyTWVzc2FnZSB7XHJcbiAgbWVzc2FnZTogSVVpRmlsZVNlcnZpY2VNZXNzYWdlcyxcclxuICBkYXRhOiBhbnlcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1maWxlLXVwbG9hZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbICcuL3VpLWZpbGUtdXBsb2FkZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gICAgdXNlRXhpc3Rpbmc6IFVpRmlsZVVwbG9hZGVyQ29tcG9uZW50LFxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUZpbGVVcGxvYWRlckNvbXBvbmVudCBleHRlbmRzIFVpU2ltcGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSBtYXhGaWxlcyA9IDE7XHJcbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNyb3AgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjcm9wUm91bmRlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNyb3BNYXhXaWR0aDtcclxuICBASW5wdXQoKSBmaWxlU2l6ZSA9ICdkZWZhdWx0JztcclxuICBASW5wdXQoKSBjdXN0b21GaWxlTWVudSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFkZEhpbnQ7XHJcbiAgQElucHV0KCkgbmV3RmlsZVBvc2l0aW9uOiAnZmlyc3QnIHwgJ2xhc3QnID0gJ2xhc3QnO1xyXG5cclxuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IHsgbWVudVRlbXBsYXRlPzogYW55LCBhZGRGaWxlVGVtcGxhdGU/OiBhbnksIGZpbGVUZW1wbGF0ZT86IGFueSB9ID0ge31cclxuXHJcbiAgZ2V0IG1lbnVUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcz8ubWVudVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFkZEZpbGVUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcz8uYWRkRmlsZVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbGVUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcz8uZmlsZVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcHJldmlld1Bvc2l0aW9uOiAnbGVmdCcgfCAnYm90dG9tJyB8ICdhYm92ZScgPSAnYm90dG9tJztcclxuXHJcbiAgQE91dHB1dCgpIGltYWdlQ3JvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZmlsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxJVWlVcGxvYWRlclVzZXJNZXNzYWdlPigpO1xyXG5cclxuICB1cGxvYWRPcHRpb25zOiBVcGxvYWRlck9wdGlvbnMgPSB7XHJcbiAgICBjb25jdXJyZW5jeTogdGhpcy5maWxlU2VydmljZUNvbmZpZy5jb25jdXJyZW50VXBsb2Fkc1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyB1cGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgY2hhbmdlRmlsZUluZGV4O1xyXG5cclxuICBzaG93Q3JvcHBlciA9IGZhbHNlO1xyXG4gIG1lbnVWaXNpYmxlOiBhbnk7XHJcbiAgc2hvd0Nyb3BQcmV2aWV3ID0ge307XHJcbiAgY3JvcFByZXZpZXdUaW1lb3V0cyA9IHt9O1xyXG4gIGNyb3BTb3VyY2VJbWFnZXMgPSB7fTtcclxuICBjcm9wcGVySW1hZ2VMb2FkZWQgPSB7fTtcclxuICBpbWFnZXNEb25lID0ge307XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIGNhbnZhc1JvdGF0aW9uID0ge31cclxuXHJcbiAgcHVibGljIGZpbGVzIDogeyBjdXN0b20/OiBhbnksICRuZXdGaWxlPzogVXBsb2FkRmlsZSB9W107XHJcblxyXG4gIHB1YmxpYyByZXNwb25zZUZpbGVzO1xyXG5cclxuICByZWZyZXNoQWRkSW5wdXQgPSBmYWxzZTtcclxuXHJcbiAgZmlsZU1lbnVPcGVuZWQ7XHJcblxyXG4gIHBhdGNoaW5nVmFsdWVzID0gZmFsc2U7XHJcblxyXG4gIGlucHV0QXJyYXkgPSBmYWxzZTtcclxuICBkcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuICB1cGxvYWRlcklkID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoVUlfRklMRVNFUlZJQ0UpIHByaXZhdGUgZmlsZVNlcnZpY2VDb25maWc6IElVaUZpbGVTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoVUlfVFJBTlNMQVRFU0VSVklDRSkgcHVibGljIHRyYW5zbGF0ZVNlcnZpY2U6IElVaVRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBAU2tpcFNlbGYoKSBwcm90ZWN0ZWQgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgICAgICAgICAgICBwcml2YXRlIGZpbGVTZXJ2aWNlOiBVaUZpbGVTZXJ2aWNlKSB7XHJcblxyXG4gICAgc3VwZXIobnVsbCwgY29udHJvbENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5maWxlU2VydmljZS51cGxvYWRTdWJzY3JpcHRpb24ubmV4dCh7YWN0aW9uOiAncmVnaXN0ZXInLCBkYXRhOiB0aGlzfSk7XHJcblxyXG4gICAgdGhpcy5maWxlU2VydmljZS51cGxvYWRTdWJzY3JpcHRpb24uc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcclxuICAgICAgc3dpdGNoICh2LmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3VwbG9hZFN0YXJ0ZWQnOiB0aGlzLnVwbG9hZGluZyA9IHRydWU7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3VwbG9hZEZhaWxlZCc6XHJcbiAgICAgICAgY2FzZSAndXBsb2FkU3VjY2Vzcyc6XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5wYXRjaFZhbHVlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCB1cGxvYWRJbnB1dCgpOiBFdmVudEVtaXR0ZXI8VXBsb2FkSW5wdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZElucHV0O1xyXG4gIH1cclxuXHJcbiAgY3JvcHBlZEltYWdlcyA9IHt9O1xyXG5cclxuICBnZXQgZWRpdGFibGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5lbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5nQWRkU3R5bGUoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogTWF0aC5hYnModGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzBdKSArICdweCcsXHJcbiAgICAgIGhlaWdodDogTWF0aC5hYnModGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdKSArICdweCcsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXNwZWN0UmF0aW8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzBdIC8gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFkZEZpbGVJbWdTcmMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5hZGRGaWxlSW1nU3JjO1xyXG4gIH1cclxuXHJcbiAgY3JvcERvbmUoZikge1xyXG4gICAgcmV0dXJuICFmLiRuZXdGaWxlIHx8IHRoaXMuaW1hZ2VzRG9uZVtmLiRuZXdGaWxlLmlkXTtcclxuICB9XHJcblxyXG4gIC8vIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIC8vICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAvLyB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWxlU2VydmljZS51cGxvYWRTdWJzY3JpcHRpb24ubmV4dCh7YWN0aW9uOiAnZGVzdHJveScsIGRhdGE6IHRoaXN9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZShmOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChmLiRuZXdGaWxlKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkSW5wdXQuZW1pdCh7dHlwZTogJ3JlbW92ZScsIGlkOiBmLiRuZXdGaWxlLmlkfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZiksIDEpO1xyXG4gICAgdGhpcy5wcmVwYXJlUmVzcG9uc2UoKTtcclxuICAgIC8vIHRoaXMub25DaGFuZ2UodGhpcy5pbnB1dEFycmF5ID8gdGhpcy5maWxlcyA6ICh0aGlzLmZpbGVzLmxlbmd0aCA+IDAgPyB0aGlzLmZpbGVzWzBdIDogbnVsbCkpO1xyXG4gICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdmaWxlUmVtb3ZlZCcsIGRhdGE6IGYgfSk7XHJcbi8vICAgICB0aGlzLnBhdGNoVmFsdWVzKCk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFZhbHVlcygpOiB2b2lkIHtcclxuICAgIHRoaXMucGF0Y2hpbmdWYWx1ZXMgPSB0cnVlO1xyXG4gICAgLy8gaWYgKHRoaXMuaW5wdXRBcnJheSkge1xyXG4gICAgLy8gICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsZXMubWFwKGYgPT4gZi5jdXN0b20pKTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5maWxlcy5sZW5ndGggPT09IDAgPyBudWxsIDogdGhpcy5maWxlc1swXS5jdXN0b20pO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5wYXRjaGluZ1ZhbHVlcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0ZpbGVzVG9VcGxvYWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmZpbGVzLmZpbmQoZiA9PiBmLiRuZXdGaWxlICYmIGYuJG5ld0ZpbGUucHJvZ3Jlc3Muc3RhdHVzICE9PSAyKTtcclxuICB9XHJcblxyXG4gIGNhbkltYWdlUHJldmlldyh0eXBlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpIHx8IHR5cGUuc3RhcnRzV2l0aCgndmlkZW8vJyk7XHJcbiAgfVxyXG5cclxuICBvblVwbG9hZE91dHB1dCgkZXZlbnQ6IFVwbG9hZE91dHB1dCwgc2tpcEN1c3RvbVZhbGlkYXRpb24gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coJGV2ZW50KTtcclxuICAgIHN3aXRjaCAoJGV2ZW50LnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3RhcnQnOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnZHJhZ092ZXInOlxyXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkcmFnT3V0JzpcclxuICAgICAgY2FzZSAnZHJvcCc6XHJcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnYWRkZWRUb1F1ZXVlJzpcclxuICAgICAgICBpZiAodGhpcy5jcm9wICYmICEkZXZlbnQuZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6ICRldmVudC5maWxlLmlkIH0pO1xyXG4gICAgICAgICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdjcm9wSW52YWxpZEZpbGVUeXBlJywgZGF0YTogJGV2ZW50LmZpbGUgfSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNraXBDdXN0b21WYWxpZGF0aW9uICYmIHRoaXMuZmlsZVNlcnZpY2VDb25maWcuZmlsZVZhbGlkYXRpb24pIHtcclxuICAgICAgICAgIHRoaXMuZmlsZVNlcnZpY2VDb25maWcuZmlsZVZhbGlkYXRpb24odGhpcy5maWxlU2l6ZSwgJGV2ZW50LmZpbGUpLnRoZW4odmFsaWQgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9uVXBsb2FkT3V0cHV0KCRldmVudCwgdHJ1ZSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6ICRldmVudC5maWxlLmlkIH0pO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZmlsZUV2ZW50LmVtaXQoeyBtZXNzYWdlOiAnY3JvcEludmFsaWRGaWxlVHlwZScsIGRhdGE6ICRldmVudC5maWxlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZjtcclxuICAgICAgICAgIGlmICh0aGlzLmNoYW5nZUZpbGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGYgPSB0aGlzLmZpbGVzW3RoaXMuY2hhbmdlRmlsZUluZGV4XTtcclxuICAgICAgICAgICAgaWYgKGYuJG5ld0ZpbGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6IGYuJG5ld0ZpbGUuaWQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZi4kbmV3RmlsZSA9ICRldmVudC5maWxlO1xyXG4gICAgICAgICAgICBmLmN1c3RvbSA9ICRldmVudC5maWxlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZpbGVJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGYgPSB7IGN1c3RvbTogJGV2ZW50LmZpbGUsICRuZXdGaWxlOiAkZXZlbnQuZmlsZSB9O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdGaWxlUG9zaXRpb24gPT09ICdsYXN0Jykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVzLnVuc2hpZnQoZik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmNhbkltYWdlUHJldmlldygkZXZlbnQuZmlsZS50eXBlKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jcm9wKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXNSb3RhdGlvblskZXZlbnQuZmlsZS5pZF0gPSAwO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JvcFNvdXJjZUltYWdlc1skZXZlbnQuZmlsZS5pZF0gPSAkZXZlbnQuZmlsZS5uYXRpdmVGaWxlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JvcHBlckltYWdlTG9hZGVkWyRldmVudC5maWxlLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZSgpO1xyXG4gICAgICAgICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdmaWxlQWRkZWQnLCBkYXRhOiBmIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2RvbmUnOlxyXG4gICAgICAgIGNvbnN0IGRmID0gdGhpcy5maWxlcy5maW5kKGYgPT4gZi4kbmV3RmlsZSA9PT0gJGV2ZW50LmZpbGUpO1xyXG4gICAgICAgIGlmIChkZikge1xyXG4gICAgICAgICAgaWYgKGRmLiRuZXdGaWxlLnJlc3BvbnNlU3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZGYpXS5jdXN0b20gPSBkZi4kbmV3RmlsZS5yZXNwb25zZTtcclxuICAgICAgICAgICAgZGYuJG5ld0ZpbGUgPSBudWxsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Vycm9yIG9uIHVwbG9hZCcsIGRmLiRldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5oYXNGaWxlc1RvVXBsb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZShmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHtcclxuICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmZpbGVzLmZpbmQoZiA9PiAhIWYuJG5ld0ZpbGUpID8gJ3VwbG9hZENvbnRyb2xGYWlsZWQnIDogJ3VwbG9hZENvbnRyb2xTdWNjZXNzJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJlcGFyZVJlc3BvbnNlKGRvZW1pdCA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLmlucHV0QXJyYXkpIHtcclxuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRmlsZXMpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRmlsZXMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc3BvbnNlRmlsZXMubGVuZ3RoID0gMDtcclxuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGYgPT4gdGhpcy5yZXNwb25zZUZpbGVzLnB1c2goey4uLmYuY3VzdG9tLCAkbmV3RmlsZTogZi4kbmV3RmlsZX0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcyA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRmlsZXMpIHtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbGVzWzBdLmN1c3RvbSkuZm9yRWFjaChrID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VGaWxlc1trXSA9IHRoaXMuZmlsZXNbMF0uY3VzdG9tW2tdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcy4kbmV3RmlsZSA9IHRoaXMuZmlsZXNbMF0uJG5ld0ZpbGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChkb2VtaXQpIHtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJlc3BvbnNlRmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKCdlbWl0JywgdGhpcy5maWxlc1sxXSwgeyAuLi50aGlzLmZpbGVzWzFdLmN1c3RvbSwgJG5ld0ZpbGU6IHRoaXMuZmlsZXNbMV0uJG5ld0ZpbGUgfSk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/XHJcbiAgICAvLyAgIHRoaXMuZmlsZXMubWFwKGYgPT4gKHsgLi4uZi5jdXN0b20sICRuZXdGaWxlOiBmLiRuZXdGaWxlfSkpIDpcclxuICAgIC8vICAgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5maWxlc1swXS5jdXN0b20sICRuZXdGaWxlOiB0aGlzLmZpbGVzWzBdLiRuZXdGaWxlIH0gOiBudWxsKSk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/XHJcbiAgICAvLyAgIHRoaXMuZmlsZXMgOlxyXG4gICAgLy8gICAodGhpcy5maWxlcy5sZW5ndGggPiAwID8gdGhpcy5maWxlc1swXSA6IG51bGwpKTtcclxuICB9XHJcblxyXG4gIGJlZm9yZVNhdmUoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChmID0+IHtcclxuICAgICAgICBpZiAoZi4kbmV3RmlsZSAmJiBmLiRuZXdGaWxlLnByb2dyZXNzLnN0YXR1cyA9PT0gMikge1xyXG4gICAgICAgICAgZi4kbmV3RmlsZS5wcm9ncmVzcy5zdGF0dXMgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jcm9wICYmIGYuJG5ld0ZpbGUgJiYgIXRoaXMuaW1hZ2VzRG9uZVtmLiRuZXdGaWxlLmlkXSkge1xyXG4gICAgICAgICAgdGhpcy5jcm9wcGVyRG9uZShmLiRuZXdGaWxlLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHJlcygnZG9uZScpO1xyXG4gICAgICB9LCAyNTApO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZpbGVDaGFuZ2VFdmVudChldmVudDogYW55LCBmOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhbmdlRmlsZUluZGV4ID0gdGhpcy5maWxlcy5pbmRleE9mKGYpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRDcm9wUHJldmlldyhpZCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3JvcFByZXZpZXdUaW1lb3V0c1tpZF0pO1xyXG4gICAgdGhpcy5zaG93Q3JvcFByZXZpZXdbaWRdID0gISF0aGlzLmNyb3BTb3VyY2VJbWFnZXNbaWRdO1xyXG4gIH1cclxuXHJcbiAgc3RvcENyb3BQcmV2aWV3KGlkKSB7XHJcbiAgICB0aGlzLmNyb3BQcmV2aWV3VGltZW91dHNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0Nyb3BQcmV2aWV3W2lkXSA9IGZhbHNlO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIHpvb21Dcm9wcGVkSW1hZ2UoZGlyLCBpZCkge1xyXG4gICAgbGV0IHNjYWxlID0gdGhpcy50cmFuc2Zvcm1baWRdLnNjYWxlO1xyXG4gICAgc2NhbGUgKz0gZGlyO1xyXG4gICAgaWYgKHNjYWxlIDwgMC4xKSB7XHJcbiAgICAgIHNjYWxlID0gMC4xO1xyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc2Zvcm1baWRdID0ge1xyXG4gICAgICAuLi50aGlzLnRyYW5zZm9ybVtpZF0sXHJcbiAgICAgIHNjYWxlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcm90YXRlQ3JvcHBlZEltYWdlKGRpciwgaWQpIHtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb25baWRdICs9IGRpcjtcclxuICAgIGNvbnN0IGZsaXBwZWRIID0gdGhpcy50cmFuc2Zvcm1baWRdLmZsaXBIO1xyXG4gICAgY29uc3QgZmxpcHBlZFYgPSB0aGlzLnRyYW5zZm9ybVtpZF0uZmxpcFY7XHJcbiAgICB0aGlzLnRyYW5zZm9ybVtpZF0gPSB7XHJcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtW2lkXSxcclxuICAgICAgZmxpcEg6IGZsaXBwZWRWLFxyXG4gICAgICBmbGlwVjogZmxpcHBlZEhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQsIGlkKSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZXNbaWRdID0gZXZlbnQuYmFzZTY0O1xyXG4gICAgdGhpcy5pbWFnZUNyb3BwZWQuZW1pdChldmVudC5iYXNlNjQpO1xyXG4gIH1cclxuXHJcbiAgaW1hZ2VMb2FkZWQoaWQpIHtcclxuICAgIHRoaXMuc2hvd0Nyb3BwZXIgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtW2lkXSA9IHtcclxuICAgICAgICBzY2FsZTogMVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcm9wcGVyUmVhZHkoc291cmNlSW1hZ2VEaW1lbnNpb25zOiBEaW1lbnNpb25zLCBpZCkge1xyXG4gICAgdGhpcy5jcm9wcGVySW1hZ2VMb2FkZWRbaWRdID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGxvYWRJbWFnZUZhaWxlZCgpIHtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1lbnVWaXNpYmlsaXR5KGYpIHtcclxuICAgIHRoaXMuZmlsZU1lbnVPcGVuZWQgPSBmO1xyXG4gIH1cclxuXHJcbiAgbWVudUNsaWNrKCkge1xyXG4gICAgdGhpcy5maWxlTWVudU9wZW5lZCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmlucHV0QXJyYXkgPSBvYmogaW5zdGFuY2VvZiBBcnJheTtcclxuICAgIGlmICh0aGlzLmlucHV0QXJyYXkpIHtcclxuICAgICAgdGhpcy5maWxlcyA9IG9iai5tYXAoZiA9PiAoeyBjdXN0b206IGYsICRuZXdGaWxlOiBudWxsIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsZXMgPSBvYmogPyBbIHsgY3VzdG9tOm9iaiwgJG5ld0ZpbGU6IG51bGx9IF0gOiBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuY3JvcFNvdXJjZUltYWdlcyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgY3JvcHBlckRvbmUoaWQpIHtcclxuICAgIGNvbnN0IGYgPSB0aGlzLmZpbGVzLmZpbmQoZnggPT4gZnguJG5ld0ZpbGUgJiYgZnguJG5ld0ZpbGUuaWQgPT09IGlkKTtcclxuICAgIGlmIChmKSB7XHJcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JvcHBlZEltYWdlc1tpZF07XHJcbiAgICAgIGZldGNoKHVybClcclxuICAgICAgICAudGhlbihyZXMgPT4gcmVzLmJsb2IoKSlcclxuICAgICAgICAudGhlbihibG9iID0+IHtcclxuICAgICAgICAgIGYuJG5ld0ZpbGUubmF0aXZlRmlsZSA9IG5ldyBGaWxlKFsgYmxvYiBdLCAnY3JvcC5wbmcnLCB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGYuJG5ld0ZpbGUubmFtZSA9ICdjcm9wLnBuZyc7XHJcbiAgICAgICAgICBmLiRuZXdGaWxlLnNpemUgPSBmLiRuZXdGaWxlLm5hdGl2ZUZpbGUuc2l6ZTtcclxuICAgICAgICAgIGYuJG5ld0ZpbGUudHlwZSA9IGYuJG5ld0ZpbGUubmF0aXZlRmlsZS50eXBlO1xyXG4gICAgICAgICAgdGhpcy5pbWFnZXNEb25lW2lkXSA9IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImxhYmVsXCIgKm5nSWY9XCJsYWJlbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbnRhaW5lclwiIFttYXRUb29sdGlwXT1cInJlcXVpcmVkID8gdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5jb250cm9scy52YWxpZGF0aW9uLnJlcXVpcmVkJykgOiB1bmRlZmluZWRcIiBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidhYm92ZSdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0XCI+e3tsYWJlbH19PC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkXCI+KjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJmaWxlcy1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ZHJhZ2dpbmc6IGRyYWdnaW5nLCBkaXNhYmxlZDogdXBsb2FkaW5nIHx8ICFlZGl0YWJsZX1cIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImV4aXN0aW5nLWZpbGVzXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLW1lbnVcIiAoY2xpY2spPVwidG9nZ2xlTWVudVZpc2liaWxpdHkoZilcIiAqbmdJZj1cIiFjdXN0b21GaWxlTWVudSAmJiBlZGl0YWJsZSAmJiAhdXBsb2FkaW5nXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPm1lbnU8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZpbGUtbWVudS1jb250YWluZXIgbWF0LWVsZXZhdGlvbi16MlwiIFtuZ0NsYXNzXT1cInt2aXNpYmxlOiBmID09PSBmaWxlTWVudU9wZW5lZH1cIiAoY2xpY2spPVwibWVudUNsaWNrKClcIiAobW91c2VsZWF2ZSk9XCJtZW51Q2xpY2soKVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbWVudVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtZW51LWl0ZW1cIj57eyB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnVpLWZpbGUtdXBsb2FkZXIubWVudS5jaGFuZ2UnKSB9fVxyXG4gICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhcmVmcmVzaEFkZElucHV0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIHR5cGU9XCJmaWxlXCIgbmdGaWxlU2VsZWN0IFtvcHRpb25zXT1cInVwbG9hZE9wdGlvbnNcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudCgkZXZlbnQsIGYpXCJcclxuICAgICAgICAgICAgICAgICAgICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW1cIiAoY2xpY2spPVwicmVtb3ZlKGYpXCI+e3sgdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5jb250cm9scy51aS1maWxlLXVwbG9hZGVyLm1lbnUuZGVsZXRlJykgfX08L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVudVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibWVudVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntmaWxlSW5wdXQ6IGZpbGVJbnB1dH1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlSW5wdXQ+XHJcbiAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIHR5cGU9XCJmaWxlXCIgbmdGaWxlU2VsZWN0IFtvcHRpb25zXT1cInVwbG9hZE9wdGlvbnNcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudCgkZXZlbnQsIGYpXCJcclxuICAgICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIiBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImNyb3AgJiYgIWNyb3BEb25lKGYpXCIgKG1vdXNlZW50ZXIpPVwic3RhcnRDcm9wUHJldmlldyhmLiRuZXdGaWxlLmlkKVwiIChtb3VzZWxlYXZlKT1cInN0b3BDcm9wUHJldmlldyhmLiRuZXdGaWxlLmlkKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLWNvbnRhaW5lclwiIFtuZ1N0eWxlXT1cIm5nQWRkU3R5bGVcIj5cclxuXHJcbiAgICAgICAgICA8dWktZmlsZSAqbmdJZj1cImZhbHNlICYmIGZpbGVzLmxlbmd0aCA+IDAgJiYgIWNyb3BTb3VyY2VJbWFnZXNcIiBbZmlsZVNpemVdPVwiZmlsZVNpemVcIiBbc3JjRGF0YV09XCJmaWxlc1swXS5jdXN0b21cIiBbbmdDbGFzc109XCJ7cm91bmRlZDogY3JvcFJvdW5kZWR9XCI+PC91aS1maWxlPlxyXG5cclxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cIiFjcm9wcGVySW1hZ2VMb2FkZWRbZi4kbmV3RmlsZS5pZF0gJiYgY3JvcFNvdXJjZUltYWdlc1tmLiRuZXdGaWxlLmlkXVwiIFtkaWFtZXRlcl09XCI3NVwiPjwvbWF0LXNwaW5uZXI+XHJcblxyXG4gICAgICAgICAgPGltYWdlLWNyb3BwZXIgKm5nSWY9XCJjcm9wU291cmNlSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUZpbGVdPVwiY3JvcFNvdXJjZUltYWdlc1tmLiRuZXdGaWxlLmlkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cImNyb3BNYXhXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbb25seVNjYWxlRG93bl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcm91bmRDcm9wcGVyXT1cImNyb3BSb3VuZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW52YXNSb3RhdGlvbl09XCJjYW52YXNSb3RhdGlvbltmLiRuZXdGaWxlLmlkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNmb3JtXT1cInRyYW5zZm9ybVtmLiRuZXdGaWxlLmlkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25JbWFnZV09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJzaG93Q3JvcHBlciA/IG51bGwgOiAnbm9uZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCIncG5nJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cIm9uSW1hZ2VDcm9wcGVkKCRldmVudCwgZi4kbmV3RmlsZS5pZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlTG9hZGVkKT1cImltYWdlTG9hZGVkKGYuJG5ld0ZpbGUuaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChjcm9wcGVyUmVhZHkpPVwiY3JvcHBlclJlYWR5KCRldmVudCwgZi4kbmV3RmlsZS5pZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRJbWFnZUZhaWxlZCk9XCJsb2FkSW1hZ2VGYWlsZWQoKVwiXHJcbiAgICAgICAgICA+PC9pbWFnZS1jcm9wcGVyPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLXByZXZpZXcgbWF0LWVsZXZhdGlvbi16MlwiIFtjbGFzc109XCJwcmV2aWV3UG9zaXRpb25cIiAqbmdJZj1cInRydWUgfHwgKHNob3dDcm9wUHJldmlld1tmLiRuZXdGaWxlLmlkXSAmJiBjcm9wcGVySW1hZ2VMb2FkZWRbZi4kbmV3RmlsZS5pZF0pXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLW1lbnVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cInpvb21Dcm9wcGVkSW1hZ2UoLjEsIGYuJG5ld0ZpbGUuaWQpXCI+em9vbV9pbjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJ6b29tQ3JvcHBlZEltYWdlKC0gLjEsIGYuJG5ld0ZpbGUuaWQpXCI+em9vbV9vdXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwicm90YXRlQ3JvcHBlZEltYWdlKC0xLCBmLiRuZXdGaWxlLmlkKVwiPnJvdGF0ZV9sZWZ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cInJvdGF0ZUNyb3BwZWRJbWFnZSgxLCBmLiRuZXdGaWxlLmlkKVwiPnJvdGF0ZV9yaWdodDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDEgMSAxMDAlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+dXBsb2FkX2ZpbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiB0eXBlPVwiZmlsZVwiIG5nRmlsZVNlbGVjdCBbb3B0aW9uc109XCJ1cGxvYWRPcHRpb25zXCIgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50LCBmKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCIgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cInJlbW92ZShmKVwiPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMSAxIDEwMCVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNyb3BwZXJEb25lKGYuJG5ld0ZpbGUuaWQpXCI+ZG9uZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiY3JvcHBlZEltYWdlc1tmLiRuZXdGaWxlLmlkXVwiIFtuZ0NsYXNzXT1cIntyb3VuZGVkOiBjcm9wUm91bmRlZH1cIi8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjcm9wIHx8IGNyb3BEb25lKGYpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbGVUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ZmlsZTogZiwgZmlsZUlucHV0OiBmaWxlSW5wdXQyfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZpbGVJbnB1dDI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KCRldmVudCwgZilcIlxyXG4gICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCIgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8dWktZmlsZSAqbmdJZj1cIiFmaWxlVGVtcGxhdGVcIiBbZmlsZVNpemVdPVwiZmlsZVNpemVcIiBbc3JjRGF0YV09XCJmLiRuZXdGaWxlID8gZi4kbmV3RmlsZTogZi5jdXN0b21cIiBbbmdDbGFzc109XCJ7cm91bmRlZDogY3JvcCAmJiBjcm9wUm91bmRlZH1cIj5cclxuICAgICAgICA8L3VpLWZpbGU+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmLiRuZXdGaWxlXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZi4kbmV3RmlsZS5yZXNwb25zZVN0YXR1cyAmJiBmLiRuZXdGaWxlLnJlc3BvbnNlU3RhdHVzICE9PSAyMDBcIiBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lciBlcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnVpLWZpbGUtdXBsb2FkZXIudXBsb2FkRXJyb3InLCBmLiRuZXdGaWxlLnJlc3BvbnNlKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWYuJG5ld0ZpbGUucmVzcG9uc2VTdGF0dXMgJiYgZi4kbmV3RmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IDFcIiBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBbbmdTdHlsZV09XCJ7d2lkdGg6IGYuJG5ld0ZpbGUucHJvZ3Jlc3MuZGF0YS5wZXJjZW50YWdlICsgJyUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXIgYWRkXCIgbmdGaWxlRHJvcCAgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiIFtuZ0NsYXNzXT1cInt2aXNpYmxlOiBmaWxlcy5sZW5ndGggPCBtYXhGaWxlcyB8fCBtYXhGaWxlcyA9PT0gMH1cIiBbbmdTdHlsZV09XCJhZGRGaWxlVGVtcGxhdGUgPyB7fSA6IG5nQWRkU3R5bGVcIj5cclxuICAgIDxsYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkZEZpbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRGaWxlVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhZGRGaWxlVGVtcGxhdGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWltYWdlLWNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJhZGRGaWxlSW1nU3JjXCIgW25nQ2xhc3NdPVwieyd3aXRoLWhpbnQnOiBhZGRIaW50fVwiIC8+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImFkZEhpbnRcIiBjbGFzcz1cImFkZC1oaW50XCI+e3thZGRIaW50fX08L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiIFttdWx0aXBsZV09XCJtYXhGaWxlcyA9PT0gMCAmJiBtdWx0aXBsZVwiPlxyXG4gICAgPC9sYWJlbD5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=