mmhglobal-dynamicform 2.42.0 → 2.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,10 @@
1
1
  /********** Angular **********/
2
2
  import { Component, ViewChild } from '@angular/core';
3
+ /********** RxJS **********/
4
+ import { firstValueFrom } from 'rxjs';
3
5
  /********** Component & Service **********/
4
6
  import { InputFieldBase } from '../components/inputfieldbase.component';
5
7
  import { ZComponentHelper } from 'mmhglobal-zcore';
6
- import { firstValueFrom } from 'rxjs';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "../services/zcomponent.service";
9
10
  import * as i2 from "mmhglobal-zcore";
@@ -34,73 +35,174 @@ export class ZtexteditorComponent extends InputFieldBase {
34
35
  };
35
36
  this.isCompressModeOn = false;
36
37
  this.CloseEnlargeBtn = false;
37
- this.style = "";
38
- this.CompressionEnableIcon = 'k-i-zoom-best-fit';
39
- this.CompressionDisabledIcon = 'k-i-zoom-actual-size';
38
+ this.originalInlineStyle = '';
39
+ this.compressionEnableIcon = 'k-i-zoom-best-fit';
40
+ this.compressionDisabledIcon = 'k-i-zoom-actual-size';
40
41
  }
42
+ /** Initialize component state and editor configuration. */
41
43
  ngOnInit() {
42
44
  super.setupInnerField();
43
- this.data.ToolBarUploadImageMethod = this.data.ToolBarUploadImageMethod || 'explorer'; // || 'default';
45
+ // Backward-compatible default: when not provided, use explorer.
46
+ this.data.ToolBarUploadImageMethod = this.data.ToolBarUploadImageMethod || 'explorer';
44
47
  this.setupPasteCleanupSettings();
45
48
  super.setupComponentSettings(this.componentSettings);
46
49
  super.focusOnDefault(this.focus.bind(this));
47
- this.isCompressModeOn = !!this.data.Compression;
50
+ // Safe cast to boolean.
51
+ this.isCompressModeOn = !!this.data?.Compression;
48
52
  }
53
+ /** Notify component service once view is ready. */
49
54
  ngAfterViewInit() {
50
55
  this.componentService.decrementComponentCounterForField(this.data);
51
56
  }
57
+ /** Sync editor content to zModel and trigger configured change handler. */
52
58
  onChange(value) {
53
59
  ZComponentHelper.setToZModel(this.data.Value, value, this.group, this.data);
54
- this.triggerEvent("inputfield-onChange", this.data.OnChange, value);
60
+ this.triggerEvent('inputfield-onChange', this.data.OnChange, value);
55
61
  }
56
- async onPaste($event) {
57
- const imageCompressionEnabled = !!this.data.Compression;
58
- if (imageCompressionEnabled && this.isCompressModeOn) {
59
- let beforeSize = 0;
60
- let afterSize = 0;
61
- const parser = new DOMParser();
62
- const doc = parser.parseFromString($event.cleanedHtml, 'text/html');
63
- const imgElements = Array.from(doc.querySelectorAll('img')).filter(dom => dom.src.startsWith('data:image/'));
64
- await Promise.all(imgElements.map(async (imgTags, index) => {
65
- const file = await this.base64ToFile(imgTags.src, "image" + index.toString());
66
- beforeSize += file.size;
67
- const compress = await this.ImageCompression(file);
68
- if (compress != null) {
69
- const base64 = await this.readFileAsDataURL(compress);
70
- afterSize += compress.size;
71
- imgTags.src = base64;
72
- }
73
- else {
74
- console.log('Image compress failed');
75
- }
76
- }));
77
- console.log(`Before Image compress size: ${(beforeSize / 1024).toFixed(2)}KB`);
78
- console.log(`After Image compress size: ${(afterSize / 1024).toFixed(2)}KB`);
79
- this.editor.value = doc.body.innerHTML;
62
+ /** Handle paste: normalize plain-text special entities, then optionally compress pasted base64 images. */
63
+ async onPaste(e) {
64
+ if (!e) {
65
+ console.warn('[Ztexteditor] Paste event is undefined. Paste ignored.');
66
+ return;
67
+ }
68
+ // Common Excel/plain-text issue: "&" gets inserted literally causing "&" in HTML.
69
+ this.handleCommonSymbolTags(e);
70
+ // Compress only if enabled and base64 images exist.
71
+ await this.handleImageCompression(e);
72
+ }
73
+ /**
74
+ * If the paste is plain text (no HTML tags and no images), normalize common entities and insert as real text.
75
+ * Returns true when the event is handled and default paste is prevented.
76
+ */
77
+ handleCommonSymbolTags(e) {
78
+ const editor = this.editor;
79
+ if (!editor) {
80
+ console.warn('[Ztexteditor] Editor is not ready. Cannot handle plain-text normalization.');
81
+ return false;
82
+ }
83
+ const clipboard = e.originalEvent?.clipboardData;
84
+ const plainText = clipboard?.getData('text/plain') ?? '';
85
+ const htmlText = clipboard?.getData('text/html') ?? '';
86
+ const cleanedHtml = e.cleanedHtml ?? '';
87
+ const htmlHasImg = /<img\b/i.test(htmlText);
88
+ const cleanedHasTags = /<[^>]+>/.test(cleanedHtml);
89
+ // If paste has HTML tags or images, do NOT interfere (let Kendo handle it).
90
+ if (htmlHasImg || cleanedHasTags) {
91
+ return false;
80
92
  }
93
+ // Plain-text paste: prevent Kendo from inserting encoded entities as literal text.
94
+ e.preventDefault();
95
+ // Decode common entities once so user sees correct characters.
96
+ // This is intentionally limited to common entities to avoid unexpected transformations.
97
+ const normalized = (plainText || cleanedHtml)
98
+ .replaceAll('&amp;', '&')
99
+ .replaceAll('&lt;', '<')
100
+ .replaceAll('&gt;', '>')
101
+ .replaceAll('&quot;', '"')
102
+ .replaceAll('&#39;', "'");
103
+ editor.exec('insertText', { text: normalized });
104
+ return true;
105
+ }
106
+ /**
107
+ * If compression is enabled and compress mode is ON, compress any pasted base64 images (data:image/*).
108
+ * IMPORTANT: modifies e.cleanedHtml (what gets pasted), not editor.value.
109
+ */
110
+ async handleImageCompression(e) {
111
+ const compressionConfig = this.data?.Compression;
112
+ const isCompressionEnabled = !!compressionConfig;
113
+ if (!isCompressionEnabled || !this.isCompressModeOn) {
114
+ return;
115
+ }
116
+ const cleaned = e.cleanedHtml ?? '';
117
+ if (!cleaned) {
118
+ return;
119
+ }
120
+ let doc;
121
+ try {
122
+ doc = new DOMParser().parseFromString(cleaned, 'text/html');
123
+ }
124
+ catch (err) {
125
+ console.warn('[Ztexteditor] Failed to parse pasted HTML for image compression. Paste will continue.', err);
126
+ return;
127
+ }
128
+ const imgElements = Array.from(doc.querySelectorAll('img'))
129
+ .map(img => img)
130
+ .filter(img => typeof img?.src === 'string' && img.src.startsWith('data:image/'));
131
+ if (imgElements.length === 0) {
132
+ return;
133
+ }
134
+ let beforeSizeBytes = 0;
135
+ let afterSizeBytes = 0;
136
+ let failedCount = 0;
137
+ await Promise.all(imgElements.map(async (img, index) => {
138
+ const src = img.src;
139
+ try {
140
+ const file = await this.base64ToFile(src, `pasted-image-${index}`);
141
+ beforeSizeBytes += file.size;
142
+ const compressed = await this.imageCompression(file);
143
+ if (!compressed) {
144
+ failedCount++;
145
+ console.warn(`[Ztexteditor] Image compression skipped/failed for pasted image #${index + 1}.`);
146
+ return;
147
+ }
148
+ const base64 = await this.readFileAsDataURL(compressed);
149
+ afterSizeBytes += compressed.size;
150
+ img.src = base64;
151
+ }
152
+ catch (err) {
153
+ failedCount++;
154
+ console.warn(`[Ztexteditor] Error compressing pasted image #${index + 1}.`, err);
155
+ }
156
+ }));
157
+ // Helpful console logs for troubleshooting.
158
+ const beforeKb = (beforeSizeBytes / 1024).toFixed(2);
159
+ const afterKb = (afterSizeBytes / 1024).toFixed(2);
160
+ console.log(`[Ztexteditor] Pasted image compression completed. Images=${imgElements.length}, Failed=${failedCount}, Before=${beforeKb}KB, After=${afterKb}KB`);
161
+ // Modify what gets pasted, not editor.value.
162
+ e.cleanedHtml = doc.body.innerHTML;
81
163
  }
82
- OnOffCompressMode($event) {
83
- debugger;
84
- const alertHeader = `Confirmation`;
85
- const alertMessage = `Do you want to <b>${this.isCompressModeOn ? 'disable' : 'enable'}</b> image compression when input content? <br/> Note: Click "Yes" the content will be reset to blank.`;
86
- const buttonConfig = {
164
+ /**
165
+ * Toggle compress mode via confirmation dialog.
166
+ */
167
+ onOffCompressMode(event) {
168
+ const header = 'Confirmation';
169
+ const actionText = this.isCompressModeOn ? 'disable' : 'enable';
170
+ // Keep existing behavior: toggling resets content.
171
+ const message = `Do you want to <b>${actionText}</b> image compression when input content?` +
172
+ `<br/>Note: Click "Yes" the content will be reset to blank.`;
173
+ const buttons = {
87
174
  yes: { text: 'Yes', cssClass: 'primary' },
88
- no: { text: 'No', cssClass: 'secondary' }
175
+ no: { text: 'No', cssClass: 'secondary' },
89
176
  };
90
- this.alertService.show(alertHeader, alertMessage, [buttonConfig.yes, buttonConfig.no], ['col-4'])
177
+ this.alertService
178
+ .show(header, message, [buttons.yes, buttons.no], ['col-4'])
91
179
  .subscribe(reply => {
92
- if (reply === 'Yes') {
93
- this.editor.value = "";
94
- this.isCompressModeOn = !this.isCompressModeOn;
95
- let button = $event.target;
96
- button.classList.remove(this.CompressionEnableIcon);
97
- button.classList.remove(this.CompressionDisabledIcon);
98
- button.classList.add(this.isCompressModeOn ? this.CompressionDisabledIcon : this.CompressionEnableIcon);
180
+ if (reply !== 'Yes') {
181
+ return;
182
+ }
183
+ const editor = this.editor;
184
+ if (!editor) {
185
+ console.warn('[Ztexteditor] Editor is not ready. Cannot toggle compression mode.');
186
+ return;
187
+ }
188
+ editor.value = '';
189
+ this.isCompressModeOn = !this.isCompressModeOn;
190
+ // Update toolbar icon classes safely.
191
+ const buttonEl = this.getEventTargetElement(event);
192
+ if (!buttonEl) {
193
+ console.warn('[Ztexteditor] Unable to resolve toolbar button element from event.');
194
+ }
195
+ else {
196
+ buttonEl.classList.remove(this.compressionEnableIcon, this.compressionDisabledIcon);
197
+ buttonEl.classList.add(this.isCompressModeOn ? this.compressionDisabledIcon : this.compressionEnableIcon);
198
+ }
199
+ if (this.compress_btn) {
99
200
  this.compress_btn.title = `${this.isCompressModeOn ? 'Disable' : 'Enable'} image compression`;
100
- this.toastService.show(`${this.isCompressModeOn ? 'Enable' : 'Disable'} image compression successfully.`, 'top', false, 2500, "success");
101
201
  }
202
+ this.toastService.show(`${this.isCompressModeOn ? 'Enable' : 'Disable'} image compression successfully.`, 'top', false, 2500, 'success');
102
203
  });
103
204
  }
205
+ /** Focus editor if available. Returns true if focus succeeded. */
104
206
  focus() {
105
207
  if (this.editor) {
106
208
  this.editor.focus();
@@ -115,96 +217,182 @@ export class ZtexteditorComponent extends InputFieldBase {
115
217
  }
116
218
  return iconName;
117
219
  }
220
+ /** Merge paste cleanup options from data.Options (string expression or object) into pasteCleanupSettings. */
118
221
  setupPasteCleanupSettings() {
119
- if (this.data.Options) {
120
- if (typeof this.data.Options == 'string') {
121
- const option = ZComponentHelper.getGroupValue(this.data.Options, this.group);
122
- Object.assign(this.pasteCleanupSettings, option);
222
+ const options = this.data?.Options;
223
+ if (!options) {
224
+ return;
225
+ }
226
+ if (typeof options === 'string') {
227
+ const resolved = ZComponentHelper.getGroupValue(options, this.group);
228
+ if (resolved && typeof resolved === 'object') {
229
+ Object.assign(this.pasteCleanupSettings, resolved);
123
230
  }
124
- else if (typeof this.data.Options == 'object') {
125
- Object.assign(this.pasteCleanupSettings, this.data.Options);
231
+ else {
232
+ console.warn('[Ztexteditor] data.Options resolved value is not an object. Paste cleanup settings unchanged.', {
233
+ resolved,
234
+ });
126
235
  }
236
+ return;
127
237
  }
238
+ if (typeof options === 'object') {
239
+ Object.assign(this.pasteCleanupSettings, options);
240
+ return;
241
+ }
242
+ console.warn('[Ztexteditor] Unsupported data.Options type. Paste cleanup settings unchanged.', {
243
+ type: typeof options,
244
+ });
128
245
  }
129
- // #region Custom Image Upload
246
+ // #region Custom Image Upload / Enlarge
247
+ /** Trigger hidden file input click for image upload. */
130
248
  openFileExplorer() {
131
- const input = document.getElementById(`${this.data.Value}-upload-file`);
132
- if (input) {
133
- input.click();
249
+ const id = `${this.data.Value}-upload-file`;
250
+ const input = document.getElementById(id);
251
+ if (!input) {
252
+ console.warn(`[Ztexteditor] Upload input element not found (id="${id}").`);
253
+ return;
134
254
  }
255
+ input.click();
135
256
  }
257
+ /** Open an enlarged popup editor. */
136
258
  openPopup() {
137
- if (this.editor) {
138
- // Open the popup
139
- this.dialogRef = this.dialogService.open({
140
- content: ZtexteditorComponent,
141
- width: '98%',
142
- height: '97%'
143
- });
144
- const texteditor = this.dialogRef.content.instance;
145
- texteditor.data = this.data;
146
- texteditor.data.AllowEnlarge = false;
147
- texteditor.dialogRef = this.dialogRef;
148
- texteditor.CloseEnlargeBtn = true;
149
- texteditor.componentProperties = this.componentProperties;
150
- this.style = this.componentProperties.style.style1;
151
- texteditor.componentProperties.style.style1 += "height:" + (window.innerHeight * 0.8).toString() + "px";
152
- texteditor.group = this.group;
153
- texteditor.componentSettings = this.componentSettings;
154
- texteditor.form = this.form;
155
- //To set the html back into the target ztext editor.
156
- this.dialogRef.result.subscribe(() => {
157
- this.data.AllowEnlarge = true;
158
- this.componentProperties.style.style1 = this.style;
159
- this.editor.value = this.group.zModel[this.data.Value];
160
- this.onChange(this.group.zModel[this.data.Value]);
161
- this.focus();
162
- });
259
+ const editor = this.editor;
260
+ if (!editor) {
261
+ console.warn('[Ztexteditor] Editor is not ready. Cannot open popup.');
262
+ return;
263
+ }
264
+ // Open dialog
265
+ this.dialogRef = this.dialogService.open({
266
+ content: ZtexteditorComponent,
267
+ width: '98%',
268
+ height: '97%',
269
+ });
270
+ const popupComponent = this.dialogRef.content.instance;
271
+ popupComponent.data = this.data;
272
+ popupComponent.data.AllowEnlarge = false;
273
+ popupComponent.dialogRef = this.dialogRef;
274
+ popupComponent.CloseEnlargeBtn = true;
275
+ popupComponent.componentProperties = this.componentProperties;
276
+ // Preserve style so we can restore it on close.
277
+ this.originalInlineStyle = this.componentProperties?.style?.style1 ?? '';
278
+ if (popupComponent.componentProperties?.style) {
279
+ popupComponent.componentProperties.style.style1 =
280
+ (popupComponent.componentProperties.style.style1 ?? '') +
281
+ `height:${(window.innerHeight * 0.8).toString()}px`;
163
282
  }
283
+ popupComponent.group = this.group;
284
+ popupComponent.componentSettings = this.componentSettings;
285
+ popupComponent.form = this.form;
286
+ // Restore state and push value back into editor on close.
287
+ this.dialogRef.result.subscribe(() => {
288
+ this.data.AllowEnlarge = true;
289
+ if (this.componentProperties?.style) {
290
+ this.componentProperties.style.style1 = this.originalInlineStyle;
291
+ }
292
+ // Pull current zModel into editor and trigger onChange (existing behavior).
293
+ const newValue = this.group?.zModel?.[this.data.Value];
294
+ editor.value = newValue;
295
+ this.onChange(newValue);
296
+ this.focus();
297
+ });
164
298
  }
299
+ /** Close the popup editor if open. */
165
300
  onPopupClose() {
301
+ if (!this.dialogRef) {
302
+ return;
303
+ }
166
304
  this.dialogRef.close();
167
305
  }
306
+ /**
307
+ * Handle <input type="file"> change and insert selected image into editor.
308
+ * NOTE: Prefer typing fileInput as Event for better safety.
309
+ */
168
310
  uploadImage(fileInput) {
169
- const uploadedImage = fileInput.target.files[0];
170
- if (uploadedImage) {
171
- this.insertImageIntoEditor(uploadedImage);
311
+ const input = fileInput?.target;
312
+ const file = input?.files?.[0];
313
+ if (!file) {
314
+ console.warn('[Ztexteditor] No image selected for upload.');
315
+ return;
172
316
  }
317
+ void this.insertImageIntoEditor(file);
173
318
  }
319
+ /** Insert image into editor, optionally compressing first. */
174
320
  async insertImageIntoEditor(file) {
175
- const imageCompressionEnabled = !!this.data.Compression;
176
- if (imageCompressionEnabled) {
177
- console.log(`Before Image compress size: ${(file.size / 1024).toFixed(2)}KB`);
178
- file = await this.ImageCompression(file);
179
- console.log(`After Image compress size: ${(file.size / 1024).toFixed(2)}KB`);
180
- }
181
- var base64str = await this.readFileAsDataURL(file);
182
- this.editor.exec("insertImage", { src: base64str });
321
+ const editor = this.editor;
322
+ if (!editor) {
323
+ console.warn('[Ztexteditor] Editor is not ready. Cannot insert image.');
324
+ return;
325
+ }
326
+ let workingFile = file;
327
+ const compressionConfig = this.data?.Compression;
328
+ const compressionEnabled = !!compressionConfig;
329
+ if (compressionEnabled) {
330
+ console.log(`[Ztexteditor] Upload image before compression: ${(workingFile.size / 1024).toFixed(2)}KB`);
331
+ workingFile = await this.imageCompression(workingFile);
332
+ if (!workingFile) {
333
+ console.warn('[Ztexteditor] Image compression failed. Upload image insertion aborted.');
334
+ return;
335
+ }
336
+ console.log(`[Ztexteditor] Upload image after compression: ${(workingFile.size / 1024).toFixed(2)}KB`);
337
+ }
338
+ try {
339
+ const base64 = await this.readFileAsDataURL(workingFile);
340
+ editor.exec('insertImage', { src: base64 });
341
+ }
342
+ catch (err) {
343
+ console.warn('[Ztexteditor] Failed to read uploaded image as base64.', err);
344
+ }
183
345
  }
346
+ /** Convert base64 (data URL) to File. */
184
347
  async base64ToFile(base64String, fileName) {
348
+ // Using fetch on data URL is supported by modern browsers; keep existing logic.
185
349
  const response = await fetch(base64String);
186
350
  const blob = await response.blob();
187
- const file = new File([blob], fileName, {
351
+ return new File([blob], fileName, {
188
352
  type: blob.type,
189
353
  lastModified: Date.now(),
190
354
  });
191
- return file;
192
355
  }
193
- async ImageCompression(file) {
194
- //Check if Image Compression is enabled.
195
- if (file && file.type.includes("image")) {
196
- const imgConfig = this.compressionConfigHandler(this.data.Compression);
197
- if (file.size > imgConfig.FileSizeMinSizeByte) {
198
- const compressed$ = this.compressImage.compress(file, imgConfig);
199
- const compressFile = await firstValueFrom(compressed$);
200
- return compressFile;
201
- } // file size check
356
+ /**
357
+ * Compress an image file if it is an image and above min threshold.
358
+ * Returns the compressed file, or null if not compressible / compression skipped.
359
+ */
360
+ async imageCompression(file) {
361
+ if (!file) {
362
+ console.warn('[Ztexteditor] imageCompression called with empty file.');
363
+ return null;
202
364
  }
203
- else {
365
+ if (!file.type || !file.type.includes('image')) {
366
+ console.warn('[Ztexteditor] Skipping compression: file is not an image.', { type: file.type });
367
+ return null;
368
+ }
369
+ const config = this.data?.Compression;
370
+ if (!config) {
371
+ // Compression not configured.
372
+ return null;
373
+ }
374
+ const imgConfig = this.compressionConfigHandler(config);
375
+ // If file is below threshold, keep existing behavior: skip compression (return null).
376
+ if (file.size <= imgConfig.FileSizeMinSizeByte) {
377
+ console.log(`[Ztexteditor] Skipping compression: file size ${(file.size / 1024).toFixed(2)}KB is below threshold ${(imgConfig.FileSizeMinSizeByte / 1024).toFixed(2)}KB.`);
378
+ return null;
379
+ }
380
+ try {
381
+ const compressed$ = this.compressImage.compress(file, imgConfig);
382
+ const compressedFile = await firstValueFrom(compressed$);
383
+ return compressedFile ?? null;
384
+ }
385
+ catch (err) {
386
+ console.warn('[Ztexteditor] Compression service threw an error.', err);
204
387
  return null;
205
388
  }
206
389
  }
390
+ /** Normalize image compression config into byte-based thresholds. */
207
391
  compressionConfigHandler(imgConfig) {
392
+ if (!imgConfig) {
393
+ // Defensive: should never happen because caller checks.
394
+ return imgConfig;
395
+ }
208
396
  if (imgConfig.FileSizeMaxSize) {
209
397
  imgConfig.FileSizeMaxSizeByte = this.convertSizeToByte(imgConfig.FileSizeMaxSize);
210
398
  }
@@ -216,63 +404,74 @@ export class ZtexteditorComponent extends InputFieldBase {
216
404
  }
217
405
  return imgConfig;
218
406
  }
407
+ /**
408
+ * Convert size string like "100kb", "1 MB", "2gb" to bytes.
409
+ * If no unit is provided, bytes are assumed.
410
+ */
219
411
  convertSizeToByte(sizeString) {
220
- let _tempFileSizeMaxSize = 0;
221
- let sizeByByte = 0;
222
- let sizeType = 'b';
223
- // remove all space
224
- const _tempFileSize = sizeString.replace(/ /g, '');
225
- // check last char is alphabetic
226
- const lastChar = _tempFileSize.substr(_tempFileSize.length - 1);
227
- if (isNaN(parseFloat(lastChar))) {
228
- const secLastChar = _tempFileSize.substr(_tempFileSize.length - 2).slice(0, -1);
229
- if (isNaN(parseFloat(secLastChar))) {
230
- // check last 2nd char is alphabetic
231
- sizeType = secLastChar + sizeType;
232
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -2));
233
- }
234
- else {
235
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -1));
236
- }
237
- switch (sizeType.toLowerCase()) {
238
- case "b":
239
- sizeByByte = _tempFileSizeMaxSize;
240
- break;
241
- case "kb":
242
- sizeByByte = _tempFileSizeMaxSize * 1024;
243
- break;
244
- case "mb":
245
- sizeByByte = _tempFileSizeMaxSize * 1048576;
246
- break;
247
- case "gb":
248
- sizeByByte = _tempFileSizeMaxSize * 1073741824;
249
- break;
250
- }
412
+ if (!sizeString || typeof sizeString !== 'string') {
413
+ console.warn('[Ztexteditor] convertSizeToByte received invalid sizeString. Defaulting to 0.', { sizeString });
414
+ return 0;
251
415
  }
252
- else {
253
- // default using bytes if no size type
254
- sizeByByte = parseFloat(_tempFileSize);
416
+ // Remove all spaces, e.g. "1 MB" -> "1MB"
417
+ const trimmed = sizeString.replace(/ /g, '').trim();
418
+ if (!trimmed) {
419
+ return 0;
420
+ }
421
+ // Extract numeric part and unit part (letters).
422
+ // Example: "1.5MB" => number=1.5, unit="mb"
423
+ const match = /^([0-9]*\.?[0-9]+)([a-zA-Z]*)$/.exec(trimmed);
424
+ if (!match) {
425
+ console.warn('[Ztexteditor] Unable to parse sizeString. Defaulting to 0.', { sizeString });
426
+ return 0;
427
+ }
428
+ const numeric = Number(match[1]);
429
+ const unit = (match[2] || 'b').toLowerCase();
430
+ if (Number.isNaN(numeric) || numeric < 0) {
431
+ console.warn('[Ztexteditor] Invalid numeric size in sizeString. Defaulting to 0.', { sizeString });
432
+ return 0;
433
+ }
434
+ switch (unit) {
435
+ case 'b':
436
+ case '':
437
+ return numeric;
438
+ case 'kb':
439
+ return numeric * 1024;
440
+ case 'mb':
441
+ return numeric * 1024 * 1024;
442
+ case 'gb':
443
+ return numeric * 1024 * 1024 * 1024;
444
+ default:
445
+ console.warn('[Ztexteditor] Unknown unit in sizeString. Defaulting to bytes.', { sizeString, unit });
446
+ return numeric;
255
447
  }
256
- return sizeByByte;
257
448
  }
449
+ /** Read a File as base64 data URL. */
258
450
  readFileAsDataURL(file) {
259
451
  return new Promise((resolve, reject) => {
452
+ if (!file) {
453
+ reject(new Error('File is required.'));
454
+ return;
455
+ }
260
456
  const reader = new FileReader();
261
457
  reader.readAsDataURL(file);
262
- reader.onload = () => {
263
- resolve(reader.result);
264
- };
265
- reader.onerror = (error) => {
266
- reject(error);
267
- };
458
+ reader.onload = () => resolve(reader.result);
459
+ reader.onerror = (error) => reject(error);
268
460
  });
269
461
  }
462
+ // #endregion
463
+ // #region Small helpers
464
+ /** Extract event target as HTMLElement safely. */
465
+ getEventTargetElement(event) {
466
+ const target = event?.target;
467
+ return target instanceof HTMLElement ? target : null;
468
+ }
270
469
  }
271
470
  ZtexteditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FontAweSomeService }, { token: i3.DialogService }, { token: i2.AlertService }, { token: i2.CompressImageService }, { token: i2.ToastService }], target: i0.ɵɵFactoryTarget.Component });
272
- ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }, { propertyName: "compress_btn", first: true, predicate: ["compressButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6.EditorInsertUnorderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertUnorderedListButton]" }, { type: i6.EditorInsertOrderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertOrderedListButton]" }, { type: i6.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
471
+ ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }, { propertyName: "compress_btn", first: true, predicate: ["compressButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6.EditorInsertUnorderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertUnorderedListButton]" }, { type: i6.EditorInsertOrderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertOrderedListButton]" }, { type: i6.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
273
472
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, decorators: [{
274
473
  type: Component,
275
- args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
474
+ args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
276
475
  }], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FontAweSomeService }, { type: i3.DialogService }, { type: i2.AlertService }, { type: i2.CompressImageService }, { type: i2.ToastService }]; }, propDecorators: { editor: [{
277
476
  type: ViewChild,
278
477
  args: ['editor']
@@ -280,4 +479,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
280
479
  type: ViewChild,
281
480
  args: ['compressButton']
282
481
  }] } });
283
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzdELDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFeEUsT0FBTyxFQUFjLGdCQUFnQixFQUE0RyxNQUFNLGlCQUFpQixDQUFDO0FBRXpLLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztBQVF0QyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBYztJQWlCdEQsWUFDUyxnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQzVCLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRzNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUmpCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFDbkMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbkMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFwQnRDLHlCQUFvQixHQUFHO1lBQzVCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGlCQUFpQixFQUFF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QUFLLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2lIQTVSVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixpUkNyQmpDLG8zVEF3SUE7MkZEbkhhLG9CQUFvQjtrQkFOaEMsU0FBUzsrQkFDRSxpQkFBaUI7OFBBTUMsTUFBTTtzQkFBakMsU0FBUzt1QkFBQyxRQUFRO2dCQUNrQixZQUFZO3NCQUEvQyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBFZGl0b3JDb21wb25lbnQsIEVkaXRvclBhc3RlRXZlbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1lZGl0b3InO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJbnB1dEZpZWxkQmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBGb250QXdlU29tZVNlcnZpY2UsIENvbXByZXNzSW1hZ2VTZXJ2aWNlLCBJbWFnZUNvbXByZXNzaW9uQ29uZmlnICwgQWxlcnRTZXJ2aWNlLFRvYXN0U2VydmljZSwgQWxlcnRCdXR0b259IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIERpYWxvZ1JlZiB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kaWFsb2dcIjtcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVG9vbEJhckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXRvb2xiYXInO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC16dGV4dGVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3p0ZXh0ZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi96dGV4dGVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIHB1YmxpYyBlZGl0b3I6IEVkaXRvckNvbXBvbmVudDtcclxuICAgQFZpZXdDaGlsZCgnY29tcHJlc3NCdXR0b24nKSBwdWJsaWMgY29tcHJlc3NfYnRuOiBUb29sQmFyQnV0dG9uQ29tcG9uZW50O1xyXG4gIHB1YmxpYyBwYXN0ZUNsZWFudXBTZXR0aW5ncyA9IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogZmFsc2UsXHJcbiAgICByZW1vdmVNc1N0eWxlczogZmFsc2UsXHJcbiAgICByZW1vdmVJbnZhbGlkSFRNTDogZmFsc2UsXHJcbiAgfTtcclxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MgPSB7XHJcbiAgICBpZnJhbWU6IHRydWUsXHJcbiAgfTtcclxuICBwdWJsaWMgaXNDb21wcmVzc01vZGVPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBDbG9zZUVubGFyZ2VCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0eWxlID0gXCJcIjtcclxuICBwcml2YXRlIHJlYWRvbmx5IENvbXByZXNzaW9uRW5hYmxlSWNvbjogc3RyaW5nID0gJ2staS16b29tLWJlc3QtZml0JztcclxuICBwcml2YXRlIHJlYWRvbmx5IENvbXByZXNzaW9uRGlzYWJsZWRJY29uOiBzdHJpbmcgPSAnay1pLXpvb20tYWN0dWFsLXNpemUnO1xyXG4gIHB1YmxpYyBkaWFsb2dSZWY6IERpYWxvZ1JlZjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHB1YmxpYyBmb250QXdlU29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzSW1hZ2U6IENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcbiAgICB0aGlzLmRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID0gdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCB8fCAnZXhwbG9yZXInOyAvLyAgfHwgJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy5zZXR1cFBhc3RlQ2xlYW51cFNldHRpbmdzKCk7XHJcbiAgICBzdXBlci5zZXR1cENvbXBvbmVudFNldHRpbmdzKHRoaXMuY29tcG9uZW50U2V0dGluZ3MpO1xyXG4gICAgc3VwZXIuZm9jdXNPbkRlZmF1bHQodGhpcy5mb2N1cy5iaW5kKHRoaXMpKTtcclxuICAgIHRoaXMuaXNDb21wcmVzc01vZGVPbiA9ICEhdGhpcy5kYXRhLkNvbXByZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiBhbnkpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0VG9aTW9kZWwodGhpcy5kYXRhLlZhbHVlLCB2YWx1ZSwgdGhpcy5ncm91cCwgdGhpcy5kYXRhKTtcclxuICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkNoYW5nZVwiLCB0aGlzLmRhdGEuT25DaGFuZ2UsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvblBhc3RlKCRldmVudDogRWRpdG9yUGFzdGVFdmVudCkge1xyXG4gICAgY29uc3QgaW1hZ2VDb21wcmVzc2lvbkVuYWJsZWQgPSAhIXRoaXMuZGF0YS5Db21wcmVzc2lvbjtcclxuICAgIGlmIChpbWFnZUNvbXByZXNzaW9uRW5hYmxlZCAmJiB0aGlzLmlzQ29tcHJlc3NNb2RlT24pIHtcclxuICAgICAgbGV0IGJlZm9yZVNpemUgPSAwO1xyXG4gICAgICBsZXQgYWZ0ZXJTaXplID0gMDtcclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCRldmVudC5jbGVhbmVkSHRtbCwgJ3RleHQvaHRtbCcpO1xyXG4gICAgICBjb25zdCBpbWdFbGVtZW50cyA9IEFycmF5LmZyb20oZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpKS5maWx0ZXIoZG9tID0+IGRvbS5zcmMuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS8nKSk7XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIGltZ0VsZW1lbnRzLm1hcChhc3luYyAoaW1nVGFncywgaW5kZXgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmJhc2U2NFRvRmlsZShpbWdUYWdzLnNyYywgXCJpbWFnZVwiICsgaW5kZXgudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICBiZWZvcmVTaXplICs9IGZpbGUuc2l6ZTtcclxuICAgICAgICAgIGNvbnN0IGNvbXByZXNzID0gYXdhaXQgdGhpcy5JbWFnZUNvbXByZXNzaW9uKGZpbGUpO1xyXG4gICAgICAgICAgaWYoY29tcHJlc3MhPSBudWxsKXtcclxuICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChjb21wcmVzcyk7XHJcbiAgICAgICAgICAgIGFmdGVyU2l6ZSArPSBjb21wcmVzcy5zaXplO1xyXG4gICAgICAgICAgICBpbWdUYWdzLnNyYyA9IGJhc2U2NDtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW1hZ2UgY29tcHJlc3MgZmFpbGVkJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICBjb25zb2xlLmxvZyhgQmVmb3JlIEltYWdlIGNvbXByZXNzIHNpemU6ICR7KGJlZm9yZVNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBBZnRlciBJbWFnZSBjb21wcmVzcyBzaXplOiAkeyhhZnRlclNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIE9uT2ZmQ29tcHJlc3NNb2RlKCRldmVudDphbnkpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gICAgY29uc3QgYWxlcnRIZWFkZXIgPSBgQ29uZmlybWF0aW9uYDtcclxuICAgIGNvbnN0IGFsZXJ0TWVzc2FnZSA9ICBgRG8geW91IHdhbnQgdG8gPGI+JHt0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyAnZGlzYWJsZScgOiAnZW5hYmxlJ308L2I+IGltYWdlIGNvbXByZXNzaW9uIHdoZW4gaW5wdXQgY29udGVudD8gPGJyLz4gTm90ZTogQ2xpY2sgXCJZZXNcIiB0aGUgY29udGVudCB3aWxsIGJlIHJlc2V0IHRvIGJsYW5rLmA7XHJcbiAgICBjb25zdCBidXR0b25Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHllczogeyB0ZXh0OiAnWWVzJywgY3NzQ2xhc3M6ICdwcmltYXJ5J30gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgIG5vOiB7IHRleHQ6ICdObycsIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICB9O1xyXG4gICAgdGhpcy5hbGVydFNlcnZpY2Uuc2hvdyhhbGVydEhlYWRlciwgYWxlcnRNZXNzYWdlLCBbYnV0dG9uQ29uZmlnLnllcywgYnV0dG9uQ29uZmlnLm5vXSwgWydjb2wtNCddKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlcGx5ID0+IHtcclxuICAgICAgICBpZiAocmVwbHkgPT09ICdZZXMnKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRvci52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhdGhpcy5pc0NvbXByZXNzTW9kZU9uO1xyXG4gICAgICAgICAgbGV0IGJ1dHRvbiA9ICAkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5Db21wcmVzc2lvbkVuYWJsZUljb24pO1xyXG4gICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuQ29tcHJlc3Npb25EaXNhYmxlZEljb24pO1xyXG4gICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoIHRoaXMuaXNDb21wcmVzc01vZGVPbj8gdGhpcy5Db21wcmVzc2lvbkRpc2FibGVkSWNvbjp0aGlzLkNvbXByZXNzaW9uRW5hYmxlSWNvbik7XHJcbiAgICAgICAgICB0aGlzLmNvbXByZXNzX2J0bi50aXRsZSA9IGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdEaXNhYmxlJyA6ICdFbmFibGUnfSBpbWFnZSBjb21wcmVzc2lvbmA7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdFbmFibGUnIDogJ0Rpc2FibGUnfSBpbWFnZSBjb21wcmVzc2lvbiBzdWNjZXNzZnVsbHkuYCwgJ3RvcCcsIGZhbHNlLCAyNTAwLCBcInN1Y2Nlc3NcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWU6IGFueSwgZm9udEF3ZXNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UpIHtcclxuICAgIGNvbnN0IGljb25OYW1lVmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoaWNvbk5hbWUsIHRoaXMuZ3JvdXApO1xyXG4gICAgaWYgKGljb25OYW1lVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWVWYWx1ZSwgZm9udEF3ZXNvbWVTZXJ2aWNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpY29uTmFtZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBzZXR1cFBhc3RlQ2xlYW51cFNldHRpbmdzKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5PcHRpb25zKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLk9wdGlvbnMgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLk9wdGlvbnMsIHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgb3B0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5kYXRhLk9wdGlvbnMgPT0gJ29iamVjdCcpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFzdGVDbGVhbnVwU2V0dGluZ3MsIHRoaXMuZGF0YS5PcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyAjcmVnaW9uIEN1c3RvbSBJbWFnZSBVcGxvYWRcclxuICBwdWJsaWMgb3BlbkZpbGVFeHBsb3JlcigpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5kYXRhLlZhbHVlfS11cGxvYWQtZmlsZWApO1xyXG4gICAgaWYgKGlucHV0KSB7XHJcbiAgICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlblBvcHVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XHJcbiAgICAgIC8vIE9wZW4gdGhlIHBvcHVwXHJcblxyXG4gICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKHtcclxuICAgICAgICBjb250ZW50OiBadGV4dGVkaXRvckNvbXBvbmVudCxcclxuICAgICAgICB3aWR0aDogJzk4JScsXHJcbiAgICAgICAgaGVpZ2h0OiAnOTclJ1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgdGV4dGVkaXRvciA9IHRoaXMuZGlhbG9nUmVmLmNvbnRlbnQuaW5zdGFuY2UgYXMgWnRleHRlZGl0b3JDb21wb25lbnQ7XHJcbiAgICAgIHRleHRlZGl0b3IuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgdGV4dGVkaXRvci5kYXRhLkFsbG93RW5sYXJnZSA9IGZhbHNlO1xyXG4gICAgICB0ZXh0ZWRpdG9yLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nUmVmO1xyXG4gICAgICB0ZXh0ZWRpdG9yLkNsb3NlRW5sYXJnZUJ0biA9IHRydWU7XHJcbiAgICAgIHRleHRlZGl0b3IuY29tcG9uZW50UHJvcGVydGllcyA9IHRoaXMuY29tcG9uZW50UHJvcGVydGllcztcclxuICAgICAgdGhpcy5zdHlsZSA9IHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTE7XHJcbiAgICAgIHRleHRlZGl0b3IuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgKz0gXCJoZWlnaHQ6XCIgKyAod2luZG93LmlubmVySGVpZ2h0ICogMC44KS50b1N0cmluZygpICsgXCJweFwiO1xyXG4gICAgICB0ZXh0ZWRpdG9yLmdyb3VwID0gdGhpcy5ncm91cDtcclxuICAgICAgdGV4dGVkaXRvci5jb21wb25lbnRTZXR0aW5ncyA9IHRoaXMuY29tcG9uZW50U2V0dGluZ3M7XHJcbiAgICAgIHRleHRlZGl0b3IuZm9ybSA9IHRoaXMuZm9ybTtcclxuICAgICAgLy9UbyBzZXQgdGhlIGh0bWwgYmFjayBpbnRvIHRoZSB0YXJnZXQgenRleHQgZWRpdG9yLlxyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5yZXN1bHQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEuQWxsb3dFbmxhcmdlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID0gdGhpcy5zdHlsZTtcclxuICAgICAgICB0aGlzLmVkaXRvci52YWx1ZSA9IHRoaXMuZ3JvdXAuek1vZGVsW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdyb3VwLnpNb2RlbFt0aGlzLmRhdGEuVmFsdWVdKTtcclxuICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgb25Qb3B1cENsb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWRJbWFnZShmaWxlSW5wdXQ6IGFueSkge1xyXG4gICAgY29uc3QgdXBsb2FkZWRJbWFnZSA9IGZpbGVJbnB1dC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICBpZiAodXBsb2FkZWRJbWFnZSkge1xyXG4gICAgICB0aGlzLmluc2VydEltYWdlSW50b0VkaXRvcih1cGxvYWRlZEltYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0SW1hZ2VJbnRvRWRpdG9yKGZpbGUpIHtcclxuICAgIGNvbnN0IGltYWdlQ29tcHJlc3Npb25FbmFibGVkID0gISF0aGlzLmRhdGEuQ29tcHJlc3Npb247XHJcbiAgICBpZiAoaW1hZ2VDb21wcmVzc2lvbkVuYWJsZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYEJlZm9yZSBJbWFnZSBjb21wcmVzcyBzaXplOiAkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcbiAgICAgIGZpbGUgPSBhd2FpdCB0aGlzLkltYWdlQ29tcHJlc3Npb24oZmlsZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBBZnRlciBJbWFnZSBjb21wcmVzcyBzaXplOiAkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcbiAgICB9XHJcbiAgICB2YXIgYmFzZTY0c3RyID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChmaWxlKTtcclxuICAgIHRoaXMuZWRpdG9yLmV4ZWMoXCJpbnNlcnRJbWFnZVwiLCB7IHNyYzogYmFzZTY0c3RyIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmFzZTY0VG9GaWxlKGJhc2U2NFN0cmluZzogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJhc2U2NFN0cmluZyk7XHJcbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xyXG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZU5hbWUsIHtcclxuICAgICAgdHlwZTogYmxvYi50eXBlLFxyXG4gICAgICBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZmlsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSW1hZ2VDb21wcmVzc2lvbihmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICAvL0NoZWNrIGlmIEltYWdlIENvbXByZXNzaW9uIGlzIGVuYWJsZWQuXHJcblxyXG4gICAgaWYgKGZpbGUgJiYgZmlsZS50eXBlLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcclxuXHJcbiAgICAgIGNvbnN0IGltZ0NvbmZpZyA9IHRoaXMuY29tcHJlc3Npb25Db25maWdIYW5kbGVyKHRoaXMuZGF0YS5Db21wcmVzc2lvbik7XHJcbiAgICAgIGlmIChmaWxlLnNpemUgPiBpbWdDb25maWcuRmlsZVNpemVNaW5TaXplQnl0ZSkge1xyXG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWQkID0gdGhpcy5jb21wcmVzc0ltYWdlLmNvbXByZXNzKGZpbGUsIGltZ0NvbmZpZyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbXByZXNzRmlsZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGNvbXByZXNzZWQkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbXByZXNzRmlsZTtcclxuXHJcbiAgICAgIH0gLy8gZmlsZSBzaXplIGNoZWNrXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGltZ0NvbmZpZzogSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyk6IEltYWdlQ29tcHJlc3Npb25Db25maWcge1xyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gdGhpcy5jb252ZXJ0U2l6ZVRvQnl0ZShpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpbWdDb25maWcuRmlsZVNpemVNaW5TaXplQnl0ZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGltZ0NvbmZpZztcclxuICB9XHJcbiAgcHJpdmF0ZSBjb252ZXJ0U2l6ZVRvQnl0ZShzaXplU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IF90ZW1wRmlsZVNpemVNYXhTaXplOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNpemVCeUJ5dGU6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgc2l6ZVR5cGUgPSAnYic7XHJcblxyXG4gICAgLy8gcmVtb3ZlIGFsbCBzcGFjZVxyXG4gICAgY29uc3QgX3RlbXBGaWxlU2l6ZSA9IHNpemVTdHJpbmcucmVwbGFjZSgvIC9nLCAnJyk7XHJcblxyXG4gICAgLy8gY2hlY2sgbGFzdCBjaGFyIGlzIGFscGhhYmV0aWNcclxuICAgIGNvbnN0IGxhc3RDaGFyID0gX3RlbXBGaWxlU2l6ZS5zdWJzdHIoX3RlbXBGaWxlU2l6ZS5sZW5ndGggLSAxKTtcclxuICAgIGlmIChpc05hTihwYXJzZUZsb2F0KGxhc3RDaGFyKSkpIHtcclxuICAgICAgY29uc3Qgc2VjTGFzdENoYXIgPSBfdGVtcEZpbGVTaXplLnN1YnN0cihfdGVtcEZpbGVTaXplLmxlbmd0aCAtIDIpLnNsaWNlKDAsIC0xKTtcclxuICAgICAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2VjTGFzdENoYXIpKSkge1xyXG4gICAgICAgIC8vIGNoZWNrIGxhc3QgMm5kIGNoYXIgaXMgYWxwaGFiZXRpY1xyXG4gICAgICAgIHNpemVUeXBlID0gc2VjTGFzdENoYXIgKyBzaXplVHlwZTtcclxuICAgICAgICBfdGVtcEZpbGVTaXplTWF4U2l6ZSA9IHBhcnNlRmxvYXQoX3RlbXBGaWxlU2l6ZS5zbGljZSgwLCAtMikpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIF90ZW1wRmlsZVNpemVNYXhTaXplID0gcGFyc2VGbG9hdChfdGVtcEZpbGVTaXplLnNsaWNlKDAsIC0xKSk7XHJcbiAgICAgIH1cclxuICAgICAgc3dpdGNoIChzaXplVHlwZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgY2FzZSBcImJcIjpcclxuICAgICAgICAgIHNpemVCeUJ5dGUgPSBfdGVtcEZpbGVTaXplTWF4U2l6ZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImtiXCI6XHJcbiAgICAgICAgICBzaXplQnlCeXRlID0gX3RlbXBGaWxlU2l6ZU1heFNpemUgKiAxMDI0XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWJcIjpcclxuICAgICAgICAgIHNpemVCeUJ5dGUgPSBfdGVtcEZpbGVTaXplTWF4U2l6ZSAqIDEwNDg1NzZcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJnYlwiOlxyXG4gICAgICAgICAgc2l6ZUJ5Qnl0ZSA9IF90ZW1wRmlsZVNpemVNYXhTaXplICogMTA3Mzc0MTgyNFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBkZWZhdWx0IHVzaW5nIGJ5dGVzIGlmIG5vIHNpemUgdHlwZVxyXG4gICAgICBzaXplQnlCeXRlID0gcGFyc2VGbG9hdChfdGVtcEZpbGVTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2l6ZUJ5Qnl0ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xyXG4gICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiXHJcblxyXG48ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienRleHRlZGl0b3ItY29udGFpbmVyIGUxdGFnLXN0eWxlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGVcIiBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBleHBhbmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gIDxpb24tYnV0dG9uICAgY2xhc3M9XCJpb24tYWN0aXZhdGFibGUgcmlwcGxlLXBhcmVudFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNFwiICpuZ0lmPVwiZGF0YS5BbGxvd0VubGFyZ2VcIiAoY2xpY2spPVwib3BlblBvcHVwKClcIiAgW2lkXT1cImRhdGEuVmFsdWUgKyctcG9wdXAtYnV0dG9uJ1wiPlxyXG4gICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvblwiIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUV4cGFuZEFsdCcsIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgPC9pb24tYnV0dG9uPlxyXG4gIDxpb24tYnV0dG9uICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJDbG9zZUVubGFyZ2VCdG5cIiAoY2xpY2spPVwib25Qb3B1cENsb3NlKClcIiAgW2lkXT1cImRhdGEuVmFsdWUgKyctcG9wdXAtYnV0dG9uJ1wiPlxyXG4gICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvblwiICBbaWNvbl09XCJnZXRGb250QXdlc29tZSgnZmFDb21wcmVzc0FsdCcsIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgPC9pb24tYnV0dG9uPlxyXG48L2Rpdj5cclxuICA8a2VuZG8tZWRpdG9yICNlZGl0b3JcclxuICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cImRhdGEuUmVzaXphYmxlIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtwYXN0ZUNsZWFudXBTZXR0aW5nc109XCJwYXN0ZUNsZWFudXBTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtpZnJhbWVdPVwiY29tcG9uZW50U2V0dGluZ3MuaWZyYW1lXCI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciBbc3R5bGUuZGlzcGxheV09XCJkYXRhLlRvb2xCYXJTdHlsZSA9PT0gJ2Jhc2ljJyA/ICdpbmhlcml0JyA6ICdub25lJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCJcclxuICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yUmVkb0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckJvbGRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJdGFsaWNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRlcmxpbmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdHJpa2V0aHJvdWdoQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3Vic2NyaXB0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3VwZXJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkxlZnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkNlbnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduUmlnaHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkp1c3RpZnlCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb3JtYXQ+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udFNpemU+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udEZhbWlseT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlciBrZW5kb0VkaXRvckZvcmVDb2xvcj48L2tlbmRvLXRvb2xiYXItY29sb3JwaWNrZXI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yQmFja0NvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0VW5vcmRlcmVkTGlzdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluc2VydE9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5kZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yT3V0ZGVudEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckNyZWF0ZUxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+PC9rZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dCZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dBZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZUNvbHVtbkJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVJvd0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVRhYmxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiAgaWNvbj1cImstaS1pbWFnZSBrLWktem9vbS1hY3R1YWwtc2l6ZVwiIChjbGljayk9XCJPbk9mZkNvbXByZXNzTW9kZSgkZXZlbnQpXCIgI2NvbXByZXNzQnV0dG9uIHRpdGxlPVwiRGlzYWJsZSBJbWFnZSBDb21wcmVzc2lvblwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclZpZXdTb3VyY2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgIDwva2VuZG8tdG9vbGJhcj5cclxuICAgIDxrZW5kby10b29sYmFyIFtzdHlsZS5kaXNwbGF5XT1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnZnVsbCcgPyAnaW5oZXJpdCcgOiAnbm9uZSdcIiBjbGFzcz1cImUxdGFnLXN0eWxlMlwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yUmVkb0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckJvbGRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJdGFsaWNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRlcmxpbmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdHJpa2V0aHJvdWdoQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3Vic2NyaXB0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3VwZXJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkxlZnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkNlbnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduUmlnaHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkp1c3RpZnlCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3Igdmlldz1cImdyYWRpZW50XCI+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRVbm9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0T3JkZXJlZExpc3RCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdkZWZhdWx0J1wiIGtlbmRvRWRpdG9ySW5zZXJ0SW1hZ2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2V4cGxvcmVyJ1wiIGljb249XCJrLWktaW1hZ2Ugay1pLXBob3RvXCIgKGNsaWNrKT1cIm9wZW5GaWxlRXhwbG9yZXIoKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAgKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBpY29uPVwiay1pLWltYWdlIGstaS1maWxlLWltYWdlXCIgKGNsaWNrKT1cIk9uT2ZmQ29tcHJlc3NNb2RlKCRldmVudClcIiAgI2NvbXByZXNzQnV0dG9uIHRpdGxlPVwiRGlzYWJsZSBJbWFnZSBDb21wcmVzc2lvblwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclZpZXdTb3VyY2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPjwva2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZENvbHVtbkJlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZENvbHVtbkFmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkUm93QmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkUm93QWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JEZWxldGVDb2x1bW5CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JEZWxldGVSb3dCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JEZWxldGVUYWJsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvck1lcmdlQ2VsbHNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTcGxpdENlbGxCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgPC9rZW5kby10b29sYmFyPlxyXG4gIDwva2VuZG8tZWRpdG9yPlxyXG4gIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiB0eXBlPVwiZmlsZVwiIFtpZF09XCJkYXRhLlZhbHVlICsnLXVwbG9hZC1maWxlJ1wiIFtuYW1lXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG5nZi1tYXgtc2l6ZT1cIjVNQlwiIChjaGFuZ2UpPVwidXBsb2FkSW1hZ2UoJGV2ZW50KVwiPlxyXG48L2Rpdj5cclxuIl19
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU81RSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFRTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBNkJ0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQS9CdEMseUJBQW9CLEdBS3ZCO1lBQ0YsZUFBZSxFQUFFLEtBQUs7WUFDdEIsY0FBYyxFQUFFLEtBQUs7WUFD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aUJBQWlCOzhQQUtDLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsUUFBUTtnQkFDaUIsWUFBWTtzQkFBL0MsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBFZGl0b3JDb21wb25lbnQsIEVkaXRvclBhc3RlRXZlbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1lZGl0b3InO1xyXG5pbXBvcnQgeyBUb29sQmFyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdG9vbGJhcic7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcblxyXG4vKioqKioqKioqKiBSeEpTICoqKioqKioqKiovXHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IElucHV0RmllbGRCYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sXHJcbiAgQWxlcnRTZXJ2aWNlLFxyXG4gIENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gIEZvbnRBd2VTb21lU2VydmljZSxcclxuICBJbWFnZUNvbXByZXNzaW9uQ29uZmlnLFxyXG4gIFRvYXN0U2VydmljZSxcclxuICBaQ29tcG9uZW50LFxyXG4gIFpDb21wb25lbnRIZWxwZXJcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenRleHRlZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96dGV4dGVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4venRleHRlZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIHB1YmxpYyBlZGl0b3IhOiBFZGl0b3JDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnY29tcHJlc3NCdXR0b24nKSBwdWJsaWMgY29tcHJlc3NfYnRuITogVG9vbEJhckJ1dHRvbkNvbXBvbmVudDtcclxuXHJcbiAgcHVibGljIHBhc3RlQ2xlYW51cFNldHRpbmdzOiB7XHJcbiAgICByZW1vdmVNc0NsYXNzZXM6IGJvb2xlYW47XHJcbiAgICByZW1vdmVNc1N0eWxlczogYm9vbGVhbjtcclxuICAgIHJlbW92ZUludmFsaWRIVE1MOiBib29sZWFuO1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG4gIH0gPSB7XHJcbiAgICByZW1vdmVNc0NsYXNzZXM6IGZhbHNlLFxyXG4gICAgcmVtb3ZlTXNTdHlsZXM6IGZhbHNlLFxyXG4gICAgcmVtb3ZlSW52YWxpZEhUTUw6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBjb21wb25lbnRTZXR0aW5nczogeyBpZnJhbWU6IGJvb2xlYW47IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG4gICAgaWZyYW1lOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBpc0NvbXByZXNzTW9kZU9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIENsb3NlRW5sYXJnZUJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZGlhbG9nUmVmPzogRGlhbG9nUmVmO1xyXG5cclxuICBwcml2YXRlIG9yaWdpbmFsSW5saW5lU3R5bGU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uRW5hYmxlSWNvbjogc3RyaW5nID0gJ2staS16b29tLWJlc3QtZml0JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uRGlzYWJsZWRJY29uOiBzdHJpbmcgPSAnay1pLXpvb20tYWN0dWFsLXNpemUnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHB1YmxpYyByZWFkb25seSBmb250QXdlU29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzSW1hZ2U6IENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemUgY29tcG9uZW50IHN0YXRlIGFuZCBlZGl0b3IgY29uZmlndXJhdGlvbi4gKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuXHJcbiAgICAvLyBCYWNrd2FyZC1jb21wYXRpYmxlIGRlZmF1bHQ6IHdoZW4gbm90IHByb3ZpZGVkLCB1c2UgZXhwbG9yZXIuXHJcbiAgICB0aGlzLmRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID0gdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCB8fCAnZXhwbG9yZXInO1xyXG5cclxuICAgIHRoaXMuc2V0dXBQYXN0ZUNsZWFudXBTZXR0aW5ncygpO1xyXG4gICAgc3VwZXIuc2V0dXBDb21wb25lbnRTZXR0aW5ncyh0aGlzLmNvbXBvbmVudFNldHRpbmdzKTtcclxuICAgIHN1cGVyLmZvY3VzT25EZWZhdWx0KHRoaXMuZm9jdXMuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgLy8gU2FmZSBjYXN0IHRvIGJvb2xlYW4uXHJcbiAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhIXRoaXMuZGF0YT8uQ29tcHJlc3Npb247XHJcbiAgfVxyXG5cclxuICAvKiogTm90aWZ5IGNvbXBvbmVudCBzZXJ2aWNlIG9uY2UgdmlldyBpcyByZWFkeS4gKi9cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN5bmMgZWRpdG9yIGNvbnRlbnQgdG8gek1vZGVsIGFuZCB0cmlnZ2VyIGNvbmZpZ3VyZWQgY2hhbmdlIGhhbmRsZXIuICovXHJcbiAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldFRvWk1vZGVsKHRoaXMuZGF0YS5WYWx1ZSwgdmFsdWUsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLnRyaWdnZXJFdmVudCgnaW5wdXRmaWVsZC1vbkNoYW5nZScsIHRoaXMuZGF0YS5PbkNoYW5nZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZSBwYXN0ZTogbm9ybWFsaXplIHBsYWluLXRleHQgc3BlY2lhbCBlbnRpdGllcywgdGhlbiBvcHRpb25hbGx5IGNvbXByZXNzIHBhc3RlZCBiYXNlNjQgaW1hZ2VzLiAqL1xyXG4gIHB1YmxpYyBhc3luYyBvblBhc3RlKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gUGFzdGUgZXZlbnQgaXMgdW5kZWZpbmVkLiBQYXN0ZSBpZ25vcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29tbW9uIEV4Y2VsL3BsYWluLXRleHQgaXNzdWU6IFwiJmFtcDtcIiBnZXRzIGluc2VydGVkIGxpdGVyYWxseSBjYXVzaW5nIFwiJmFtcDthbXA7XCIgaW4gSFRNTC5cclxuICAgIHRoaXMuaGFuZGxlQ29tbW9uU3ltYm9sVGFncyhlKTtcclxuXHJcbiAgICAvLyBDb21wcmVzcyBvbmx5IGlmIGVuYWJsZWQgYW5kIGJhc2U2NCBpbWFnZXMgZXhpc3QuXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUltYWdlQ29tcHJlc3Npb24oZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgcGFzdGUgaXMgcGxhaW4gdGV4dCAobm8gSFRNTCB0YWdzIGFuZCBubyBpbWFnZXMpLCBub3JtYWxpemUgY29tbW9uIGVudGl0aWVzIGFuZCBpbnNlcnQgYXMgcmVhbCB0ZXh0LlxyXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBldmVudCBpcyBoYW5kbGVkIGFuZCBkZWZhdWx0IHBhc3RlIGlzIHByZXZlbnRlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUNvbW1vblN5bWJvbFRhZ3MoZTogRWRpdG9yUGFzdGVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IGhhbmRsZSBwbGFpbi10ZXh0IG5vcm1hbGl6YXRpb24uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGlwYm9hcmQgPSAoZS5vcmlnaW5hbEV2ZW50IGFzIENsaXBib2FyZEV2ZW50IHwgdW5kZWZpbmVkKT8uY2xpcGJvYXJkRGF0YTtcclxuICAgIGNvbnN0IHBsYWluVGV4dCA9IGNsaXBib2FyZD8uZ2V0RGF0YSgndGV4dC9wbGFpbicpID8/ICcnO1xyXG4gICAgY29uc3QgaHRtbFRleHQgPSBjbGlwYm9hcmQ/LmdldERhdGEoJ3RleHQvaHRtbCcpID8/ICcnO1xyXG4gICAgY29uc3QgY2xlYW5lZEh0bWwgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG5cclxuICAgIGNvbnN0IGh0bWxIYXNJbWcgPSAvPGltZ1xcYi9pLnRlc3QoaHRtbFRleHQpO1xyXG4gICAgY29uc3QgY2xlYW5lZEhhc1RhZ3MgPSAvPFtePl0rPi8udGVzdChjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgLy8gSWYgcGFzdGUgaGFzIEhUTUwgdGFncyBvciBpbWFnZXMsIGRvIE5PVCBpbnRlcmZlcmUgKGxldCBLZW5kbyBoYW5kbGUgaXQpLlxyXG4gICAgaWYgKGh0bWxIYXNJbWcgfHwgY2xlYW5lZEhhc1RhZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBsYWluLXRleHQgcGFzdGU6IHByZXZlbnQgS2VuZG8gZnJvbSBpbnNlcnRpbmcgZW5jb2RlZCBlbnRpdGllcyBhcyBsaXRlcmFsIHRleHQuXHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgLy8gRGVjb2RlIGNvbW1vbiBlbnRpdGllcyBvbmNlIHNvIHVzZXIgc2VlcyBjb3JyZWN0IGNoYXJhY3RlcnMuXHJcbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgbGltaXRlZCB0byBjb21tb24gZW50aXRpZXMgdG8gYXZvaWQgdW5leHBlY3RlZCB0cmFuc2Zvcm1hdGlvbnMuXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gKHBsYWluVGV4dCB8fCBjbGVhbmVkSHRtbClcclxuICAgICAgLnJlcGxhY2VBbGwoJyZhbXA7JywgJyYnKVxyXG4gICAgICAucmVwbGFjZUFsbCgnJmx0OycsICc8JylcclxuICAgICAgLnJlcGxhY2VBbGwoJyZndDsnLCAnPicpXHJcbiAgICAgIC5yZXBsYWNlQWxsKCcmcXVvdDsnLCAnXCInKVxyXG4gICAgICAucmVwbGFjZUFsbCgnJiMzOTsnLCBcIidcIik7XHJcblxyXG4gICAgZWRpdG9yLmV4ZWMoJ2luc2VydFRleHQnLCB7IHRleHQ6IG5vcm1hbGl6ZWQgfSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYW5kIGNvbXByZXNzIG1vZGUgaXMgT04sIGNvbXByZXNzIGFueSBwYXN0ZWQgYmFzZTY0IGltYWdlcyAoZGF0YTppbWFnZS8qKS5cclxuICAgKiBJTVBPUlRBTlQ6IG1vZGlmaWVzIGUuY2xlYW5lZEh0bWwgKHdoYXQgZ2V0cyBwYXN0ZWQpLCBub3QgZWRpdG9yLnZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW1hZ2VDb21wcmVzc2lvbihlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkNvbmZpZyA9IHRoaXMuZGF0YT8uQ29tcHJlc3Npb24gYXMgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlzQ29tcHJlc3Npb25FbmFibGVkID0gISFjb21wcmVzc2lvbkNvbmZpZztcclxuICAgIGlmICghaXNDb21wcmVzc2lvbkVuYWJsZWQgfHwgIXRoaXMuaXNDb21wcmVzc01vZGVPbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xlYW5lZCA9IGUuY2xlYW5lZEh0bWwgPz8gJyc7XHJcbiAgICBpZiAoIWNsZWFuZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkb2M6IERvY3VtZW50O1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhjbGVhbmVkLCAndGV4dC9odG1sJyk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byBwYXJzZSBwYXN0ZWQgSFRNTCBmb3IgaW1hZ2UgY29tcHJlc3Npb24uIFBhc3RlIHdpbGwgY29udGludWUuJywgZXJyKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0VsZW1lbnRzID0gQXJyYXkuZnJvbShkb2MucXVlcnlTZWxlY3RvckFsbCgnaW1nJykpXHJcbiAgICAgIC5tYXAoaW1nID0+IGltZyBhcyBIVE1MSW1hZ2VFbGVtZW50KVxyXG4gICAgICAuZmlsdGVyKGltZyA9PiB0eXBlb2YgaW1nPy5zcmMgPT09ICdzdHJpbmcnICYmIGltZy5zcmMuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS8nKSk7XHJcblxyXG4gICAgaWYgKGltZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJlZm9yZVNpemVCeXRlcyA9IDA7XHJcbiAgICBsZXQgYWZ0ZXJTaXplQnl0ZXMgPSAwO1xyXG4gICAgbGV0IGZhaWxlZENvdW50ID0gMDtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgaW1nRWxlbWVudHMubWFwKGFzeW5jIChpbWcsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3JjID0gaW1nLnNyYztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmJhc2U2NFRvRmlsZShzcmMsIGBwYXN0ZWQtaW1hZ2UtJHtpbmRleH1gKTtcclxuICAgICAgICAgIGJlZm9yZVNpemVCeXRlcyArPSBmaWxlLnNpemU7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IHRoaXMuaW1hZ2VDb21wcmVzc2lvbihmaWxlKTtcclxuICAgICAgICAgIGlmICghY29tcHJlc3NlZCkge1xyXG4gICAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtadGV4dGVkaXRvcl0gSW1hZ2UgY29tcHJlc3Npb24gc2tpcHBlZC9mYWlsZWQgZm9yIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChjb21wcmVzc2VkKTtcclxuICAgICAgICAgIGFmdGVyU2l6ZUJ5dGVzICs9IGNvbXByZXNzZWQuc2l6ZTtcclxuICAgICAgICAgIGltZy5zcmMgPSBiYXNlNjQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIEVycm9yIGNvbXByZXNzaW5nIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmAsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gSGVscGZ1bCBjb25zb2xlIGxvZ3MgZm9yIHRyb3VibGVzaG9vdGluZy5cclxuICAgIGNvbnN0IGJlZm9yZUtiID0gKGJlZm9yZVNpemVCeXRlcyAvIDEwMjQpLnRvRml4ZWQoMik7XHJcbiAgICBjb25zdCBhZnRlcktiID0gKGFmdGVyU2l6ZUJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtadGV4dGVkaXRvcl0gUGFzdGVkIGltYWdlIGNvbXByZXNzaW9uIGNvbXBsZXRlZC4gSW1hZ2VzPSR7aW1nRWxlbWVudHMubGVuZ3RofSwgRmFpbGVkPSR7ZmFpbGVkQ291bnR9LCBCZWZvcmU9JHtiZWZvcmVLYn1LQiwgQWZ0ZXI9JHthZnRlcktifUtCYCxcclxuICAgICk7XHJcblxyXG4gICAgLy8gTW9kaWZ5IHdoYXQgZ2V0cyBwYXN0ZWQsIG5vdCBlZGl0b3IudmFsdWUuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNvbXByZXNzIG1vZGUgdmlhIGNvbmZpcm1hdGlvbiBkaWFsb2cuXHJcbiAgICovXHJcbiAgcHVibGljIG9uT2ZmQ29tcHJlc3NNb2RlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZGVyID0gJ0NvbmZpcm1hdGlvbic7XHJcbiAgICBjb25zdCBhY3Rpb25UZXh0ID0gdGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ2Rpc2FibGUnIDogJ2VuYWJsZSc7XHJcblxyXG4gICAgLy8gS2VlcCBleGlzdGluZyBiZWhhdmlvcjogdG9nZ2xpbmcgcmVzZXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtZXNzYWdlID1cclxuICAgICAgYERvIHlvdSB3YW50IHRvIDxiPiR7YWN0aW9uVGV4dH08L2I+IGltYWdlIGNvbXByZXNzaW9uIHdoZW4gaW5wdXQgY29udGVudD9gICtcclxuICAgICAgYDxici8+Tm90ZTogQ2xpY2sgXCJZZXNcIiB0aGUgY29udGVudCB3aWxsIGJlIHJlc2V0IHRvIGJsYW5rLmA7XHJcblxyXG4gICAgY29uc3QgYnV0dG9ucyA9IHtcclxuICAgICAgeWVzOiB7IHRleHQ6ICdZZXMnLCBjc3NDbGFzczogJ3ByaW1hcnknIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgIG5vOiB7IHRleHQ6ICdObycsIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhoZWFkZXIsIG1lc3NhZ2UsIFtidXR0b25zLnllcywgYnV0dG9ucy5ub10sIFsnY29sLTQnXSlcclxuICAgICAgLnN1YnNjcmliZShyZXBseSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5ICE9PSAnWWVzJykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgdG9nZ2xlIGNvbXByZXNzaW9uIG1vZGUuJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZGl0b3IudmFsdWUgPSAnJztcclxuICAgICAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhdGhpcy5pc0NvbXByZXNzTW9kZU9uO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdG9vbGJhciBpY29uIGNsYXNzZXMgc2FmZWx5LlxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy5nZXRFdmVudFRhcmdldEVsZW1lbnQoZXZlbnQpO1xyXG4gICAgICAgIGlmICghYnV0dG9uRWwpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBVbmFibGUgdG8gcmVzb2x2ZSB0b29sYmFyIGJ1dHRvbiBlbGVtZW50IGZyb20gZXZlbnQuJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJ1dHRvbkVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jb21wcmVzc2lvbkVuYWJsZUljb24sIHRoaXMuY29tcHJlc3Npb25EaXNhYmxlZEljb24pO1xyXG4gICAgICAgICAgYnV0dG9uRWwuY2xhc3NMaXN0LmFkZCh0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRJY29uIDogdGhpcy5jb21wcmVzc2lvbkVuYWJsZUljb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NfYnRuKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbXByZXNzX2J0bi50aXRsZSA9IGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdEaXNhYmxlJyA6ICdFbmFibGUnfSBpbWFnZSBjb21wcmVzc2lvbmA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFxyXG4gICAgICAgICAgYCR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ0VuYWJsZScgOiAnRGlzYWJsZSd9IGltYWdlIGNvbXByZXNzaW9uIHN1Y2Nlc3NmdWxseS5gLFxyXG4gICAgICAgICAgJ3RvcCcsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIDI1MDAsXHJcbiAgICAgICAgICAnc3VjY2VzcycsXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jdXMgZWRpdG9yIGlmIGF2YWlsYWJsZS4gUmV0dXJucyB0cnVlIGlmIGZvY3VzIHN1Y2NlZWRlZC4gKi9cclxuICBwdWJsaWMgZm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcclxuICAgICAgdGhpcy5lZGl0b3IuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWU6IHN0cmluZywgZm9udEF3ZXNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IGljb25OYW1lVmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoaWNvbk5hbWUsIHRoaXMuZ3JvdXApO1xyXG4gICAgaWYgKGljb25OYW1lVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWVWYWx1ZSwgZm9udEF3ZXNvbWVTZXJ2aWNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpY29uTmFtZTtcclxuICB9XHJcblxyXG4gIC8qKiBNZXJnZSBwYXN0ZSBjbGVhbnVwIG9wdGlvbnMgZnJvbSBkYXRhLk9wdGlvbnMgKHN0cmluZyBleHByZXNzaW9uIG9yIG9iamVjdCkgaW50byBwYXN0ZUNsZWFudXBTZXR0aW5ncy4gKi9cclxuICBwcml2YXRlIHNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kYXRhPy5PcHRpb25zO1xyXG4gICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKG9wdGlvbnMsIHRoaXMuZ3JvdXApO1xyXG4gICAgICBpZiAocmVzb2x2ZWQgJiYgdHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgcmVzb2x2ZWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBkYXRhLk9wdGlvbnMgcmVzb2x2ZWQgdmFsdWUgaXMgbm90IGFuIG9iamVjdC4gUGFzdGUgY2xlYW51cCBzZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICAgICAgcmVzb2x2ZWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhc3RlQ2xlYW51cFNldHRpbmdzLCBvcHRpb25zKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBVbnN1cHBvcnRlZCBkYXRhLk9wdGlvbnMgdHlwZS4gUGFzdGUgY2xlYW51cCBzZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICB0eXBlOiB0eXBlb2Ygb3B0aW9ucyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBDdXN0b20gSW1hZ2UgVXBsb2FkIC8gRW5sYXJnZVxyXG5cclxuICAvKiogVHJpZ2dlciBoaWRkZW4gZmlsZSBpbnB1dCBjbGljayBmb3IgaW1hZ2UgdXBsb2FkLiAqL1xyXG4gIHB1YmxpYyBvcGVuRmlsZUV4cGxvcmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBgJHt0aGlzLmRhdGEuVmFsdWV9LXVwbG9hZC1maWxlYDtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbnB1dCBlbGVtZW50IG5vdCBmb3VuZCAoaWQ9XCIke2lkfVwiKS5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbiBhbiBlbmxhcmdlZCBwb3B1cCBlZGl0b3IuICovXHJcbiAgcHVibGljIG9wZW5Qb3B1cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBvcGVuIHBvcHVwLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3BlbiBkaWFsb2dcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xyXG4gICAgICBjb250ZW50OiBadGV4dGVkaXRvckNvbXBvbmVudCxcclxuICAgICAgd2lkdGg6ICc5OCUnLFxyXG4gICAgICBoZWlnaHQ6ICc5NyUnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXBDb21wb25lbnQgPSB0aGlzLmRpYWxvZ1JlZi5jb250ZW50Lmluc3RhbmNlIGFzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50O1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEuQWxsb3dFbmxhcmdlID0gZmFsc2U7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZjtcclxuICAgIHBvcHVwQ29tcG9uZW50LkNsb3NlRW5sYXJnZUJ0biA9IHRydWU7XHJcbiAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzO1xyXG5cclxuICAgIC8vIFByZXNlcnZlIHN0eWxlIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGNsb3NlLlxyXG4gICAgdGhpcy5vcmlnaW5hbElubGluZVN0eWxlID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxID8/ICcnO1xyXG4gICAgaWYgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXM/LnN0eWxlKSB7XHJcbiAgICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID1cclxuICAgICAgICAocG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPz8gJycpICtcclxuICAgICAgICBgaGVpZ2h0OiR7KHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCkudG9TdHJpbmcoKX1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcG9wdXBDb21wb25lbnQuZ3JvdXAgPSB0aGlzLmdyb3VwO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50U2V0dGluZ3MgPSB0aGlzLmNvbXBvbmVudFNldHRpbmdzO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZm9ybSA9IHRoaXMuZm9ybTtcclxuXHJcbiAgICAvLyBSZXN0b3JlIHN0YXRlIGFuZCBwdXNoIHZhbHVlIGJhY2sgaW50byBlZGl0b3Igb24gY2xvc2UuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5yZXN1bHQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5kYXRhLkFsbG93RW5sYXJnZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPSB0aGlzLm9yaWdpbmFsSW5saW5lU3R5bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFB1bGwgY3VycmVudCB6TW9kZWwgaW50byBlZGl0b3IgYW5kIHRyaWdnZXIgb25DaGFuZ2UgKGV4aXN0aW5nIGJlaGF2aW9yKS5cclxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdyb3VwPy56TW9kZWw/Llt0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgICBlZGl0b3IudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsb3NlIHRoZSBwb3B1cCBlZGl0b3IgaWYgb3Blbi4gKi9cclxuICBwdWJsaWMgb25Qb3B1cENsb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpYWxvZ1JlZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIDxpbnB1dCB0eXBlPVwiZmlsZVwiPiBjaGFuZ2UgYW5kIGluc2VydCBzZWxlY3RlZCBpbWFnZSBpbnRvIGVkaXRvci5cclxuICAgKiBOT1RFOiBQcmVmZXIgdHlwaW5nIGZpbGVJbnB1dCBhcyBFdmVudCBmb3IgYmV0dGVyIHNhZmV0eS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkSW1hZ2UoZmlsZUlucHV0OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dD8uZmlsZXM/LlswXTtcclxuXHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIE5vIGltYWdlIHNlbGVjdGVkIGZvciB1cGxvYWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2b2lkIHRoaXMuaW5zZXJ0SW1hZ2VJbnRvRWRpdG9yKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBpbWFnZSBpbnRvIGVkaXRvciwgb3B0aW9uYWxseSBjb21wcmVzc2luZyBmaXJzdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIGluc2VydEltYWdlSW50b0VkaXRvcihmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IGltYWdlLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdvcmtpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IGZpbGU7XHJcblxyXG4gICAgY29uc3QgY29tcHJlc3Npb25Db25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG5cclxuICAgIGlmIChjb21wcmVzc2lvbkVuYWJsZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtadGV4dGVkaXRvcl0gVXBsb2FkIGltYWdlIGJlZm9yZSBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuXHJcbiAgICAgIHdvcmtpbmdGaWxlID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKHdvcmtpbmdGaWxlKTtcclxuICAgICAgaWYgKCF3b3JraW5nRmlsZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBmYWlsZWQuIFVwbG9hZCBpbWFnZSBpbnNlcnRpb24gYWJvcnRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBhZnRlciBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKHdvcmtpbmdGaWxlKTtcclxuICAgICAgZWRpdG9yLmV4ZWMoJ2luc2VydEltYWdlJywgeyBzcmM6IGJhc2U2NCB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHJlYWQgdXBsb2FkZWQgaW1hZ2UgYXMgYmFzZTY0LicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydCBiYXNlNjQgKGRhdGEgVVJMKSB0byBGaWxlLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYmFzZTY0VG9GaWxlKGJhc2U2NFN0cmluZzogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICAvLyBVc2luZyBmZXRjaCBvbiBkYXRhIFVSTCBpcyBzdXBwb3J0ZWQgYnkgbW9kZXJuIGJyb3dzZXJzOyBrZWVwIGV4aXN0aW5nIGxvZ2ljLlxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiYXNlNjRTdHJpbmcpO1xyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwge1xyXG4gICAgICB0eXBlOiBibG9iLnR5cGUsXHJcbiAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpZiBpdCBpcyBhbiBpbWFnZSBhbmQgYWJvdmUgbWluIHRocmVzaG9sZC5cclxuICAgKiBSZXR1cm5zIHRoZSBjb21wcmVzc2VkIGZpbGUsIG9yIG51bGwgaWYgbm90IGNvbXByZXNzaWJsZSAvIGNvbXByZXNzaW9uIHNraXBwZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBpbWFnZUNvbXByZXNzaW9uKGZpbGU6IEZpbGUpOiBQcm9taXNlPEZpbGUgfCBudWxsPiB7XHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIGltYWdlQ29tcHJlc3Npb24gY2FsbGVkIHdpdGggZW1wdHkgZmlsZS4nKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmaWxlLnR5cGUgfHwgIWZpbGUudHlwZS5pbmNsdWRlcygnaW1hZ2UnKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gU2tpcHBpbmcgY29tcHJlc3Npb246IGZpbGUgaXMgbm90IGFuIGltYWdlLicsIHsgdHlwZTogZmlsZS50eXBlIH0pO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICAvLyBDb21wcmVzc2lvbiBub3QgY29uZmlndXJlZC5cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW1nQ29uZmlnID0gdGhpcy5jb21wcmVzc2lvbkNvbmZpZ0hhbmRsZXIoY29uZmlnKTtcclxuXHJcbiAgICAvLyBJZiBmaWxlIGlzIGJlbG93IHRocmVzaG9sZCwga2VlcCBleGlzdGluZyBiZWhhdmlvcjogc2tpcCBjb21wcmVzc2lvbiAocmV0dXJuIG51bGwpLlxyXG4gICAgaWYgKGZpbGUuc2l6ZSA8PSBpbWdDb25maWcuRmlsZVNpemVNaW5TaXplQnl0ZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBgW1p0ZXh0ZWRpdG9yXSBTa2lwcGluZyBjb21wcmVzc2lvbjogZmlsZSBzaXplICR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0IgaXMgYmVsb3cgdGhyZXNob2xkICR7KGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlIC8gMTAyNCkudG9GaXhlZCgyKX1LQi5gLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjb21wcmVzc2VkJCA9IHRoaXMuY29tcHJlc3NJbWFnZS5jb21wcmVzcyhmaWxlLCBpbWdDb25maWcpO1xyXG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGNvbXByZXNzZWQkKTtcclxuICAgICAgcmV0dXJuIGNvbXByZXNzZWRGaWxlID8/IG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIENvbXByZXNzaW9uIHNlcnZpY2UgdGhyZXcgYW4gZXJyb3IuJywgZXJyKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIGltYWdlIGNvbXByZXNzaW9uIGNvbmZpZyBpbnRvIGJ5dGUtYmFzZWQgdGhyZXNob2xkcy4gKi9cclxuICBwcml2YXRlIGNvbXByZXNzaW9uQ29uZmlnSGFuZGxlcihpbWdDb25maWc6IEltYWdlQ29tcHJlc3Npb25Db25maWcpOiBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHtcclxuICAgIGlmICghaW1nQ29uZmlnKSB7XHJcbiAgICAgIC8vIERlZmVuc2l2ZTogc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNhbGxlciBjaGVja3MuXHJcbiAgICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gdGhpcy5jb252ZXJ0U2l6ZVRvQnl0ZShpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW1nQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBzaXplIHN0cmluZyBsaWtlIFwiMTAwa2JcIiwgXCIxIE1CXCIsIFwiMmdiXCIgdG8gYnl0ZXMuXHJcbiAgICogSWYgbm8gdW5pdCBpcyBwcm92aWRlZCwgYnl0ZXMgYXJlIGFzc3VtZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0U2l6ZVRvQnl0ZShzaXplU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKCFzaXplU3RyaW5nIHx8IHR5cGVvZiBzaXplU3RyaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gY29udmVydFNpemVUb0J5dGUgcmVjZWl2ZWQgaW52YWxpZCBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgYWxsIHNwYWNlcywgZS5nLiBcIjEgTUJcIiAtPiBcIjFNQlwiXHJcbiAgICBjb25zdCB0cmltbWVkID0gc2l6ZVN0cmluZy5yZXBsYWNlKC8gL2csICcnKS50cmltKCk7XHJcbiAgICBpZiAoIXRyaW1tZWQpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCBudW1lcmljIHBhcnQgYW5kIHVuaXQgcGFydCAobGV0dGVycykuXHJcbiAgICAvLyBFeGFtcGxlOiBcIjEuNU1CXCIgPT4gbnVtYmVyPTEuNSwgdW5pdD1cIm1iXCJcclxuICAgIGNvbnN0IG1hdGNoID0gL14oWzAtOV0qXFwuP1swLTldKykoW2EtekEtWl0qKSQvLmV4ZWModHJpbW1lZCk7XHJcbiAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBVbmFibGUgdG8gcGFyc2Ugc2l6ZVN0cmluZy4gRGVmYXVsdGluZyB0byAwLicsIHsgc2l6ZVN0cmluZyB9KTtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpYyA9IE51bWJlcihtYXRjaFsxXSk7XHJcbiAgICBjb25zdCB1bml0ID0gKG1hdGNoWzJdIHx8ICdiJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG51bWVyaWMpIHx8IG51bWVyaWMgPCAwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbnZhbGlkIG51bWVyaWMgc2l6ZSBpbiBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgY2FzZSAnYic6XHJcbiAgICAgIGNhc2UgJyc6XHJcbiAgICAgICAgcmV0dXJuIG51bWVyaWM7XHJcbiAgICAgIGNhc2UgJ2tiJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ21iJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0O1xyXG4gICAgICBjYXNlICdnYic6XHJcbiAgICAgICAgcmV0dXJuIG51bWVyaWMgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVua25vd24gdW5pdCBpbiBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIGJ5dGVzLicsIHsgc2l6ZVN0cmluZywgdW5pdCB9KTtcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIGEgRmlsZSBhcyBiYXNlNjQgZGF0YSBVUkwuICovXHJcbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmICghZmlsZSkge1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZpbGUgaXMgcmVxdWlyZWQuJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gU21hbGwgaGVscGVyc1xyXG5cclxuICAvKiogRXh0cmFjdCBldmVudCB0YXJnZXQgYXMgSFRNTEVsZW1lbnQgc2FmZWx5LiAqL1xyXG4gIHByaXZhdGUgZ2V0RXZlbnRUYXJnZXRFbGVtZW50KGV2ZW50OiBFdmVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudD8udGFyZ2V0O1xyXG4gICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdGFyZ2V0IDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxufVxyXG4iLCJcclxuXHJcbjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJ6dGV4dGVkaXRvci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGV4cGFuZC1idG4tY29udGFpbmVyXCI+XHJcbiAgPGlvbi1idXR0b24gICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJkYXRhLkFsbG93RW5sYXJnZVwiIChjbGljayk9XCJvcGVuUG9wdXAoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoJ2ZhRXhwYW5kQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbiAgPGlvbi1idXR0b24gIGNsYXNzPVwiaW9uLWFjdGl2YXRhYmxlIHJpcHBsZS1wYXJlbnRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIiAqbmdJZj1cIkNsb3NlRW5sYXJnZUJ0blwiIChjbGljayk9XCJvblBvcHVwQ2xvc2UoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUNvbXByZXNzQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbjwvZGl2PlxyXG4gIDxrZW5kby1lZGl0b3IgI2VkaXRvclxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwiZGF0YS5SZXNpemFibGUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW3Bhc3RlQ2xlYW51cFNldHRpbmdzXT1cInBhc3RlQ2xlYW51cFNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2lmcmFtZV09XCJjb21wb25lbnRTZXR0aW5ncy5pZnJhbWVcIj5cclxuICAgIDxrZW5kby10b29sYmFyIFtzdHlsZS5kaXNwbGF5XT1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnYmFzaWMnID8gJ2luaGVyaXQnIDogJ25vbmUnXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTJcIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3I+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRVbm9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0T3JkZXJlZExpc3RCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRGaWxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdkZWZhdWx0J1wiIGtlbmRvRWRpdG9ySW5zZXJ0SW1hZ2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2V4cGxvcmVyJ1wiIGljb249XCJrLWktaW1hZ2Ugay1pLXBob3RvXCIgKGNsaWNrKT1cIm9wZW5GaWxlRXhwbG9yZXIoKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5Db21wcmVzc2lvblwiICBpY29uPVwiay1pLWltYWdlIGstaS16b29tLWFjdHVhbC1zaXplXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKCRldmVudClcIiAjY29tcHJlc3NCdXR0b24gdGl0bGU9XCJEaXNhYmxlIEltYWdlIENvbXByZXNzaW9uXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yVmlld1NvdXJjZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgPC9rZW5kby10b29sYmFyPlxyXG4gICAgPGtlbmRvLXRvb2xiYXIgW3N0eWxlLmRpc3BsYXldPVwiZGF0YS5Ub29sQmFyU3R5bGUgPT09ICdmdWxsJyA/ICdpbmhlcml0JyA6ICdub25lJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvbnRTaXplPjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvbnRGYW1pbHk+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JGb3JlQ29sb3Igdmlldz1cImdyYWRpZW50XCI+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlciBrZW5kb0VkaXRvckJhY2tDb2xvciB2aWV3PVwiZ3JhZGllbnRcIj48L2tlbmRvLXRvb2xiYXItY29sb3JwaWNrZXI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluc2VydFVub3JkZXJlZExpc3RCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRPcmRlcmVkTGlzdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluZGVudEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvck91dGRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JDcmVhdGVMaW5rQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yVW5saW5rQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2RlZmF1bHQnXCIga2VuZG9FZGl0b3JJbnNlcnRJbWFnZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZXhwbG9yZXInXCIgaWNvbj1cImstaS1pbWFnZSBrLWktcGhvdG9cIiAoY2xpY2spPVwib3BlbkZpbGVFeHBsb3JlcigpXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICAqbmdJZj1cIiEhZGF0YS5Db21wcmVzc2lvblwiIGljb249XCJrLWktaW1hZ2Ugay1pLWZpbGUtaW1hZ2VcIiAoY2xpY2spPVwib25PZmZDb21wcmVzc01vZGUoJGV2ZW50KVwiICAjY29tcHJlc3NCdXR0b24gdGl0bGU9XCJEaXNhYmxlIEltYWdlIENvbXByZXNzaW9uXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yVmlld1NvdXJjZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+PC9rZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dCZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dBZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZUNvbHVtbkJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVJvd0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVRhYmxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yTWVyZ2VDZWxsc0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclNwbGl0Q2VsbEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgPC9rZW5kby1lZGl0b3I+XHJcbiAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHR5cGU9XCJmaWxlXCIgW2lkXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgW25hbWVdPVwiZGF0YS5WYWx1ZSArJy11cGxvYWQtZmlsZSdcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgbmdmLW1heC1zaXplPVwiNU1CXCIgKGNoYW5nZSk9XCJ1cGxvYWRJbWFnZSgkZXZlbnQpXCI+XHJcbjwvZGl2PlxyXG4iXX0=