@cqa-lib/cqa-ui 1.1.492 → 1.1.494
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +372 -98
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +31 -3
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +7 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +7 -3
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +7 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +7 -3
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +8 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +441 -110
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +435 -112
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/mixed-variable-input/mixed-variable-input.component.d.ts +30 -3
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +7 -0
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +3 -1
- package/lib/test-case-details/loop-step/loop-step.component.d.ts +3 -1
- package/lib/test-case-details/normal-step/normal-step.component.d.ts +3 -1
- package/lib/test-case-details/step-group/step-group.component.d.ts +3 -1
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +3 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/common";
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const VAR_PATH = '[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*|\\[\\d+\\])*';
|
|
5
|
+
const VAR_NAME_REGEX = new RegExp('^' + VAR_PATH + '$');
|
|
6
|
+
const VAR_TOKEN_REGEX = new RegExp('\\$\\{(' + VAR_PATH + ')\\}', 'g');
|
|
7
|
+
const VAR_PATH_TAIL_REGEX = new RegExp('(' + VAR_PATH + ')$');
|
|
8
|
+
const INVALID_VAR_MESSAGE = 'Invalid variable name.';
|
|
9
|
+
const BLUR_HIDE_DELAY_MS = 150;
|
|
6
10
|
export class MixedVariableInputComponent {
|
|
7
11
|
constructor(cdr, hostRef) {
|
|
8
12
|
this.cdr = cdr;
|
|
@@ -11,41 +15,56 @@ export class MixedVariableInputComponent {
|
|
|
11
15
|
this.placeholder = 'Text Input';
|
|
12
16
|
this.disabled = false;
|
|
13
17
|
this.valueChange = new EventEmitter();
|
|
18
|
+
this.validityChange = new EventEmitter();
|
|
14
19
|
this.showSuggestion = false;
|
|
15
20
|
this.pendingWord = '';
|
|
21
|
+
this.canAddAsVariable = false;
|
|
22
|
+
this.errorMessage = null;
|
|
23
|
+
this.selectionRange = null;
|
|
24
|
+
this.selectionMode = false;
|
|
16
25
|
this.lastEmitted = '';
|
|
26
|
+
this.lastValid = null;
|
|
17
27
|
}
|
|
18
|
-
|
|
19
|
-
|
|
28
|
+
// ---- Lifecycle ------------------------------------------------------------
|
|
29
|
+
ngOnChanges(changes) {
|
|
30
|
+
if (!changes['value'] || !this.editorRef)
|
|
20
31
|
return;
|
|
21
|
-
const
|
|
22
|
-
if (this.
|
|
32
|
+
const incoming = changes['value'].currentValue ?? '';
|
|
33
|
+
if (incoming === this.lastEmitted)
|
|
23
34
|
return;
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
ngOnChanges(changes) {
|
|
27
|
-
if (changes['value'] && this.editorRef) {
|
|
28
|
-
const incoming = changes['value'].currentValue ?? '';
|
|
29
|
-
if (incoming !== this.lastEmitted) {
|
|
30
|
-
this.render(incoming);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
35
|
+
this.render(incoming);
|
|
36
|
+
this.validate(incoming);
|
|
33
37
|
}
|
|
34
38
|
ngAfterViewInit() {
|
|
35
|
-
this.
|
|
39
|
+
const initial = this.value || '';
|
|
40
|
+
this.render(initial);
|
|
41
|
+
this.validate(initial);
|
|
36
42
|
}
|
|
43
|
+
// ---- Editor event handlers -----------------------------------------------
|
|
37
44
|
onInput() {
|
|
38
|
-
|
|
39
|
-
this.
|
|
40
|
-
this.valueChange.emit(str);
|
|
45
|
+
this.flattenStructure();
|
|
46
|
+
this.sanitizeChips();
|
|
41
47
|
this.autoChipify();
|
|
48
|
+
this.emitValue();
|
|
49
|
+
this.refreshSuggestion();
|
|
50
|
+
}
|
|
51
|
+
onEditorFocus() {
|
|
42
52
|
this.refreshSuggestion();
|
|
43
53
|
}
|
|
54
|
+
onEditorBlur() {
|
|
55
|
+
// Delay so clicks on suggestion buttons register before we hide them.
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
this.autoChipify(true);
|
|
58
|
+
this.hideSuggestion();
|
|
59
|
+
}, BLUR_HIDE_DELAY_MS);
|
|
60
|
+
}
|
|
44
61
|
onKeyDown(event) {
|
|
45
62
|
if (event.key === 'Enter') {
|
|
46
63
|
event.preventDefault();
|
|
47
64
|
return;
|
|
48
65
|
}
|
|
66
|
+
if (event.key === 'Tab')
|
|
67
|
+
return;
|
|
49
68
|
if (event.key === 'Escape') {
|
|
50
69
|
if (this.showSuggestion) {
|
|
51
70
|
event.preventDefault();
|
|
@@ -62,36 +81,119 @@ export class MixedVariableInputComponent {
|
|
|
62
81
|
}
|
|
63
82
|
}
|
|
64
83
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
84
|
+
onPaste(event) {
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
const text = event.clipboardData?.getData('text/plain') ?? '';
|
|
87
|
+
if (!text)
|
|
88
|
+
return;
|
|
89
|
+
this.insertPlainTextAtCaret(text);
|
|
90
|
+
this.onInput();
|
|
91
|
+
}
|
|
92
|
+
onDrop(event) {
|
|
93
|
+
event.preventDefault();
|
|
94
|
+
const text = event.dataTransfer?.getData('text/plain') ?? '';
|
|
95
|
+
if (text) {
|
|
96
|
+
this.editorRef.nativeElement.focus();
|
|
97
|
+
this.insertPlainTextAtCaret(text);
|
|
98
|
+
}
|
|
99
|
+
this.onInput();
|
|
100
|
+
}
|
|
101
|
+
onDragStart(event) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
}
|
|
104
|
+
onDocumentMouseDown(event) {
|
|
105
|
+
if (!this.showSuggestion)
|
|
106
|
+
return;
|
|
107
|
+
if (this.hostRef.nativeElement.contains(event.target))
|
|
108
|
+
return;
|
|
109
|
+
this.hideSuggestion();
|
|
110
|
+
}
|
|
111
|
+
onDocumentSelectionChange() {
|
|
112
|
+
if (document.activeElement !== this.editorRef?.nativeElement)
|
|
113
|
+
return;
|
|
114
|
+
this.refreshSuggestion();
|
|
68
115
|
}
|
|
116
|
+
// ---- Suggestion actions ---------------------------------------------------
|
|
69
117
|
addAsText() {
|
|
70
118
|
this.hideSuggestion();
|
|
71
119
|
this.editorRef.nativeElement.focus();
|
|
72
120
|
}
|
|
73
121
|
addAsVariable() {
|
|
74
|
-
const name = (this.pendingWord || '')
|
|
122
|
+
const name = this.normalizeCandidate(this.pendingWord || '');
|
|
75
123
|
if (!name || !VAR_NAME_REGEX.test(name)) {
|
|
76
124
|
this.hideSuggestion();
|
|
77
125
|
return;
|
|
78
126
|
}
|
|
79
|
-
this.
|
|
127
|
+
if (this.selectionMode && this.selectionRange) {
|
|
128
|
+
if (this.rangeCrossesChip(this.selectionRange)) {
|
|
129
|
+
this.hideSuggestion();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.insertChipReplacingRange(name, this.selectionRange);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.insertChipReplacingCurrentWord(name);
|
|
136
|
+
}
|
|
80
137
|
this.hideSuggestion();
|
|
138
|
+
this.emitValue();
|
|
139
|
+
}
|
|
140
|
+
// ---- Value emission / validation -----------------------------------------
|
|
141
|
+
emitValue() {
|
|
81
142
|
const str = this.serialize();
|
|
82
|
-
this.lastEmitted
|
|
83
|
-
|
|
143
|
+
if (str !== this.lastEmitted) {
|
|
144
|
+
this.lastEmitted = str;
|
|
145
|
+
this.valueChange.emit(str);
|
|
146
|
+
}
|
|
147
|
+
this.validate(str);
|
|
148
|
+
}
|
|
149
|
+
validate(str) {
|
|
150
|
+
const error = this.findValidationError(str);
|
|
151
|
+
const valid = error === null;
|
|
152
|
+
if (this.lastValid === valid && this.errorMessage === error)
|
|
153
|
+
return;
|
|
154
|
+
this.lastValid = valid;
|
|
155
|
+
this.errorMessage = error;
|
|
156
|
+
this.validityChange.emit({ valid, error });
|
|
157
|
+
this.cdr.markForCheck();
|
|
158
|
+
}
|
|
159
|
+
findValidationError(str) {
|
|
160
|
+
if (!str)
|
|
161
|
+
return null;
|
|
162
|
+
const braceBody = /\$\{([^}]*)\}/g;
|
|
163
|
+
let m;
|
|
164
|
+
braceBody.lastIndex = 0;
|
|
165
|
+
while ((m = braceBody.exec(str)) !== null) {
|
|
166
|
+
const body = m[1];
|
|
167
|
+
if (body !== body.trim() || !VAR_NAME_REGEX.test(body)) {
|
|
168
|
+
return INVALID_VAR_MESSAGE;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const openCount = (str.match(/\$\{/g) || []).length;
|
|
172
|
+
const closedCount = (str.match(braceBody) || []).length;
|
|
173
|
+
if (openCount > closedCount)
|
|
174
|
+
return INVALID_VAR_MESSAGE;
|
|
175
|
+
return null;
|
|
84
176
|
}
|
|
177
|
+
// ---- Suggestion state -----------------------------------------------------
|
|
85
178
|
refreshSuggestion() {
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
|
|
179
|
+
const selInfo = this.getSelectedInfo();
|
|
180
|
+
if (selInfo) {
|
|
181
|
+
const normalized = this.normalizeCandidate(selInfo.text);
|
|
182
|
+
this.pendingWord = normalized;
|
|
183
|
+
this.selectionRange = selInfo.range;
|
|
184
|
+
this.selectionMode = true;
|
|
89
185
|
this.showSuggestion = true;
|
|
186
|
+
this.canAddAsVariable =
|
|
187
|
+
!!normalized && VAR_NAME_REGEX.test(normalized) && !this.rangeCrossesChip(selInfo.range);
|
|
188
|
+
this.cdr.markForCheck();
|
|
189
|
+
return;
|
|
90
190
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
191
|
+
this.selectionMode = false;
|
|
192
|
+
this.selectionRange = null;
|
|
193
|
+
const word = this.getCurrentWord();
|
|
194
|
+
this.pendingWord = word;
|
|
195
|
+
this.showSuggestion = !!word;
|
|
196
|
+
this.canAddAsVariable = !!word && VAR_NAME_REGEX.test(word);
|
|
95
197
|
this.cdr.markForCheck();
|
|
96
198
|
}
|
|
97
199
|
hideSuggestion() {
|
|
@@ -99,45 +201,126 @@ export class MixedVariableInputComponent {
|
|
|
99
201
|
return;
|
|
100
202
|
this.showSuggestion = false;
|
|
101
203
|
this.pendingWord = '';
|
|
204
|
+
this.canAddAsVariable = false;
|
|
102
205
|
this.cdr.markForCheck();
|
|
103
206
|
}
|
|
104
|
-
|
|
207
|
+
normalizeCandidate(text) {
|
|
208
|
+
let t = text.trim();
|
|
209
|
+
if (t.startsWith('${') && t.endsWith('}')) {
|
|
210
|
+
t = t.slice(2, -1).trim();
|
|
211
|
+
}
|
|
212
|
+
return t;
|
|
213
|
+
}
|
|
214
|
+
// ---- DOM sanitization -----------------------------------------------------
|
|
215
|
+
flattenStructure() {
|
|
105
216
|
const editor = this.editorRef.nativeElement;
|
|
106
|
-
const
|
|
107
|
-
editor.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
217
|
+
const wrappers = Array.from(editor.querySelectorAll('div, p'));
|
|
218
|
+
const strayInlines = Array.from(editor.querySelectorAll('span')).filter((s) => !s.classList.contains('cqa-var-chip') && !s.closest('.cqa-var-chip'));
|
|
219
|
+
for (const el of [...wrappers, ...strayInlines]) {
|
|
220
|
+
if (el.closest('.cqa-var-chip'))
|
|
221
|
+
continue;
|
|
222
|
+
while (el.firstChild)
|
|
223
|
+
el.parentNode?.insertBefore(el.firstChild, el);
|
|
224
|
+
el.remove();
|
|
225
|
+
}
|
|
226
|
+
const brs = Array.from(editor.querySelectorAll('br'));
|
|
227
|
+
for (const br of brs) {
|
|
228
|
+
if (br.closest('.cqa-var-chip'))
|
|
229
|
+
continue;
|
|
230
|
+
br.parentNode?.replaceChild(document.createTextNode(' '), br);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
sanitizeChips() {
|
|
234
|
+
const editor = this.editorRef.nativeElement;
|
|
235
|
+
const chips = Array.from(editor.querySelectorAll('.cqa-var-chip'));
|
|
236
|
+
for (const chip of chips) {
|
|
237
|
+
const name = (chip.getAttribute('data-var') || '').trim();
|
|
238
|
+
if (!name || !VAR_NAME_REGEX.test(name)) {
|
|
239
|
+
chip.parentNode?.replaceChild(document.createTextNode(chip.textContent || ''), chip);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const structureBroken = chip.getAttribute('contenteditable') !== 'false' ||
|
|
243
|
+
!chip.querySelector('.cqa-var-chip__remove');
|
|
244
|
+
if (structureBroken) {
|
|
245
|
+
chip.parentNode?.replaceChild(this.buildChip(name), chip);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Remove stray remove icons left from partial undo/redo states.
|
|
249
|
+
const orphans = Array.from(editor.querySelectorAll('.cqa-var-chip__remove'));
|
|
250
|
+
for (const o of orphans) {
|
|
251
|
+
if (!o.closest('.cqa-var-chip'))
|
|
252
|
+
o.remove();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// ---- Chipification --------------------------------------------------------
|
|
256
|
+
autoChipify(force = false) {
|
|
257
|
+
const editor = this.editorRef.nativeElement;
|
|
258
|
+
const caretRange = this.getSelectionRange();
|
|
259
|
+
let changed = false;
|
|
260
|
+
let lastChip = null;
|
|
261
|
+
for (const tn of this.collectDescendantTextNodes(editor)) {
|
|
262
|
+
if (!tn.parentNode)
|
|
263
|
+
continue;
|
|
112
264
|
const text = tn.nodeValue || '';
|
|
113
265
|
VAR_TOKEN_REGEX.lastIndex = 0;
|
|
114
266
|
if (!VAR_TOKEN_REGEX.test(text))
|
|
115
267
|
continue;
|
|
116
268
|
VAR_TOKEN_REGEX.lastIndex = 0;
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const
|
|
121
|
-
let lastIndex = 0;
|
|
269
|
+
const caretOffset = !force && caretRange && caretRange.collapsed && caretRange.startContainer === tn
|
|
270
|
+
? caretRange.startOffset
|
|
271
|
+
: -1;
|
|
272
|
+
const matches = [];
|
|
122
273
|
let m;
|
|
123
274
|
while ((m = VAR_TOKEN_REGEX.exec(text)) !== null) {
|
|
124
|
-
|
|
125
|
-
|
|
275
|
+
const start = m.index;
|
|
276
|
+
const end = start + m[0].length;
|
|
277
|
+
// Keep the token as plain text while the caret is strictly inside.
|
|
278
|
+
if (caretOffset > start && caretOffset < end)
|
|
279
|
+
continue;
|
|
280
|
+
matches.push({ start, end, name: m[1] });
|
|
281
|
+
}
|
|
282
|
+
if (!matches.length)
|
|
283
|
+
continue;
|
|
284
|
+
const frag = document.createDocumentFragment();
|
|
285
|
+
let cursor = 0;
|
|
286
|
+
for (const mt of matches) {
|
|
287
|
+
if (mt.start > cursor) {
|
|
288
|
+
frag.appendChild(document.createTextNode(text.slice(cursor, mt.start)));
|
|
126
289
|
}
|
|
127
|
-
|
|
128
|
-
|
|
290
|
+
const chip = this.buildChip(mt.name);
|
|
291
|
+
frag.appendChild(chip);
|
|
292
|
+
lastChip = chip;
|
|
293
|
+
cursor = mt.end;
|
|
129
294
|
}
|
|
130
|
-
if (
|
|
131
|
-
frag.appendChild(document.createTextNode(text.slice(
|
|
295
|
+
if (cursor < text.length) {
|
|
296
|
+
frag.appendChild(document.createTextNode(text.slice(cursor)));
|
|
132
297
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const str = this.serialize();
|
|
136
|
-
this.lastEmitted = str;
|
|
137
|
-
this.valueChange.emit(str);
|
|
138
|
-
return;
|
|
298
|
+
tn.parentNode.replaceChild(frag, tn);
|
|
299
|
+
changed = true;
|
|
139
300
|
}
|
|
301
|
+
if (changed && lastChip)
|
|
302
|
+
this.placeCaretAfter(lastChip);
|
|
303
|
+
}
|
|
304
|
+
collectDescendantTextNodes(root) {
|
|
305
|
+
const out = [];
|
|
306
|
+
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
|
|
307
|
+
acceptNode: (node) => {
|
|
308
|
+
let p = node.parentNode;
|
|
309
|
+
while (p && p !== root) {
|
|
310
|
+
if (p.classList?.contains?.('cqa-var-chip')) {
|
|
311
|
+
return NodeFilter.FILTER_REJECT;
|
|
312
|
+
}
|
|
313
|
+
p = p.parentNode;
|
|
314
|
+
}
|
|
315
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
let n;
|
|
319
|
+
while ((n = walker.nextNode()))
|
|
320
|
+
out.push(n);
|
|
321
|
+
return out;
|
|
140
322
|
}
|
|
323
|
+
// ---- Render / serialize ---------------------------------------------------
|
|
141
324
|
render(value) {
|
|
142
325
|
const editor = this.editorRef.nativeElement;
|
|
143
326
|
editor.innerHTML = '';
|
|
@@ -160,22 +343,30 @@ export class MixedVariableInputComponent {
|
|
|
160
343
|
serialize() {
|
|
161
344
|
const editor = this.editorRef.nativeElement;
|
|
162
345
|
let out = '';
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
out += (
|
|
346
|
+
const walk = (node) => {
|
|
347
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
348
|
+
out += (node.nodeValue || '').replace(/\u00a0/g, ' ');
|
|
349
|
+
return;
|
|
166
350
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
out += el.textContent || '';
|
|
176
|
-
}
|
|
351
|
+
if (node.nodeType !== Node.ELEMENT_NODE)
|
|
352
|
+
return;
|
|
353
|
+
const el = node;
|
|
354
|
+
if (el.classList.contains('cqa-var-chip')) {
|
|
355
|
+
const name = el.getAttribute('data-var') || '';
|
|
356
|
+
if (name)
|
|
357
|
+
out += '${' + name + '}';
|
|
358
|
+
return;
|
|
177
359
|
}
|
|
178
|
-
|
|
360
|
+
if (el.tagName === 'BR') {
|
|
361
|
+
out += '\n';
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const isBlock = el.tagName === 'DIV' || el.tagName === 'P';
|
|
365
|
+
if (isBlock && out.length > 0 && !out.endsWith('\n'))
|
|
366
|
+
out += '\n';
|
|
367
|
+
el.childNodes.forEach(walk);
|
|
368
|
+
};
|
|
369
|
+
editor.childNodes.forEach(walk);
|
|
179
370
|
return out;
|
|
180
371
|
}
|
|
181
372
|
buildChip(name) {
|
|
@@ -200,6 +391,7 @@ export class MixedVariableInputComponent {
|
|
|
200
391
|
chip.appendChild(remove);
|
|
201
392
|
return chip;
|
|
202
393
|
}
|
|
394
|
+
// ---- Selection / caret helpers -------------------------------------------
|
|
203
395
|
getSelectionRange() {
|
|
204
396
|
const sel = window.getSelection();
|
|
205
397
|
if (!sel || sel.rangeCount === 0)
|
|
@@ -209,6 +401,25 @@ export class MixedVariableInputComponent {
|
|
|
209
401
|
return null;
|
|
210
402
|
return range;
|
|
211
403
|
}
|
|
404
|
+
getSelectedInfo() {
|
|
405
|
+
const sel = window.getSelection();
|
|
406
|
+
if (!sel || sel.rangeCount === 0)
|
|
407
|
+
return null;
|
|
408
|
+
const range = sel.getRangeAt(0);
|
|
409
|
+
if (range.collapsed)
|
|
410
|
+
return null;
|
|
411
|
+
const editor = this.editorRef.nativeElement;
|
|
412
|
+
if (!editor.contains(range.startContainer) || !editor.contains(range.endContainer))
|
|
413
|
+
return null;
|
|
414
|
+
const text = range.toString();
|
|
415
|
+
if (!text)
|
|
416
|
+
return null;
|
|
417
|
+
return { text, range: range.cloneRange() };
|
|
418
|
+
}
|
|
419
|
+
rangeCrossesChip(range) {
|
|
420
|
+
const contents = range.cloneContents();
|
|
421
|
+
return !!contents.querySelector?.('.cqa-var-chip');
|
|
422
|
+
}
|
|
212
423
|
getNodeBeforeCaret() {
|
|
213
424
|
const range = this.getSelectionRange();
|
|
214
425
|
if (!range || !range.collapsed)
|
|
@@ -223,16 +434,39 @@ export class MixedVariableInputComponent {
|
|
|
223
434
|
}
|
|
224
435
|
getCurrentWord() {
|
|
225
436
|
const range = this.getSelectionRange();
|
|
226
|
-
if (!range)
|
|
227
|
-
return '';
|
|
228
|
-
const node = range.startContainer;
|
|
229
|
-
if (node.nodeType !== Node.TEXT_NODE)
|
|
437
|
+
if (!range || !range.collapsed)
|
|
230
438
|
return '';
|
|
439
|
+
let node = range.startContainer;
|
|
440
|
+
let offset = range.startOffset;
|
|
441
|
+
if (node.nodeType !== Node.TEXT_NODE) {
|
|
442
|
+
const prev = node.childNodes[offset - 1];
|
|
443
|
+
if (!prev || prev.nodeType !== Node.TEXT_NODE)
|
|
444
|
+
return '';
|
|
445
|
+
node = prev;
|
|
446
|
+
offset = (prev.nodeValue || '').length;
|
|
447
|
+
}
|
|
231
448
|
const text = node.nodeValue || '';
|
|
232
|
-
const
|
|
233
|
-
|
|
449
|
+
const braceOpen = text.lastIndexOf('${', offset - 1);
|
|
450
|
+
if (braceOpen !== -1) {
|
|
451
|
+
const closeIdx = text.indexOf('}', braceOpen + 2);
|
|
452
|
+
const tokenClosedBeforeCaret = closeIdx !== -1 && closeIdx < offset;
|
|
453
|
+
if (!tokenClosedBeforeCaret) {
|
|
454
|
+
const start = braceOpen + 2;
|
|
455
|
+
const end = closeIdx === -1 ? text.length : closeIdx;
|
|
456
|
+
return text.slice(start, end);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const match = text.slice(0, offset).match(VAR_PATH_TAIL_REGEX);
|
|
234
460
|
return match ? match[1] : '';
|
|
235
461
|
}
|
|
462
|
+
// ---- Chip insertion -------------------------------------------------------
|
|
463
|
+
insertChipReplacingRange(name, range) {
|
|
464
|
+
const chip = this.buildChip(name);
|
|
465
|
+
range.deleteContents();
|
|
466
|
+
range.insertNode(chip);
|
|
467
|
+
this.stripBracesAround(chip);
|
|
468
|
+
this.placeCaretAfter(chip);
|
|
469
|
+
}
|
|
236
470
|
insertChipReplacingCurrentWord(name) {
|
|
237
471
|
const range = this.getSelectionRange();
|
|
238
472
|
const chip = this.buildChip(name);
|
|
@@ -242,26 +476,59 @@ export class MixedVariableInputComponent {
|
|
|
242
476
|
return;
|
|
243
477
|
}
|
|
244
478
|
const node = range.startContainer;
|
|
245
|
-
if (node.nodeType
|
|
246
|
-
const text = node.nodeValue || '';
|
|
247
|
-
const before = text.slice(0, range.startOffset);
|
|
248
|
-
const after = text.slice(range.startOffset);
|
|
249
|
-
const wordMatch = before.match(/([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
250
|
-
const beforeKept = wordMatch ? before.slice(0, before.length - wordMatch[1].length) : before;
|
|
251
|
-
const parent = node.parentNode;
|
|
252
|
-
const frag = document.createDocumentFragment();
|
|
253
|
-
if (beforeKept)
|
|
254
|
-
frag.appendChild(document.createTextNode(beforeKept));
|
|
255
|
-
frag.appendChild(chip);
|
|
256
|
-
if (after)
|
|
257
|
-
frag.appendChild(document.createTextNode(after));
|
|
258
|
-
parent.replaceChild(frag, node);
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
479
|
+
if (node.nodeType !== Node.TEXT_NODE) {
|
|
261
480
|
range.insertNode(chip);
|
|
481
|
+
this.placeCaretAfter(chip);
|
|
482
|
+
return;
|
|
262
483
|
}
|
|
484
|
+
const text = node.nodeValue || '';
|
|
485
|
+
const before = text.slice(0, range.startOffset);
|
|
486
|
+
const after = text.slice(range.startOffset);
|
|
487
|
+
const wordMatch = before.match(VAR_PATH_TAIL_REGEX);
|
|
488
|
+
let beforeKept = wordMatch ? before.slice(0, before.length - wordMatch[1].length) : before;
|
|
489
|
+
let afterKept = after;
|
|
490
|
+
if (beforeKept.endsWith('${') && afterKept.startsWith('}')) {
|
|
491
|
+
beforeKept = beforeKept.slice(0, -2);
|
|
492
|
+
afterKept = afterKept.slice(1);
|
|
493
|
+
}
|
|
494
|
+
else if (beforeKept.endsWith('${')) {
|
|
495
|
+
beforeKept = beforeKept.slice(0, -2);
|
|
496
|
+
}
|
|
497
|
+
const frag = document.createDocumentFragment();
|
|
498
|
+
if (beforeKept)
|
|
499
|
+
frag.appendChild(document.createTextNode(beforeKept));
|
|
500
|
+
frag.appendChild(chip);
|
|
501
|
+
if (afterKept)
|
|
502
|
+
frag.appendChild(document.createTextNode(afterKept));
|
|
503
|
+
node.parentNode.replaceChild(frag, node);
|
|
263
504
|
this.placeCaretAfter(chip);
|
|
264
505
|
}
|
|
506
|
+
stripBracesAround(chip) {
|
|
507
|
+
const prev = chip.previousSibling;
|
|
508
|
+
const next = chip.nextSibling;
|
|
509
|
+
if (prev && prev.nodeType === Node.TEXT_NODE) {
|
|
510
|
+
const t = prev.nodeValue || '';
|
|
511
|
+
if (t.endsWith('${'))
|
|
512
|
+
prev.nodeValue = t.slice(0, -2);
|
|
513
|
+
}
|
|
514
|
+
if (next && next.nodeType === Node.TEXT_NODE) {
|
|
515
|
+
const t = next.nodeValue || '';
|
|
516
|
+
if (t.startsWith('}'))
|
|
517
|
+
next.nodeValue = t.slice(1);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
insertPlainTextAtCaret(text) {
|
|
521
|
+
const range = this.getSelectionRange();
|
|
522
|
+
if (!range) {
|
|
523
|
+
this.editorRef.nativeElement.appendChild(document.createTextNode(text));
|
|
524
|
+
this.placeCaretAtEnd();
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
range.deleteContents();
|
|
528
|
+
const node = document.createTextNode(text);
|
|
529
|
+
range.insertNode(node);
|
|
530
|
+
this.placeCaretAfter(node);
|
|
531
|
+
}
|
|
265
532
|
placeCaretAfter(node) {
|
|
266
533
|
const sel = window.getSelection();
|
|
267
534
|
if (!sel)
|
|
@@ -273,22 +540,21 @@ export class MixedVariableInputComponent {
|
|
|
273
540
|
sel.addRange(range);
|
|
274
541
|
}
|
|
275
542
|
placeCaretAtEnd() {
|
|
276
|
-
const editor = this.editorRef.nativeElement;
|
|
277
543
|
const sel = window.getSelection();
|
|
278
544
|
if (!sel)
|
|
279
545
|
return;
|
|
280
546
|
const range = document.createRange();
|
|
281
|
-
range.selectNodeContents(
|
|
547
|
+
range.selectNodeContents(this.editorRef.nativeElement);
|
|
282
548
|
range.collapse(false);
|
|
283
549
|
sel.removeAllRanges();
|
|
284
550
|
sel.addRange(range);
|
|
285
551
|
}
|
|
286
552
|
}
|
|
287
553
|
MixedVariableInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MixedVariableInputComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
288
|
-
MixedVariableInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MixedVariableInputComponent, selector: "cqa-mixed-variable-input", inputs: { value: "value", placeholder: "placeholder", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event)" }, classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-mixed-var-wrapper\">\n <div\n #editor\n class=\"cqa-mixed-var-editor\"\n role=\"textbox\"\n spellcheck=\"false\"\n [attr.contenteditable]=\"!disabled\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onEditorBlur()\">\n </div>\n\n <div\n *ngIf=\"showSuggestion\"\n class=\"cqa-mixed-var-suggest\"\n (mousedown)=\"$event.preventDefault()\">\n <button type=\"button\" class=\"cqa-mixed-var-suggest__item\" (click)=\"addAsText()\">\n Add as Text <span class=\"cqa-mixed-var-suggest__hint\">\"{{ pendingWord }}\"</span>\n </button>\n <button type=\"button\"
|
|
554
|
+
MixedVariableInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MixedVariableInputComponent, selector: "cqa-mixed-variable-input", inputs: { value: "value", placeholder: "placeholder", disabled: "disabled" }, outputs: { valueChange: "valueChange", validityChange: "validityChange" }, host: { listeners: { "dragstart": "onDragStart($event)", "document:mousedown": "onDocumentMouseDown($event)", "document:selectionchange": "onDocumentSelectionChange()" }, classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-mixed-var-wrapper\">\n <div\n #editor\n class=\"cqa-mixed-var-editor\"\n role=\"textbox\"\n spellcheck=\"false\"\n [attr.contenteditable]=\"!disabled\"\n [attr.data-placeholder]=\"placeholder\"\n [attr.aria-invalid]=\"errorMessage ? 'true' : null\"\n [class.cqa-mixed-var-editor--invalid]=\"errorMessage\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"onEditorFocus()\"\n (paste)=\"onPaste($event)\"\n (drop)=\"onDrop($event)\"\n (blur)=\"onEditorBlur()\">\n </div>\n <p *ngIf=\"errorMessage\" class=\"cqa-mixed-var-error\" role=\"alert\">{{ errorMessage }}</p>\n\n <div\n *ngIf=\"showSuggestion\"\n class=\"cqa-mixed-var-suggest\"\n (mousedown)=\"$event.preventDefault()\">\n <button type=\"button\" class=\"cqa-mixed-var-suggest__item\" (click)=\"addAsText()\">\n Add as Text <span *ngIf=\"pendingWord\" class=\"cqa-mixed-var-suggest__hint\">\"{{ pendingWord }}\"</span>\n </button>\n <button *ngIf=\"canAddAsVariable\" type=\"button\"\n class=\"cqa-mixed-var-suggest__item cqa-mixed-var-suggest__item--primary\"\n (click)=\"addAsVariable()\">\n Add as local variable <span class=\"cqa-mixed-var-suggest__hint\">${{ '{' }}{{ pendingWord }}{{ '}' }}</span>\n </button>\n </div>\n</div>\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
289
555
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MixedVariableInputComponent, decorators: [{
|
|
290
556
|
type: Component,
|
|
291
|
-
args: [{ selector: 'cqa-mixed-variable-input', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-mixed-var-wrapper\">\n <div\n #editor\n class=\"cqa-mixed-var-editor\"\n role=\"textbox\"\n spellcheck=\"false\"\n [attr.contenteditable]=\"!disabled\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onEditorBlur()\">\n </div>\n\n <div\n *ngIf=\"showSuggestion\"\n class=\"cqa-mixed-var-suggest\"\n (mousedown)=\"$event.preventDefault()\">\n <button type=\"button\" class=\"cqa-mixed-var-suggest__item\" (click)=\"addAsText()\">\n Add as Text <span class=\"cqa-mixed-var-suggest__hint\">\"{{ pendingWord }}\"</span>\n </button>\n <button type=\"button\"
|
|
557
|
+
args: [{ selector: 'cqa-mixed-variable-input', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-mixed-var-wrapper\">\n <div\n #editor\n class=\"cqa-mixed-var-editor\"\n role=\"textbox\"\n spellcheck=\"false\"\n [attr.contenteditable]=\"!disabled\"\n [attr.data-placeholder]=\"placeholder\"\n [attr.aria-invalid]=\"errorMessage ? 'true' : null\"\n [class.cqa-mixed-var-editor--invalid]=\"errorMessage\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"onEditorFocus()\"\n (paste)=\"onPaste($event)\"\n (drop)=\"onDrop($event)\"\n (blur)=\"onEditorBlur()\">\n </div>\n <p *ngIf=\"errorMessage\" class=\"cqa-mixed-var-error\" role=\"alert\">{{ errorMessage }}</p>\n\n <div\n *ngIf=\"showSuggestion\"\n class=\"cqa-mixed-var-suggest\"\n (mousedown)=\"$event.preventDefault()\">\n <button type=\"button\" class=\"cqa-mixed-var-suggest__item\" (click)=\"addAsText()\">\n Add as Text <span *ngIf=\"pendingWord\" class=\"cqa-mixed-var-suggest__hint\">\"{{ pendingWord }}\"</span>\n </button>\n <button *ngIf=\"canAddAsVariable\" type=\"button\"\n class=\"cqa-mixed-var-suggest__item cqa-mixed-var-suggest__item--primary\"\n (click)=\"addAsVariable()\">\n Add as local variable <span class=\"cqa-mixed-var-suggest__hint\">${{ '{' }}{{ pendingWord }}{{ '}' }}</span>\n </button>\n </div>\n</div>\n", styles: [] }]
|
|
292
558
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { value: [{
|
|
293
559
|
type: Input
|
|
294
560
|
}], placeholder: [{
|
|
@@ -297,11 +563,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
297
563
|
type: Input
|
|
298
564
|
}], valueChange: [{
|
|
299
565
|
type: Output
|
|
566
|
+
}], validityChange: [{
|
|
567
|
+
type: Output
|
|
300
568
|
}], editorRef: [{
|
|
301
569
|
type: ViewChild,
|
|
302
570
|
args: ['editor', { static: true }]
|
|
571
|
+
}], onDragStart: [{
|
|
572
|
+
type: HostListener,
|
|
573
|
+
args: ['dragstart', ['$event']]
|
|
303
574
|
}], onDocumentMouseDown: [{
|
|
304
575
|
type: HostListener,
|
|
305
576
|
args: ['document:mousedown', ['$event']]
|
|
577
|
+
}], onDocumentSelectionChange: [{
|
|
578
|
+
type: HostListener,
|
|
579
|
+
args: ['document:selectionchange']
|
|
306
580
|
}] } });
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4ZWQtdmFyaWFibGUtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9taXhlZC12YXJpYWJsZS1pbnB1dC9taXhlZC12YXJpYWJsZS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL21peGVkLXZhcmlhYmxlLWlucHV0L21peGVkLXZhcmlhYmxlLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBT2pNLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGlDQUFpQyxDQUFDO0FBUzFELE1BQU0sT0FBTywyQkFBMkI7SUFjdEMsWUFDVSxHQUFzQixFQUN0QixPQUFnQztRQURoQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQWZqQyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsZ0JBQVcsR0FBRyxZQUFZLENBQUM7UUFDM0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFJbkQsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFVCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztJQUt0QixDQUFDO0lBR0osbUJBQW1CLENBQUMsS0FBaUI7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUNqQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBYyxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMs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QUFDO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQzs7d0hBNVJVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLDRhQ2pCeEMsZzdCQXlCQTsyRkRSYSwyQkFBMkI7a0JBUHZDLFNBQVM7K0JBQ0UsMEJBQTBCLG1CQUduQix1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtpSUFHckIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVnQyxTQUFTO3NCQUEvQyxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBYXJDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBNaXhlZFNlZ21lbnQge1xuICB0eXBlOiAndGV4dCcgfCAndmFyaWFibGUnO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5jb25zdCBWQVJfTkFNRV9SRUdFWCA9IC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKiQvO1xuY29uc3QgVkFSX1RPS0VOX1JFR0VYID0gL1xcJFxceyhbQS1aYS16X11bQS1aYS16MC05X10qKVxcfS9nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbWl4ZWQtdmFyaWFibGUtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWl4ZWQtdmFyaWFibGUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBNaXhlZFZhcmlhYmxlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdUZXh0IElucHV0JztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCdlZGl0b3InLCB7IHN0YXRpYzogdHJ1ZSB9KSBlZGl0b3JSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBzaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xuICBwZW5kaW5nV29yZCA9ICcnO1xuXG4gIHByaXZhdGUgbGFzdEVtaXR0ZWQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIFxuICAgIHByaXZhdGUgaG9zdFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgKSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1N1Z2dlc3Rpb24pIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmFsdWUnXSAmJiB0aGlzLmVkaXRvclJlZikge1xuICAgICAgY29uc3QgaW5jb21pbmcgPSBjaGFuZ2VzWyd2YWx1ZSddLmN1cnJlbnRWYWx1ZSA/PyAnJztcbiAgICAgIGlmIChpbmNvbWluZyAhPT0gdGhpcy5sYXN0RW1pdHRlZCkge1xuICAgICAgICB0aGlzLnJlbmRlcihpbmNvbWluZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyKHRoaXMudmFsdWUgfHwgJycpO1xuICB9XG5cbiAgb25JbnB1dCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLnNlcmlhbGl6ZSgpO1xuICAgIHRoaXMubGFzdEVtaXR0ZWQgPSBzdHI7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHN0cik7XG4gICAgdGhpcy5hdXRvQ2hpcGlmeSgpO1xuICAgIHRoaXMucmVmcmVzaFN1Z2dlc3Rpb24oKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAodGhpcy5zaG93U3VnZ2VzdGlvbikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQmVmb3JlQ2FyZXQoKTtcbiAgICAgIGlmIChub2RlICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdjcWEtdmFyLWNoaXAnKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAobm9kZSBhcyBIVE1MRWxlbWVudCkucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25JbnB1dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRWRpdG9yQmx1cigpOiB2b2lkIHtcbiAgICAvLyBTbWFsbCB0aW1lb3V0IHNvIGNsaWNrcyBvbiBzdWdnZXN0aW9uIGJ1dHRvbnMgcmVnaXN0ZXIgYmVmb3JlIGhpZGluZy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZVN1Z2dlc3Rpb24oKSwgMTUwKTtcbiAgfVxuXG4gIGFkZEFzVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGVTdWdnZXN0aW9uKCk7XG4gICAgdGhpcy5lZGl0b3JSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgYWRkQXNWYXJpYWJsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMucGVuZGluZ1dvcmQgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUgfHwgIVZBUl9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnRDaGlwUmVwbGFjaW5nQ3VycmVudFdvcmQobmFtZSk7XG4gICAgdGhpcy5oaWRlU3VnZ2VzdGlvbigpO1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2VyaWFsaXplKCk7XG4gICAgdGhpcy5sYXN0RW1pdHRlZCA9IHN0cjtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoc3RyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFN1Z2dlc3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgd29yZCA9IHRoaXMuZ2V0Q3VycmVudFdvcmQoKTtcbiAgICBpZiAod29yZCAmJiBWQVJfTkFNRV9SRUdFWC50ZXN0KHdvcmQpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdXb3JkID0gd29yZDtcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBlbmRpbmdXb3JkID0gJyc7XG4gICAgICB0aGlzLnNob3dTdWdnZXN0aW9uID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlU3VnZ2VzdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1N1Z2dlc3Rpb24gJiYgIXRoaXMucGVuZGluZ1dvcmQpIHJldHVybjtcbiAgICB0aGlzLnNob3dTdWdnZXN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nV29yZCA9ICcnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvQ2hpcGlmeSgpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHRleHROb2RlczogVGV4dFtdID0gW107XG4gICAgZWRpdG9yLmNoaWxkTm9kZXMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB0ZXh0Tm9kZXMucHVzaChuIGFzIFRleHQpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3QgdG4gb2YgdGV4dE5vZGVzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdG4ubm9kZVZhbHVlIHx8ICcnO1xuICAgICAgVkFSX1RPS0VOX1JFR0VYLmxhc3RJbmRleCA9IDA7XG4gICAgICBpZiAoIVZBUl9UT0tFTl9SRUdFWC50ZXN0KHRleHQpKSBjb250aW51ZTtcbiAgICAgIFZBUl9UT0tFTl9SRUdFWC5sYXN0SW5kZXggPSAwO1xuICAgICAgY29uc3QgcGFyZW50ID0gdG4ucGFyZW50Tm9kZTtcbiAgICAgIGlmICghcGFyZW50KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgICAgIGxldCBtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgICAgd2hpbGUgKChtID0gVkFSX1RPS0VOX1JFR0VYLmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChtLmluZGV4ID4gbGFzdEluZGV4KSB7XG4gICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCkpKTtcbiAgICAgICAgfVxuICAgICAgICBmcmFnLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRDaGlwKG1bMV0pKTtcbiAgICAgICAgbGFzdEluZGV4ID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dC5zbGljZShsYXN0SW5kZXgpKSk7XG4gICAgICB9XG4gICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKGZyYWcsIHRuKTtcbiAgICAgIHRoaXMucGxhY2VDYXJldEF0RW5kKCk7XG4gICAgICBjb25zdCBzdHIgPSB0aGlzLnNlcmlhbGl6ZSgpO1xuICAgICAgdGhpcy5sYXN0RW1pdHRlZCA9IHN0cjtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChzdHIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGVkaXRvci5pbm5lckhUTUwgPSAnJztcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgVkFSX1RPS0VOX1JFR0VYLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgd2hpbGUgKChtID0gVkFSX1RPS0VOX1JFR0VYLmV4ZWModmFsdWUpKSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG0uaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlLnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCkpKTtcbiAgICAgIH1cbiAgICAgIGVkaXRvci5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkQ2hpcChtWzFdKSk7XG4gICAgICBsYXN0SW5kZXggPSBtLmluZGV4ICsgbVswXS5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChsYXN0SW5kZXggPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIGVkaXRvci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZS5zbGljZShsYXN0SW5kZXgpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGxldCBvdXQgPSAnJztcbiAgICBlZGl0b3IuY2hpbGROb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgb3V0ICs9IChuLm5vZGVWYWx1ZSB8fCAnJykucmVwbGFjZSgvXFx1MDBhMC9nLCAnICcpO1xuICAgICAgfSBlbHNlIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBjb25zdCBlbCA9IG4gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NxYS12YXItY2hpcCcpKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS12YXInKSB8fCAnJztcbiAgICAgICAgICBpZiAobmFtZSkgb3V0ICs9ICckeycgKyBuYW1lICsgJ30nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSBlbC50ZXh0Q29udGVudCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2hpcChuYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY2hpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBjaGlwLmNsYXNzTmFtZSA9ICdjcWEtdmFyLWNoaXAnO1xuICAgIGNoaXAuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKTtcbiAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS12YXInLCBuYW1lKTtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY3FhLXZhci1jaGlwX19sYWJlbCc7XG4gICAgbGFiZWwudGV4dENvbnRlbnQgPSAnJHsnICsgbmFtZSArICd9JztcbiAgICBjb25zdCByZW1vdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgcmVtb3ZlLmNsYXNzTmFtZSA9ICdjcWEtdmFyLWNoaXBfX3JlbW92ZSc7XG4gICAgcmVtb3ZlLnRleHRDb250ZW50ID0gJ8OXJztcbiAgICByZW1vdmUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgcmVtb3ZlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjaGlwLnJlbW92ZSgpO1xuICAgICAgdGhpcy5vbklucHV0KCk7XG4gICAgfSk7XG4gICAgY2hpcC5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgY2hpcC5hcHBlbmRDaGlsZChyZW1vdmUpO1xuICAgIHJldHVybiBjaGlwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3Rpb25SYW5nZSgpOiBSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbCB8fCBzZWwucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICBpZiAoIXRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmFuZ2Uuc3RhcnRDb250YWluZXIpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cblxuICBwcml2YXRlIGdldE5vZGVCZWZvcmVDYXJldCgpOiBOb2RlIHwgbnVsbCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFyYW5nZSB8fCAhcmFuZ2UuY29sbGFwc2VkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCB9ID0gcmFuZ2U7XG4gICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gc3RhcnRDb250YWluZXIucHJldmlvdXNTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldCAtIDFdIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRXb3JkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFyYW5nZSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHJldHVybiAnJztcbiAgICBjb25zdCB0ZXh0ID0gbm9kZS5ub2RlVmFsdWUgfHwgJyc7XG4gICAgY29uc3QgYmVmb3JlID0gdGV4dC5zbGljZSgwLCByYW5nZS5zdGFydE9mZnNldCk7XG4gICAgY29uc3QgbWF0Y2ggPSBiZWZvcmUubWF0Y2goLyhbQS1aYS16X11bQS1aYS16MC05X10qKSQvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRDaGlwUmVwbGFjaW5nQ3VycmVudFdvcmQobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7XG4gICAgY29uc3QgY2hpcCA9IHRoaXMuYnVpbGRDaGlwKG5hbWUpO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpcCk7XG4gICAgICB0aGlzLnBsYWNlQ2FyZXRBZnRlcihjaGlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgY29uc3QgdGV4dCA9IG5vZGUubm9kZVZhbHVlIHx8ICcnO1xuICAgICAgY29uc3QgYmVmb3JlID0gdGV4dC5zbGljZSgwLCByYW5nZS5zdGFydE9mZnNldCk7XG4gICAgICBjb25zdCBhZnRlciA9IHRleHQuc2xpY2UocmFuZ2Uuc3RhcnRPZmZzZXQpO1xuICAgICAgY29uc3Qgd29yZE1hdGNoID0gYmVmb3JlLm1hdGNoKC8oW0EtWmEtel9dW0EtWmEtejAtOV9dKikkLyk7XG4gICAgICBjb25zdCBiZWZvcmVLZXB0ID0gd29yZE1hdGNoID8gYmVmb3JlLnNsaWNlKDAsIGJlZm9yZS5sZW5ndGggLSB3b3JkTWF0Y2hbMV0ubGVuZ3RoKSA6IGJlZm9yZTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZSE7XG4gICAgICBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgaWYgKGJlZm9yZUtlcHQpIGZyYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmVmb3JlS2VwdCkpO1xuICAgICAgZnJhZy5hcHBlbmRDaGlsZChjaGlwKTtcbiAgICAgIGlmIChhZnRlcikgZnJhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhZnRlcikpO1xuICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChmcmFnLCBub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjaGlwKTtcbiAgICB9XG4gICAgdGhpcy5wbGFjZUNhcmV0QWZ0ZXIoY2hpcCk7XG4gIH1cblxuICBwcml2YXRlIHBsYWNlQ2FyZXRBZnRlcihub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsKSByZXR1cm47XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIobm9kZSk7XG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gIH1cblxuICBwcml2YXRlIHBsYWNlQ2FyZXRBdEVuZCgpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcbiAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtbWl4ZWQtdmFyLXdyYXBwZXJcIj5cbiAgPGRpdlxuICAgICNlZGl0b3JcbiAgICBjbGFzcz1cImNxYS1taXhlZC12YXItZWRpdG9yXCJcbiAgICByb2xlPVwidGV4dGJveFwiXG4gICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiIWRpc2FibGVkXCJcbiAgICBbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dCgpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgKGJsdXIpPVwib25FZGl0b3JCbHVyKClcIj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2hvd1N1Z2dlc3Rpb25cIlxuICAgIGNsYXNzPVwiY3FhLW1peGVkLXZhci1zdWdnZXN0XCJcbiAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcWEtbWl4ZWQtdmFyLXN1Z2dlc3RfX2l0ZW1cIiAoY2xpY2spPVwiYWRkQXNUZXh0KClcIj5cbiAgICAgIEFkZCBhcyBUZXh0IDxzcGFuIGNsYXNzPVwiY3FhLW1peGVkLXZhci1zdWdnZXN0X19oaW50XCI+XCJ7eyBwZW5kaW5nV29yZCB9fVwiPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLW1peGVkLXZhci1zdWdnZXN0X19pdGVtIGNxYS1taXhlZC12YXItc3VnZ2VzdF9faXRlbS0tcHJpbWFyeVwiIChjbGljayk9XCJhZGRBc1ZhcmlhYmxlKClcIj5cbiAgICAgIEFkZCBhcyBsb2NhbCB2YXJpYWJsZSA8c3BhbiBjbGFzcz1cImNxYS1taXhlZC12YXItc3VnZ2VzdF9faGludFwiPiR7eyAneycgfX17eyBwZW5kaW5nV29yZCB9fXt7ICd9JyB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
581
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4ZWQtdmFyaWFibGUtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9taXhlZC12YXJpYWJsZS1pbnB1dC9taXhlZC12YXJpYWJsZS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL21peGVkLXZhcmlhYmxlLWlucHV0L21peGVkLXZhcmlhYmxlLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBWWpNLE1BQU0sUUFBUSxHQUFHLGlFQUFpRSxDQUFDO0FBQ25GLE1BQU0sY0FBYyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsR0FBRyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzlELE1BQU0sbUJBQW1CLEdBQUcsd0JBQXdCLENBQUM7QUFDckQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFTL0IsTUFBTSxPQUFPLDJCQUEyQjtJQW9CdEMsWUFDVSxHQUFzQixFQUN0QixPQUFnQztRQURoQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQXJCakMsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGdCQUFXLEdBQUcsWUFBWSxDQUFDO1FBQzNCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFaEIsZ0JBQVcs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S0FBSyxDQUFDLENBQUM7UUFDdEIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQzs7d0hBbmpCVSwyQkFBMkI7NEdBQTNCLDJCQUEyQiw2aUJDMUJ4Qyx1eUNBaUNBOzJGRFBhLDJCQUEyQjtrQkFQdkMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0sUUFDekMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO2lJQUdyQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFZ0MsU0FBUztzQkFBL0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWlHckMsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNckMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVE5Qyx5QkFBeUI7c0JBRHhCLFlBQVk7dUJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1peGVkU2VnbWVudCB7XG4gIHR5cGU6ICd0ZXh0JyB8ICd2YXJpYWJsZSc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWl4ZWRWYXJpYWJsZVZhbGlkaXR5IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGVycm9yOiBzdHJpbmcgfCBudWxsO1xufVxuXG5jb25zdCBWQVJfUEFUSCA9ICdbQS1aYS16X11bQS1aYS16MC05X10qKD86XFxcXC5bQS1aYS16X11bQS1aYS16MC05X10qfFxcXFxbXFxcXGQrXFxcXF0pKic7XG5jb25zdCBWQVJfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ14nICsgVkFSX1BBVEggKyAnJCcpO1xuY29uc3QgVkFSX1RPS0VOX1JFR0VYID0gbmV3IFJlZ0V4cCgnXFxcXCRcXFxceygnICsgVkFSX1BBVEggKyAnKVxcXFx9JywgJ2cnKTtcbmNvbnN0IFZBUl9QQVRIX1RBSUxfUkVHRVggPSBuZXcgUmVnRXhwKCcoJyArIFZBUl9QQVRIICsgJykkJyk7XG5jb25zdCBJTlZBTElEX1ZBUl9NRVNTQUdFID0gJ0ludmFsaWQgdmFyaWFibGUgbmFtZS4nO1xuY29uc3QgQkxVUl9ISURFX0RFTEFZX01TID0gMTUwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbWl4ZWQtdmFyaWFibGUtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWl4ZWQtdmFyaWFibGUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBNaXhlZFZhcmlhYmxlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdUZXh0IElucHV0JztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHZhbGlkaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNaXhlZFZhcmlhYmxlVmFsaWRpdHk+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgc2hvd1N1Z2dlc3Rpb24gPSBmYWxzZTtcbiAgcGVuZGluZ1dvcmQgPSAnJztcbiAgY2FuQWRkQXNWYXJpYWJsZSA9IGZhbHNlO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc2VsZWN0aW9uUmFuZ2U6IFJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0aW9uTW9kZSA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RFbWl0dGVkID0gJyc7XG4gIHByaXZhdGUgbGFzdFZhbGlkOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaG9zdFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICkge31cblxuICAvLyAtLS0tIExpZmVjeWNsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCFjaGFuZ2VzWyd2YWx1ZSddIHx8ICF0aGlzLmVkaXRvclJlZikgcmV0dXJuO1xuICAgIGNvbnN0IGluY29taW5nID0gY2hhbmdlc1sndmFsdWUnXS5jdXJyZW50VmFsdWUgPz8gJyc7XG4gICAgaWYgKGluY29taW5nID09PSB0aGlzLmxhc3RFbWl0dGVkKSByZXR1cm47XG4gICAgdGhpcy5yZW5kZXIoaW5jb21pbmcpO1xuICAgIHRoaXMudmFsaWRhdGUoaW5jb21pbmcpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSB0aGlzLnZhbHVlIHx8ICcnO1xuICAgIHRoaXMucmVuZGVyKGluaXRpYWwpO1xuICAgIHRoaXMudmFsaWRhdGUoaW5pdGlhbCk7XG4gIH1cblxuICAvLyAtLS0tIEVkaXRvciBldmVudCBoYW5kbGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5mbGF0dGVuU3RydWN0dXJlKCk7XG4gICAgdGhpcy5zYW5pdGl6ZUNoaXBzKCk7XG4gICAgdGhpcy5hdXRvQ2hpcGlmeSgpO1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgdGhpcy5yZWZyZXNoU3VnZ2VzdGlvbigpO1xuICB9XG5cbiAgb25FZGl0b3JGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hTdWdnZXN0aW9uKCk7XG4gIH1cblxuICBvbkVkaXRvckJsdXIoKTogdm9pZCB7XG4gICAgLy8gRGVsYXkgc28gY2xpY2tzIG9uIHN1Z2dlc3Rpb24gYnV0dG9ucyByZWdpc3RlciBiZWZvcmUgd2UgaGlkZSB0aGVtLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hdXRvQ2hpcGlmeSh0cnVlKTtcbiAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgICB9LCBCTFVSX0hJREVfREVMQVlfTVMpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgaWYgKHRoaXMuc2hvd1N1Z2dlc3Rpb24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJlZm9yZUNhcmV0KCk7XG4gICAgICBpZiAobm9kZSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0Py5jb250YWlucygnY3FhLXZhci1jaGlwJykpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9uSW5wdXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvcGxhaW4nKSA/PyAnJztcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICB0aGlzLmluc2VydFBsYWluVGV4dEF0Q2FyZXQodGV4dCk7XG4gICAgdGhpcy5vbklucHV0KCk7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGV4dCA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZ2V0RGF0YSgndGV4dC9wbGFpbicpID8/ICcnO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLmluc2VydFBsYWluVGV4dEF0Q2FyZXQodGV4dCk7XG4gICAgfVxuICAgIHRoaXMub25JbnB1dCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50TW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dTdWdnZXN0aW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnNlbGVjdGlvbmNoYW5nZScpXG4gIG9uRG9jdW1lbnRTZWxlY3Rpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5yZWZyZXNoU3VnZ2VzdGlvbigpO1xuICB9XG5cbiAgLy8gLS0tLSBTdWdnZXN0aW9uIGFjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgYWRkQXNUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgICB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBhZGRBc1ZhcmlhYmxlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vcm1hbGl6ZUNhbmRpZGF0ZSh0aGlzLnBlbmRpbmdXb3JkIHx8ICcnKTtcbiAgICBpZiAoIW5hbWUgfHwgIVZBUl9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAmJiB0aGlzLnNlbGVjdGlvblJhbmdlKSB7XG4gICAgICBpZiAodGhpcy5yYW5nZUNyb3NzZXNDaGlwKHRoaXMuc2VsZWN0aW9uUmFuZ2UpKSB7XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnNlcnRDaGlwUmVwbGFjaW5nUmFuZ2UobmFtZSwgdGhpcy5zZWxlY3Rpb25SYW5nZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5zZXJ0Q2hpcFJlcGxhY2luZ0N1cnJlbnRXb3JkKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVTdWdnZXN0aW9uKCk7XG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIC0tLS0gVmFsdWUgZW1pc3Npb24gLyB2YWxpZGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBlbWl0VmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RyID0gdGhpcy5zZXJpYWxpemUoKTtcbiAgICBpZiAoc3RyICE9PSB0aGlzLmxhc3RFbWl0dGVkKSB7XG4gICAgICB0aGlzLmxhc3RFbWl0dGVkID0gc3RyO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHN0cik7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGUoc3RyKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvciA9IHRoaXMuZmluZFZhbGlkYXRpb25FcnJvcihzdHIpO1xuICAgIGNvbnN0IHZhbGlkID0gZXJyb3IgPT09IG51bGw7XG4gICAgaWYgKHRoaXMubGFzdFZhbGlkID09PSB2YWxpZCAmJiB0aGlzLmVycm9yTWVzc2FnZSA9PT0gZXJyb3IpIHJldHVybjtcbiAgICB0aGlzLmxhc3RWYWxpZCA9IHZhbGlkO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3I7XG4gICAgdGhpcy52YWxpZGl0eUNoYW5nZS5lbWl0KHsgdmFsaWQsIGVycm9yIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kVmFsaWRhdGlvbkVycm9yKHN0cjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJyYWNlQm9keSA9IC9cXCRcXHsoW159XSopXFx9L2c7XG4gICAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgYnJhY2VCb2R5Lmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKChtID0gYnJhY2VCb2R5LmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBtWzFdO1xuICAgICAgaWYgKGJvZHkgIT09IGJvZHkudHJpbSgpIHx8ICFWQVJfTkFNRV9SRUdFWC50ZXN0KGJvZHkpKSB7XG4gICAgICAgIHJldHVybiBJTlZBTElEX1ZBUl9NRVNTQUdFO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcGVuQ291bnQgPSAoc3RyLm1hdGNoKC9cXCRcXHsvZykgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBjbG9zZWRDb3VudCA9IChzdHIubWF0Y2goYnJhY2VCb2R5KSB8fCBbXSkubGVuZ3RoO1xuICAgIGlmIChvcGVuQ291bnQgPiBjbG9zZWRDb3VudCkgcmV0dXJuIElOVkFMSURfVkFSX01FU1NBR0U7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyAtLS0tIFN1Z2dlc3Rpb24gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIHJlZnJlc2hTdWdnZXN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbEluZm8gPSB0aGlzLmdldFNlbGVjdGVkSW5mbygpO1xuICAgIGlmIChzZWxJbmZvKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVDYW5kaWRhdGUoc2VsSW5mby50ZXh0KTtcbiAgICAgIHRoaXMucGVuZGluZ1dvcmQgPSBub3JtYWxpemVkO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZSA9IHNlbEluZm8ucmFuZ2U7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmNhbkFkZEFzVmFyaWFibGUgPVxuICAgICAgICAhIW5vcm1hbGl6ZWQgJiYgVkFSX05BTUVfUkVHRVgudGVzdChub3JtYWxpemVkKSAmJiAhdGhpcy5yYW5nZUNyb3NzZXNDaGlwKHNlbEluZm8ucmFuZ2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xuICAgIGNvbnN0IHdvcmQgPSB0aGlzLmdldEN1cnJlbnRXb3JkKCk7XG4gICAgdGhpcy5wZW5kaW5nV29yZCA9IHdvcmQ7XG4gICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9ICEhd29yZDtcbiAgICB0aGlzLmNhbkFkZEFzVmFyaWFibGUgPSAhIXdvcmQgJiYgVkFSX05BTUVfUkVHRVgudGVzdCh3b3JkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZVN1Z2dlc3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dTdWdnZXN0aW9uICYmICF0aGlzLnBlbmRpbmdXb3JkKSByZXR1cm47XG4gICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1dvcmQgPSAnJztcbiAgICB0aGlzLmNhbkFkZEFzVmFyaWFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ2FuZGlkYXRlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHQgPSB0ZXh0LnRyaW0oKTtcbiAgICBpZiAodC5zdGFydHNXaXRoKCckeycpICYmIHQuZW5kc1dpdGgoJ30nKSkge1xuICAgICAgdCA9IHQuc2xpY2UoMiwgLTEpLnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHQ7XG4gIH1cblxuICAvLyAtLS0tIERPTSBzYW5pdGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGZsYXR0ZW5TdHJ1Y3R1cmUoKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB3cmFwcGVycyA9IEFycmF5LmZyb20oZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdiwgcCcpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGNvbnN0IHN0cmF5SW5saW5lcyA9IEFycmF5LmZyb20oZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4nKSkuZmlsdGVyKFxuICAgICAgKHMpID0+ICFzLmNsYXNzTGlzdC5jb250YWlucygnY3FhLXZhci1jaGlwJykgJiYgIXMuY2xvc2VzdCgnLmNxYS12YXItY2hpcCcpLFxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIFsuLi53cmFwcGVycywgLi4uc3RyYXlJbmxpbmVzXSkge1xuICAgICAgaWYgKGVsLmNsb3Nlc3QoJy5jcWEtdmFyLWNoaXAnKSkgY29udGludWU7XG4gICAgICB3aGlsZSAoZWwuZmlyc3RDaGlsZCkgZWwucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGVsLmZpcnN0Q2hpbGQsIGVsKTtcbiAgICAgIGVsLnJlbW92ZSgpO1xuICAgIH1cbiAgICBjb25zdCBicnMgPSBBcnJheS5mcm9tKGVkaXRvci5xdWVyeVNlbGVjdG9yQWxsKCdicicpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGZvciAoY29uc3QgYnIgb2YgYnJzKSB7XG4gICAgICBpZiAoYnIuY2xvc2VzdCgnLmNxYS12YXItY2hpcCcpKSBjb250aW51ZTtcbiAgICAgIGJyLnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpLCBicik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYW5pdGl6ZUNoaXBzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2hpcHMgPSBBcnJheS5mcm9tKGVkaXRvci5xdWVyeVNlbGVjdG9yQWxsKCcuY3FhLXZhci1jaGlwJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKGNoaXAuZ2V0QXR0cmlidXRlKCdkYXRhLXZhcicpIHx8ICcnKS50cmltKCk7XG4gICAgICBpZiAoIW5hbWUgfHwgIVZBUl9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgY2hpcC5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpcC50ZXh0Q29udGVudCB8fCAnJyksIGNoaXApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0cnVjdHVyZUJyb2tlbiA9XG4gICAgICAgIGNoaXAuZ2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSAhPT0gJ2ZhbHNlJyB8fFxuICAgICAgICAhY2hpcC5xdWVyeVNlbGVjdG9yKCcuY3FhLXZhci1jaGlwX19yZW1vdmUnKTtcbiAgICAgIGlmIChzdHJ1Y3R1cmVCcm9rZW4pIHtcbiAgICAgICAgY2hpcC5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQodGhpcy5idWlsZENoaXAobmFtZSksIGNoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc3RyYXkgcmVtb3ZlIGljb25zIGxlZnQgZnJvbSBwYXJ0aWFsIHVuZG8vcmVkbyBzdGF0ZXMuXG4gICAgY29uc3Qgb3JwaGFucyA9IEFycmF5LmZyb20oZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jcWEtdmFyLWNoaXBfX3JlbW92ZScpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGZvciAoY29uc3QgbyBvZiBvcnBoYW5zKSB7XG4gICAgICBpZiAoIW8uY2xvc2VzdCgnLmNxYS12YXItY2hpcCcpKSBvLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gQ2hpcGlmaWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgYXV0b0NoaXBpZnkoZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FyZXRSYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGxldCBsYXN0Q2hpcDogTm9kZSB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCB0biBvZiB0aGlzLmNvbGxlY3REZXNjZW5kYW50VGV4dE5vZGVzKGVkaXRvcikpIHtcbiAgICAgIGlmICghdG4ucGFyZW50Tm9kZSkgY29udGludWU7XG4gICAgICBjb25zdCB0ZXh0ID0gdG4ubm9kZVZhbHVlIHx8ICcnO1xuICAgICAgVkFSX1RPS0VOX1JFR0VYLmxhc3RJbmRleCA9IDA7XG4gICAgICBpZiAoIVZBUl9UT0tFTl9SRUdFWC50ZXN0KHRleHQpKSBjb250aW51ZTtcbiAgICAgIFZBUl9UT0tFTl9SRUdFWC5sYXN0SW5kZXggPSAwO1xuXG4gICAgICBjb25zdCBjYXJldE9mZnNldCA9XG4gICAgICAgICFmb3JjZSAmJiBjYXJldFJhbmdlICYmIGNhcmV0UmFuZ2UuY29sbGFwc2VkICYmIGNhcmV0UmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IHRuXG4gICAgICAgICAgPyBjYXJldFJhbmdlLnN0YXJ0T2Zmc2V0XG4gICAgICAgICAgOiAtMTtcblxuICAgICAgY29uc3QgbWF0Y2hlczogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH0+ID0gW107XG4gICAgICBsZXQgbTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICAgIHdoaWxlICgobSA9IFZBUl9UT0tFTl9SRUdFWC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IG0uaW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbVswXS5sZW5ndGg7XG4gICAgICAgIC8vIEtlZXAgdGhlIHRva2VuIGFzIHBsYWluIHRleHQgd2hpbGUgdGhlIGNhcmV0IGlzIHN0cmljdGx5IGluc2lkZS5cbiAgICAgICAgaWYgKGNhcmV0T2Zmc2V0ID4gc3RhcnQgJiYgY2FyZXRPZmZzZXQgPCBlbmQpIGNvbnRpbnVlO1xuICAgICAgICBtYXRjaGVzLnB1c2goeyBzdGFydCwgZW5kLCBuYW1lOiBtWzFdIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXRjaGVzLmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBsZXQgY3Vyc29yID0gMDtcbiAgICAgIGZvciAoY29uc3QgbXQgb2YgbWF0Y2hlcykge1xuICAgICAgICBpZiAobXQuc3RhcnQgPiBjdXJzb3IpIHtcbiAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQuc2xpY2UoY3Vyc29yLCBtdC5zdGFydCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlwID0gdGhpcy5idWlsZENoaXAobXQubmFtZSk7XG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoY2hpcCk7XG4gICAgICAgIGxhc3RDaGlwID0gY2hpcDtcbiAgICAgICAgY3Vyc29yID0gbXQuZW5kO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnNvciA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dC5zbGljZShjdXJzb3IpKSk7XG4gICAgICB9XG4gICAgICB0bi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmcmFnLCB0bik7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZCAmJiBsYXN0Q2hpcCkgdGhpcy5wbGFjZUNhcmV0QWZ0ZXIobGFzdENoaXApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RGVzY2VuZGFudFRleHROb2Rlcyhyb290OiBFbGVtZW50KTogVGV4dFtdIHtcbiAgICBjb25zdCBvdXQ6IFRleHRbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIocm9vdCwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIHtcbiAgICAgIGFjY2VwdE5vZGU6IChub2RlKSA9PiB7XG4gICAgICAgIGxldCBwOiBOb2RlIHwgbnVsbCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgd2hpbGUgKHAgJiYgcCAhPT0gcm9vdCkge1xuICAgICAgICAgIGlmICgocCBhcyBFbGVtZW50KS5jbGFzc0xpc3Q/LmNvbnRhaW5zPy4oJ2NxYS12YXItY2hpcCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfUkVKRUNUO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwID0gcC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGxldCBuOiBOb2RlIHwgbnVsbDtcbiAgICB3aGlsZSAoKG4gPSB3YWxrZXIubmV4dE5vZGUoKSkpIG91dC5wdXNoKG4gYXMgVGV4dCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIC0tLS0gUmVuZGVyIC8gc2VyaWFsaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgcmVuZGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGVkaXRvci5pbm5lckhUTUwgPSAnJztcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgVkFSX1RPS0VOX1JFR0VYLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgd2hpbGUgKChtID0gVkFSX1RPS0VOX1JFR0VYLmV4ZWModmFsdWUpKSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG0uaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlLnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCkpKTtcbiAgICAgIH1cbiAgICAgIGVkaXRvci5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkQ2hpcChtWzFdKSk7XG4gICAgICBsYXN0SW5kZXggPSBtLmluZGV4ICsgbVswXS5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChsYXN0SW5kZXggPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIGVkaXRvci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZS5zbGljZShsYXN0SW5kZXgpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGxldCBvdXQgPSAnJztcbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IE5vZGUpOiB2b2lkID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICBvdXQgKz0gKG5vZGUubm9kZVZhbHVlIHx8ICcnKS5yZXBsYWNlKC9cXHUwMGEwL2csICcgJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuO1xuICAgICAgY29uc3QgZWwgPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY3FhLXZhci1jaGlwJykpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS12YXInKSB8fCAnJztcbiAgICAgICAgaWYgKG5hbWUpIG91dCArPSAnJHsnICsgbmFtZSArICd9JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVsLnRhZ05hbWUgPT09ICdCUicpIHtcbiAgICAgICAgb3V0ICs9ICdcXG4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpc0Jsb2NrID0gZWwudGFnTmFtZSA9PT0gJ0RJVicgfHwgZWwudGFnTmFtZSA9PT0gJ1AnO1xuICAgICAgaWYgKGlzQmxvY2sgJiYgb3V0Lmxlbmd0aCA+IDAgJiYgIW91dC5lbmRzV2l0aCgnXFxuJykpIG91dCArPSAnXFxuJztcbiAgICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaCh3YWxrKTtcbiAgICB9O1xuICAgIGVkaXRvci5jaGlsZE5vZGVzLmZvckVhY2god2Fsayk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGlwKG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGNoaXAuY2xhc3NOYW1lID0gJ2NxYS12YXItY2hpcCc7XG4gICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpO1xuICAgIGNoaXAuc2V0QXR0cmlidXRlKCdkYXRhLXZhcicsIG5hbWUpO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjcWEtdmFyLWNoaXBfX2xhYmVsJztcbiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICckeycgKyBuYW1lICsgJ30nO1xuICAgIGNvbnN0IHJlbW92ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICByZW1vdmUuY2xhc3NOYW1lID0gJ2NxYS12YXItY2hpcF9fcmVtb3ZlJztcbiAgICByZW1vdmUudGV4dENvbnRlbnQgPSAnw5cnO1xuICAgIHJlbW92ZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICByZW1vdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNoaXAucmVtb3ZlKCk7XG4gICAgICB0aGlzLm9uSW5wdXQoKTtcbiAgICB9KTtcbiAgICBjaGlwLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICBjaGlwLmFwcGVuZENoaWxkKHJlbW92ZSk7XG4gICAgcmV0dXJuIGNoaXA7XG4gIH1cblxuICAvLyAtLS0tIFNlbGVjdGlvbiAvIGNhcmV0IGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0aW9uUmFuZ2UoKTogUmFuZ2UgfCBudWxsIHtcbiAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWwgfHwgc2VsLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgaWYgKCF0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJhbmdlLnN0YXJ0Q29udGFpbmVyKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEluZm8oKTogeyB0ZXh0OiBzdHJpbmc7IHJhbmdlOiBSYW5nZSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsIHx8IHNlbC5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xuICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlZGl0b3IuY29udGFpbnMocmFuZ2Uuc3RhcnRDb250YWluZXIpIHx8ICFlZGl0b3IuY29udGFpbnMocmFuZ2UuZW5kQ29udGFpbmVyKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdGV4dCA9IHJhbmdlLnRvU3RyaW5nKCk7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyB0ZXh0LCByYW5nZTogcmFuZ2UuY2xvbmVSYW5nZSgpIH07XG4gIH1cblxuICBwcml2YXRlIHJhbmdlQ3Jvc3Nlc0NoaXAocmFuZ2U6IFJhbmdlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udGVudHMgPSByYW5nZS5jbG9uZUNvbnRlbnRzKCk7XG4gICAgcmV0dXJuICEhY29udGVudHMucXVlcnlTZWxlY3Rvcj8uKCcuY3FhLXZhci1jaGlwJyk7XG4gIH1cblxuICBwcml2YXRlIGdldE5vZGVCZWZvcmVDYXJldCgpOiBOb2RlIHwgbnVsbCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFyYW5nZSB8fCAhcmFuZ2UuY29sbGFwc2VkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCB9ID0gcmFuZ2U7XG4gICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gc3RhcnRDb250YWluZXIucHJldmlvdXNTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tzdGFydE9mZnNldCAtIDFdIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRXb3JkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFyYW5nZSB8fCAhcmFuZ2UuY29sbGFwc2VkKSByZXR1cm4gJyc7XG4gICAgbGV0IG5vZGU6IE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcbiAgICBsZXQgb2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICBjb25zdCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgaWYgKCFwcmV2IHx8IHByZXYubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSByZXR1cm4gJyc7XG4gICAgICBub2RlID0gcHJldjtcbiAgICAgIG9mZnNldCA9IChwcmV2Lm5vZGVWYWx1ZSB8fCAnJykubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkubm9kZVZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IGJyYWNlT3BlbiA9IHRleHQubGFzdEluZGV4T2YoJyR7Jywgb2Zmc2V0IC0gMSk7XG4gICAgaWYgKGJyYWNlT3BlbiAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGNsb3NlSWR4ID0gdGV4dC5pbmRleE9mKCd9JywgYnJhY2VPcGVuICsgMik7XG4gICAgICBjb25zdCB0b2tlbkNsb3NlZEJlZm9yZUNhcmV0ID0gY2xvc2VJZHggIT09IC0xICYmIGNsb3NlSWR4IDwgb2Zmc2V0O1xuICAgICAgaWYgKCF0b2tlbkNsb3NlZEJlZm9yZUNhcmV0KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYnJhY2VPcGVuICsgMjtcbiAgICAgICAgY29uc3QgZW5kID0gY2xvc2VJZHggPT09IC0xID8gdGV4dC5sZW5ndGggOiBjbG9zZUlkeDtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gdGV4dC5zbGljZSgwLCBvZmZzZXQpLm1hdGNoKFZBUl9QQVRIX1RBSUxfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogJyc7XG4gIH1cblxuICAvLyAtLS0tIENoaXAgaW5zZXJ0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGluc2VydENoaXBSZXBsYWNpbmdSYW5nZShuYW1lOiBzdHJpbmcsIHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgIGNvbnN0IGNoaXAgPSB0aGlzLmJ1aWxkQ2hpcChuYW1lKTtcbiAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgIHJhbmdlLmluc2VydE5vZGUoY2hpcCk7XG4gICAgdGhpcy5zdHJpcEJyYWNlc0Fyb3VuZChjaGlwKTtcbiAgICB0aGlzLnBsYWNlQ2FyZXRBZnRlcihjaGlwKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0Q2hpcFJlcGxhY2luZ0N1cnJlbnRXb3JkKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO1xuICAgIGNvbnN0IGNoaXAgPSB0aGlzLmJ1aWxkQ2hpcChuYW1lKTtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGNoaXApO1xuICAgICAgdGhpcy5wbGFjZUNhcmV0QWZ0ZXIoY2hpcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgIHJhbmdlLmluc2VydE5vZGUoY2hpcCk7XG4gICAgICB0aGlzLnBsYWNlQ2FyZXRBZnRlcihjaGlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IG5vZGUubm9kZVZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IGJlZm9yZSA9IHRleHQuc2xpY2UoMCwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xuICAgIGNvbnN0IGFmdGVyID0gdGV4dC5zbGljZShyYW5nZS5zdGFydE9mZnNldCk7XG4gICAgY29uc3Qgd29yZE1hdGNoID0gYmVmb3JlLm1hdGNoKFZBUl9QQVRIX1RBSUxfUkVHRVgpO1xuICAgIGxldCBiZWZvcmVLZXB0ID0gd29yZE1hdGNoID8gYmVmb3JlLnNsaWNlKDAsIGJlZm9yZS5sZW5ndGggLSB3b3JkTWF0Y2hbMV0ubGVuZ3RoKSA6IGJlZm9yZTtcbiAgICBsZXQgYWZ0ZXJLZXB0ID0gYWZ0ZXI7XG4gICAgaWYgKGJlZm9yZUtlcHQuZW5kc1dpdGgoJyR7JykgJiYgYWZ0ZXJLZXB0LnN0YXJ0c1dpdGgoJ30nKSkge1xuICAgICAgYmVmb3JlS2VwdCA9IGJlZm9yZUtlcHQuc2xpY2UoMCwgLTIpO1xuICAgICAgYWZ0ZXJLZXB0ID0gYWZ0ZXJLZXB0LnNsaWNlKDEpO1xuICAgIH0gZWxzZSBpZiAoYmVmb3JlS2VwdC5lbmRzV2l0aCgnJHsnKSkge1xuICAgICAgYmVmb3JlS2VwdCA9IGJlZm9yZUtlcHQuc2xpY2UoMCwgLTIpO1xuICAgIH1cbiAgICBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIGlmIChiZWZvcmVLZXB0KSBmcmFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJlZm9yZUtlcHQpKTtcbiAgICBmcmFnLmFwcGVuZENoaWxkKGNoaXApO1xuICAgIGlmIChhZnRlcktlcHQpIGZyYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYWZ0ZXJLZXB0KSk7XG4gICAgbm9kZS5wYXJlbnROb2RlIS5yZXBsYWNlQ2hpbGQoZnJhZywgbm9kZSk7XG4gICAgdGhpcy5wbGFjZUNhcmV0QWZ0ZXIoY2hpcCk7XG4gIH1cblxuICBwcml2YXRlIHN0cmlwQnJhY2VzQXJvdW5kKGNoaXA6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IGNoaXAucHJldmlvdXNTaWJsaW5nO1xuICAgIGNvbnN0IG5leHQgPSBjaGlwLm5leHRTaWJsaW5nO1xuICAgIGlmIChwcmV2ICYmIHByZXYubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICBjb25zdCB0ID0gcHJldi5ub2RlVmFsdWUgfHwgJyc7XG4gICAgICBpZiAodC5lbmRzV2l0aCgnJHsnKSkgcHJldi5ub2RlVmFsdWUgPSB0LnNsaWNlKDAsIC0yKTtcbiAgICB9XG4gICAgaWYgKG5leHQgJiYgbmV4dC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgIGNvbnN0IHQgPSBuZXh0Lm5vZGVWYWx1ZSB8fCAnJztcbiAgICAgIGlmICh0LnN0YXJ0c1dpdGgoJ30nKSkgbmV4dC5ub2RlVmFsdWUgPSB0LnNsaWNlKDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0UGxhaW5UZXh0QXRDYXJldCh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICAgIHRoaXMucGxhY2VDYXJldEF0RW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgIHJhbmdlLmluc2VydE5vZGUobm9kZSk7XG4gICAgdGhpcy5wbGFjZUNhcmV0QWZ0ZXIobm9kZSk7XG4gIH1cblxuICBwcml2YXRlIHBsYWNlQ2FyZXRBZnRlcihub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsKSByZXR1cm47XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIobm9kZSk7XG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gIH1cblxuICBwcml2YXRlIHBsYWNlQ2FyZXRBdEVuZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWwpIHJldHVybjtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS1taXhlZC12YXItd3JhcHBlclwiPlxuICA8ZGl2XG4gICAgI2VkaXRvclxuICAgIGNsYXNzPVwiY3FhLW1peGVkLXZhci1lZGl0b3JcIlxuICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgIFthdHRyLmNvbnRlbnRlZGl0YWJsZV09XCIhZGlzYWJsZWRcIlxuICAgIFthdHRyLmRhdGEtcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJlcnJvck1lc3NhZ2UgPyAndHJ1ZScgOiBudWxsXCJcbiAgICBbY2xhc3MuY3FhLW1peGVkLXZhci1lZGl0b3ItLWludmFsaWRdPVwiZXJyb3JNZXNzYWdlXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dCgpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgKGZvY3VzKT1cIm9uRWRpdG9yRm9jdXMoKVwiXG4gICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiXG4gICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxuICAgIChibHVyKT1cIm9uRWRpdG9yQmx1cigpXCI+XG4gIDwvZGl2PlxuICA8cCAqbmdJZj1cImVycm9yTWVzc2FnZVwiIGNsYXNzPVwiY3FhLW1peGVkLXZhci1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yTWVzc2FnZSB9fTwvcD5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93U3VnZ2VzdGlvblwiXG4gICAgY2xhc3M9XCJjcWEtbWl4ZWQtdmFyLXN1Z2dlc3RcIlxuICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNxYS1taXhlZC12YXItc3VnZ2VzdF9faXRlbVwiIChjbGljayk9XCJhZGRBc1RleHQoKVwiPlxuICAgICAgQWRkIGFzIFRleHQgPHNwYW4gKm5nSWY9XCJwZW5kaW5nV29yZFwiIGNsYXNzPVwiY3FhLW1peGVkLXZhci1zdWdnZXN0X19oaW50XCI+XCJ7eyBwZW5kaW5nV29yZCB9fVwiPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJjYW5BZGRBc1ZhcmlhYmxlXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNxYS1taXhlZC12YXItc3VnZ2VzdF9faXRlbSBjcWEtbWl4ZWQtdmFyLXN1Z2dlc3RfX2l0ZW0tLXByaW1hcnlcIlxuICAgICAgKGNsaWNrKT1cImFkZEFzVmFyaWFibGUoKVwiPlxuICAgICAgQWRkIGFzIGxvY2FsIHZhcmlhYmxlIDxzcGFuIGNsYXNzPVwiY3FhLW1peGVkLXZhci1zdWdnZXN0X19oaW50XCI+JHt7ICd7JyB9fXt7IHBlbmRpbmdXb3JkIH19e3sgJ30nIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|