@aquera/ngx-smart-table 0.0.17-patch-0.2 → 0.0.17-patch-0.4

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.
@@ -16,11 +16,13 @@ function injectCodeEditorStyles() {
16
16
  const style = document.createElement('style');
17
17
  style.id = styleId;
18
18
  style.textContent = `
19
- /* Nile Code Editor cell styling */
19
+ /* Nile Code Editor cell styling - constrained to cell height */
20
20
  nile-code-editor.st-cell-editor {
21
21
  display: block;
22
22
  width: 100%;
23
23
  height: 100%;
24
+ max-height: 32px;
25
+ overflow: hidden;
24
26
  font-size: inherit !important;
25
27
  font-family: inherit !important;
26
28
  line-height: inherit !important;
@@ -28,19 +30,31 @@ function injectCodeEditorStyles() {
28
30
  nile-code-editor.st-cell-editor::part(code-editor-base) {
29
31
  border: none !important;
30
32
  min-height: 100% !important;
33
+ max-height: 32px !important;
31
34
  background: transparent !important;
32
35
  font-size: inherit !important;
33
36
  font-family: inherit !important;
34
37
  line-height: inherit !important;
38
+ overflow: hidden !important;
35
39
  }
36
40
  /* Ensure proper sizing within table cell */
37
41
  .st-nile-code-editor {
38
42
  width: 100%;
39
43
  height: 100%;
44
+ max-height: 32px;
40
45
  min-height: 28px;
41
46
  font-size: inherit !important;
47
+ overflow: hidden;
48
+ }
49
+ /* CodeMirror content should inherit font size and be constrained */
50
+ nile-code-editor.st-cell-editor .cm-editor {
51
+ max-height: 32px !important;
52
+ overflow: hidden !important;
53
+ }
54
+ nile-code-editor.st-cell-editor .cm-scroller {
55
+ max-height: 32px !important;
56
+ overflow: hidden !important;
42
57
  }
43
- /* CodeMirror content should inherit font size */
44
58
  nile-code-editor.st-cell-editor .cm-content,
45
59
  nile-code-editor.st-cell-editor .cm-line {
46
60
  font-size: inherit !important;
@@ -53,12 +67,15 @@ function injectCodeEditorStyles() {
53
67
  align-items: center;
54
68
  width: 100%;
55
69
  height: 100%;
70
+ max-height: 32px;
56
71
  gap: 4px;
57
72
  }
58
73
  .st-code-editor-wrapper .st-code-editor-input {
59
74
  flex: 1;
60
75
  min-width: 0;
61
76
  height: 100%;
77
+ max-height: 32px;
78
+ overflow: hidden;
62
79
  }
63
80
  .st-code-editor-wrapper .st-expand-button {
64
81
  display: flex;
@@ -79,13 +96,22 @@ function injectCodeEditorStyles() {
79
96
  background: var(--nile-color-neutral-100, #f3f4f6);
80
97
  color: var(--nile-color-neutral-700, #374151);
81
98
  }
82
- /* Dialog code editor styling */
99
+ /* Dialog code editor styling - fixed header/footer, scrollable content */
83
100
  .st-code-editor-dialog::part(panel) {
84
101
  max-height: var(--max-height, 80vh) !important;
85
102
  overflow: hidden !important;
103
+ display: flex !important;
104
+ flex-direction: column !important;
105
+ }
106
+ .st-code-editor-dialog::part(header) {
107
+ flex-shrink: 0 !important;
86
108
  }
87
109
  .st-code-editor-dialog::part(body) {
88
- overflow: auto !important;
110
+ overflow: hidden !important;
111
+ flex: 1 !important;
112
+ display: flex !important;
113
+ flex-direction: column !important;
114
+ padding: 0 !important;
89
115
  }
90
116
  .st-code-editor-dialog nile-code-editor {
91
117
  width: 100%;
@@ -94,14 +120,6 @@ function injectCodeEditorStyles() {
94
120
  .st-code-editor-dialog nile-code-editor::part(code-editor-base) {
95
121
  border: 1px solid var(--nile-color-neutral-200, #e5e7eb) !important;
96
122
  border-radius: 4px !important;
97
- overflow: auto !important;
98
- min-height: var(--dialog-editor-min-height, 300px) !important;
99
- }
100
- .st-code-editor-dialog nile-code-editor .cm-editor {
101
- min-height: var(--dialog-editor-min-height, 300px) !important;
102
- }
103
- .st-code-editor-dialog nile-code-editor .cm-content {
104
- min-height: var(--dialog-editor-min-height, 300px) !important;
105
123
  }
106
124
  `;
107
125
  document.head.appendChild(style);
@@ -118,6 +136,10 @@ export class NileCodeEditor {
118
136
  this.dialogOpen = false;
119
137
  this.expandButtonClicked = false;
120
138
  this.trackedValue = null;
139
+ this.syncingFromDialog = false; // Flag to prevent inline editor from overwriting multiline content
140
+ this.userEditedInline = false; // Flag to track if user has typed in inline editor
141
+ this.dialogOriginalValue = ''; // Store original value when dialog opens
142
+ this.dialogCurrentValue = ''; // Track current value in dialog
121
143
  }
122
144
  edit(context) {
123
145
  if (!context.container) {
@@ -125,7 +147,10 @@ export class NileCodeEditor {
125
147
  return;
126
148
  }
127
149
  this.context = context;
128
- this.trackedValue = null;
150
+ // Initialize tracked value from context
151
+ this.trackedValue = String(context.value ?? '');
152
+ this.syncingFromDialog = false;
153
+ this.userEditedInline = false;
129
154
  // Inject global styles once
130
155
  injectCodeEditorStyles();
131
156
  // Check if we should show expand button (default: true)
@@ -145,6 +170,11 @@ export class NileCodeEditor {
145
170
  this.editor.style.height = '100%';
146
171
  this.editor.style.boxSizing = 'border-box';
147
172
  this.editor.noborder = this.options?.noborder !== false;
173
+ // Enable multiline by default for inline editor to support paste and multiline content
174
+ this.editor.multiline = this.options?.multiline !== false;
175
+ this.editor.hasScroller = true;
176
+ // No line numbers for inline editor
177
+ this.editor.lineNumbers = false;
148
178
  editorContainer.appendChild(this.editor);
149
179
  this.wrapper.appendChild(editorContainer);
150
180
  // Create expand button
@@ -178,6 +208,11 @@ export class NileCodeEditor {
178
208
  this.editor.style.height = '100%';
179
209
  this.editor.style.boxSizing = 'border-box';
180
210
  this.editor.noborder = this.options?.noborder !== false;
211
+ // Enable multiline by default for inline editor to support paste and multiline content
212
+ this.editor.multiline = this.options?.multiline !== false;
213
+ this.editor.hasScroller = true;
214
+ // No line numbers for inline editor
215
+ this.editor.lineNumbers = false;
181
216
  // Clear container and append editor
182
217
  context.container.innerHTML = '';
183
218
  context.container.appendChild(this.editor);
@@ -225,6 +260,36 @@ export class NileCodeEditor {
225
260
  // Silently handle any errors
226
261
  }
227
262
  }
263
+ /**
264
+ * Read the live value directly from CodeMirror's internal state,
265
+ * bypassing debounced nile-change events and the possibly-stale .value property.
266
+ *
267
+ * Priority order:
268
+ * 1. trackedValue - always up to date from change events
269
+ * 2. CodeMirror internal state - for real-time reading
270
+ * 3. editor.value property - fallback
271
+ */
272
+ getLiveEditorValue() {
273
+ // Use tracked value if available (updated by change events)
274
+ if (this.trackedValue !== null) {
275
+ return this.trackedValue;
276
+ }
277
+ if (!this.editor)
278
+ return '';
279
+ try {
280
+ const shadowRoot = this.editor.shadowRoot;
281
+ if (shadowRoot) {
282
+ const cmEditor = shadowRoot.querySelector('.cm-editor');
283
+ if (cmEditor?.cmView?.view) {
284
+ return cmEditor.cmView.view.state.doc.toString();
285
+ }
286
+ }
287
+ }
288
+ catch {
289
+ // Fall through to other methods
290
+ }
291
+ return this.editor.value ?? '';
292
+ }
228
293
  /**
229
294
  * Open the full editor dialog
230
295
  */
@@ -233,6 +298,8 @@ export class NileCodeEditor {
233
298
  return;
234
299
  this.dialogOpen = true;
235
300
  this.expandButtonClicked = false; // Reset flag now that dialog is opening
301
+ // Store original value for cancel functionality
302
+ this.dialogOriginalValue = this.getLiveEditorValue();
236
303
  // Create dialog with configurable dimensions
237
304
  const dialogWidth = this.options?.dialogWidth || '600px';
238
305
  const dialogMaxHeight = this.options?.dialogMaxHeight || '80vh';
@@ -243,26 +310,26 @@ export class NileCodeEditor {
243
310
  this.dialog.label = dialogTitle;
244
311
  this.dialog.style.setProperty('--width', dialogWidth);
245
312
  this.dialog.style.setProperty('--max-height', dialogMaxHeight);
246
- // Create dialog content
313
+ // Create dialog content wrapper - flex column to handle fixed header/footer
314
+ const contentWrapper = document.createElement('div');
315
+ contentWrapper.style.display = 'flex';
316
+ contentWrapper.style.flexDirection = 'column';
317
+ contentWrapper.style.height = `calc(${dialogMaxHeight} - 60px)`; // Account for dialog header
318
+ contentWrapper.style.maxHeight = `calc(${dialogMaxHeight} - 60px)`;
319
+ // Create editor content area - this is the scrollable part
247
320
  const content = document.createElement('div');
248
321
  content.style.padding = '16px';
249
- content.style.maxHeight = `calc(${dialogMaxHeight} - 80px)`;
322
+ content.style.paddingBottom = '8px';
323
+ content.style.flex = '1';
250
324
  content.style.overflow = 'auto';
325
+ content.style.minHeight = '0'; // Important for flex shrinking
251
326
  // Create full editor
252
327
  this.dialogEditor = document.createElement('nile-code-editor');
253
- const minLines = this.options?.dialogMinLines ?? 20;
254
- const currentValue = this.editor?.value || '';
255
- const currentLineCount = (currentValue.match(/\n/g) || []).length + 1;
256
- const paddingLines = Math.max(0, minLines - currentLineCount);
257
- this.dialogEditor.value = currentValue + '\n'.repeat(paddingLines);
328
+ this.dialogEditor.value = this.dialogOriginalValue;
258
329
  this.dialogEditor.multiline = true;
259
330
  this.dialogEditor.lineNumbersMultiline = true;
260
331
  this.dialogEditor.hasScroller = true;
261
- const lineHeightPx = 20;
262
- const minHeightFromLines = `${minLines * lineHeightPx}px`;
263
- this.dialogEditor.style.minHeight = `max(${dialogEditorHeight}, ${minHeightFromLines})`;
264
- this.dialogEditor.style.maxHeight = `calc(${dialogMaxHeight} - 120px)`;
265
- content.style.setProperty('--dialog-editor-min-height', `max(${dialogEditorHeight}, ${minHeightFromLines})`);
332
+ this.dialogEditor.style.minHeight = dialogEditorHeight;
266
333
  // Apply same options to dialog editor
267
334
  if (this.options?.language) {
268
335
  this.dialogEditor.language = this.options.language;
@@ -289,38 +356,44 @@ export class NileCodeEditor {
289
356
  this.dialogEditor.customThemeCSS = this.options.customThemeCSS;
290
357
  }
291
358
  this.dialogEditor.expandable = false;
292
- // Real-time sync: Update cell editor whenever dialog editor changes
359
+ // Initialize dialog current value
360
+ this.dialogCurrentValue = this.dialogOriginalValue;
361
+ // Track changes in dialog editor
293
362
  this.dialogEditor.addEventListener('nile-change', (e) => {
294
- const dialogValue = e.detail?.value || '';
295
- this.trackedValue = dialogValue;
296
- if (this.editor) {
297
- this.editor.value = dialogValue;
298
- }
299
- if (this.context) {
300
- this.context.onChange(dialogValue);
301
- }
363
+ this.dialogCurrentValue = e.detail?.value ?? '';
302
364
  });
303
365
  content.appendChild(this.dialogEditor);
304
- this.dialog.appendChild(content);
305
- // Handle dialog close events (clicking X button - stay in edit mode)
366
+ contentWrapper.appendChild(content);
367
+ // Create footer with Ok button - fixed at bottom
368
+ const footer = document.createElement('div');
369
+ footer.style.display = 'flex';
370
+ footer.style.justifyContent = 'flex-end';
371
+ footer.style.padding = '12px 16px';
372
+ footer.style.borderTop = '1px solid var(--nile-color-neutral-200, #e5e7eb)';
373
+ footer.style.gap = '8px';
374
+ footer.style.flexShrink = '0'; // Prevent footer from shrinking
375
+ footer.style.backgroundColor = 'var(--nile-color-neutral-0, #ffffff)';
376
+ const okButton = document.createElement('nile-button');
377
+ okButton.setAttribute('variant', 'primary');
378
+ okButton.textContent = 'Ok';
379
+ okButton.addEventListener('click', () => {
380
+ this.applyDialogChanges();
381
+ });
382
+ footer.appendChild(okButton);
383
+ contentWrapper.appendChild(footer);
384
+ this.dialog.appendChild(contentWrapper);
385
+ // Handle dialog close events (clicking X button - cancel changes)
306
386
  this.dialog.addEventListener('nile-request-close', (e) => {
307
- const customEvent = e;
308
- // Check if close was triggered by overlay click (clicking outside)
309
- if (customEvent.detail?.source === 'overlay') {
310
- // Clicking outside the dialog - save and exit edit mode
311
- this.closeDialog(true);
312
- }
313
- else {
314
- // Clicking X button - stay in edit mode
315
- this.closeDialog(false);
316
- }
387
+ e.preventDefault();
388
+ // X button or overlay click - cancel changes
389
+ this.cancelDialogChanges();
317
390
  });
318
- // Handle Escape key in dialog - stay in edit mode
391
+ // Handle Escape key in dialog - cancel changes
319
392
  this.dialog.addEventListener('keydown', (e) => {
320
393
  if (e.key === 'Escape') {
321
394
  e.preventDefault();
322
395
  e.stopPropagation();
323
- this.closeDialog(false);
396
+ this.cancelDialogChanges();
324
397
  }
325
398
  });
326
399
  // Append to body and show
@@ -337,34 +410,113 @@ export class NileCodeEditor {
337
410
  }, 0);
338
411
  }
339
412
  /**
340
- * Close the dialog and optionally save/exit edit mode
413
+ * Get the current value from the dialog editor
414
+ */
415
+ getDialogEditorValue() {
416
+ // Use tracked value from change events (most reliable)
417
+ if (this.dialogCurrentValue) {
418
+ return this.dialogCurrentValue.replace(/\n+$/, '');
419
+ }
420
+ if (!this.dialogEditor)
421
+ return this.dialogOriginalValue;
422
+ // Try to get value from CodeMirror's internal state
423
+ try {
424
+ const shadowRoot = this.dialogEditor.shadowRoot;
425
+ if (shadowRoot) {
426
+ const cmEditor = shadowRoot.querySelector('.cm-editor');
427
+ if (cmEditor?.cmView?.view) {
428
+ const value = cmEditor.cmView.view.state.doc.toString();
429
+ return value.replace(/\n+$/, '');
430
+ }
431
+ }
432
+ }
433
+ catch {
434
+ // Fall through to other methods
435
+ }
436
+ // Fallback to value property
437
+ const value = this.dialogEditor.value;
438
+ return (value ?? '').replace(/\n+$/, '');
439
+ }
440
+ /**
441
+ * Apply changes from dialog and close it
442
+ */
443
+ applyDialogChanges() {
444
+ if (!this.dialogOpen)
445
+ return;
446
+ // Get the value from dialog editor - try multiple sources
447
+ let dialogValue = this.dialogCurrentValue;
448
+ // If no tracked value, try reading directly from dialog editor
449
+ if (!dialogValue && this.dialogEditor) {
450
+ try {
451
+ const shadowRoot = this.dialogEditor.shadowRoot;
452
+ if (shadowRoot) {
453
+ const cmEditor = shadowRoot.querySelector('.cm-editor');
454
+ if (cmEditor?.cmView?.view) {
455
+ dialogValue = cmEditor.cmView.view.state.doc.toString();
456
+ }
457
+ }
458
+ }
459
+ catch {
460
+ // Fall through
461
+ }
462
+ // Fallback to value property
463
+ if (!dialogValue) {
464
+ dialogValue = this.dialogEditor.value ?? '';
465
+ }
466
+ }
467
+ // Strip trailing newlines
468
+ dialogValue = (dialogValue || '').replace(/\n+$/, '');
469
+ // Update tracked value and inline editor
470
+ this.trackedValue = dialogValue;
471
+ this.userEditedInline = false;
472
+ this.syncingFromDialog = true;
473
+ if (this.editor) {
474
+ this.editor.value = dialogValue;
475
+ }
476
+ setTimeout(() => {
477
+ this.syncingFromDialog = false;
478
+ }, 0);
479
+ // Notify context of the change
480
+ if (this.context) {
481
+ this.context.onChange(dialogValue);
482
+ }
483
+ // Close dialog
484
+ this.closeDialogUI();
485
+ // Refocus the cell editor to stay in edit mode
486
+ setTimeout(() => {
487
+ this.focusEditor();
488
+ }, 50);
489
+ }
490
+ /**
491
+ * Cancel dialog changes and revert to original value
341
492
  */
342
- closeDialog(saveAndExit = false) {
493
+ cancelDialogChanges() {
343
494
  if (!this.dialogOpen)
344
495
  return;
345
- // Reset flag immediately so document click handler works
496
+ // Revert to original value (don't change anything)
497
+ // trackedValue and inline editor remain as they were before dialog opened
498
+ // Close dialog
499
+ this.closeDialogUI();
500
+ // Refocus the cell editor to stay in edit mode
501
+ setTimeout(() => {
502
+ this.focusEditor();
503
+ }, 50);
504
+ }
505
+ /**
506
+ * Close and remove the dialog UI
507
+ */
508
+ closeDialogUI() {
346
509
  this.dialogOpen = false;
347
- // Close and remove dialog
510
+ this.dialogCurrentValue = '';
348
511
  if (this.dialog) {
349
512
  this.dialog.open = false;
350
513
  const dialogRef = this.dialog;
351
- const dialogEditorRef = this.dialogEditor;
352
514
  this.dialog = undefined;
353
515
  this.dialogEditor = undefined;
354
516
  // Remove from DOM after animation
355
517
  setTimeout(() => {
356
518
  dialogRef?.remove();
357
519
  }, 200);
358
- if (saveAndExit && this.context) {
359
- // Save and exit edit mode
360
- this.context.onSave(this.getCurrentValue());
361
- }
362
- else {
363
- // Refocus the cell editor to stay in edit mode
364
- setTimeout(() => {
365
- this.focusEditor();
366
- }, 50);
367
- }
368
520
  }
369
521
  }
370
522
  /**
@@ -526,6 +678,11 @@ export class NileCodeEditor {
526
678
  const changeHandler = (e) => {
527
679
  const customEvent = e;
528
680
  const newValue = customEvent.detail?.value ?? '';
681
+ // Don't process if we're syncing from dialog (prevents feedback loop)
682
+ if (this.syncingFromDialog) {
683
+ return;
684
+ }
685
+ // Update tracked value
529
686
  this.trackedValue = newValue;
530
687
  context.onChange(newValue);
531
688
  };
@@ -591,6 +748,11 @@ export class NileCodeEditor {
591
748
  this.expandButton = undefined;
592
749
  this.context = undefined;
593
750
  this.expandButtonClicked = false;
751
+ this.syncingFromDialog = false;
752
+ this.trackedValue = null;
753
+ this.userEditedInline = false;
754
+ this.dialogOriginalValue = '';
755
+ this.dialogCurrentValue = '';
594
756
  }
595
757
  focus() {
596
758
  this.editor?.focus();
@@ -598,7 +760,7 @@ export class NileCodeEditor {
598
760
  getCurrentValue() {
599
761
  if (!this.editor)
600
762
  return '';
601
- const value = (this.trackedValue !== null ? this.trackedValue : this.editor.value ?? '');
763
+ const value = this.getLiveEditorValue();
602
764
  return value.replace(/\n+$/, '');
603
765
  }
604
766
  /**
@@ -616,4 +778,4 @@ export class NileCodeEditor {
616
778
  return this.editor;
617
779
  }
618
780
  }
619
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jb2RlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNvZGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQXFISDs7R0FFRztBQUNILElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksd0JBQXdCO1FBQUUsT0FBTztJQUNyQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0ZuQixDQUFDO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWF6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVBwRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFFNUIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO0lBRW9CLENBQUM7SUFFaEUsSUFBSSxDQUFDLE9BQTZCO1FBQ2hDLElBQUksQ0FBQyxPQUFP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ZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVDb2RlRWRpdG9yIGZyb20gQGFxdWVyYS9uaWxlLWVsZW1lbnRzXG4gKiBUaGlzIHByb3ZpZGVzIGNvZGUgZWRpdGluZyBjYXBhYmlsaXRpZXMgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciB0YWJsZSBjZWxsc1xuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEF1dG9jb21wbGV0aW9uIGl0ZW0gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVFZGl0b3JDb21wbGV0aW9uIHtcbiAgLyoqIFRoZSBjb21wbGV0aW9uIGxhYmVsIHNob3duIGluIGRyb3Bkb3duICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBUaGUgdmFsdWUgdG8gaW5zZXJ0ICovXG4gIHZhbHVlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZGVzY3JpcHRpb24gKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF1dG9jb21wbGV0ZSBzdHlsZSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0NvbXBsZXRlU3R5bGUge1xuICAvKiogV2lkdGggb2YgdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biAqL1xuICB3aWR0aD86IHN0cmluZztcbiAgLyoqIEVuYWJsZSBtdWx0aWxpbmUgY29udGVudCBpbiBhdXRvY29tcGxldGUgKi9cbiAgbXVsdGlsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUNvZGVFZGl0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaWxlQ29kZUVkaXRvck9wdGlvbnMge1xuICAvLyBMYW5ndWFnZSBhbmQgc3ludGF4XG4gIC8qKiBMYW5ndWFnZSBtb2RlIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nICovXG4gIGxhbmd1YWdlPzogJ2phdmFzY3JpcHQnIHwgJ3NxbCcgfCAnanNvbicgfCAnaHRtbCc7XG4gIC8qKiBEaXNhYmxlIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cbiAgZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZz86IGJvb2xlYW47XG5cbiAgLy8gRWRpdG9yIGFwcGVhcmFuY2VcbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgd2hlbiBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqIFNob3cgbGluZSBudW1iZXJzIChzaW5nbGUtbGluZSBtb2RlKSAqL1xuICBsaW5lTnVtYmVycz86IGJvb2xlYW47XG4gIC8qKiBTaG93IGxpbmUgbnVtYmVycyBpbiBtdWx0aWxpbmUgbW9kZSAqL1xuICBsaW5lTnVtYmVyc011bHRpbGluZT86IGJvb2xlYW47XG4gIC8qKiBBbGxvdyBtdWx0aS1saW5lIGVkaXRpbmcgKi9cbiAgbXVsdGlsaW5lPzogYm9vbGVhbjtcbiAgLyoqIFJlbmRlciB3aXRob3V0IGJvcmRlciAqL1xuICBub2JvcmRlcj86IGJvb2xlYW47XG4gIC8qKiBVc2UgZGVmYXVsdCBmb250IGluc3RlYWQgb2YgaW5oZXJpdCAqL1xuICBkZWZhdWx0Rm9udD86IGJvb2xlYW47XG5cbiAgLy8gRWRpdG9yIGJlaGF2aW9yXG4gIC8qKiBBdXRvIGZvY3VzIG9uIGVkaXQgKi9cbiAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgLyoqIFJlYWQtb25seSBtb2RlICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcbiAgLyoqIERpc2FibGVkIHN0YXRlICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBUYWItdG8tY29tcGxldGUgKi9cbiAgdGFiQ29tcGxldGlvbj86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgc2VhcmNoIGtleW1hcCAqL1xuICBlbmFibGVTZWFyY2g/OiBib29sZWFuO1xuICAvKiogU2hvdyBjb2RlIGZvbGRpbmcgZ3V0dGVycyAqL1xuICBlbmFibGVGb2xkR3V0dGVycz86IGJvb2xlYW47XG4gIC8qKiBJbnRlcm5hbCBzY3JvbGwgY29udGFpbmVyICovXG4gIGhhc1Njcm9sbGVyPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgZXhwYW5kIGNvbnRyb2wgKG5hdGl2ZSBuaWxlLWNvZGUtZWRpdG9yIGV4cGFuZCkgKi9cbiAgZXhwYW5kYWJsZT86IGJvb2xlYW47XG4gIC8qKiBJY29uIGZvciBleHBhbmQgY29udHJvbCAqL1xuICBleHBhbmRJY29uPzogc3RyaW5nO1xuICBcbiAgLy8gRGlhbG9nIGV4cGFuZCBmZWF0dXJlXG4gIC8qKiBTaG93IGV4cGFuZCBidXR0b24gdG8gb3BlbiBmdWxsIGVkaXRvciBkaWFsb2cgKGRlZmF1bHQ6IHRydWUpICovXG4gIHNob3dFeHBhbmRCdXR0b24/OiBib29sZWFuO1xuICAvKiogRGlhbG9nIHRpdGxlIChkZWZhdWx0OiAnRWRpdCBDb2RlJykgKi9cbiAgZGlhbG9nVGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgd2lkdGggKGRlZmF1bHQ6ICc2MDBweCcpICovXG4gIGRpYWxvZ1dpZHRoPzogc3RyaW5nO1xuICAvKiogRGlhbG9nIG1heCBoZWlnaHQgKGRlZmF1bHQ6ICc4MHZoJykgKi9cbiAgZGlhbG9nTWF4SGVpZ2h0Pzogc3RyaW5nO1xuICAvKiogRGlhbG9nIGVkaXRvciBtaW4gaGVpZ2h0IChkZWZhdWx0OiAnMzAwcHgnKSAqL1xuICBkaWFsb2dFZGl0b3JIZWlnaHQ/OiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiB2aXNpYmxlIGxpbmVzIGluIHRoZSBkaWFsb2cgZWRpdG9yIChkZWZhdWx0OiAyMCkgKi9cbiAgZGlhbG9nTWluTGluZXM/OiBudW1iZXI7XG5cbiAgLy8gQXV0b2NvbXBsZXRpb25cbiAgLyoqIElubGluZSBjb21wbGV0aW9uIGRhdGFzZXQgKi9cbiAgY3VzdG9tQXV0b0NvbXBsZXRpb25zPzogUmVjb3JkPHN0cmluZywgQ29kZUVkaXRvckNvbXBsZXRpb25bXT4gfCBDb2RlRWRpdG9yQ29tcGxldGlvbltdO1xuICAvKiogUGF0aHMgdG8gZmV0Y2ggY29tcGxldGlvbiBkYXRhc2V0cyBmcm9tICovXG4gIGN1c3RvbUNvbXBsZXRpb25zUGF0aHM/OiBzdHJpbmdbXTtcbiAgLyoqIEVuYWJsZSB2YXJpYWJsZXMgaW4gc3VnZ2VzdGlvbnMgKi9cbiAgYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbj86IGJvb2xlYW47XG4gIC8qKiBTaG93IGF1dG9jb21wbGV0ZSBhYm92ZSBjdXJzb3IgKi9cbiAgYWJvdmVDdXJzb3I/OiBib29sZWFuO1xuICAvKiogU3R5bGUgY29uZmlnIGZvciBhdXRvY29tcGxldGUgZHJvcGRvd24gKi9cbiAgYXV0b0NvbXBsZXRlU3R5bGU/OiBBdXRvQ29tcGxldGVTdHlsZTtcblxuICAvLyBDaGFuZ2UgaGFuZGxpbmdcbiAgLyoqIERlYm91bmNlIGNoYW5nZSBldmVudHMgKi9cbiAgZGVib3VuY2U/OiBib29sZWFuO1xuICAvKiogRGVib3VuY2UgZGVsYXkgaW4gbXMgKi9cbiAgZGVib3VuY2VUaW1lb3V0PzogbnVtYmVyO1xuXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIEVycm9yIHN0YXRlICovXG4gIGVycm9yPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLy8gQ3VzdG9tIHRoZW1lXG4gIC8qKiBDdXN0b20gdGhlbWUgQ1NTIG9iamVjdCAqL1xuICBjdXN0b21UaGVtZUNTUz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8vIFZhbGlkYXRpb24gYmVoYXZpb3JcbiAgLyoqIFZhbGlkYXRlIGJlZm9yZSBzYXZpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIHZhbGlkYXRlT25TYXZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmplY3QgZ2xvYmFsIHN0eWxlcyBmb3IgbmlsZS1jb2RlLWVkaXRvciBpbiB0YWJsZSBjZWxsc1xuICovXG5sZXQgY29kZUVkaXRvclN0eWxlc0luamVjdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbmplY3RDb2RlRWRpdG9yU3R5bGVzKCk6IHZvaWQge1xuICBpZiAoY29kZUVkaXRvclN0eWxlc0luamVjdGVkKSByZXR1cm47XG4gIGNvZGVFZGl0b3JTdHlsZXNJbmplY3RlZCA9IHRydWU7XG5cbiAgY29uc3Qgc3R5bGVJZCA9ICduaWxlLWNvZGUtZWRpdG9yLWNlbGwtc3R5bGVzJztcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlSWQpKSByZXR1cm47XG5cbiAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZS5pZCA9IHN0eWxlSWQ7XG4gIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgIC8qIE5pbGUgQ29kZSBFZGl0b3IgY2VsbCBzdHlsaW5nICovXG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvcjo6cGFydChjb2RlLWVkaXRvci1iYXNlKSB7XG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAvKiBFbnN1cmUgcHJvcGVyIHNpemluZyB3aXRoaW4gdGFibGUgY2VsbCAqL1xuICAgIC5zdC1uaWxlLWNvZGUtZWRpdG9yIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMjhweDtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAvKiBDb2RlTWlycm9yIGNvbnRlbnQgc2hvdWxkIGluaGVyaXQgZm9udCBzaXplICovXG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciAuY20tY29udGVudCxcbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIC5jbS1saW5lIHtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC8qIENvbnRhaW5lciB3cmFwcGVyIGZvciBlZGl0b3IgKyBleHBhbmQgYnV0dG9uICovXG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtY29kZS1lZGl0b3ItaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIgLnN0LWV4cGFuZC1idXR0b24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgbWluLXdpZHRoOiAyNHB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgY29sb3I6IHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC01MDAsICM2YjcyODApO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci13cmFwcGVyIC5zdC1leHBhbmQtYnV0dG9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC0xMDAsICNmM2Y0ZjYpO1xuICAgICAgY29sb3I6IHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC03MDAsICMzNzQxNTEpO1xuICAgIH1cbiAgICAvKiBEaWFsb2cgY29kZSBlZGl0b3Igc3R5bGluZyAqL1xuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2c6OnBhcnQocGFuZWwpIHtcbiAgICAgIG1heC1oZWlnaHQ6IHZhcigtLW1heC1oZWlnaHQsIDgwdmgpICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2c6OnBhcnQoYm9keSkge1xuICAgICAgb3ZlcmZsb3c6IGF1dG8gIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2cgbmlsZS1jb2RlLWVkaXRvcjo6cGFydChjb2RlLWVkaXRvci1iYXNlKSB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1uaWxlLWNvbG9yLW5ldXRyYWwtMjAwLCAjZTVlN2ViKSAhaW1wb3J0YW50O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgICAgbWluLWhlaWdodDogdmFyKC0tZGlhbG9nLWVkaXRvci1taW4taGVpZ2h0LCAzMDBweCkgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yIC5jbS1lZGl0b3Ige1xuICAgICAgbWluLWhlaWdodDogdmFyKC0tZGlhbG9nLWVkaXRvci1taW4taGVpZ2h0LCAzMDBweCkgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yIC5jbS1jb250ZW50IHtcbiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWRpYWxvZy1lZGl0b3ItbWluLWhlaWdodCwgMzAwcHgpICFpbXBvcnRhbnQ7XG4gICAgfVxuICBgO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlQ29kZUVkaXRvciBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGNvZGUgZWRpdGluZyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlIGNlbGxzXG4gKiBAdGVtcGxhdGUgVCBUaGUgdmFsdWUgdHlwZSAodHlwaWNhbGx5IHN0cmluZylcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbGVDb2RlRWRpdG9yPFQgPSBzdHJpbmc+IGltcGxlbWVudHMgQ2VsbEVkaXRvcjxUPiB7XG4gIHByaXZhdGUgZWRpdG9yPzogYW55O1xuICBwcml2YXRlIHdyYXBwZXI/OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBleHBhbmRCdXR0b24/OiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgcHJpdmF0ZSBkaWFsb2c/OiBhbnk7XG4gIHByaXZhdGUgZGlhbG9nRWRpdG9yPzogYW55O1xuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBBcnJheTx7IGV2ZW50OiBzdHJpbmc7IGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBjb250ZXh0PzogQ2VsbEVkaXRvckNvbnRleHQ8VD47XG4gIHByaXZhdGUgZGlhbG9nT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkb2N1bWVudENsaWNrSGFuZGxlcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHRyYWNrZWRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzogTmlsZUNvZGVFZGl0b3JPcHRpb25zKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05pbGVDb2RlRWRpdG9yIHJlcXVpcmVzIGEgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMudHJhY2tlZFZhbHVlID0gbnVsbDtcblxuICAgIC8vIEluamVjdCBnbG9iYWwgc3R5bGVzIG9uY2VcbiAgICBpbmplY3RDb2RlRWRpdG9yU3R5bGVzKCk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBleHBhbmQgYnV0dG9uIChkZWZhdWx0OiB0cnVlKVxuICAgIGNvbnN0IHNob3dFeHBhbmRCdXR0b24gPSB0aGlzLm9wdGlvbnM/LnNob3dFeHBhbmRCdXR0b24gIT09IGZhbHNlO1xuXG4gICAgaWYgKHNob3dFeHBhbmRCdXR0b24pIHtcbiAgICAgIC8vIENyZWF0ZSB3cmFwcGVyIGZvciBlZGl0b3IgKyBleHBhbmQgYnV0dG9uXG4gICAgICB0aGlzLndyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMud3JhcHBlci5jbGFzc05hbWUgPSAnc3QtY29kZS1lZGl0b3Itd3JhcHBlcic7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZWRpdG9yIGNvbnRhaW5lclxuICAgICAgY29uc3QgZWRpdG9yQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlZGl0b3JDb250YWluZXIuY2xhc3NOYW1lID0gJ3N0LWNvZGUtZWRpdG9yLWlucHV0JztcblxuICAgICAgLy8gQ3JlYXRlIE5pbGVDb2RlRWRpdG9yIGN1c3RvbSBlbGVtZW50XG4gICAgICB0aGlzLmVkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY29kZS1lZGl0b3InKTtcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gU3RyaW5nKGNvbnRleHQudmFsdWUgPz8gJycpO1xuICAgICAgdGhpcy5lZGl0b3IuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY29kZS1lZGl0b3InO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgICB0aGlzLmVkaXRvci5ub2JvcmRlciA9IHRoaXMub3B0aW9ucz8ubm9ib3JkZXIgIT09IGZhbHNlO1xuXG4gICAgICBlZGl0b3JDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3IpO1xuICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKGVkaXRvckNvbnRhaW5lcik7XG5cbiAgICAgIC8vIENyZWF0ZSBleHBhbmQgYnV0dG9uXG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24uY2xhc3NOYW1lID0gJ3N0LWV4cGFuZC1idXR0b24nO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24udGl0bGUgPSAnRXhwYW5kIGVkaXRvcic7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5pbm5lckhUTUwgPSAnPG5pbGUtaWNvbiBuYW1lPVwiZXhwYW5kLTA2XCIgc2l6ZT1cIjE2XCI+PC9uaWxlLWljb24+JztcbiAgICAgIFxuICAgICAgLy8gVXNlIG1vdXNlZG93biB0byBzZXQgZmxhZyBCRUZPUkUgYmx1ciBldmVudCBmaXJlc1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm9wZW5EaWFsb2coKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuZXhwYW5kQnV0dG9uKTtcblxuICAgICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgd3JhcHBlclxuICAgICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgTmlsZUNvZGVFZGl0b3IgY3VzdG9tIGVsZW1lbnQgd2l0aG91dCB3cmFwcGVyXG4gICAgICB0aGlzLmVkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY29kZS1lZGl0b3InKTtcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gU3RyaW5nKGNvbnRleHQudmFsdWUgPz8gJycpO1xuICAgICAgdGhpcy5lZGl0b3IuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY29kZS1lZGl0b3InO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgICB0aGlzLmVkaXRvci5ub2JvcmRlciA9IHRoaXMub3B0aW9ucz8ubm9ib3JkZXIgIT09IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBlZGl0b3JcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3IpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIEF1dG8gZm9jdXMgLSBuZWVkIGEgc2xpZ2h0IGRlbGF5IGZvciBuaWxlLWNvZGUtZWRpdG9yIHRvIGZ1bGx5IGluaXRpYWxpemVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHRoZSBuaWxlLWFmdGVyLWluaXQgZXZlbnQgd2hpY2ggZmlyZXMgd2hlbiBlZGl0b3IgaXMgcmVhZHlcbiAgICAgIGNvbnN0IGluaXRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjazogYWxzbyB0cnkgYWZ0ZXIgYSBkZWxheSBpbiBjYXNlIHRoZSBldmVudCBhbHJlYWR5IGZpcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgY3Vyc29yXG4gICAqL1xuICBwcml2YXRlIGZvY3VzRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ2FsbCB0aGUgY29tcG9uZW50J3MgZm9jdXMgbWV0aG9kXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xuICAgICAgXG4gICAgICAvLyBUcnkgdG8gZGlyZWN0bHkgZm9jdXMgdGhlIENvZGVNaXJyb3IgY29udGVudCBhcmVhXG4gICAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5lZGl0b3Iuc2hhZG93Um9vdDtcbiAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgIGNvbnN0IGNtQ29udGVudCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGNtQ29udGVudCkge1xuICAgICAgICAgIGNtQ29udGVudC5mb2N1cygpO1xuICAgICAgICAgIC8vIERpc3BhdGNoIGEgY2xpY2sgZXZlbnQgdG8gZW5zdXJlIGN1cnNvciBwbGFjZW1lbnRcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2V1cCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBTaWxlbnRseSBoYW5kbGUgYW55IGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBmdWxsIGVkaXRvciBkaWFsb2dcbiAgICovXG4gIHByaXZhdGUgb3BlbkRpYWxvZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaWFsb2dPcGVuKSByZXR1cm47XG4gICAgdGhpcy5kaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTsgLy8gUmVzZXQgZmxhZyBub3cgdGhhdCBkaWFsb2cgaXMgb3BlbmluZ1xuXG4gICAgLy8gQ3JlYXRlIGRpYWxvZyB3aXRoIGNvbmZpZ3VyYWJsZSBkaW1lbnNpb25zXG4gICAgY29uc3QgZGlhbG9nV2lkdGggPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1dpZHRoIHx8ICc2MDBweCc7XG4gICAgY29uc3QgZGlhbG9nTWF4SGVpZ2h0ID0gdGhpcy5vcHRpb25zPy5kaWFsb2dNYXhIZWlnaHQgfHwgJzgwdmgnO1xuICAgIGNvbnN0IGRpYWxvZ0VkaXRvckhlaWdodCA9IHRoaXMub3B0aW9ucz8uZGlhbG9nRWRpdG9ySGVpZ2h0IHx8ICczMDBweCc7XG4gICAgY29uc3QgZGlhbG9nVGl0bGUgPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1RpdGxlIHx8ICdFZGl0IENvZGUnO1xuXG4gICAgdGhpcy5kaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWRpYWxvZycpO1xuICAgIHRoaXMuZGlhbG9nLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci1kaWFsb2cnO1xuICAgIHRoaXMuZGlhbG9nLmxhYmVsID0gZGlhbG9nVGl0bGU7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0td2lkdGgnLCBkaWFsb2dXaWR0aCk7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4LWhlaWdodCcsIGRpYWxvZ01heEhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGVudC5zdHlsZS5wYWRkaW5nID0gJzE2cHgnO1xuICAgIGNvbnRlbnQuc3R5bGUubWF4SGVpZ2h0ID0gYGNhbGMoJHtkaWFsb2dNYXhIZWlnaHR9IC0gODBweClgO1xuICAgIGNvbnRlbnQuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG5cbiAgICAvLyBDcmVhdGUgZnVsbCBlZGl0b3JcbiAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY29kZS1lZGl0b3InKTtcbiAgICBjb25zdCBtaW5MaW5lcyA9IHRoaXMub3B0aW9ucz8uZGlhbG9nTWluTGluZXMgPz8gMjA7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0b3I/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lQ291bnQgPSAoY3VycmVudFZhbHVlLm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFkZGluZ0xpbmVzID0gTWF0aC5tYXgoMCwgbWluTGluZXMgLSBjdXJyZW50TGluZUNvdW50KTtcbiAgICB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZSA9IGN1cnJlbnRWYWx1ZSArICdcXG4nLnJlcGVhdChwYWRkaW5nTGluZXMpO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLm11bHRpbGluZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0cnVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0UHggPSAyMDtcbiAgICBjb25zdCBtaW5IZWlnaHRGcm9tTGluZXMgPSBgJHttaW5MaW5lcyAqIGxpbmVIZWlnaHRQeH1weGA7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3Iuc3R5bGUubWluSGVpZ2h0ID0gYG1heCgke2RpYWxvZ0VkaXRvckhlaWdodH0sICR7bWluSGVpZ2h0RnJvbUxpbmVzfSlgO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLnN0eWxlLm1heEhlaWdodCA9IGBjYWxjKCR7ZGlhbG9nTWF4SGVpZ2h0fSAtIDEyMHB4KWA7XG4gICAgY29udGVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQnLCBgbWF4KCR7ZGlhbG9nRWRpdG9ySGVpZ2h0fSwgJHttaW5IZWlnaHRGcm9tTGluZXN9KWApO1xuXG4gICAgLy8gQXBwbHkgc2FtZSBvcHRpb25zIHRvIGRpYWxvZyBlZGl0b3JcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8udGFiQ29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci50YWJDb21wbGV0aW9uID0gdGhpcy5vcHRpb25zLnRhYkNvbXBsZXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5lbmFibGVGb2xkR3V0dGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVGb2xkR3V0dGVycyA9IHRoaXMub3B0aW9ucy5lbmFibGVGb2xkR3V0dGVycztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21Db21wbGV0aW9uc1BhdGhzKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21Db21wbGV0aW9uc1BhdGhzID0gdGhpcy5vcHRpb25zLmN1c3RvbUNvbXBsZXRpb25zUGF0aHM7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbVRoZW1lQ1NTKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21UaGVtZUNTUyA9IHRoaXMub3B0aW9ucy5jdXN0b21UaGVtZUNTUztcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ0VkaXRvci5leHBhbmRhYmxlID0gZmFsc2U7XG5cbiAgICAvLyBSZWFsLXRpbWUgc3luYzogVXBkYXRlIGNlbGwgZWRpdG9yIHdoZW5ldmVyIGRpYWxvZyBlZGl0b3IgY2hhbmdlc1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkaWFsb2dWYWx1ZSA9IGUuZGV0YWlsPy52YWx1ZSB8fCAnJztcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlID0gZGlhbG9nVmFsdWU7XG4gICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBkaWFsb2dWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9uQ2hhbmdlKGRpYWxvZ1ZhbHVlIGFzIFQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZ0VkaXRvcik7XG4gICAgdGhpcy5kaWFsb2cuYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgICAvLyBIYW5kbGUgZGlhbG9nIGNsb3NlIGV2ZW50cyAoY2xpY2tpbmcgWCBidXR0b24gLSBzdGF5IGluIGVkaXQgbW9kZSlcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCduaWxlLXJlcXVlc3QtY2xvc2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIC8vIENoZWNrIGlmIGNsb3NlIHdhcyB0cmlnZ2VyZWQgYnkgb3ZlcmxheSBjbGljayAoY2xpY2tpbmcgb3V0c2lkZSlcbiAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LnNvdXJjZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIC8vIENsaWNraW5nIG91dHNpZGUgdGhlIGRpYWxvZyAtIHNhdmUgYW5kIGV4aXQgZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2codHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGlja2luZyBYIGJ1dHRvbiAtIHN0YXkgaW4gZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2coZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEVzY2FwZSBrZXkgaW4gZGlhbG9nIC0gc3RheSBpbiBlZGl0IG1vZGVcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCB0byBib2R5IGFuZCBzaG93XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZyk7XG4gICAgXG4gICAgLy8gT3BlbiBkaWFsb2cgYWZ0ZXIgYSB0aWNrIHRvIGVuc3VyZSBpdCdzIGluIHRoZSBET01cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgLy8gRm9jdXMgdGhlIGRpYWxvZyBlZGl0b3JcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dFZGl0b3I/LmZvY3VzKCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGRpYWxvZyBhbmQgb3B0aW9uYWxseSBzYXZlL2V4aXQgZWRpdCBtb2RlXG4gICAqL1xuICBwcml2YXRlIGNsb3NlRGlhbG9nKHNhdmVBbmRFeGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlhbG9nT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgZmxhZyBpbW1lZGlhdGVseSBzbyBkb2N1bWVudCBjbGljayBoYW5kbGVyIHdvcmtzXG4gICAgdGhpcy5kaWFsb2dPcGVuID0gZmFsc2U7XG5cbiAgICAvLyBDbG9zZSBhbmQgcmVtb3ZlIGRpYWxvZ1xuICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbiA9IGZhbHNlO1xuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c7XG4gICAgICBjb25zdCBkaWFsb2dFZGl0b3JSZWYgPSB0aGlzLmRpYWxvZ0VkaXRvcjtcbiAgICAgIHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBhZnRlciBhbmltYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWY/LnJlbW92ZSgpO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIFxuICAgICAgaWYgKHNhdmVBbmRFeGl0ICYmIHRoaXMuY29udGV4dCkge1xuICAgICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgICB0aGlzLmNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgY2VsbCBlZGl0b3IgdG8gc3RheSBpbiBlZGl0IG1vZGVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVDb2RlRWRpdG9yIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5lZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZykge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZyA9IHRoaXMub3B0aW9ucy5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nO1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBhcHBlYXJhbmNlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzTXVsdGlsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzTXVsdGlsaW5lID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzTXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm11bHRpbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5tdWx0aWxpbmUgPSB0aGlzLm9wdGlvbnMubXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRlZmF1bHRGb250ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlZmF1bHRGb250ID0gdGhpcy5vcHRpb25zLmRlZmF1bHRGb250O1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBiZWhhdmlvclxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnJlYWRvbmx5ID0gdGhpcy5vcHRpb25zLnJlYWRvbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnRhYkNvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IudGFiQ29tcGxldGlvbiA9IHRoaXMub3B0aW9ucy50YWJDb21wbGV0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZUZvbGRHdXR0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVuYWJsZUZvbGRHdXR0ZXJzID0gdGhpcy5vcHRpb25zLmVuYWJsZUZvbGRHdXR0ZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmhhc1Njcm9sbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmhhc1Njcm9sbGVyID0gdGhpcy5vcHRpb25zLmhhc1Njcm9sbGVyO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZGFibGUgLSBkZWZhdWx0IHRvIGZhbHNlIGZvciBjZWxsIGVkaXRpbmdcbiAgICB0aGlzLmVkaXRvci5leHBhbmRhYmxlID0gdGhpcy5vcHRpb25zPy5leHBhbmRhYmxlID8/IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kSWNvbikge1xuICAgICAgdGhpcy5lZGl0b3IuZXhwYW5kSWNvbiA9IHRoaXMub3B0aW9ucy5leHBhbmRJY29uO1xuICAgIH1cblxuICAgIC8vIEF1dG9jb21wbGV0aW9uXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmVkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbUNvbXBsZXRpb25zUGF0aHMpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmN1c3RvbUNvbXBsZXRpb25zUGF0aHMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29tcGxldGlvbnNQYXRocztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmFsbG93VmFyaWFibGVJbkN1c3RvbVN1Z2dlc3Rpb24gPSB0aGlzLm9wdGlvbnMuYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hYm92ZUN1cnNvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5hYm92ZUN1cnNvciA9IHRoaXMub3B0aW9ucy5hYm92ZUN1cnNvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvQ29tcGxldGVTdHlsZSkge1xuICAgICAgdGhpcy5lZGl0b3IuYXV0b0NvbXBsZXRlU3R5bGUgPSB0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlU3R5bGU7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGhhbmRsaW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVib3VuY2UgPSB0aGlzLm9wdGlvbnMuZGVib3VuY2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2VUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlYm91bmNlVGltZW91dCA9IHRoaXMub3B0aW9ucy5kZWJvdW5jZVRpbWVvdXQ7XG4gICAgfVxuXG4gICAgLy8gVmlzdWFsIHN0YXRlc1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5lZGl0b3IuZXJyb3JNZXNzYWdlID0gdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBDdXN0b20gdGhlbWVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21UaGVtZUNTUykge1xuICAgICAgdGhpcy5lZGl0b3IuY3VzdG9tVGhlbWVDU1MgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVGhlbWVDU1M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbGwgZXZlbnQgbGlzdGVuZXJzIHdpdGggcHJvcGVyIGNsZWFudXAgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbGlkYXRlT25TYXZlID0gdGhpcy5vcHRpb25zPy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleUV2ZW50ID0gZSBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgXG4gICAgICAvLyBGb3Igc2luZ2xlLWxpbmUgbW9kZSwgRW50ZXIgc2F2ZXNcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5tdWx0aWxpbmUgJiYga2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVzY2FwZSBjYW5jZWxzXG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuaWxlLWJsdXIgZXZlbnQgZm9yIHNhdmluZyBvbiBibHVyXG4gICAgY29uc3QgYmx1ckhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAvLyBEb24ndCBzYXZlIGlmIGRpYWxvZyBpcyBvcGVuXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRG9uJ3Qgc2F2ZSBpZiBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkIChtb3VzZWRvd24gc2V0cyB0aGlzIGZsYWcpXG4gICAgICBpZiAodGhpcy5leHBhbmRCdXR0b25DbGlja2VkKSB7XG4gICAgICAgIC8vIFJlc2V0IGZsYWcgLSB0aGUgY2xpY2sgaGFuZGxlciB3aWxsIG9wZW4gdGhlIGRpYWxvZ1xuICAgICAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1ibHVyJywgYmx1ckhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1ibHVyJywgaGFuZGxlcjogYmx1ckhhbmRsZXIgfSk7XG5cbiAgICAvLyBEb2N1bWVudC1sZXZlbCBtb3VzZWRvd24gaGFuZGxlciB0byBkZXRlY3QgY2xpY2tzIG91dHNpZGUgdGhlIGVkaXRvclxuICAgIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gRG9uJ3QgcHJvY2VzcyBpZiBkaWFsb2cgaXMgb3BlbiBvciBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuIHx8IHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBjb21wb3NlZFBhdGggdG8gaGFuZGxlIFNoYWRvdyBET00gYm91bmRhcmllc1xuICAgICAgY29uc3QgcGF0aCA9IGUuY29tcG9zZWRQYXRoKCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGFueSBlbGVtZW50IGluIHRoZSBwYXRoIGlzIG91ciB3cmFwcGVyLCBlZGl0b3IsIG9yIGV4cGFuZCBidXR0b25cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLndyYXBwZXIgfHwgZWxlbWVudCA9PT0gdGhpcy5lZGl0b3IgfHwgZWxlbWVudCA9PT0gdGhpcy5leHBhbmRCdXR0b24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBjaGVjayBpZiBpdCdzIHRoZSBjb250YWluZXIgKHRoZSBjZWxsKVxuICAgICAgICBpZiAoZWxlbWVudCA9PT0gY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xpY2sgaXMgb3V0c2lkZSAtIHNhdmUgYW5kIGV4aXRcbiAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdpdGggYSBzbWFsbCBkZWxheSB0byBhdm9pZCBjYXB0dXJpbmcgdGhlIGluaXRpYWwgY2xpY2sgdGhhdCBvcGVuZWQgdGhlIGVkaXRvclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciEsIHRydWUpO1xuICAgIH0sIDUwKTtcblxuICAgIC8vIFJlYWwtdGltZSB2YWx1ZSB1cGRhdGVzIHVzaW5nIG5pbGUtY2hhbmdlXG4gICAgY29uc3QgY2hhbmdlSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjdXN0b21FdmVudC5kZXRhaWw/LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy50cmFja2VkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUgYXMgVCk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBjaGFuZ2VIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGV4cGFuZCBldmVudCBpZiBleHBhbmRhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBhIGN1c3RvbSBldmVudCB0aGF0IHRoZSBwYXJlbnQgY2FuIGxpc3RlbiB0b1xuICAgICAgICBjb25zdCBleHBhbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc3QtY29kZS1lZGl0b3ItZXhwYW5kJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwYXRjaEV2ZW50KGV4cGFuZEV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWV4cGFuZCcsIGV4cGFuZEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWV4cGFuZCcsIGhhbmRsZXI6IGV4cGFuZEhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm47XG5cbiAgICAvLyBDb2RlIGVkaXRvciBkb2Vzbid0IGhhdmUgYnVpbHQtaW4gdmFsaWRhdGlvbiBsaWtlIGlucHV0XG4gICAgLy8gQnV0IHdlIGNhbiBjaGVjayBmb3IgZXJyb3Igc3RhdGVcbiAgICBpZiAodmFsaWRhdGUgJiYgdGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBjbGljayBoYW5kbGVyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkaWFsb2cgaWYgb3BlblxuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gJiYgdGhpcy5kaWFsb2cpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaWFsb2cgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG4gICAgICB0aGlzLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgd3JhcHBlciBpZiBleGlzdHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXhwYW5kIGJ1dHRvbiByZWZlcmVuY2VcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvcj8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJycgYXMgdW5rbm93biBhcyBUO1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMudHJhY2tlZFZhbHVlICE9PSBudWxsID8gdGhpcy50cmFja2VkVmFsdWUgOiB0aGlzLmVkaXRvci52YWx1ZSA/PyAnJykgYXMgc3RyaW5nO1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXG4rJC8sICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIHByb2dyYW1tYXRpY2FsbHlcbiAgICovXG4gIHNldFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci52YWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQ29kZU1pcnJvciBpbnN0YW5jZSAoaWYgbmVlZGVkIGZvciBhZHZhbmNlZCB1c2FnZSlcbiAgICovXG4gIGdldEVkaXRvckluc3RhbmNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xuICB9XG59XG4iXX0=
781
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jb2RlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNvZGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQW1ISDs7R0FFRztBQUNILElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksd0JBQXdCO1FBQUUsT0FBTztJQUNyQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEduQixDQUFDO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWlCekIsWUFBNkIsT0FBK0I7UUFBL0IsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFYcEQsbUJBQWMsR0FBcUQsRUFBRSxDQUFDO1FBRXRFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRTVCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxzQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxtRUFBbUU7UUFDOUYscUJBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsbURBQW1EO1FBQzdFLHdCQUFtQixHQUFXLEVBQUUsQ0FBQyxDQUFDLHlDQUF5QztRQUMzRSx1QkFBa0IsR0FBVyxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0M7SUFFVixDQUFDO0lBRWhFLElBQUksQ0FBQyxPQUE2QjtRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDNUQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRTlCLDRCQUE0QjtRQUM1QixzQkFBc0IsRUFBRSxDQUFDO1FBRXpCLHdEQUF3RDtRQUN4RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEtBQUssS0FBSyxDQUFDO1FBRWxFLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyx3QkFBd0IsQ0FBQztZQUVsRCw4QkFBOEI7WUFDOUIsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxlQUFlLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1lBRW5ELHVDQUF1QztZQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxvQ0FBb0MsQ0FBQztZQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztZQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsS0FBSyxLQUFLLENBQUM7WUFDeEQsdUZBQXVGO1lBQ3ZGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxLQUFLLEtBQUssQ0FBQztZQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDL0Isb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUVoQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUxQyx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsb0RBQW9ELENBQUM7WUFFbkYsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDaEQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU1QyxxQ0FBcUM7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3QzthQUFNO1lBQ0wsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLG9DQUFvQyxDQUFDO1lBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxLQUFLLEtBQUssQ0FBQztZQUN4RCx1RkFBdUY7WUFDdkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEtBQUssS0FBSyxDQUFDO1lBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUMvQixvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBRWhDLG9DQUFvQztZQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQix5QkFBeUI7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxDLDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxLQUFLLEtBQUssRUFBRTtZQUNyQyx3RUFBd0U7WUFDeEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO2dCQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUU3RCxtRUFBbUU7WUFDbkUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFekIsSUFBSTtZQUNGLG9DQUFvQztZQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRXBCLG9EQUFvRDtZQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUMxQyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBZ0IsQ0FBQztnQkFDekUsSUFBSSxTQUFTLEVBQUU7b0JBQ2IsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNsQixvREFBb0Q7b0JBQ3BELFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDeEUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN2RTthQUNGO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLDZCQUE2QjtTQUM5QjtJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGtCQUFrQjtRQUN4Qiw0REFBNEQ7UUFDNUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUU1QixJQUFJO1lBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDMUMsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQVEsQ0FBQztnQkFDL0QsSUFBSSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQkFDMUIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNsRDthQUNGO1NBQ0Y7UUFBQyxNQUFNO1lBQ04sZ0NBQWdDO1NBQ2pDO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLENBQUMsd0NBQXdDO1FBRTFFLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFckQsNkNBQTZDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJLE9BQU8sQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsSUFBSSxNQUFNLENBQUM7UUFDaEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixJQUFJLE9BQU8sQ0FBQztRQUN2RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxXQUFXLENBQUM7UUFFN0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLHVCQUF1QixDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFL0QsNEVBQTRFO1FBQzVFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLGNBQWMsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUM5QyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLGVBQWUsVUFBVSxDQUFDLENBQUMsNEJBQTRCO1FBQzdGLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsZUFBZSxVQUFVLENBQUM7UUFFbkUsMkRBQTJEO1FBQzNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLCtCQUErQjtRQUU5RCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO1FBRXZELHNDQUFzQztRQUN0QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO1lBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUMxRDtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1NBQzlEO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7U0FDNUQ7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEtBQUssU0FBUyxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztTQUN0RTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRTtZQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUM7U0FDOUU7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1NBQ2hGO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRTtZQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztTQUNoRTtRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUVyQyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUVuRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFjLEVBQUUsRUFBRTtZQUNuRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwQyxpREFBaUQ7UUFDakQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQztRQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxrREFBa0QsQ0FBQztRQUM1RSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsZ0NBQWdDO1FBQy9ELE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLHNDQUFzQyxDQUFDO1FBRXRFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDNUIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEMsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRTtZQUM5RCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBZ0IsRUFBRSxFQUFFO1lBQzNELElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0JBQ3RCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUM1QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsMEJBQTBCO1FBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV2QyxxREFBcUQ7UUFDckQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLDBCQUEwQjtnQkFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUM3QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDVDtRQUNILENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQjtRQUMxQix1REFBdUQ7UUFDdkQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNwRDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBRXhELG9EQUFvRDtRQUNwRCxJQUFJO1lBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDaEQsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQVEsQ0FBQztnQkFDL0QsSUFBSSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQkFDMUIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDeEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDbEM7YUFDRjtTQUNGO1FBQUMsTUFBTTtZQUNOLGdDQUFnQztTQUNqQztRQUVELDZCQUE2QjtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN0QyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFN0IsMERBQTBEO1FBQzFELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUUxQywrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JDLElBQUk7Z0JBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7Z0JBQ2hELElBQUksVUFBVSxFQUFFO29CQUNkLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFRLENBQUM7b0JBQy9ELElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7d0JBQzFCLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO3FCQUN6RDtpQkFDRjthQUNGO1lBQUMsTUFBTTtnQkFDTixlQUFlO2FBQ2hCO1lBRUQsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hCLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7YUFDN0M7U0FDRjtRQUVELDBCQUEwQjtRQUMxQixXQUFXLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV0RCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUU5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztTQUNqQztRQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVOLCtCQUErQjtRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBMkIsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsZUFBZTtRQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQiwrQ0FBK0M7UUFDL0MsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUU3QixtREFBbUQ7UUFDbkQsMEVBQTBFO1FBRTFFLGVBQWU7UUFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsK0NBQStDO1FBQy9DLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1lBRTlCLGtDQUFrQztZQUNsQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN0QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV6QixzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUM5QztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRTtZQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUM7U0FDaEY7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUNwRDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1NBQ3BEO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7U0FDdEU7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUNoRDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1NBQ3BEO1FBRUQsa0JBQWtCO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1NBQzlDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDOUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN4RDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1NBQ3REO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixLQUFLLFNBQVMsRUFBRTtZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7U0FDaEU7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUNwRDtRQUVELGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRTtZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUNsRDtRQUVELGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1NBQ3hFO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztTQUMxRTtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSwrQkFBK0IsS0FBSyxTQUFTLEVBQUU7WUFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDO1NBQzVGO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDcEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1NBQ2hFO1FBRUQsa0JBQWtCO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1NBQzlDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7U0FDNUQ7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7U0FDeEM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1NBQ3REO1FBRUQsZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxPQUE2QjtRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXpCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxLQUFLLEtBQUssQ0FBQztRQUU5RCx5QkFBeUI7UUFDekIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFRLEVBQUUsRUFBRTtZQUNsQyxNQUFNLFFBQVEsR0FBRyxDQUFrQixDQUFDO1lBRXBDLG9DQUFvQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7Z0JBQ3hELFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQzthQUN6QztZQUVELGlCQUFpQjtZQUNqQixJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUM3QixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLHlDQUF5QztRQUN6QyxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDdkIsK0JBQStCO1lBQy9CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsT0FBTzthQUNSO1lBRUQscUVBQXFFO1lBQ3JFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUM1QixzREFBc0Q7Z0JBQ3RELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2pDLE9BQU87YUFDUjtZQUVELDBCQUEwQjtZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFdkUsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFO1lBQzVDLCtEQUErRDtZQUMvRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUMvQyxPQUFPO2FBQ1I7WUFFRCxtREFBbUQ7WUFDbkQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTlCLDRFQUE0RTtZQUM1RSxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksRUFBRTtnQkFDMUIsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDeEYsT0FBTztpQkFDUjtnQkFDRCw4Q0FBOEM7Z0JBQzlDLElBQUksT0FBTyxLQUFLLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBQ2pDLE9BQU87aUJBQ1I7YUFDRjtZQUVELG1DQUFtQztZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7UUFFRixxRkFBcUY7UUFDckYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLDRDQUE0QztRQUM1QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLENBQWdCLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBRWpELHNFQUFzRTtZQUN0RSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsT0FBTzthQUNSO1lBRUQsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBd0IsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUUzRSxvQ0FBb0M7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRTtZQUM1QixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7Z0JBQ3pCLG9EQUFvRDtnQkFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsdUJBQXVCLEVBQUU7b0JBQzNELE9BQU8sRUFBRSxJQUFJO29CQUNiLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7aUJBQzFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDNUU7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTLENBQUMsT0FBNkIsRUFBRSxRQUFpQjtRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXpCLDBEQUEwRDtRQUMxRCxtQ0FBbUM7UUFDbkMsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUU7WUFDbkMsT0FBTztTQUNSO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU87UUFDTCxnQ0FBZ0M7UUFDaEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztTQUN2QztRQUVELHVCQUF1QjtRQUN2QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztTQUN6QjtRQUVELDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztTQUN6QjtRQUVELDJCQUEyQjtRQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztTQUMxQjtRQUVELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFrQixDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxLQUFRO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNvZGVFZGl0b3IgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFRoaXMgcHJvdmlkZXMgY29kZSBlZGl0aW5nIGNhcGFiaWxpdGllcyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlIGNlbGxzXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQXV0b2NvbXBsZXRpb24gaXRlbSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUVkaXRvckNvbXBsZXRpb24ge1xuICAvKiogVGhlIGNvbXBsZXRpb24gbGFiZWwgc2hvd24gaW4gZHJvcGRvd24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFRoZSB2YWx1ZSB0byBpbnNlcnQgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBkZXNjcmlwdGlvbiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXV0b2NvbXBsZXRlIHN0eWxlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvQ29tcGxldGVTdHlsZSB7XG4gIC8qKiBXaWR0aCBvZiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duICovXG4gIHdpZHRoPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIG11bHRpbGluZSBjb250ZW50IGluIGF1dG9jb21wbGV0ZSAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgaW50ZXJmYWNlIGZvciBOaWxlQ29kZUVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVDb2RlRWRpdG9yT3B0aW9ucyB7XG4gIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgLyoqIExhbmd1YWdlIG1vZGUgZm9yIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cbiAgbGFuZ3VhZ2U/OiAnamF2YXNjcmlwdCcgfCAnc3FsJyB8ICdqc29uJyB8ICdodG1sJztcbiAgLyoqIERpc2FibGUgc3ludGF4IGhpZ2hsaWdodGluZyAqL1xuICBkaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nPzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYXBwZWFyYW5jZVxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogU2hvdyBsaW5lIG51bWJlcnMgKHNpbmdsZS1saW5lIG1vZGUpICovXG4gIGxpbmVOdW1iZXJzPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgbGluZSBudW1iZXJzIGluIG11bHRpbGluZSBtb2RlICovXG4gIGxpbmVOdW1iZXJzTXVsdGlsaW5lPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IG11bHRpLWxpbmUgZWRpdGluZyAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xuICAvKiogUmVuZGVyIHdpdGhvdXQgYm9yZGVyICovXG4gIG5vYm9yZGVyPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBkZWZhdWx0IGZvbnQgaW5zdGVhZCBvZiBpbmhlcml0ICovXG4gIGRlZmF1bHRGb250PzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYmVoYXZpb3JcbiAgLyoqIEF1dG8gZm9jdXMgb24gZWRpdCAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAvKiogUmVhZC1vbmx5IG1vZGUgKi9cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZWQgc3RhdGUgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIFRhYi10by1jb21wbGV0ZSAqL1xuICB0YWJDb21wbGV0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2gga2V5bWFwICovXG4gIGVuYWJsZVNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBTaG93IGNvZGUgZm9sZGluZyBndXR0ZXJzICovXG4gIGVuYWJsZUZvbGRHdXR0ZXJzPzogYm9vbGVhbjtcbiAgLyoqIEludGVybmFsIHNjcm9sbCBjb250YWluZXIgKi9cbiAgaGFzU2Nyb2xsZXI/OiBib29sZWFuO1xuICAvKiogU2hvdyBleHBhbmQgY29udHJvbCAobmF0aXZlIG5pbGUtY29kZS1lZGl0b3IgZXhwYW5kKSAqL1xuICBleHBhbmRhYmxlPzogYm9vbGVhbjtcbiAgLyoqIEljb24gZm9yIGV4cGFuZCBjb250cm9sICovXG4gIGV4cGFuZEljb24/OiBzdHJpbmc7XG4gIFxuICAvLyBEaWFsb2cgZXhwYW5kIGZlYXR1cmVcbiAgLyoqIFNob3cgZXhwYW5kIGJ1dHRvbiB0byBvcGVuIGZ1bGwgZWRpdG9yIGRpYWxvZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc2hvd0V4cGFuZEJ1dHRvbj86IGJvb2xlYW47XG4gIC8qKiBEaWFsb2cgdGl0bGUgKGRlZmF1bHQ6ICdFZGl0IENvZGUnKSAqL1xuICBkaWFsb2dUaXRsZT86IHN0cmluZztcbiAgLyoqIERpYWxvZyB3aWR0aCAoZGVmYXVsdDogJzYwMHB4JykgKi9cbiAgZGlhbG9nV2lkdGg/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgbWF4IGhlaWdodCAoZGVmYXVsdDogJzgwdmgnKSAqL1xuICBkaWFsb2dNYXhIZWlnaHQ/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgZWRpdG9yIG1pbiBoZWlnaHQgKGRlZmF1bHQ6ICczMDBweCcpICovXG4gIGRpYWxvZ0VkaXRvckhlaWdodD86IHN0cmluZztcblxuICAvLyBBdXRvY29tcGxldGlvblxuICAvKiogSW5saW5lIGNvbXBsZXRpb24gZGF0YXNldCAqL1xuICBjdXN0b21BdXRvQ29tcGxldGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDb2RlRWRpdG9yQ29tcGxldGlvbltdPiB8IENvZGVFZGl0b3JDb21wbGV0aW9uW107XG4gIC8qKiBQYXRocyB0byBmZXRjaCBjb21wbGV0aW9uIGRhdGFzZXRzIGZyb20gKi9cbiAgY3VzdG9tQ29tcGxldGlvbnNQYXRocz86IHN0cmluZ1tdO1xuICAvKiogRW5hYmxlIHZhcmlhYmxlcyBpbiBzdWdnZXN0aW9ucyAqL1xuICBhbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgYXV0b2NvbXBsZXRlIGFib3ZlIGN1cnNvciAqL1xuICBhYm92ZUN1cnNvcj86IGJvb2xlYW47XG4gIC8qKiBTdHlsZSBjb25maWcgZm9yIGF1dG9jb21wbGV0ZSBkcm9wZG93biAqL1xuICBhdXRvQ29tcGxldGVTdHlsZT86IEF1dG9Db21wbGV0ZVN0eWxlO1xuXG4gIC8vIENoYW5nZSBoYW5kbGluZ1xuICAvKiogRGVib3VuY2UgY2hhbmdlIGV2ZW50cyAqL1xuICBkZWJvdW5jZT86IGJvb2xlYW47XG4gIC8qKiBEZWJvdW5jZSBkZWxheSBpbiBtcyAqL1xuICBkZWJvdW5jZVRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogRXJyb3Igc3RhdGUgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAvLyBDdXN0b20gdGhlbWVcbiAgLyoqIEN1c3RvbSB0aGVtZSBDU1Mgb2JqZWN0ICovXG4gIGN1c3RvbVRoZW1lQ1NTPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLy8gVmFsaWRhdGlvbiBiZWhhdmlvclxuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluamVjdCBnbG9iYWwgc3R5bGVzIGZvciBuaWxlLWNvZGUtZWRpdG9yIGluIHRhYmxlIGNlbGxzXG4gKi9cbmxldCBjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTogdm9pZCB7XG4gIGlmIChjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQpIHJldHVybjtcbiAgY29kZUVkaXRvclN0eWxlc0luamVjdGVkID0gdHJ1ZTtcblxuICBjb25zdCBzdHlsZUlkID0gJ25pbGUtY29kZS1lZGl0b3ItY2VsbC1zdHlsZXMnO1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHJldHVybjtcblxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gc3R5bGVJZDtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLyogTmlsZSBDb2RlIEVkaXRvciBjZWxsIHN0eWxpbmcgLSBjb25zdHJhaW5lZCB0byBjZWxsIGhlaWdodCAqL1xuICAgIG5pbGUtY29kZS1lZGl0b3Iuc3QtY2VsbC1lZGl0b3Ige1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvcjo6cGFydChjb2RlLWVkaXRvci1iYXNlKSB7XG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHggIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAvKiBFbnN1cmUgcHJvcGVyIHNpemluZyB3aXRoaW4gdGFibGUgY2VsbCAqL1xuICAgIC5zdC1uaWxlLWNvZGUtZWRpdG9yIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbWF4LWhlaWdodDogMzJweDtcbiAgICAgIG1pbi1oZWlnaHQ6IDI4cHg7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuICAgIC8qIENvZGVNaXJyb3IgY29udGVudCBzaG91bGQgaW5oZXJpdCBmb250IHNpemUgYW5kIGJlIGNvbnN0cmFpbmVkICovXG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciAuY20tZWRpdG9yIHtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHggIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICB9XG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciAuY20tc2Nyb2xsZXIge1xuICAgICAgbWF4LWhlaWdodDogMzJweCAhaW1wb3J0YW50O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIC5jbS1jb250ZW50LFxuICAgIG5pbGUtY29kZS1lZGl0b3Iuc3QtY2VsbC1lZGl0b3IgLmNtLWxpbmUge1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLyogQ29udGFpbmVyIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b24gKi9cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbWF4LWhlaWdodDogMzJweDtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtY29kZS1lZGl0b3ItaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtZXhwYW5kLWJ1dHRvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICBtaW4td2lkdGg6IDI0cHg7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTUwMCwgIzZiNzI4MCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIgLnN0LWV4cGFuZC1idXR0b246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTEwMCwgI2YzZjRmNik7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTcwMCwgIzM3NDE1MSk7XG4gICAgfVxuICAgIC8qIERpYWxvZyBjb2RlIGVkaXRvciBzdHlsaW5nIC0gZml4ZWQgaGVhZGVyL2Zvb3Rlciwgc2Nyb2xsYWJsZSBjb250ZW50ICovXG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChwYW5lbCkge1xuICAgICAgbWF4LWhlaWdodDogdmFyKC0tbWF4LWhlaWdodCwgODB2aCkgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChoZWFkZXIpIHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2c6OnBhcnQoYm9keSkge1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgICAgZmxleDogMSAhaW1wb3J0YW50O1xuICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbiAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yOjpwYXJ0KGNvZGUtZWRpdG9yLWJhc2UpIHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC0yMDAsICNlNWU3ZWIpICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlZGl0b3IgdGhhdCB1c2VzIE5pbGVDb2RlRWRpdG9yIGNvbXBvbmVudFxuICogUHJvdmlkZXMgY29kZSBlZGl0aW5nIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgdGFibGUgY2VsbHNcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB2YWx1ZSB0eXBlICh0eXBpY2FsbHkgc3RyaW5nKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZUNvZGVFZGl0b3I8VCA9IHN0cmluZz4gaW1wbGVtZW50cyBDZWxsRWRpdG9yPFQ+IHtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgd3JhcHBlcj86IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIGV4cGFuZEJ1dHRvbj86IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIGRpYWxvZz86IGFueTtcbiAgcHJpdmF0ZSBkaWFsb2dFZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuICBwcml2YXRlIGNvbnRleHQ/OiBDZWxsRWRpdG9yQ29udGV4dDxUPjtcbiAgcHJpdmF0ZSBkaWFsb2dPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRvY3VtZW50Q2xpY2tIYW5kbGVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgdHJhY2tlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzeW5jaW5nRnJvbURpYWxvZyA9IGZhbHNlOyAvLyBGbGFnIHRvIHByZXZlbnQgaW5saW5lIGVkaXRvciBmcm9tIG92ZXJ3cml0aW5nIG11bHRpbGluZSBjb250ZW50XG4gIHByaXZhdGUgdXNlckVkaXRlZElubGluZSA9IGZhbHNlOyAvLyBGbGFnIHRvIHRyYWNrIGlmIHVzZXIgaGFzIHR5cGVkIGluIGlubGluZSBlZGl0b3JcbiAgcHJpdmF0ZSBkaWFsb2dPcmlnaW5hbFZhbHVlOiBzdHJpbmcgPSAnJzsgLy8gU3RvcmUgb3JpZ2luYWwgdmFsdWUgd2hlbiBkaWFsb2cgb3BlbnNcbiAgcHJpdmF0ZSBkaWFsb2dDdXJyZW50VmFsdWU6IHN0cmluZyA9ICcnOyAvLyBUcmFjayBjdXJyZW50IHZhbHVlIGluIGRpYWxvZ1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE5pbGVDb2RlRWRpdG9yT3B0aW9ucykge31cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlQ29kZUVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAvLyBJbml0aWFsaXplIHRyYWNrZWQgdmFsdWUgZnJvbSBjb250ZXh0XG4gICAgdGhpcy50cmFja2VkVmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgdGhpcy5zeW5jaW5nRnJvbURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMudXNlckVkaXRlZElubGluZSA9IGZhbHNlO1xuXG4gICAgLy8gSW5qZWN0IGdsb2JhbCBzdHlsZXMgb25jZVxuICAgIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTtcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGV4cGFuZCBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAgY29uc3Qgc2hvd0V4cGFuZEJ1dHRvbiA9IHRoaXMub3B0aW9ucz8uc2hvd0V4cGFuZEJ1dHRvbiAhPT0gZmFsc2U7XG5cbiAgICBpZiAoc2hvd0V4cGFuZEJ1dHRvbikge1xuICAgICAgLy8gQ3JlYXRlIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b25cbiAgICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci13cmFwcGVyJztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBlZGl0b3IgY29udGFpbmVyXG4gICAgICBjb25zdCBlZGl0b3JDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVkaXRvckNvbnRhaW5lci5jbGFzc05hbWUgPSAnc3QtY29kZS1lZGl0b3ItaW5wdXQnO1xuXG4gICAgICAvLyBDcmVhdGUgTmlsZUNvZGVFZGl0b3IgY3VzdG9tIGVsZW1lbnRcbiAgICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgICB0aGlzLmVkaXRvci5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jb2RlLWVkaXRvcic7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICAgIHRoaXMuZWRpdG9yLm5vYm9yZGVyID0gdGhpcy5vcHRpb25zPy5ub2JvcmRlciAhPT0gZmFsc2U7XG4gICAgICAvLyBFbmFibGUgbXVsdGlsaW5lIGJ5IGRlZmF1bHQgZm9yIGlubGluZSBlZGl0b3IgdG8gc3VwcG9ydCBwYXN0ZSBhbmQgbXVsdGlsaW5lIGNvbnRlbnRcbiAgICAgIHRoaXMuZWRpdG9yLm11bHRpbGluZSA9IHRoaXMub3B0aW9ucz8ubXVsdGlsaW5lICE9PSBmYWxzZTtcbiAgICAgIHRoaXMuZWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGxpbmUgbnVtYmVycyBmb3IgaW5saW5lIGVkaXRvclxuICAgICAgdGhpcy5lZGl0b3IubGluZU51bWJlcnMgPSBmYWxzZTtcblxuICAgICAgZWRpdG9yQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWRpdG9yKTtcbiAgICAgIHRoaXMud3JhcHBlci5hcHBlbmRDaGlsZChlZGl0b3JDb250YWluZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgZXhwYW5kIGJ1dHRvblxuICAgICAgdGhpcy5leHBhbmRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmNsYXNzTmFtZSA9ICdzdC1leHBhbmQtYnV0dG9uJztcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLnRpdGxlID0gJ0V4cGFuZCBlZGl0b3InO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24uaW5uZXJIVE1MID0gJzxuaWxlLWljb24gbmFtZT1cImV4cGFuZC0wNlwiIHNpemU9XCIxNlwiPjwvbmlsZS1pY29uPic7XG4gICAgICBcbiAgICAgIC8vIFVzZSBtb3VzZWRvd24gdG8gc2V0IGZsYWcgQkVGT1JFIGJsdXIgZXZlbnQgZmlyZXNcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5vcGVuRGlhbG9nKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmV4cGFuZEJ1dHRvbik7XG5cbiAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHdyYXBwZXJcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy53cmFwcGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIE5pbGVDb2RlRWRpdG9yIGN1c3RvbSBlbGVtZW50IHdpdGhvdXQgd3JhcHBlclxuICAgICAgdGhpcy5lZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWNvZGUtZWRpdG9yJyk7XG4gICAgICB0aGlzLmVkaXRvci52YWx1ZSA9IFN0cmluZyhjb250ZXh0LnZhbHVlID8/ICcnKTtcbiAgICAgIHRoaXMuZWRpdG9yLmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1uaWxlLWNvZGUtZWRpdG9yJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgICAgdGhpcy5lZGl0b3Iubm9ib3JkZXIgPSB0aGlzLm9wdGlvbnM/Lm5vYm9yZGVyICE9PSBmYWxzZTtcbiAgICAgIC8vIEVuYWJsZSBtdWx0aWxpbmUgYnkgZGVmYXVsdCBmb3IgaW5saW5lIGVkaXRvciB0byBzdXBwb3J0IHBhc3RlIGFuZCBtdWx0aWxpbmUgY29udGVudFxuICAgICAgdGhpcy5lZGl0b3IubXVsdGlsaW5lID0gdGhpcy5vcHRpb25zPy5tdWx0aWxpbmUgIT09IGZhbHNlO1xuICAgICAgdGhpcy5lZGl0b3IuaGFzU2Nyb2xsZXIgPSB0cnVlO1xuICAgICAgLy8gTm8gbGluZSBudW1iZXJzIGZvciBpbmxpbmUgZWRpdG9yXG4gICAgICB0aGlzLmVkaXRvci5saW5lTnVtYmVycyA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBlZGl0b3JcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3IpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIEF1dG8gZm9jdXMgLSBuZWVkIGEgc2xpZ2h0IGRlbGF5IGZvciBuaWxlLWNvZGUtZWRpdG9yIHRvIGZ1bGx5IGluaXRpYWxpemVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHRoZSBuaWxlLWFmdGVyLWluaXQgZXZlbnQgd2hpY2ggZmlyZXMgd2hlbiBlZGl0b3IgaXMgcmVhZHlcbiAgICAgIGNvbnN0IGluaXRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjazogYWxzbyB0cnkgYWZ0ZXIgYSBkZWxheSBpbiBjYXNlIHRoZSBldmVudCBhbHJlYWR5IGZpcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgY3Vyc29yXG4gICAqL1xuICBwcml2YXRlIGZvY3VzRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ2FsbCB0aGUgY29tcG9uZW50J3MgZm9jdXMgbWV0aG9kXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xuICAgICAgXG4gICAgICAvLyBUcnkgdG8gZGlyZWN0bHkgZm9jdXMgdGhlIENvZGVNaXJyb3IgY29udGVudCBhcmVhXG4gICAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5lZGl0b3Iuc2hhZG93Um9vdDtcbiAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgIGNvbnN0IGNtQ29udGVudCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGNtQ29udGVudCkge1xuICAgICAgICAgIGNtQ29udGVudC5mb2N1cygpO1xuICAgICAgICAgIC8vIERpc3BhdGNoIGEgY2xpY2sgZXZlbnQgdG8gZW5zdXJlIGN1cnNvciBwbGFjZW1lbnRcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2V1cCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBTaWxlbnRseSBoYW5kbGUgYW55IGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBsaXZlIHZhbHVlIGRpcmVjdGx5IGZyb20gQ29kZU1pcnJvcidzIGludGVybmFsIHN0YXRlLFxuICAgKiBieXBhc3NpbmcgZGVib3VuY2VkIG5pbGUtY2hhbmdlIGV2ZW50cyBhbmQgdGhlIHBvc3NpYmx5LXN0YWxlIC52YWx1ZSBwcm9wZXJ0eS5cbiAgICogXG4gICAqIFByaW9yaXR5IG9yZGVyOlxuICAgKiAxLiB0cmFja2VkVmFsdWUgLSBhbHdheXMgdXAgdG8gZGF0ZSBmcm9tIGNoYW5nZSBldmVudHNcbiAgICogMi4gQ29kZU1pcnJvciBpbnRlcm5hbCBzdGF0ZSAtIGZvciByZWFsLXRpbWUgcmVhZGluZ1xuICAgKiAzLiBlZGl0b3IudmFsdWUgcHJvcGVydHkgLSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRMaXZlRWRpdG9yVmFsdWUoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgdHJhY2tlZCB2YWx1ZSBpZiBhdmFpbGFibGUgKHVwZGF0ZWQgYnkgY2hhbmdlIGV2ZW50cylcbiAgICBpZiAodGhpcy50cmFja2VkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2hhZG93Um9vdCA9IHRoaXMuZWRpdG9yLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoc2hhZG93Um9vdCkge1xuICAgICAgICBjb25zdCBjbUVkaXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWVkaXRvcicpIGFzIGFueTtcbiAgICAgICAgaWYgKGNtRWRpdG9yPy5jbVZpZXc/LnZpZXcpIHtcbiAgICAgICAgICByZXR1cm4gY21FZGl0b3IuY21WaWV3LnZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBvdGhlciBtZXRob2RzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGZ1bGwgZWRpdG9yIGRpYWxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcbiAgICB0aGlzLmRpYWxvZ09wZW4gPSB0cnVlO1xuICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlOyAvLyBSZXNldCBmbGFnIG5vdyB0aGF0IGRpYWxvZyBpcyBvcGVuaW5nXG5cbiAgICAvLyBTdG9yZSBvcmlnaW5hbCB2YWx1ZSBmb3IgY2FuY2VsIGZ1bmN0aW9uYWxpdHlcbiAgICB0aGlzLmRpYWxvZ09yaWdpbmFsVmFsdWUgPSB0aGlzLmdldExpdmVFZGl0b3JWYWx1ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGRpYWxvZyB3aXRoIGNvbmZpZ3VyYWJsZSBkaW1lbnNpb25zXG4gICAgY29uc3QgZGlhbG9nV2lkdGggPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1dpZHRoIHx8ICc2MDBweCc7XG4gICAgY29uc3QgZGlhbG9nTWF4SGVpZ2h0ID0gdGhpcy5vcHRpb25zPy5kaWFsb2dNYXhIZWlnaHQgfHwgJzgwdmgnO1xuICAgIGNvbnN0IGRpYWxvZ0VkaXRvckhlaWdodCA9IHRoaXMub3B0aW9ucz8uZGlhbG9nRWRpdG9ySGVpZ2h0IHx8ICczMDBweCc7XG4gICAgY29uc3QgZGlhbG9nVGl0bGUgPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1RpdGxlIHx8ICdFZGl0IENvZGUnO1xuXG4gICAgdGhpcy5kaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWRpYWxvZycpO1xuICAgIHRoaXMuZGlhbG9nLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci1kaWFsb2cnO1xuICAgIHRoaXMuZGlhbG9nLmxhYmVsID0gZGlhbG9nVGl0bGU7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0td2lkdGgnLCBkaWFsb2dXaWR0aCk7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4LWhlaWdodCcsIGRpYWxvZ01heEhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGNvbnRlbnQgd3JhcHBlciAtIGZsZXggY29sdW1uIHRvIGhhbmRsZSBmaXhlZCBoZWFkZXIvZm9vdGVyXG4gICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGNvbnRlbnRXcmFwcGVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS5oZWlnaHQgPSBgY2FsYygke2RpYWxvZ01heEhlaWdodH0gLSA2MHB4KWA7IC8vIEFjY291bnQgZm9yIGRpYWxvZyBoZWFkZXJcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS5tYXhIZWlnaHQgPSBgY2FsYygke2RpYWxvZ01heEhlaWdodH0gLSA2MHB4KWA7XG5cbiAgICAvLyBDcmVhdGUgZWRpdG9yIGNvbnRlbnQgYXJlYSAtIHRoaXMgaXMgdGhlIHNjcm9sbGFibGUgcGFydFxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LnN0eWxlLnBhZGRpbmcgPSAnMTZweCc7XG4gICAgY29udGVudC5zdHlsZS5wYWRkaW5nQm90dG9tID0gJzhweCc7XG4gICAgY29udGVudC5zdHlsZS5mbGV4ID0gJzEnO1xuICAgIGNvbnRlbnQuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG4gICAgY29udGVudC5zdHlsZS5taW5IZWlnaHQgPSAnMCc7IC8vIEltcG9ydGFudCBmb3IgZmxleCBzaHJpbmtpbmdcblxuICAgIC8vIENyZWF0ZSBmdWxsIGVkaXRvclxuICAgIHRoaXMuZGlhbG9nRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLnZhbHVlID0gdGhpcy5kaWFsb2dPcmlnaW5hbFZhbHVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLm11bHRpbGluZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0cnVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICB0aGlzLmRpYWxvZ0VkaXRvci5zdHlsZS5taW5IZWlnaHQgPSBkaWFsb2dFZGl0b3JIZWlnaHQ7XG5cbiAgICAvLyBBcHBseSBzYW1lIG9wdGlvbnMgdG8gZGlhbG9nIGVkaXRvclxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5sYW5ndWFnZSA9IHRoaXMub3B0aW9ucy5sYW5ndWFnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy50YWJDb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLnRhYkNvbXBsZXRpb24gPSB0aGlzLm9wdGlvbnMudGFiQ29tcGxldGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlU2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmVuYWJsZVNlYXJjaCA9IHRoaXMub3B0aW9ucy5lbmFibGVTZWFyY2g7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZUZvbGRHdXR0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmVuYWJsZUZvbGRHdXR0ZXJzID0gdGhpcy5vcHRpb25zLmVuYWJsZUZvbGRHdXR0ZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21BdXRvQ29tcGxldGlvbnMpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmN1c3RvbUF1dG9Db21wbGV0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21BdXRvQ29tcGxldGlvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbUNvbXBsZXRpb25zUGF0aHMpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmN1c3RvbUNvbXBsZXRpb25zUGF0aHMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29tcGxldGlvbnNQYXRocztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tVGhlbWVDU1MpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmN1c3RvbVRoZW1lQ1NTID0gdGhpcy5vcHRpb25zLmN1c3RvbVRoZW1lQ1NTO1xuICAgIH1cblxuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmV4cGFuZGFibGUgPSBmYWxzZTtcblxuICAgIC8vIEluaXRpYWxpemUgZGlhbG9nIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9IHRoaXMuZGlhbG9nT3JpZ2luYWxWYWx1ZTtcblxuICAgIC8vIFRyYWNrIGNoYW5nZXMgaW4gZGlhbG9nIGVkaXRvclxuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9IGUuZGV0YWlsPy52YWx1ZSA/PyAnJztcbiAgICB9KTtcblxuICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5kaWFsb2dFZGl0b3IpO1xuICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGZvb3RlciB3aXRoIE9rIGJ1dHRvbiAtIGZpeGVkIGF0IGJvdHRvbVxuICAgIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZvb3Rlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGZvb3Rlci5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdmbGV4LWVuZCc7XG4gICAgZm9vdGVyLnN0eWxlLnBhZGRpbmcgPSAnMTJweCAxNnB4JztcbiAgICBmb290ZXIuc3R5bGUuYm9yZGVyVG9wID0gJzFweCBzb2xpZCB2YXIoLS1uaWxlLWNvbG9yLW5ldXRyYWwtMjAwLCAjZTVlN2ViKSc7XG4gICAgZm9vdGVyLnN0eWxlLmdhcCA9ICc4cHgnO1xuICAgIGZvb3Rlci5zdHlsZS5mbGV4U2hyaW5rID0gJzAnOyAvLyBQcmV2ZW50IGZvb3RlciBmcm9tIHNocmlua2luZ1xuICAgIGZvb3Rlci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTAsICNmZmZmZmYpJztcblxuICAgIGNvbnN0IG9rQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1idXR0b24nKTtcbiAgICBva0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ3ZhcmlhbnQnLCAncHJpbWFyeScpO1xuICAgIG9rQnV0dG9uLnRleHRDb250ZW50ID0gJ09rJztcbiAgICBva0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlEaWFsb2dDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICBmb290ZXIuYXBwZW5kQ2hpbGQob2tCdXR0b24pO1xuICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGZvb3Rlcik7XG5cbiAgICB0aGlzLmRpYWxvZy5hcHBlbmRDaGlsZChjb250ZW50V3JhcHBlcik7XG5cbiAgICAvLyBIYW5kbGUgZGlhbG9nIGNsb3NlIGV2ZW50cyAoY2xpY2tpbmcgWCBidXR0b24gLSBjYW5jZWwgY2hhbmdlcylcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCduaWxlLXJlcXVlc3QtY2xvc2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFggYnV0dG9uIG9yIG92ZXJsYXkgY2xpY2sgLSBjYW5jZWwgY2hhbmdlc1xuICAgICAgdGhpcy5jYW5jZWxEaWFsb2dDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgRXNjYXBlIGtleSBpbiBkaWFsb2cgLSBjYW5jZWwgY2hhbmdlc1xuICAgIHRoaXMuZGlhbG9nLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsRGlhbG9nQ2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwZW5kIHRvIGJvZHkgYW5kIHNob3dcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZGlhbG9nKTtcbiAgICBcbiAgICAvLyBPcGVuIGRpYWxvZyBhZnRlciBhIHRpY2sgdG8gZW5zdXJlIGl0J3MgaW4gdGhlIERPTVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlhbG9nKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSB0cnVlO1xuICAgICAgICAvLyBGb2N1cyB0aGUgZGlhbG9nIGVkaXRvclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ0VkaXRvcj8uZm9jdXMoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgZGlhbG9nIGVkaXRvclxuICAgKi9cbiAgcHJpdmF0ZSBnZXREaWFsb2dFZGl0b3JWYWx1ZSgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB0cmFja2VkIHZhbHVlIGZyb20gY2hhbmdlIGV2ZW50cyAobW9zdCByZWxpYWJsZSlcbiAgICBpZiAodGhpcy5kaWFsb2dDdXJyZW50VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZS5yZXBsYWNlKC9cXG4rJC8sICcnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmRpYWxvZ0VkaXRvcikgcmV0dXJuIHRoaXMuZGlhbG9nT3JpZ2luYWxWYWx1ZTtcbiAgICBcbiAgICAvLyBUcnkgdG8gZ2V0IHZhbHVlIGZyb20gQ29kZU1pcnJvcidzIGludGVybmFsIHN0YXRlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmRpYWxvZ0VkaXRvci5zaGFkb3dSb290O1xuICAgICAgaWYgKHNoYWRvd1Jvb3QpIHtcbiAgICAgICAgY29uc3QgY21FZGl0b3IgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jbS1lZGl0b3InKSBhcyBhbnk7XG4gICAgICAgIGlmIChjbUVkaXRvcj8uY21WaWV3Py52aWV3KSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjbUVkaXRvci5jbVZpZXcudmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuKyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBvdGhlciBtZXRob2RzXG4gICAgfVxuICAgIFxuICAgIC8vIEZhbGxiYWNrIHRvIHZhbHVlIHByb3BlcnR5XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZTtcbiAgICByZXR1cm4gKHZhbHVlID8/ICcnKS5yZXBsYWNlKC9cXG4rJC8sICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBjaGFuZ2VzIGZyb20gZGlhbG9nIGFuZCBjbG9zZSBpdFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseURpYWxvZ0NoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgZnJvbSBkaWFsb2cgZWRpdG9yIC0gdHJ5IG11bHRpcGxlIHNvdXJjZXNcbiAgICBsZXQgZGlhbG9nVmFsdWUgPSB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZTtcbiAgICBcbiAgICAvLyBJZiBubyB0cmFja2VkIHZhbHVlLCB0cnkgcmVhZGluZyBkaXJlY3RseSBmcm9tIGRpYWxvZyBlZGl0b3JcbiAgICBpZiAoIWRpYWxvZ1ZhbHVlICYmIHRoaXMuZGlhbG9nRWRpdG9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5kaWFsb2dFZGl0b3Iuc2hhZG93Um9vdDtcbiAgICAgICAgaWYgKHNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICBjb25zdCBjbUVkaXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWVkaXRvcicpIGFzIGFueTtcbiAgICAgICAgICBpZiAoY21FZGl0b3I/LmNtVmlldz8udmlldykge1xuICAgICAgICAgICAgZGlhbG9nVmFsdWUgPSBjbUVkaXRvci5jbVZpZXcudmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmFsbGJhY2sgdG8gdmFsdWUgcHJvcGVydHlcbiAgICAgIGlmICghZGlhbG9nVmFsdWUpIHtcbiAgICAgICAgZGlhbG9nVmFsdWUgPSB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU3RyaXAgdHJhaWxpbmcgbmV3bGluZXNcbiAgICBkaWFsb2dWYWx1ZSA9IChkaWFsb2dWYWx1ZSB8fCAnJykucmVwbGFjZSgvXFxuKyQvLCAnJyk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHRyYWNrZWQgdmFsdWUgYW5kIGlubGluZSBlZGl0b3JcbiAgICB0aGlzLnRyYWNrZWRWYWx1ZSA9IGRpYWxvZ1ZhbHVlO1xuICAgIHRoaXMudXNlckVkaXRlZElubGluZSA9IGZhbHNlO1xuICAgIFxuICAgIHRoaXMuc3luY2luZ0Zyb21EaWFsb2cgPSB0cnVlO1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBkaWFsb2dWYWx1ZTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNpbmdGcm9tRGlhbG9nID0gZmFsc2U7XG4gICAgfSwgMCk7XG4gICAgXG4gICAgLy8gTm90aWZ5IGNvbnRleHQgb2YgdGhlIGNoYW5nZVxuICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkNoYW5nZShkaWFsb2dWYWx1ZSBhcyB1bmtub3duIGFzIFQpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIGRpYWxvZ1xuICAgIHRoaXMuY2xvc2VEaWFsb2dVSSgpO1xuICAgIFxuICAgIC8vIFJlZm9jdXMgdGhlIGNlbGwgZWRpdG9yIHRvIHN0YXkgaW4gZWRpdCBtb2RlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBkaWFsb2cgY2hhbmdlcyBhbmQgcmV2ZXJ0IHRvIG9yaWdpbmFsIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNhbmNlbERpYWxvZ0NoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcblxuICAgIC8vIFJldmVydCB0byBvcmlnaW5hbCB2YWx1ZSAoZG9uJ3QgY2hhbmdlIGFueXRoaW5nKVxuICAgIC8vIHRyYWNrZWRWYWx1ZSBhbmQgaW5saW5lIGVkaXRvciByZW1haW4gYXMgdGhleSB3ZXJlIGJlZm9yZSBkaWFsb2cgb3BlbmVkXG5cbiAgICAvLyBDbG9zZSBkaWFsb2dcbiAgICB0aGlzLmNsb3NlRGlhbG9nVUkoKTtcbiAgICBcbiAgICAvLyBSZWZvY3VzIHRoZSBjZWxsIGVkaXRvciB0byBzdGF5IGluIGVkaXQgbW9kZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhbmQgcmVtb3ZlIHRoZSBkaWFsb2cgVUlcbiAgICovXG4gIHByaXZhdGUgY2xvc2VEaWFsb2dVSSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuZGlhbG9nKSB7XG4gICAgICB0aGlzLmRpYWxvZy5vcGVuID0gZmFsc2U7XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZztcbiAgICAgIHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBhZnRlciBhbmltYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWY/LnJlbW92ZSgpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgTmlsZUNvZGVFZGl0b3IgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgLy8gTGFuZ3VhZ2UgYW5kIHN5bnRheFxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmVkaXRvci5sYW5ndWFnZSA9IHRoaXMub3B0aW9ucy5sYW5ndWFnZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nKSB7XG4gICAgICB0aGlzLmVkaXRvci5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nID0gdGhpcy5vcHRpb25zLmRpc2FibGVTeW50YXhIaWdobGlnaHRpbmc7XG4gICAgfVxuXG4gICAgLy8gRWRpdG9yIGFwcGVhcmFuY2VcbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5lZGl0b3IucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubGluZU51bWJlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IubGluZU51bWJlcnMgPSB0aGlzLm9wdGlvbnMubGluZU51bWJlcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubGluZU51bWJlcnNNdWx0aWxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0aGlzLm9wdGlvbnMubGluZU51bWJlcnNNdWx0aWxpbmU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubXVsdGlsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLm11bHRpbGluZSA9IHRoaXMub3B0aW9ucy5tdWx0aWxpbmU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVmYXVsdEZvbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVmYXVsdEZvbnQgPSB0aGlzLm9wdGlvbnMuZGVmYXVsdEZvbnQ7XG4gICAgfVxuXG4gICAgLy8gRWRpdG9yIGJlaGF2aW9yXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucmVhZG9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IucmVhZG9ubHkgPSB0aGlzLm9wdGlvbnMucmVhZG9ubHk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzYWJsZWQgPSB0aGlzLm9wdGlvbnMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8udGFiQ29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci50YWJDb21wbGV0aW9uID0gdGhpcy5vcHRpb25zLnRhYkNvbXBsZXRpb247XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlU2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVuYWJsZVNlYXJjaCA9IHRoaXMub3B0aW9ucy5lbmFibGVTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlRm9sZEd1dHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZW5hYmxlRm9sZEd1dHRlcnMgPSB0aGlzLm9wdGlvbnMuZW5hYmxlRm9sZEd1dHRlcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uaGFzU2Nyb2xsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuaGFzU2Nyb2xsZXIgPSB0aGlzLm9wdGlvbnMuaGFzU2Nyb2xsZXI7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kYWJsZSAtIGRlZmF1bHQgdG8gZmFsc2UgZm9yIGNlbGwgZWRpdGluZ1xuICAgIHRoaXMuZWRpdG9yLmV4cGFuZGFibGUgPSB0aGlzLm9wdGlvbnM/LmV4cGFuZGFibGUgPz8gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5leHBhbmRJY29uKSB7XG4gICAgICB0aGlzLmVkaXRvci5leHBhbmRJY29uID0gdGhpcy5vcHRpb25zLmV4cGFuZEljb247XG4gICAgfVxuXG4gICAgLy8gQXV0b2NvbXBsZXRpb25cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21BdXRvQ29tcGxldGlvbnMpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmN1c3RvbUF1dG9Db21wbGV0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21BdXRvQ29tcGxldGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQ29tcGxldGlvbnNQYXRocykge1xuICAgICAgdGhpcy5lZGl0b3IuY3VzdG9tQ29tcGxldGlvbnNQYXRocyA9IHRoaXMub3B0aW9ucy5jdXN0b21Db21wbGV0aW9uc1BhdGhzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFsbG93VmFyaWFibGVJbkN1c3RvbVN1Z2dlc3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbiA9IHRoaXMub3B0aW9ucy5hbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFib3ZlQ3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmFib3ZlQ3Vyc29yID0gdGhpcy5vcHRpb25zLmFib3ZlQ3Vyc29yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Db21wbGV0ZVN0eWxlKSB7XG4gICAgICB0aGlzLmVkaXRvci5hdXRvQ29tcGxldGVTdHlsZSA9IHRoaXMub3B0aW9ucy5hdXRvQ29tcGxldGVTdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgaGFuZGxpbmdcbiAgICBpZiAodGhpcy5vcHRpb25zPy5kZWJvdW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZWJvdW5jZSA9IHRoaXMub3B0aW9ucy5kZWJvdW5jZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5kZWJvdW5jZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVib3VuY2VUaW1lb3V0ID0gdGhpcy5vcHRpb25zLmRlYm91bmNlVGltZW91dDtcbiAgICB9XG5cbiAgICAvLyBWaXN1YWwgc3RhdGVzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZXJyb3IgPSB0aGlzLm9wdGlvbnMuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aGlzLmVkaXRvci5lcnJvck1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSB0aGVtZVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbVRoZW1lQ1NTKSB7XG4gICAgICB0aGlzLmVkaXRvci5jdXN0b21UaGVtZUNTUyA9IHRoaXMub3B0aW9ucy5jdXN0b21UaGVtZUNTUztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGFsbCBldmVudCBsaXN0ZW5lcnMgd2l0aCBwcm9wZXIgY2xlYW51cCB0cmFja2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsaWRhdGVPblNhdmUgPSB0aGlzLm9wdGlvbnM/LnZhbGlkYXRlT25TYXZlICE9PSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBcbiAgICAgIC8vIEZvciBzaW5nbGUtbGluZSBtb2RlLCBFbnRlciBzYXZlc1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnM/Lm11bHRpbGluZSAmJiBrZXlFdmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRXNjYXBlIGNhbmNlbHNcbiAgICAgIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAna2V5ZG93bicsIGhhbmRsZXI6IGtleWRvd25IYW5kbGVyIH0pO1xuXG4gICAgLy8gVXNlIG5pbGUtYmx1ciBldmVudCBmb3Igc2F2aW5nIG9uIGJsdXJcbiAgICBjb25zdCBibHVySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIC8vIERvbid0IHNhdmUgaWYgZGlhbG9nIGlzIG9wZW5cbiAgICAgIGlmICh0aGlzLmRpYWxvZ09wZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEb24ndCBzYXZlIGlmIGV4cGFuZCBidXR0b24gd2FzIGNsaWNrZWQgKG1vdXNlZG93biBzZXRzIHRoaXMgZmxhZylcbiAgICAgIGlmICh0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgICAgLy8gUmVzZXQgZmxhZyAtIHRoZSBjbGljayBoYW5kbGVyIHdpbGwgb3BlbiB0aGUgZGlhbG9nXG4gICAgICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNhdmUgYW5kIGV4aXQgZWRpdCBtb2RlXG4gICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWJsdXInLCBibHVySGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWJsdXInLCBoYW5kbGVyOiBibHVySGFuZGxlciB9KTtcblxuICAgIC8vIERvY3VtZW50LWxldmVsIG1vdXNlZG93biBoYW5kbGVyIHRvIGRldGVjdCBjbGlja3Mgb3V0c2lkZSB0aGUgZWRpdG9yXG4gICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBEb24ndCBwcm9jZXNzIGlmIGRpYWxvZyBpcyBvcGVuIG9yIGV4cGFuZCBidXR0b24gd2FzIGNsaWNrZWRcbiAgICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gfHwgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGNvbXBvc2VkUGF0aCB0byBoYW5kbGUgU2hhZG93IERPTSBib3VuZGFyaWVzXG4gICAgICBjb25zdCBwYXRoID0gZS5jb21wb3NlZFBhdGgoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgYW55IGVsZW1lbnQgaW4gdGhlIHBhdGggaXMgb3VyIHdyYXBwZXIsIGVkaXRvciwgb3IgZXhwYW5kIGJ1dHRvblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhdGgpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMud3JhcHBlciB8fCBlbGVtZW50ID09PSB0aGlzLmVkaXRvciB8fCBlbGVtZW50ID09PSB0aGlzLmV4cGFuZEJ1dHRvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGNoZWNrIGlmIGl0J3MgdGhlIGNvbnRhaW5lciAodGhlIGNlbGwpXG4gICAgICAgIGlmIChlbGVtZW50ID09PSBjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGljayBpcyBvdXRzaWRlIC0gc2F2ZSBhbmQgZXhpdFxuICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgd2l0aCBhIHNtYWxsIGRlbGF5IHRvIGF2b2lkIGNhcHR1cmluZyB0aGUgaW5pdGlhbCBjbGljayB0aGF0IG9wZW5lZCB0aGUgZWRpdG9yXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRvY3VtZW50Q2xpY2tIYW5kbGVyISwgdHJ1ZSk7XG4gICAgfSwgNTApO1xuXG4gICAgLy8gUmVhbC10aW1lIHZhbHVlIHVwZGF0ZXMgdXNpbmcgbmlsZS1jaGFuZ2VcbiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGN1c3RvbUV2ZW50LmRldGFpbD8udmFsdWUgPz8gJyc7XG4gICAgICBcbiAgICAgIC8vIERvbid0IHByb2Nlc3MgaWYgd2UncmUgc3luY2luZyBmcm9tIGRpYWxvZyAocHJldmVudHMgZmVlZGJhY2sgbG9vcClcbiAgICAgIGlmICh0aGlzLnN5bmNpbmdGcm9tRGlhbG9nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHRyYWNrZWQgdmFsdWVcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICBjb250ZXh0Lm9uQ2hhbmdlKG5ld1ZhbHVlIGFzIHVua25vd24gYXMgVCk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBjaGFuZ2VIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGV4cGFuZCBldmVudCBpZiBleHBhbmRhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBhIGN1c3RvbSBldmVudCB0aGF0IHRoZSBwYXJlbnQgY2FuIGxpc3RlbiB0b1xuICAgICAgICBjb25zdCBleHBhbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc3QtY29kZS1lZGl0b3ItZXhwYW5kJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwYXRjaEV2ZW50KGV4cGFuZEV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWV4cGFuZCcsIGV4cGFuZEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWV4cGFuZCcsIGhhbmRsZXI6IGV4cGFuZEhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm47XG5cbiAgICAvLyBDb2RlIGVkaXRvciBkb2Vzbid0IGhhdmUgYnVpbHQtaW4gdmFsaWRhdGlvbiBsaWtlIGlucHV0XG4gICAgLy8gQnV0IHdlIGNhbiBjaGVjayBmb3IgZXJyb3Igc3RhdGVcbiAgICBpZiAodmFsaWRhdGUgJiYgdGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBjbGljayBoYW5kbGVyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkaWFsb2cgaWYgb3BlblxuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gJiYgdGhpcy5kaWFsb2cpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaWFsb2cgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG4gICAgICB0aGlzLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgd3JhcHBlciBpZiBleGlzdHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXhwYW5kIGJ1dHRvbiByZWZlcmVuY2VcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gICAgdGhpcy5zeW5jaW5nRnJvbURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2tlZFZhbHVlID0gbnVsbDtcbiAgICB0aGlzLnVzZXJFZGl0ZWRJbmxpbmUgPSBmYWxzZTtcbiAgICB0aGlzLmRpYWxvZ09yaWdpbmFsVmFsdWUgPSAnJztcbiAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9ICcnO1xuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogVCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuICcnIGFzIHVua25vd24gYXMgVDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TGl2ZUVkaXRvclZhbHVlKCk7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcbiskLywgJycpIGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsdWUgcHJvZ3JhbW1hdGljYWxseVxuICAgKi9cbiAgc2V0VmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBDb2RlTWlycm9yIGluc3RhbmNlIChpZiBuZWVkZWQgZm9yIGFkdmFuY2VkIHVzYWdlKVxuICAgKi9cbiAgZ2V0RWRpdG9ySW5zdGFuY2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3I7XG4gIH1cbn1cbiJdfQ==