@qodalis/cli-string 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/processors/cli-string-command-processor.mjs +523 -10
- package/esm2022/lib/version.mjs +3 -0
- package/fesm2022/qodalis-cli-string.mjs +524 -9
- package/fesm2022/qodalis-cli-string.mjs.map +1 -1
- package/lib/processors/cli-string-command-processor.d.ts +5 -2
- package/lib/version.d.ts +1 -0
- package/package.json +1 -1
- package/umd/index.js +523 -8
|
@@ -1,26 +1,539 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { CliForegroundColor, DefaultLibraryAuthor, } from '@qodalis/cli-core';
|
|
3
3
|
import * as _ from 'lodash';
|
|
4
|
+
import { LIBRARY_VERSION } from '../version';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
6
|
+
const lodash = _.default || _;
|
|
7
|
+
/**
|
|
8
|
+
* Helper to create a simple string transform subcommand
|
|
9
|
+
*/
|
|
10
|
+
function stringTransform(command, description, transform, options) {
|
|
11
|
+
return {
|
|
12
|
+
command,
|
|
13
|
+
aliases: options?.aliases,
|
|
14
|
+
description,
|
|
15
|
+
allowUnlistedCommands: true,
|
|
16
|
+
valueRequired: true,
|
|
17
|
+
processCommand: async (cmd, context) => {
|
|
18
|
+
const text = (cmd.value || cmd.data || '');
|
|
19
|
+
const result = transform(text);
|
|
20
|
+
context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
|
|
21
|
+
context.process.output(result);
|
|
22
|
+
},
|
|
23
|
+
writeDescription: (context) => {
|
|
24
|
+
const { writer } = context;
|
|
25
|
+
writer.writeln(description);
|
|
26
|
+
writer.writeln();
|
|
27
|
+
writer.writeln('📋 Usage:');
|
|
28
|
+
writer.writeln(` ${writer.wrapInColor(`string ${command} <text>`, CliForegroundColor.Cyan)}`);
|
|
29
|
+
if (options?.example) {
|
|
30
|
+
writer.writeln();
|
|
31
|
+
writer.writeln('📝 Examples:');
|
|
32
|
+
writer.writeln(` string ${command} ${options.example.input.padEnd(20)} ${writer.wrapInColor(`# → ${options.example.output}`, CliForegroundColor.Green)}`);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
5
37
|
export class CliStringCommandProcessor {
|
|
6
38
|
constructor() {
|
|
7
39
|
this.command = 'string';
|
|
8
|
-
this.
|
|
40
|
+
this.aliases = ['str'];
|
|
41
|
+
this.description = 'String manipulation commands';
|
|
9
42
|
this.author = DefaultLibraryAuthor;
|
|
43
|
+
this.version = LIBRARY_VERSION;
|
|
10
44
|
this.processors = [];
|
|
11
|
-
this.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
45
|
+
this.metadata = {
|
|
46
|
+
icon: '🔤',
|
|
47
|
+
};
|
|
48
|
+
this.processors = [
|
|
49
|
+
// -- Case conversions --
|
|
50
|
+
stringTransform('upper', 'Convert to UPPERCASE', (t) => t.toUpperCase(), {
|
|
51
|
+
aliases: ['uppercase', 'toUpper'],
|
|
52
|
+
example: { input: 'hello world', output: 'HELLO WORLD' },
|
|
53
|
+
}),
|
|
54
|
+
stringTransform('lower', 'Convert to lowercase', (t) => t.toLowerCase(), {
|
|
55
|
+
aliases: ['lowercase', 'toLower'],
|
|
56
|
+
example: { input: 'HELLO WORLD', output: 'hello world' },
|
|
57
|
+
}),
|
|
58
|
+
stringTransform('capitalize', 'Capitalize the first letter', (t) => lodash.capitalize(t), {
|
|
59
|
+
aliases: ['cap'],
|
|
60
|
+
example: { input: 'hello world', output: 'Hello world' },
|
|
61
|
+
}),
|
|
62
|
+
stringTransform('camelCase', 'Convert to camelCase', (t) => lodash.camelCase(t), {
|
|
63
|
+
aliases: ['camel'],
|
|
64
|
+
example: { input: 'hello world', output: 'helloWorld' },
|
|
65
|
+
}),
|
|
66
|
+
stringTransform('kebabCase', 'Convert to kebab-case', (t) => lodash.kebabCase(t), {
|
|
67
|
+
aliases: ['kebab'],
|
|
68
|
+
example: { input: 'Hello World', output: 'hello-world' },
|
|
69
|
+
}),
|
|
70
|
+
stringTransform('snakeCase', 'Convert to snake_case', (t) => lodash.snakeCase(t), {
|
|
71
|
+
aliases: ['snake'],
|
|
72
|
+
example: { input: 'Hello World', output: 'hello_world' },
|
|
73
|
+
}),
|
|
74
|
+
stringTransform('startCase', 'Convert to Start Case', (t) => lodash.startCase(t), {
|
|
75
|
+
aliases: ['title', 'titleCase'],
|
|
76
|
+
example: { input: 'hello-world', output: 'Hello World' },
|
|
77
|
+
}),
|
|
78
|
+
// -- Trimming --
|
|
79
|
+
stringTransform('trim', 'Remove whitespace from both ends', (t) => t.trim(), {
|
|
80
|
+
example: { input: '" hello "', output: 'hello' },
|
|
81
|
+
}),
|
|
82
|
+
stringTransform('trimStart', 'Remove whitespace from the start', (t) => t.trimStart(), {
|
|
83
|
+
aliases: ['ltrim'],
|
|
84
|
+
example: { input: '" hello"', output: 'hello' },
|
|
85
|
+
}),
|
|
86
|
+
stringTransform('trimEnd', 'Remove whitespace from the end', (t) => t.trimEnd(), {
|
|
87
|
+
aliases: ['rtrim'],
|
|
88
|
+
example: { input: '"hello "', output: 'hello' },
|
|
89
|
+
}),
|
|
90
|
+
// -- Transform --
|
|
91
|
+
stringTransform('reverse', 'Reverse a string', (t) => [...t].reverse().join(''), {
|
|
92
|
+
aliases: ['rev'],
|
|
93
|
+
example: { input: 'Hello', output: 'olleH' },
|
|
94
|
+
}),
|
|
95
|
+
stringTransform('slug', 'Convert to URL-friendly slug', (t) => t.toLowerCase()
|
|
96
|
+
.normalize('NFD')
|
|
97
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
98
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
99
|
+
.replace(/^-|-$/g, ''), {
|
|
100
|
+
aliases: ['slugify'],
|
|
101
|
+
example: { input: '"Hello World!"', output: 'hello-world' },
|
|
102
|
+
}),
|
|
103
|
+
stringTransform('escape', 'Escape HTML entities', (t) => lodash.escape(t), {
|
|
104
|
+
aliases: ['escapeHtml'],
|
|
105
|
+
example: { input: '"<b>hi</b>"', output: '<b>hi</b>' },
|
|
106
|
+
}),
|
|
107
|
+
stringTransform('unescape', 'Unescape HTML entities', (t) => lodash.unescape(t), {
|
|
108
|
+
aliases: ['unescapeHtml'],
|
|
109
|
+
example: { input: '"<b>"', output: '<b>' },
|
|
110
|
+
}),
|
|
111
|
+
// -- Repeat --
|
|
112
|
+
{
|
|
113
|
+
command: 'repeat',
|
|
114
|
+
description: 'Repeat a string N times',
|
|
115
|
+
allowUnlistedCommands: true,
|
|
116
|
+
valueRequired: true,
|
|
117
|
+
parameters: [
|
|
118
|
+
{
|
|
119
|
+
name: 'count',
|
|
120
|
+
aliases: ['n'],
|
|
121
|
+
description: 'Number of repetitions (default: 2)',
|
|
122
|
+
type: 'number',
|
|
123
|
+
required: false,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'separator',
|
|
127
|
+
aliases: ['sep'],
|
|
128
|
+
description: 'Separator between repetitions (default: none)',
|
|
129
|
+
type: 'string',
|
|
130
|
+
required: false,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
processCommand: async (command, context) => {
|
|
134
|
+
const text = (command.value || command.data || '');
|
|
135
|
+
const count = Math.min(parseInt(command.args['count'] || command.args['n']) || 2, 1000);
|
|
136
|
+
const sep = command.args['separator'] || command.args['sep'] || '';
|
|
137
|
+
const result = Array(count).fill(text).join(sep);
|
|
138
|
+
context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
|
|
139
|
+
context.process.output(result);
|
|
140
|
+
},
|
|
141
|
+
writeDescription: (context) => {
|
|
142
|
+
const { writer } = context;
|
|
143
|
+
writer.writeln('Repeat a string multiple times');
|
|
144
|
+
writer.writeln();
|
|
145
|
+
writer.writeln('📋 Usage:');
|
|
146
|
+
writer.writeln(` ${writer.wrapInColor('string repeat <text> [--count=N] [--sep=S]', CliForegroundColor.Cyan)}`);
|
|
147
|
+
writer.writeln();
|
|
148
|
+
writer.writeln('📝 Examples:');
|
|
149
|
+
writer.writeln(` string repeat ha --count=3 ${writer.wrapInColor('# → hahaha', CliForegroundColor.Green)}`);
|
|
150
|
+
writer.writeln(` string repeat ab --n=3 --sep=- ${writer.wrapInColor('# → ab-ab-ab', CliForegroundColor.Green)}`);
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
// -- Replace --
|
|
154
|
+
{
|
|
155
|
+
command: 'replace',
|
|
156
|
+
description: 'Replace occurrences in a string',
|
|
157
|
+
allowUnlistedCommands: true,
|
|
158
|
+
valueRequired: true,
|
|
159
|
+
parameters: [
|
|
160
|
+
{
|
|
161
|
+
name: 'find',
|
|
162
|
+
aliases: ['f'],
|
|
163
|
+
description: 'Text to find',
|
|
164
|
+
type: 'string',
|
|
165
|
+
required: true,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'with',
|
|
169
|
+
aliases: ['w'],
|
|
170
|
+
description: 'Replacement text',
|
|
171
|
+
type: 'string',
|
|
172
|
+
required: true,
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
processCommand: async (command, context) => {
|
|
176
|
+
const text = (command.value || command.data || '');
|
|
177
|
+
const find = command.args['find'] || command.args['f'] || '';
|
|
178
|
+
const replacement = command.args['with'] || command.args['w'] || '';
|
|
179
|
+
if (!find) {
|
|
180
|
+
context.writer.writeError('--find is required');
|
|
181
|
+
context.process.exit(-1);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const result = text.split(find).join(replacement);
|
|
185
|
+
context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
|
|
186
|
+
context.process.output(result);
|
|
187
|
+
},
|
|
188
|
+
writeDescription: (context) => {
|
|
189
|
+
const { writer } = context;
|
|
190
|
+
writer.writeln('Replace all occurrences of a substring');
|
|
191
|
+
writer.writeln();
|
|
192
|
+
writer.writeln('📋 Usage:');
|
|
193
|
+
writer.writeln(` ${writer.wrapInColor('string replace <text> --find=<search> --with=<replacement>', CliForegroundColor.Cyan)}`);
|
|
194
|
+
writer.writeln();
|
|
195
|
+
writer.writeln('📝 Examples:');
|
|
196
|
+
writer.writeln(` string replace "hello world" --find=world --with=there`);
|
|
197
|
+
writer.writeln(` ${writer.wrapInColor('# → hello there', CliForegroundColor.Green)}`);
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
// -- Truncate --
|
|
201
|
+
{
|
|
202
|
+
command: 'truncate',
|
|
203
|
+
aliases: ['trunc'],
|
|
204
|
+
description: 'Truncate a string to a max length',
|
|
205
|
+
allowUnlistedCommands: true,
|
|
206
|
+
valueRequired: true,
|
|
207
|
+
parameters: [
|
|
208
|
+
{
|
|
209
|
+
name: 'length',
|
|
210
|
+
aliases: ['l'],
|
|
211
|
+
description: 'Maximum length (default: 30)',
|
|
212
|
+
type: 'number',
|
|
213
|
+
required: false,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'suffix',
|
|
217
|
+
description: 'Omission suffix (default: ...)',
|
|
218
|
+
type: 'string',
|
|
219
|
+
required: false,
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
processCommand: async (command, context) => {
|
|
223
|
+
const text = (command.value || command.data || '');
|
|
224
|
+
const length = parseInt(command.args['length'] || command.args['l']) || 30;
|
|
225
|
+
const suffix = command.args['suffix'] ?? '...';
|
|
226
|
+
const result = text.length > length
|
|
227
|
+
? text.substring(0, length - suffix.length) + suffix
|
|
228
|
+
: text;
|
|
229
|
+
context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
|
|
230
|
+
context.process.output(result);
|
|
231
|
+
},
|
|
232
|
+
writeDescription: (context) => {
|
|
233
|
+
const { writer } = context;
|
|
234
|
+
writer.writeln('Truncate a string to a maximum length with an ellipsis');
|
|
235
|
+
writer.writeln();
|
|
236
|
+
writer.writeln('📋 Usage:');
|
|
237
|
+
writer.writeln(` ${writer.wrapInColor('string truncate <text> [--length=N] [--suffix=S]', CliForegroundColor.Cyan)}`);
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
// -- Pad --
|
|
241
|
+
{
|
|
242
|
+
command: 'pad',
|
|
243
|
+
description: 'Pad a string to a target length',
|
|
244
|
+
allowUnlistedCommands: true,
|
|
245
|
+
valueRequired: true,
|
|
246
|
+
parameters: [
|
|
247
|
+
{
|
|
248
|
+
name: 'length',
|
|
249
|
+
aliases: ['l'],
|
|
250
|
+
description: 'Target length',
|
|
251
|
+
type: 'number',
|
|
252
|
+
required: true,
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
name: 'char',
|
|
256
|
+
aliases: ['c'],
|
|
257
|
+
description: 'Padding character (default: space)',
|
|
258
|
+
type: 'string',
|
|
259
|
+
required: false,
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: 'side',
|
|
263
|
+
description: 'Pad side: left, right, both (default: both)',
|
|
264
|
+
type: 'string',
|
|
265
|
+
required: false,
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
processCommand: async (command, context) => {
|
|
269
|
+
const text = (command.value || command.data || '');
|
|
270
|
+
const length = parseInt(command.args['length'] || command.args['l']);
|
|
271
|
+
const char = command.args['char'] || command.args['c'] || ' ';
|
|
272
|
+
const side = command.args['side'] || 'both';
|
|
273
|
+
if (isNaN(length)) {
|
|
274
|
+
context.writer.writeError('--length is required');
|
|
275
|
+
context.process.exit(-1);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
let result;
|
|
279
|
+
switch (side) {
|
|
280
|
+
case 'left':
|
|
281
|
+
case 'start':
|
|
282
|
+
result = text.padStart(length, char);
|
|
283
|
+
break;
|
|
284
|
+
case 'right':
|
|
285
|
+
case 'end':
|
|
286
|
+
result = text.padEnd(length, char);
|
|
287
|
+
break;
|
|
288
|
+
default:
|
|
289
|
+
result = lodash.pad(text, length, char);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}"${result}"`);
|
|
293
|
+
context.process.output(result);
|
|
294
|
+
},
|
|
295
|
+
writeDescription: (context) => {
|
|
296
|
+
const { writer } = context;
|
|
297
|
+
writer.writeln('Pad a string to a target length');
|
|
298
|
+
writer.writeln();
|
|
299
|
+
writer.writeln('📋 Usage:');
|
|
300
|
+
writer.writeln(` ${writer.wrapInColor('string pad <text> --length=N [--char=C] [--side=left|right|both]', CliForegroundColor.Cyan)}`);
|
|
301
|
+
writer.writeln();
|
|
302
|
+
writer.writeln('📝 Examples:');
|
|
303
|
+
writer.writeln(` string pad hello --length=10 --char=. --side=right`);
|
|
304
|
+
writer.writeln(` ${writer.wrapInColor('# → "hello....."', CliForegroundColor.Green)}`);
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
// -- Split --
|
|
308
|
+
{
|
|
309
|
+
command: 'split',
|
|
310
|
+
description: 'Split a string by a delimiter',
|
|
311
|
+
allowUnlistedCommands: true,
|
|
312
|
+
valueRequired: true,
|
|
313
|
+
parameters: [
|
|
314
|
+
{
|
|
315
|
+
name: 'by',
|
|
316
|
+
aliases: ['d', 'delimiter'],
|
|
317
|
+
description: 'Delimiter to split by (default: space)',
|
|
318
|
+
type: 'string',
|
|
319
|
+
required: false,
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
processCommand: async (command, context) => {
|
|
323
|
+
const text = (command.value || command.data || '');
|
|
324
|
+
const delimiter = command.args['by'] || command.args['d'] || command.args['delimiter'] || ' ';
|
|
325
|
+
const parts = text.split(delimiter);
|
|
326
|
+
const { writer } = context;
|
|
327
|
+
parts.forEach((part, i) => {
|
|
328
|
+
writer.writeln(` ${writer.wrapInColor(String(i).padStart(3), CliForegroundColor.Yellow)} ${part}`);
|
|
329
|
+
});
|
|
330
|
+
context.process.output(parts);
|
|
331
|
+
},
|
|
332
|
+
writeDescription: (context) => {
|
|
333
|
+
const { writer } = context;
|
|
334
|
+
writer.writeln('Split a string into parts by a delimiter');
|
|
335
|
+
writer.writeln();
|
|
336
|
+
writer.writeln('📋 Usage:');
|
|
337
|
+
writer.writeln(` ${writer.wrapInColor('string split <text> [--by=<delimiter>]', CliForegroundColor.Cyan)}`);
|
|
338
|
+
writer.writeln();
|
|
339
|
+
writer.writeln('📝 Examples:');
|
|
340
|
+
writer.writeln(` string split "a,b,c" --by=, ${writer.wrapInColor('# → a b c', CliForegroundColor.Green)}`);
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
// -- Words --
|
|
344
|
+
{
|
|
345
|
+
command: 'words',
|
|
346
|
+
description: 'Split a string into words',
|
|
347
|
+
allowUnlistedCommands: true,
|
|
348
|
+
valueRequired: true,
|
|
349
|
+
processCommand: async (command, context) => {
|
|
350
|
+
const text = (command.value || command.data || '');
|
|
351
|
+
const words = lodash.words(text);
|
|
352
|
+
const { writer } = context;
|
|
353
|
+
writer.writeln(`${writer.wrapInColor(`${words.length} words:`, CliForegroundColor.Yellow)} ${words.join(', ')}`);
|
|
354
|
+
context.process.output(words);
|
|
355
|
+
},
|
|
356
|
+
writeDescription: (context) => {
|
|
357
|
+
const { writer } = context;
|
|
358
|
+
writer.writeln('Split a string into its component words');
|
|
359
|
+
writer.writeln();
|
|
360
|
+
writer.writeln('📋 Usage:');
|
|
361
|
+
writer.writeln(` ${writer.wrapInColor('string words <text>', CliForegroundColor.Cyan)}`);
|
|
362
|
+
writer.writeln();
|
|
363
|
+
writer.writeln('📝 Examples:');
|
|
364
|
+
writer.writeln(` string words "helloWorld" ${writer.wrapInColor('# → hello, World', CliForegroundColor.Green)}`);
|
|
365
|
+
writer.writeln(` string words "foo-bar_baz" ${writer.wrapInColor('# → foo, bar, baz', CliForegroundColor.Green)}`);
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
// -- Analysis --
|
|
369
|
+
{
|
|
370
|
+
command: 'length',
|
|
371
|
+
aliases: ['len'],
|
|
372
|
+
description: 'Get the length of a string',
|
|
373
|
+
allowUnlistedCommands: true,
|
|
374
|
+
valueRequired: true,
|
|
375
|
+
processCommand: async (command, context) => {
|
|
376
|
+
const text = (command.value || command.data || '');
|
|
377
|
+
context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${text.length}`);
|
|
378
|
+
context.process.output(text.length);
|
|
379
|
+
},
|
|
380
|
+
writeDescription: (context) => {
|
|
381
|
+
const { writer } = context;
|
|
382
|
+
writer.writeln('Get the character count of a string');
|
|
383
|
+
writer.writeln();
|
|
384
|
+
writer.writeln('📋 Usage:');
|
|
385
|
+
writer.writeln(` ${writer.wrapInColor('string length <text>', CliForegroundColor.Cyan)}`);
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
command: 'wc',
|
|
390
|
+
aliases: ['wordcount', 'count'],
|
|
391
|
+
description: 'Count lines, words, characters, and bytes',
|
|
392
|
+
allowUnlistedCommands: true,
|
|
393
|
+
valueRequired: true,
|
|
394
|
+
processCommand: async (command, context) => {
|
|
395
|
+
const text = (command.value || command.data || '');
|
|
396
|
+
const { writer } = context;
|
|
397
|
+
const lines = text.split(/\r?\n/).length;
|
|
398
|
+
const wordCount = text.trim() ? text.trim().split(/\s+/).length : 0;
|
|
399
|
+
const chars = text.length;
|
|
400
|
+
const bytes = new TextEncoder().encode(text).length;
|
|
401
|
+
writer.writeln(` ${writer.wrapInColor('Lines:', CliForegroundColor.Cyan)} ${lines}`);
|
|
402
|
+
writer.writeln(` ${writer.wrapInColor('Words:', CliForegroundColor.Cyan)} ${wordCount}`);
|
|
403
|
+
writer.writeln(` ${writer.wrapInColor('Characters:', CliForegroundColor.Cyan)} ${chars}`);
|
|
404
|
+
writer.writeln(` ${writer.wrapInColor('Bytes:', CliForegroundColor.Cyan)} ${bytes}`);
|
|
405
|
+
context.process.output({ lines, words: wordCount, chars, bytes });
|
|
406
|
+
},
|
|
407
|
+
writeDescription: (context) => {
|
|
408
|
+
const { writer } = context;
|
|
409
|
+
writer.writeln('Count lines, words, characters, and bytes in text');
|
|
410
|
+
writer.writeln();
|
|
411
|
+
writer.writeln('📋 Usage:');
|
|
412
|
+
writer.writeln(` ${writer.wrapInColor('string wc <text>', CliForegroundColor.Cyan)}`);
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
command: 'includes',
|
|
417
|
+
aliases: ['contains', 'has'],
|
|
418
|
+
description: 'Check if a string contains a substring',
|
|
419
|
+
allowUnlistedCommands: true,
|
|
420
|
+
valueRequired: true,
|
|
421
|
+
parameters: [
|
|
422
|
+
{
|
|
423
|
+
name: 'find',
|
|
424
|
+
aliases: ['f'],
|
|
425
|
+
description: 'Substring to search for',
|
|
426
|
+
type: 'string',
|
|
427
|
+
required: true,
|
|
428
|
+
},
|
|
429
|
+
],
|
|
430
|
+
processCommand: async (command, context) => {
|
|
431
|
+
const text = (command.value || command.data || '');
|
|
432
|
+
const find = command.args['find'] || command.args['f'] || '';
|
|
433
|
+
const result = text.includes(find);
|
|
434
|
+
const { writer } = context;
|
|
435
|
+
if (result) {
|
|
436
|
+
writer.writeSuccess(`"${find}" found in string`);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
writer.writeError(`"${find}" not found in string`);
|
|
440
|
+
}
|
|
441
|
+
context.process.output(result);
|
|
442
|
+
},
|
|
443
|
+
writeDescription: (context) => {
|
|
444
|
+
const { writer } = context;
|
|
445
|
+
writer.writeln('Check if a string contains a given substring');
|
|
446
|
+
writer.writeln();
|
|
447
|
+
writer.writeln('📋 Usage:');
|
|
448
|
+
writer.writeln(` ${writer.wrapInColor('string includes <text> --find=<substring>', CliForegroundColor.Cyan)}`);
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
command: 'startsWith',
|
|
453
|
+
description: 'Check if a string starts with a prefix',
|
|
454
|
+
allowUnlistedCommands: true,
|
|
455
|
+
valueRequired: true,
|
|
456
|
+
parameters: [
|
|
457
|
+
{
|
|
458
|
+
name: 'find',
|
|
459
|
+
aliases: ['f'],
|
|
460
|
+
description: 'Prefix to check',
|
|
461
|
+
type: 'string',
|
|
462
|
+
required: true,
|
|
463
|
+
},
|
|
464
|
+
],
|
|
465
|
+
processCommand: async (command, context) => {
|
|
466
|
+
const text = (command.value || command.data || '');
|
|
467
|
+
const find = command.args['find'] || command.args['f'] || '';
|
|
468
|
+
const result = text.startsWith(find);
|
|
469
|
+
const { writer } = context;
|
|
470
|
+
writer.writeln(`${writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
|
|
471
|
+
context.process.output(result);
|
|
472
|
+
},
|
|
473
|
+
writeDescription: (context) => {
|
|
474
|
+
const { writer } = context;
|
|
475
|
+
writer.writeln('Check if a string starts with a given prefix');
|
|
476
|
+
writer.writeln();
|
|
477
|
+
writer.writeln('📋 Usage:');
|
|
478
|
+
writer.writeln(` ${writer.wrapInColor('string startsWith <text> --find=<prefix>', CliForegroundColor.Cyan)}`);
|
|
479
|
+
},
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
command: 'endsWith',
|
|
483
|
+
description: 'Check if a string ends with a suffix',
|
|
484
|
+
allowUnlistedCommands: true,
|
|
485
|
+
valueRequired: true,
|
|
486
|
+
parameters: [
|
|
487
|
+
{
|
|
488
|
+
name: 'find',
|
|
489
|
+
aliases: ['f'],
|
|
490
|
+
description: 'Suffix to check',
|
|
491
|
+
type: 'string',
|
|
492
|
+
required: true,
|
|
493
|
+
},
|
|
494
|
+
],
|
|
495
|
+
processCommand: async (command, context) => {
|
|
496
|
+
const text = (command.value || command.data || '');
|
|
497
|
+
const find = command.args['find'] || command.args['f'] || '';
|
|
498
|
+
const result = text.endsWith(find);
|
|
499
|
+
const { writer } = context;
|
|
500
|
+
writer.writeln(`${writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
|
|
501
|
+
context.process.output(result);
|
|
502
|
+
},
|
|
503
|
+
writeDescription: (context) => {
|
|
504
|
+
const { writer } = context;
|
|
505
|
+
writer.writeln('Check if a string ends with a given suffix');
|
|
506
|
+
writer.writeln();
|
|
507
|
+
writer.writeln('📋 Usage:');
|
|
508
|
+
writer.writeln(` ${writer.wrapInColor('string endsWith <text> --find=<suffix>', CliForegroundColor.Cyan)}`);
|
|
509
|
+
},
|
|
15
510
|
},
|
|
16
|
-
|
|
511
|
+
];
|
|
17
512
|
}
|
|
18
513
|
async processCommand(command, context) {
|
|
19
514
|
context.executor.showHelp(command, context);
|
|
20
515
|
}
|
|
21
516
|
writeDescription(context) {
|
|
22
|
-
|
|
23
|
-
|
|
517
|
+
const { writer } = context;
|
|
518
|
+
writer.writeln('String manipulation and analysis commands');
|
|
519
|
+
writer.writeln();
|
|
520
|
+
writer.writeln(writer.wrapInColor('🔠 Case Conversions:', CliForegroundColor.Yellow));
|
|
521
|
+
writer.writeln(` ${writer.wrapInColor('string upper', CliForegroundColor.Cyan)} / ${writer.wrapInColor('lower', CliForegroundColor.Cyan)} / ${writer.wrapInColor('capitalize', CliForegroundColor.Cyan)}`);
|
|
522
|
+
writer.writeln(` ${writer.wrapInColor('string camelCase', CliForegroundColor.Cyan)} / ${writer.wrapInColor('kebabCase', CliForegroundColor.Cyan)} / ${writer.wrapInColor('snakeCase', CliForegroundColor.Cyan)} / ${writer.wrapInColor('startCase', CliForegroundColor.Cyan)}`);
|
|
523
|
+
writer.writeln();
|
|
524
|
+
writer.writeln(writer.wrapInColor('🔧 Transform:', CliForegroundColor.Yellow));
|
|
525
|
+
writer.writeln(` ${writer.wrapInColor('string reverse', CliForegroundColor.Cyan)} / ${writer.wrapInColor('trim', CliForegroundColor.Cyan)} / ${writer.wrapInColor('slug', CliForegroundColor.Cyan)} / ${writer.wrapInColor('repeat', CliForegroundColor.Cyan)} / ${writer.wrapInColor('replace', CliForegroundColor.Cyan)} / ${writer.wrapInColor('truncate', CliForegroundColor.Cyan)}`);
|
|
526
|
+
writer.writeln(` ${writer.wrapInColor('string pad', CliForegroundColor.Cyan)} / ${writer.wrapInColor('escape', CliForegroundColor.Cyan)} / ${writer.wrapInColor('unescape', CliForegroundColor.Cyan)}`);
|
|
527
|
+
writer.writeln();
|
|
528
|
+
writer.writeln(writer.wrapInColor('🔍 Analysis:', CliForegroundColor.Yellow));
|
|
529
|
+
writer.writeln(` ${writer.wrapInColor('string length', CliForegroundColor.Cyan)} / ${writer.wrapInColor('wc', CliForegroundColor.Cyan)} / ${writer.wrapInColor('includes', CliForegroundColor.Cyan)} / ${writer.wrapInColor('startsWith', CliForegroundColor.Cyan)} / ${writer.wrapInColor('endsWith', CliForegroundColor.Cyan)}`);
|
|
530
|
+
writer.writeln(` ${writer.wrapInColor('string split', CliForegroundColor.Cyan)} / ${writer.wrapInColor('words', CliForegroundColor.Cyan)}`);
|
|
531
|
+
writer.writeln();
|
|
532
|
+
writer.writeln('📝 Examples:');
|
|
533
|
+
writer.writeln(` string camelCase "hello world" ${writer.wrapInColor('# → helloWorld', CliForegroundColor.Green)}`);
|
|
534
|
+
writer.writeln(` string reverse Hello ${writer.wrapInColor('# → olleH', CliForegroundColor.Green)}`);
|
|
535
|
+
writer.writeln(` string slug "Hello World!" ${writer.wrapInColor('# → hello-world', CliForegroundColor.Green)}`);
|
|
536
|
+
writer.writeln(` string wc "some text here" ${writer.wrapInColor('# word/char counts', CliForegroundColor.Green)}`);
|
|
24
537
|
}
|
|
25
538
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliStringCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
26
539
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliStringCommandProcessor }); }
|
|
@@ -28,4 +541,4 @@ export class CliStringCommandProcessor {
|
|
|
28
541
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliStringCommandProcessor, decorators: [{
|
|
29
542
|
type: Injectable
|
|
30
543
|
}], ctorParameters: function () { return []; } });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmluZy9zcmMvbGliL3Byb2Nlc3NvcnMvY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFFSCxvQkFBb0IsRUFHcEIsZUFBZSxHQUNsQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDOztBQUc1QixNQUFNLE9BQU8seUJBQXlCO0lBU2xDO1FBUkEsWUFBTyxHQUFHLFFBQVEsQ0FBQztRQUVuQixnQkFBVyxHQUFHLGlCQUFpQixDQUFDO1FBRWhDLFdBQU0sR0FBRyxvQkFBb0IsQ0FBQztRQUU5QixlQUFVLEdBQXdDLEVBQUUsQ0FBQztRQUdqRCxJQUFJLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUUsQ0FBUyxDQUFDLE9BQU8sRUFBRTtZQUMzRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUM7Z0JBQ3ZELE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDakIsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUNoQixPQUEwQixFQUMxQixPQUE2QjtRQUU3QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQTZCO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNsQiwwREFBMEQsQ0FDN0QsQ0FBQztRQUNGLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDckUsQ0FBQzsrR0E5QlEseUJBQXlCO21IQUF6Qix5QkFBeUI7OzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIERlZmF1bHRMaWJyYXJ5QXV0aG9yLFxuICAgIElDbGlDb21tYW5kUHJvY2Vzc29yLFxuICAgIElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgIE9iamVjdERlc2NyaWJlcixcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ2xpU3RyaW5nQ29tbWFuZFByb2Nlc3NvciBpbXBsZW1lbnRzIElDbGlDb21tYW5kUHJvY2Vzc29yIHtcbiAgICBjb21tYW5kID0gJ3N0cmluZyc7XG5cbiAgICBkZXNjcmlwdGlvbiA9ICdTdHJpbmcgY29tbWFuZHMnO1xuXG4gICAgYXV0aG9yID0gRGVmYXVsdExpYnJhcnlBdXRob3I7XG5cbiAgICBwcm9jZXNzb3JzPzogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSB8IHVuZGVmaW5lZCA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc29ycyA9IE9iamVjdERlc2NyaWJlci5kZXNjcmliZSgoXyBhcyBhbnkpLmRlZmF1bHQsIHtcbiAgICAgICAgICAgIGZpbHRlcjogKHsgYXJncyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2tpcCA9IGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3NbMF0gIT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIHJldHVybiAhc2tpcDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NDb21tYW5kKFxuICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnRleHQuZXhlY3V0b3Iuc2hvd0hlbHAoY29tbWFuZCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgd3JpdGVEZXNjcmlwdGlvbihjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgXCJQcm92aWRlcyBzdHJpbmcgY29tbWFuZHMgdXNpbmcgbG9kYXNoJ3Mgc3RyaW5nIGZ1bmN0aW9uc1wiLFxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdEb2N1bWVudGF0aW9uOiBodHRwczovL2xvZGFzaC5jb20vZG9jcycpO1xuICAgIH1cbn1cbiJdfQ==
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmluZy9zcmMvbGliL3Byb2Nlc3NvcnMvY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDSCxrQkFBa0IsRUFHbEIsb0JBQW9CLEdBR3ZCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFN0MsTUFBTSxNQUFNLEdBQUksQ0FBUyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFFdkM7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FDcEIsT0FBZSxFQUNmLFdBQW1CLEVBQ25CLFNBQW1DLEVBQ25DLE9BR0M7SUFFRCxPQUFPO1FBQ0gsT0FBTztRQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN6QixXQUFXO1FBQ1gscUJBQXFCLEVBQUUsSUFBSTtRQUMzQixhQUFhLEVBQUUsSUFBSTtRQUNuQixjQUFjLEVBQUUsS0FBSyxFQUNqQixHQUFzQixFQUN0QixPQUE2QixFQUMvQixFQUFFO1lBQ0EsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFXLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FDbEYs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LEVBQUUsQ0FBQyxDQUFDO1FBQzVILE1BQU0sQ0FBQyxPQUFPLENBQUMsMENBQTBDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25JLENBQUM7K0dBam9CUSx5QkFBeUI7bUhBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ2xpRm9yZWdyb3VuZENvbG9yLFxuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIENsaVByb2Nlc3Nvck1ldGFkYXRhLFxuICAgIERlZmF1bHRMaWJyYXJ5QXV0aG9yLFxuICAgIElDbGlDb21tYW5kUHJvY2Vzc29yLFxuICAgIElDbGlFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICdAcW9kYWxpcy9jbGktY29yZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBMSUJSQVJZX1ZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcblxuY29uc3QgbG9kYXNoID0gKF8gYXMgYW55KS5kZWZhdWx0IHx8IF87XG5cbi8qKlxuICogSGVscGVyIHRvIGNyZWF0ZSBhIHNpbXBsZSBzdHJpbmcgdHJhbnNmb3JtIHN1YmNvbW1hbmRcbiAqL1xuZnVuY3Rpb24gc3RyaW5nVHJhbnNmb3JtKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHRyYW5zZm9ybTogKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICAgIGFsaWFzZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgZXhhbXBsZT86IHsgaW5wdXQ6IHN0cmluZzsgb3V0cHV0OiBzdHJpbmcgfTtcbiAgICB9LFxuKTogSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFsaWFzZXM6IG9wdGlvbnM/LmFsaWFzZXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICBjbWQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjbWQudmFsdWUgfHwgY21kLmRhdGEgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zZm9ybSh0ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgYCR7Y29udGV4dC53cml0ZXIud3JhcEluQ29sb3IoJ1Jlc3VsdDogJywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9JHtyZXN1bHR9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbihkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcihgc3RyaW5nICR7Y29tbWFuZH0gPHRleHQ+YCwgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmV4YW1wbGUpIHtcbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICBgICBzdHJpbmcgJHtjb21tYW5kfSAke29wdGlvbnMuZXhhbXBsZS5pbnB1dC5wYWRFbmQoMjApfSAke3dyaXRlci53cmFwSW5Db2xvcihgIyDihpIgJHtvcHRpb25zLmV4YW1wbGUub3V0cHV0fWAsIENsaUZvcmVncm91bmRDb2xvci5HcmVlbil9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDbGlTdHJpbmdDb21tYW5kUHJvY2Vzc29yIGltcGxlbWVudHMgSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIGNvbW1hbmQgPSAnc3RyaW5nJztcblxuICAgIGFsaWFzZXMgPSBbJ3N0ciddO1xuXG4gICAgZGVzY3JpcHRpb24gPSAnU3RyaW5nIG1hbmlwdWxhdGlvbiBjb21tYW5kcyc7XG5cbiAgICBhdXRob3IgPSBEZWZhdWx0TGlicmFyeUF1dGhvcjtcblxuICAgIHZlcnNpb24gPSBMSUJSQVJZX1ZFUlNJT047XG5cbiAgICBwcm9jZXNzb3JzPzogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSA9IFtdO1xuXG4gICAgbWV0YWRhdGE/OiBDbGlQcm9jZXNzb3JNZXRhZGF0YSA9IHtcbiAgICAgICAgaWNvbjogJ/CflKQnLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzb3JzID0gW1xuICAgICAgICAgICAgLy8gLS0gQ2FzZSBjb252ZXJzaW9ucyAtLVxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd1cHBlcicsICdDb252ZXJ0IHRvIFVQUEVSQ0FTRScsICh0KSA9PiB0LnRvVXBwZXJDYXNlKCksIHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3VwcGVyY2FzZScsICd0b1VwcGVyJ10sXG4gICAgICAgICAgICAgICAgZXhhbXBsZTogeyBpbnB1dDogJ2hlbGxvIHdvcmxkJywgb3V0cHV0OiAnSEVMTE8gV09STEQnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN0cmluZ1RyYW5zZm9ybSgnbG93ZXInLCAnQ29udmVydCB0byBsb3dlcmNhc2UnLCAodCkgPT4gdC50b0xvd2VyQ2FzZSgpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWydsb3dlcmNhc2UnLCAndG9Mb3dlciddLFxuICAgICAgICAgICAgICAgIGV4YW1wbGU6IHsgaW5wdXQ6ICdIRUxMTyBXT1JMRCcsIG91dHB1dDogJ2hlbGxvIHdvcmxkJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ2NhcGl0YWxpemUnLCAnQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyJywgKHQpID0+IGxvZGFzaC5jYXBpdGFsaXplKHQpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWydjYXAnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnaGVsbG8gd29ybGQnLCBvdXRwdXQ6ICdIZWxsbyB3b3JsZCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCdjYW1lbENhc2UnLCAnQ29udmVydCB0byBjYW1lbENhc2UnLCAodCkgPT4gbG9kYXNoLmNhbWVsQ2FzZSh0KSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnY2FtZWwnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnaGVsbG8gd29ybGQnLCBvdXRwdXQ6ICdoZWxsb1dvcmxkJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ2tlYmFiQ2FzZScsICdDb252ZXJ0IHRvIGtlYmFiLWNhc2UnLCAodCkgPT4gbG9kYXNoLmtlYmFiQ2FzZSh0KSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsna2ViYWInXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnSGVsbG8gV29ybGQnLCBvdXRwdXQ6ICdoZWxsby13b3JsZCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCdzbmFrZUNhc2UnLCAnQ29udmVydCB0byBzbmFrZV9jYXNlJywgKHQpID0+IGxvZGFzaC5zbmFrZUNhc2UodCksIHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3NuYWtlJ10sXG4gICAgICAgICAgICAgICAgZXhhbXBsZTogeyBpbnB1dDogJ0hlbGxvIFdvcmxkJywgb3V0cHV0OiAnaGVsbG9fd29ybGQnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN0cmluZ1RyYW5zZm9ybSgnc3RhcnRDYXNlJywgJ0NvbnZlcnQgdG8gU3RhcnQgQ2FzZScsICh0KSA9PiBsb2Rhc2guc3RhcnRDYXNlKHQpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWyd0aXRsZScsICd0aXRsZUNhc2UnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnaGVsbG8td29ybGQnLCBvdXRwdXQ6ICdIZWxsbyBXb3JsZCcgfSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyAtLSBUcmltbWluZyAtLVxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd0cmltJywgJ1JlbW92ZSB3aGl0ZXNwYWNlIGZyb20gYm90aCBlbmRzJywgKHQpID0+IHQudHJpbSgpLCB7XG4gICAgICAgICAgICAgICAgZXhhbXBsZTogeyBpbnB1dDogJ1wiICBoZWxsbyAgXCInLCBvdXRwdXQ6ICdoZWxsbycgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd0cmltU3RhcnQnLCAnUmVtb3ZlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQnLCAodCkgPT4gdC50cmltU3RhcnQoKSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnbHRyaW0nXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCIgIGhlbGxvXCInLCBvdXRwdXQ6ICdoZWxsbycgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd0cmltRW5kJywgJ1JlbW92ZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCcsICh0KSA9PiB0LnRyaW1FbmQoKSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsncnRyaW0nXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCJoZWxsbyAgXCInLCBvdXRwdXQ6ICdoZWxsbycgfSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyAtLSBUcmFuc2Zvcm0gLS1cbiAgICAgICAgICAgIHN0cmluZ1RyYW5zZm9ybSgncmV2ZXJzZScsICdSZXZlcnNlIGEgc3RyaW5nJywgKHQpID0+IFsuLi50XS5yZXZlcnNlKCkuam9pbignJyksIHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3JldiddLFxuICAgICAgICAgICAgICAgIGV4YW1wbGU6IHsgaW5wdXQ6ICdIZWxsbycsIG91dHB1dDogJ29sbGVIJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ3NsdWcnLCAnQ29udmVydCB0byBVUkwtZnJpZW5kbHkgc2x1ZycsICh0KSA9PlxuICAgICAgICAgICAgICAgIHQudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL14tfC0kL2csICcnKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnc2x1Z2lmeSddLFxuICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCJIZWxsbyBXb3JsZCFcIicsIG91dHB1dDogJ2hlbGxvLXdvcmxkJyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCdlc2NhcGUnLCAnRXNjYXBlIEhUTUwgZW50aXRpZXMnLCAodCkgPT4gbG9kYXNoLmVzY2FwZSh0KSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZXNjYXBlSHRtbCddLFxuICAgICAgICAgICAgICAgIGV4YW1wbGU6IHsgaW5wdXQ6ICdcIjxiPmhpPC9iPlwiJywgb3V0cHV0OiAnJmx0O2ImZ3Q7aGkmbHQ7L2ImZ3Q7JyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ3VuZXNjYXBlJywgJ1VuZXNjYXBlIEhUTUwgZW50aXRpZXMnLCAodCkgPT4gbG9kYXNoLnVuZXNjYXBlKHQpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWyd1bmVzY2FwZUh0bWwnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCImbHQ7YiZndDtcIicsIG91dHB1dDogJzxiPicgfSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyAtLSBSZXBlYXQgLS1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncmVwZWF0JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlcGVhdCBhIHN0cmluZyBOIHRpbWVzJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb3VudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ24nXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHJlcGV0aXRpb25zIChkZWZhdWx0OiAyKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlcGFyYXRvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3NlcCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTZXBhcmF0b3IgYmV0d2VlbiByZXBldGl0aW9ucyAoZGVmYXVsdDogbm9uZSknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoY29tbWFuZC52YWx1ZSB8fCBjb21tYW5kLmRhdGEgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBNYXRoLm1pbihwYXJzZUludChjb21tYW5kLmFyZ3NbJ2NvdW50J10gfHwgY29tbWFuZC5hcmdzWyduJ10pIHx8IDIsIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXAgPSBjb21tYW5kLmFyZ3NbJ3NlcGFyYXRvciddIHx8IGNvbW1hbmQuYXJnc1snc2VwJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFycmF5KGNvdW50KS5maWxsKHRleHQpLmpvaW4oc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKCdSZXN1bHQ6ICcsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfSR7cmVzdWx0fWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ1JlcGVhdCBhIHN0cmluZyBtdWx0aXBsZSB0aW1lcycpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHJlcGVhdCA8dGV4dD4gWy0tY291bnQ9Tl0gWy0tc2VwPVNdJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyByZXBlYXQgaGEgLS1jb3VudD0zICAgICAgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgaGFoYWhhJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyByZXBlYXQgYWIgLS1uPTMgLS1zZXA9LSAgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgYWItYWItYWInLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIC0tIFJlcGxhY2UgLS1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncmVwbGFjZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXBsYWNlIG9jY3VycmVuY2VzIGluIGEgc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUZXh0IHRvIGZpbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3dpdGgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWyd3J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlcGxhY2VtZW50IHRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kID0gY29tbWFuZC5hcmdzWydmaW5kJ10gfHwgY29tbWFuZC5hcmdzWydmJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gY29tbWFuZC5hcmdzWyd3aXRoJ10gfHwgY29tbWFuZC5hcmdzWyd3J10gfHwgJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUVycm9yKCctLWZpbmQgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQuc3BsaXQoZmluZCkuam9pbihyZXBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcignUmVzdWx0OiAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0ke3Jlc3VsdH1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cml0ZURlc2NyaXB0aW9uOiAoY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCdSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBhIHN1YnN0cmluZycpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHJlcGxhY2UgPHRleHQ+IC0tZmluZD08c2VhcmNoPiAtLXdpdGg9PHJlcGxhY2VtZW50PicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TnSBFeGFtcGxlczonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICBzdHJpbmcgcmVwbGFjZSBcImhlbGxvIHdvcmxkXCIgLS1maW5kPXdvcmxkIC0td2l0aD10aGVyZWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJyMg4oaSIGhlbGxvIHRoZXJlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyAtLSBUcnVuY2F0ZSAtLVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICd0cnVuY2F0ZScsXG4gICAgICAgICAgICAgICAgYWxpYXNlczogWyd0cnVuYyddLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVHJ1bmNhdGUgYSBzdHJpbmcgdG8gYSBtYXggbGVuZ3RoJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsZW5ndGgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWydsJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01heGltdW0gbGVuZ3RoIChkZWZhdWx0OiAzMCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdWZmaXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPbWlzc2lvbiBzdWZmaXggKGRlZmF1bHQ6IC4uLiknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoY29tbWFuZC52YWx1ZSB8fCBjb21tYW5kLmRhdGEgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoY29tbWFuZC5hcmdzWydsZW5ndGgnXSB8fCBjb21tYW5kLmFyZ3NbJ2wnXSkgfHwgMzA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNvbW1hbmQuYXJnc1snc3VmZml4J10gPz8gJy4uLic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQubGVuZ3RoID4gbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRleHQuc3Vic3RyaW5nKDAsIGxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICsgc3VmZml4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcignUmVzdWx0OiAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0ke3Jlc3VsdH1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cml0ZURlc2NyaXB0aW9uOiAoY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCdUcnVuY2F0ZSBhIHN0cmluZyB0byBhIG1heGltdW0gbGVuZ3RoIHdpdGggYW4gZWxsaXBzaXMnKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyB0cnVuY2F0ZSA8dGV4dD4gWy0tbGVuZ3RoPU5dIFstLXN1ZmZpeD1TXScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyAtLSBQYWQgLS1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncGFkJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1BhZCBhIHN0cmluZyB0byBhIHRhcmdldCBsZW5ndGgnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2xlbmd0aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2wnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGFyZ2V0IGxlbmd0aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY2hhcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGFkZGluZyBjaGFyYWN0ZXIgKGRlZmF1bHQ6IHNwYWNlKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQYWQgc2lkZTogbGVmdCwgcmlnaHQsIGJvdGggKGRlZmF1bHQ6IGJvdGgpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGNvbW1hbmQuYXJnc1snbGVuZ3RoJ10gfHwgY29tbWFuZC5hcmdzWydsJ10pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gY29tbWFuZC5hcmdzWydjaGFyJ10gfHwgY29tbWFuZC5hcmdzWydjJ10gfHwgJyAnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWRlID0gY29tbWFuZC5hcmdzWydzaWRlJ10gfHwgJ2JvdGgnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUVycm9yKCctLWxlbmd0aCBpcyByZXF1aXJlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRleHQucGFkU3RhcnQobGVuZ3RoLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGV4dC5wYWRFbmQobGVuZ3RoLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9kYXNoLnBhZCh0ZXh0LCBsZW5ndGgsIGNoYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKCdSZXN1bHQ6ICcsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfVwiJHtyZXN1bHR9XCJgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cml0ZURlc2NyaXB0aW9uOiAoY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCdQYWQgYSBzdHJpbmcgdG8gYSB0YXJnZXQgbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OLIFVzYWdlOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdHJpbmcgcGFkIDx0ZXh0PiAtLWxlbmd0aD1OIFstLWNoYXI9Q10gWy0tc2lkZT1sZWZ0fHJpZ2h0fGJvdGhdJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyBwYWQgaGVsbG8gLS1sZW5ndGg9MTAgLS1jaGFyPS4gLS1zaWRlPXJpZ2h0YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgXCJoZWxsby4uLi4uXCInLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIC0tIFNwbGl0IC0tXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3NwbGl0JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NwbGl0IGEgc3RyaW5nIGJ5IGEgZGVsaW1pdGVyJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdieScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2QnLCAnZGVsaW1pdGVyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0RlbGltaXRlciB0byBzcGxpdCBieSAoZGVmYXVsdDogc3BhY2UpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGltaXRlciA9IGNvbW1hbmQuYXJnc1snYnknXSB8fCBjb21tYW5kLmFyZ3NbJ2QnXSB8fCBjb21tYW5kLmFyZ3NbJ2RlbGltaXRlciddIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KGRlbGltaXRlcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKFN0cmluZyhpKS5wYWRTdGFydCgzKSwgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9ICAke3BhcnR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHBhcnRzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ1NwbGl0IGEgc3RyaW5nIGludG8gcGFydHMgYnkgYSBkZWxpbWl0ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBzcGxpdCA8dGV4dD4gWy0tYnk9PGRlbGltaXRlcj5dJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyBzcGxpdCBcImEsYixjXCIgLS1ieT0sICAgICAgJHt3cml0ZXIud3JhcEluQ29sb3IoJyMg4oaSIGEgIGIgIGMnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIC0tIFdvcmRzIC0tXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3dvcmRzJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NwbGl0IGEgc3RyaW5nIGludG8gd29yZHMnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3Jkczogc3RyaW5nW10gPSBsb2Rhc2gud29yZHModGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7d3JpdGVyLndyYXBJbkNvbG9yKGAke3dvcmRzLmxlbmd0aH0gd29yZHM6YCwgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9ICR7d29yZHMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHdvcmRzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ1NwbGl0IGEgc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudCB3b3JkcycpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHdvcmRzIDx0ZXh0PicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TnSBFeGFtcGxlczonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICBzdHJpbmcgd29yZHMgXCJoZWxsb1dvcmxkXCIgICAgICAgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgaGVsbG8sIFdvcmxkJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyB3b3JkcyBcImZvby1iYXJfYmF6XCIgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBmb28sIGJhciwgYmF6JywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyAtLSBBbmFseXNpcyAtLVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdsZW5ndGgnLFxuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnbGVuJ10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdHZXQgdGhlIGxlbmd0aCBvZiBhIHN0cmluZycsXG4gICAgICAgICAgICAgICAgYWxsb3dVbmxpc3RlZENvbW1hbmRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcignUmVzdWx0OiAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0ke3RleHQubGVuZ3RofWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQodGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbignR2V0IHRoZSBjaGFyYWN0ZXIgY291bnQgb2YgYSBzdHJpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBsZW5ndGggPHRleHQ+JywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3djJyxcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3dvcmRjb3VudCcsICdjb3VudCddLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ291bnQgbGluZXMsIHdvcmRzLCBjaGFyYWN0ZXJzLCBhbmQgYnl0ZXMnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRDb3VudCA9IHRleHQudHJpbSgpID8gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFycyA9IHRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignTGluZXM6JywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAgICAgICAke2xpbmVzfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ1dvcmRzOicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gICAgICAgJHt3b3JkQ291bnR9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignQ2hhcmFjdGVyczonLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9ICAke2NoYXJzfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ0J5dGVzOicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gICAgICAgJHtieXRlc31gLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQoeyBsaW5lcywgd29yZHM6IHdvcmRDb3VudCwgY2hhcnMsIGJ5dGVzIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbignQ291bnQgbGluZXMsIHdvcmRzLCBjaGFyYWN0ZXJzLCBhbmQgYnl0ZXMgaW4gdGV4dCcpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHdjIDx0ZXh0PicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdpbmNsdWRlcycsXG4gICAgICAgICAgICAgICAgYWxpYXNlczogWydjb250YWlucycsICdoYXMnXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgc3Vic3RyaW5nJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdWJzdHJpbmcgdG8gc2VhcmNoIGZvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmQgPSBjb21tYW5kLmFyZ3NbJ2ZpbmQnXSB8fCBjb21tYW5kLmFyZ3NbJ2YnXSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dC5pbmNsdWRlcyhmaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3VjY2VzcyhgXCIke2ZpbmR9XCIgZm91bmQgaW4gc3RyaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFcnJvcihgXCIke2ZpbmR9XCIgbm90IGZvdW5kIGluIHN0cmluZ2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ0NoZWNrIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgZ2l2ZW4gc3Vic3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OLIFVzYWdlOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdHJpbmcgaW5jbHVkZXMgPHRleHQ+IC0tZmluZD08c3Vic3RyaW5nPicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdzdGFydHNXaXRoJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgcHJlZml4JyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQcmVmaXggdG8gY2hlY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kID0gY29tbWFuZC5hcmdzWydmaW5kJ10gfHwgY29tbWFuZC5hcmdzWydmJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQuc3RhcnRzV2l0aChmaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt3cml0ZXIud3JhcEluQ29sb3IoJ1Jlc3VsdDogJywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9JHtyZXN1bHR9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZXNzLm91dHB1dChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbignQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggYSBnaXZlbiBwcmVmaXgnKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBzdGFydHNXaXRoIDx0ZXh0PiAtLWZpbmQ9PHByZWZpeD4nLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAnZW5kc1dpdGgnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgaWYgYSBzdHJpbmcgZW5kcyB3aXRoIGEgc3VmZml4JyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdWZmaXggdG8gY2hlY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kID0gY29tbWFuZC5hcmdzWydmaW5kJ10gfHwgY29tbWFuZC5hcmdzWydmJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQuZW5kc1dpdGgoZmluZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7d3JpdGVyLndyYXBJbkNvbG9yKCdSZXN1bHQ6ICcsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfSR7cmVzdWx0fWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ0NoZWNrIGlmIGEgc3RyaW5nIGVuZHMgd2l0aCBhIGdpdmVuIHN1ZmZpeCcpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIGVuZHNXaXRoIDx0ZXh0PiAtLWZpbmQ9PHN1ZmZpeD4nLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzQ29tbWFuZChcbiAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb250ZXh0LmV4ZWN1dG9yLnNob3dIZWxwKGNvbW1hbmQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHdyaXRlRGVzY3JpcHRpb24oY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKCdTdHJpbmcgbWFuaXB1bGF0aW9uIGFuZCBhbmFseXNpcyBjb21tYW5kcycpO1xuICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIHdyaXRlci53cmFwSW5Db2xvcign8J+UoCBDYXNlIENvbnZlcnNpb25zOicsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpLFxuICAgICAgICApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHVwcGVyJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdsb3dlcicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignY2FwaXRhbGl6ZScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBjYW1lbENhc2UnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ2tlYmFiQ2FzZScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignc25ha2VDYXNlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdGFydENhc2UnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgd3JpdGVyLndyYXBJbkNvbG9yKCfwn5SnIFRyYW5zZm9ybTonLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KSxcbiAgICAgICAgKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyByZXZlcnNlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd0cmltJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzbHVnJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdyZXBlYXQnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ3JlcGxhY2UnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ3RydW5jYXRlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHBhZCcsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignZXNjYXBlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd1bmVzY2FwZScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICB3cml0ZXIud3JhcEluQ29sb3IoJ/CflI0gQW5hbHlzaXM6JywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyksXG4gICAgICAgICk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdHJpbmcgbGVuZ3RoJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd3YycsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignaW5jbHVkZXMnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0YXJ0c1dpdGgnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ2VuZHNXaXRoJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHNwbGl0JywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd3b3JkcycsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk50gRXhhbXBsZXM6Jyk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgIHN0cmluZyBjYW1lbENhc2UgXCJoZWxsbyB3b3JsZFwiICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBoZWxsb1dvcmxkJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgc3RyaW5nIHJldmVyc2UgSGVsbG8gICAgICAgICAgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBvbGxlSCcsIENsaUZvcmVncm91bmRDb2xvci5HcmVlbil9YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgIHN0cmluZyBzbHVnIFwiSGVsbG8gV29ybGQhXCIgICAgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBoZWxsby13b3JsZCcsIENsaUZvcmVncm91bmRDb2xvci5HcmVlbil9YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgIHN0cmluZyB3YyBcInNvbWUgdGV4dCBoZXJlXCIgICAgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIHdvcmQvY2hhciBjb3VudHMnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWApO1xuICAgIH1cbn1cbiJdfQ==
|