@aitos/core 1.0.0 → 1.0.1

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/dist/acs.js ADDED
@@ -0,0 +1,719 @@
1
+ "use strict";
2
+ /**
3
+ * AITOS Compact Syntax (ACS)
4
+ *
5
+ * ACS is a compact representation of Graph JSON, designed for:
6
+ * - AI generation (10-20x more compact than JSON)
7
+ * - Human readability (for auditing AI output)
8
+ * - Unambiguous compilation to/from Graph JSON
9
+ *
10
+ * Syntax:
11
+ * graph <name> {
12
+ * [mode: kernel|user]
13
+ * [in: <type> | <name>: <type>, ...]
14
+ * [out: <type>]
15
+ *
16
+ * let <nodeId> = <atom>(<param>: <value>, ...)
17
+ * if <refNodeId> {
18
+ * <nodes...>
19
+ * } [else {
20
+ * <nodes...>
21
+ * }]
22
+ * loop [max: N] [cond: <storeKey>] {
23
+ * <nodes...>
24
+ * }
25
+ * forEach <itemKey> in <arrayRef> [max: N] {
26
+ * <nodes...>
27
+ * }
28
+ * }
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.AcsDecompiler = exports.AcsCompiler = exports.AcsParser = void 0;
32
+ exports.compileAcs = compileAcs;
33
+ exports.decompileAcs = decompileAcs;
34
+ class AcsParser {
35
+ constructor() {
36
+ this.pos = 0;
37
+ this.src = '';
38
+ }
39
+ parse(text) {
40
+ this.src = text.trim();
41
+ this.pos = 0;
42
+ return this.parseGraph();
43
+ }
44
+ parseGraph() {
45
+ this.expect('graph');
46
+ const name = this.readIdentifier();
47
+ this.expect('{');
48
+ const graph = { name, nodes: [] };
49
+ while (!this.peek('}') && this.pos < this.src.length) {
50
+ this.skipWhitespaceAndComments();
51
+ if (this.peek('mode:')) {
52
+ this.advance(5);
53
+ graph.mode = this.readIdentifier();
54
+ }
55
+ else if (this.peek('meta:')) {
56
+ this.advance(5);
57
+ graph.meta = this.parseMetaDecl();
58
+ }
59
+ else if (this.peek('in:')) {
60
+ this.advance(3);
61
+ graph.input = this.parseInputDecl();
62
+ }
63
+ else if (this.peek('out:')) {
64
+ this.advance(4);
65
+ graph.output = this.readIdentifier();
66
+ }
67
+ else if (this.peek('let')) {
68
+ graph.nodes.push(this.parseLet());
69
+ }
70
+ else if (this.peek('if')) {
71
+ graph.nodes.push(this.parseIf());
72
+ }
73
+ else if (this.peek('loop')) {
74
+ graph.nodes.push(this.parseLoop());
75
+ }
76
+ else if (this.peek('forEach')) {
77
+ graph.nodes.push(this.parseForEach());
78
+ }
79
+ else if (this.peek('filter')) {
80
+ graph.nodes.push(this.parseFilter());
81
+ }
82
+ else {
83
+ throw new Error(`ACS parse error at pos ${this.pos}: unexpected "${this.src.slice(this.pos, this.pos + 20)}"`);
84
+ }
85
+ this.skipWhitespaceAndComments();
86
+ }
87
+ this.expect('}');
88
+ return graph;
89
+ }
90
+ parseLet() {
91
+ this.expect('let');
92
+ const id = this.readIdentifier();
93
+ this.expect('=');
94
+ this.skipWhitespaceAndComments();
95
+ if (this.peek('if')) {
96
+ const ifNode = this.parseIf();
97
+ ifNode.id = id;
98
+ return ifNode;
99
+ }
100
+ if (this.peek('forEach')) {
101
+ const forEachNode = this.parseForEach();
102
+ forEachNode.id = id;
103
+ return forEachNode;
104
+ }
105
+ if (this.peek('loop')) {
106
+ const loopNode = this.parseLoop();
107
+ loopNode.id = id;
108
+ return loopNode;
109
+ }
110
+ if (this.peek('filter')) {
111
+ const filterNode = this.parseFilter();
112
+ filterNode.id = id;
113
+ return filterNode;
114
+ }
115
+ const atom = this.readIdentifier();
116
+ const params = this.parseParams();
117
+ return { type: 'let', id, atom, params };
118
+ }
119
+ parseIf() {
120
+ this.expect('if');
121
+ this.skipWhitespaceAndComments();
122
+ const savedPos = this.pos;
123
+ const firstIdent = this.readIdentifier();
124
+ this.skipWhitespaceAndComments();
125
+ let ref;
126
+ let inlineCondAtom;
127
+ if (this.peek('(')) {
128
+ const params = this.parseParams();
129
+ inlineCondAtom = { atom: firstIdent, params };
130
+ ref = `__inline_cond_${savedPos}`;
131
+ }
132
+ else {
133
+ ref = firstIdent;
134
+ }
135
+ this.expect('{');
136
+ const body = this.parseBody();
137
+ this.expect('}');
138
+ let elseBody;
139
+ this.skipWhitespaceAndComments();
140
+ if (this.peek('else')) {
141
+ this.advance(4);
142
+ this.expect('{');
143
+ elseBody = this.parseBody();
144
+ this.expect('}');
145
+ }
146
+ const ifNode = { type: 'if', ref, body, elseBody };
147
+ if (inlineCondAtom) {
148
+ ifNode.inlineCondAtom = inlineCondAtom;
149
+ }
150
+ return ifNode;
151
+ }
152
+ parseLoop() {
153
+ this.expect('loop');
154
+ let maxIterations;
155
+ let condKey;
156
+ this.skipWhitespaceAndComments();
157
+ if (this.peek('max:')) {
158
+ this.advance(4);
159
+ maxIterations = this.readNumber();
160
+ }
161
+ this.skipWhitespaceAndComments();
162
+ if (this.peek('cond:')) {
163
+ this.advance(5);
164
+ condKey = this.readString() || this.readIdentifier();
165
+ }
166
+ this.expect('{');
167
+ const body = this.parseBody();
168
+ this.expect('}');
169
+ return { type: 'loop', maxIterations, condKey, body };
170
+ }
171
+ parseForEach() {
172
+ this.expect('forEach');
173
+ const itemKey = this.readIdentifier();
174
+ let indexKey;
175
+ this.skipWhitespaceAndComments();
176
+ if (this.peek(',')) {
177
+ this.advance(1);
178
+ indexKey = this.readIdentifier();
179
+ }
180
+ this.expect('in');
181
+ const arrayRef = this.readIdentifier();
182
+ let maxItems;
183
+ this.skipWhitespaceAndComments();
184
+ if (this.peek('max:')) {
185
+ this.advance(4);
186
+ maxItems = this.readNumber();
187
+ }
188
+ this.expect('{');
189
+ const body = this.parseBody();
190
+ this.expect('}');
191
+ return { type: 'forEach', itemKey, indexKey, arrayRef, maxItems, body };
192
+ }
193
+ parseFilter() {
194
+ this.expect('filter');
195
+ const itemKey = this.readIdentifier();
196
+ let indexKey;
197
+ this.skipWhitespaceAndComments();
198
+ if (this.peek('index:')) {
199
+ this.advance(6);
200
+ indexKey = this.readIdentifier();
201
+ }
202
+ this.expect('in');
203
+ const arrayRef = this.readIdentifier();
204
+ this.expect('{');
205
+ const body = this.parseBody();
206
+ this.expect('}');
207
+ return { type: 'filter', itemKey, indexKey, arrayRef, body };
208
+ }
209
+ parseBody() {
210
+ const nodes = [];
211
+ this.skipWhitespaceAndComments();
212
+ while (!this.peek('}') && this.pos < this.src.length) {
213
+ if (this.peek('let'))
214
+ nodes.push(this.parseLet());
215
+ else if (this.peek('if'))
216
+ nodes.push(this.parseIf());
217
+ else if (this.peek('loop'))
218
+ nodes.push(this.parseLoop());
219
+ else if (this.peek('forEach'))
220
+ nodes.push(this.parseForEach());
221
+ else if (this.peek('filter'))
222
+ nodes.push(this.parseFilter());
223
+ else
224
+ break;
225
+ this.skipWhitespaceAndComments();
226
+ }
227
+ return nodes;
228
+ }
229
+ parseParams() {
230
+ if (!this.peek('('))
231
+ return {};
232
+ this.advance(1); // skip (
233
+ const params = {};
234
+ while (!this.peek(')') && this.pos < this.src.length) {
235
+ const key = this.readIdentifier();
236
+ this.expect(':');
237
+ const value = this.readValue();
238
+ params[key] = value;
239
+ this.skipWhitespaceAndComments();
240
+ if (this.peek(','))
241
+ this.advance(1);
242
+ this.skipWhitespaceAndComments();
243
+ }
244
+ this.expect(')');
245
+ return params;
246
+ }
247
+ parseInputDecl() {
248
+ if (this.peek('none')) {
249
+ this.advance(4);
250
+ return [];
251
+ }
252
+ const result = [];
253
+ while (!this.peek('\n') && !this.peek('}') && this.pos < this.src.length) {
254
+ const name = this.readIdentifier();
255
+ this.expect(':');
256
+ const type = this.readIdentifier();
257
+ result.push({ name, type });
258
+ this.skipWhitespaceAndComments();
259
+ if (this.peek(','))
260
+ this.advance(1);
261
+ this.skipWhitespaceAndComments();
262
+ }
263
+ return result;
264
+ }
265
+ parseMetaDecl() {
266
+ this.expect('{');
267
+ const meta = {};
268
+ while (!this.peek('}') && this.pos < this.src.length) {
269
+ const key = this.readIdentifier();
270
+ this.expect(':');
271
+ meta[key] = this.readString() || this.readIdentifier();
272
+ this.skipWhitespaceAndComments();
273
+ if (this.peek(','))
274
+ this.advance(1);
275
+ this.skipWhitespaceAndComments();
276
+ }
277
+ this.expect('}');
278
+ return meta;
279
+ }
280
+ readValue() {
281
+ this.skipWhitespaceAndComments();
282
+ if (this.peek('"'))
283
+ return this.readString();
284
+ if (this.peek("'"))
285
+ return this.readString();
286
+ if (this.src[this.pos] === '-' || this.src[this.pos] >= '0' && this.src[this.pos] <= '9')
287
+ return this.readNumber();
288
+ if (this.peek('true')) {
289
+ this.advance(4);
290
+ return true;
291
+ }
292
+ if (this.peek('false')) {
293
+ this.advance(5);
294
+ return false;
295
+ }
296
+ if (this.peek('null')) {
297
+ this.advance(4);
298
+ return null;
299
+ }
300
+ if (this.peek('{{'))
301
+ return this.readReference();
302
+ if (this.peek('{'))
303
+ return this.readObject();
304
+ if (this.peek('['))
305
+ return this.readArray();
306
+ return this.readIdentifier();
307
+ }
308
+ readReference() {
309
+ const start = this.pos;
310
+ this.advance(2);
311
+ const ref = this.readUntil('}}');
312
+ this.advance(2);
313
+ return `{{${ref}}}`;
314
+ }
315
+ readObject() {
316
+ this.expect('{');
317
+ const obj = {};
318
+ this.skipWhitespaceAndComments();
319
+ while (!this.peek('}') && this.pos < this.src.length) {
320
+ let key;
321
+ if (this.peek('"') || this.peek("'")) {
322
+ key = this.readString();
323
+ }
324
+ else {
325
+ key = this.readIdentifier();
326
+ }
327
+ this.expect(':');
328
+ const value = this.readValue();
329
+ obj[key] = value;
330
+ this.skipWhitespaceAndComments();
331
+ if (this.peek(','))
332
+ this.advance(1);
333
+ this.skipWhitespaceAndComments();
334
+ }
335
+ this.expect('}');
336
+ return obj;
337
+ }
338
+ readArray() {
339
+ this.expect('[');
340
+ const arr = [];
341
+ this.skipWhitespaceAndComments();
342
+ while (!this.peek(']') && this.pos < this.src.length) {
343
+ arr.push(this.readValue());
344
+ this.skipWhitespaceAndComments();
345
+ if (this.peek(','))
346
+ this.advance(1);
347
+ this.skipWhitespaceAndComments();
348
+ }
349
+ this.expect(']');
350
+ return arr;
351
+ }
352
+ skipWhitespaceAndComments() {
353
+ while (this.pos < this.src.length) {
354
+ if (/\s/.test(this.src[this.pos])) {
355
+ this.pos++;
356
+ continue;
357
+ }
358
+ if (this.src[this.pos] === '/' && this.src[this.pos + 1] === '/') {
359
+ while (this.pos < this.src.length && this.src[this.pos] !== '\n')
360
+ this.pos++;
361
+ continue;
362
+ }
363
+ break;
364
+ }
365
+ }
366
+ peek(s) {
367
+ return this.src.slice(this.pos, this.pos + s.length) === s;
368
+ }
369
+ expect(s) {
370
+ this.skipWhitespaceAndComments();
371
+ if (!this.peek(s)) {
372
+ throw new Error(`ACS parse error at pos ${this.pos}: expected "${s}", got "${this.src.slice(this.pos, this.pos + 10)}"`);
373
+ }
374
+ this.pos += s.length;
375
+ }
376
+ advance(n) {
377
+ this.pos += n;
378
+ }
379
+ readIdentifier() {
380
+ this.skipWhitespaceAndComments();
381
+ let start = this.pos;
382
+ while (this.pos < this.src.length && /[a-zA-Z0-9_@\-/.]/.test(this.src[this.pos]))
383
+ this.pos++;
384
+ if (this.pos === start)
385
+ throw new Error(`ACS parse error at pos ${this.pos}: expected identifier`);
386
+ return this.src.slice(start, this.pos);
387
+ }
388
+ readNumber() {
389
+ this.skipWhitespaceAndComments();
390
+ let start = this.pos;
391
+ if (this.src[this.pos] === '-')
392
+ this.pos++;
393
+ while (this.pos < this.src.length && /[0-9.]/.test(this.src[this.pos]))
394
+ this.pos++;
395
+ return Number(this.src.slice(start, this.pos));
396
+ }
397
+ readString() {
398
+ this.skipWhitespaceAndComments();
399
+ const quote = this.src[this.pos];
400
+ if (quote !== '"' && quote !== "'")
401
+ throw new Error(`ACS parse error at pos ${this.pos}: expected string`);
402
+ this.pos++;
403
+ let result = '';
404
+ while (this.pos < this.src.length && this.src[this.pos] !== quote) {
405
+ if (this.src[this.pos] === '\\') {
406
+ this.pos++;
407
+ const ch = this.src[this.pos];
408
+ if (ch === 'n')
409
+ result += '\n';
410
+ else if (ch === 't')
411
+ result += '\t';
412
+ else if (ch === 'r')
413
+ result += '\r';
414
+ else if (ch === '\\')
415
+ result += '\\';
416
+ else if (ch === quote)
417
+ result += quote;
418
+ else if (ch === '{')
419
+ result += '\\{';
420
+ else
421
+ result += ch;
422
+ }
423
+ else {
424
+ result += this.src[this.pos];
425
+ }
426
+ this.pos++;
427
+ }
428
+ this.pos++;
429
+ return result;
430
+ }
431
+ readUntil(end) {
432
+ let result = '';
433
+ while (this.pos < this.src.length && !this.peek(end)) {
434
+ result += this.src[this.pos];
435
+ this.pos++;
436
+ }
437
+ return result;
438
+ }
439
+ }
440
+ exports.AcsParser = AcsParser;
441
+ class AcsCompiler {
442
+ compile(acsGraph) {
443
+ const graph = {
444
+ order: [],
445
+ nodes: {},
446
+ };
447
+ if (acsGraph.mode)
448
+ graph.mode = acsGraph.mode;
449
+ if (acsGraph.meta)
450
+ graph._meta = acsGraph.meta;
451
+ if (acsGraph.input && acsGraph.input.length > 0) {
452
+ graph.interface = {
453
+ input: acsGraph.input.map(i => ({ name: i.name, type: i.type })),
454
+ output: { type: acsGraph.output || 'void' },
455
+ };
456
+ }
457
+ this.compileNodes(acsGraph.nodes, graph);
458
+ return graph;
459
+ }
460
+ compileNodes(acsNodes, graph) {
461
+ for (const node of acsNodes) {
462
+ switch (node.type) {
463
+ case 'let': {
464
+ const graphNode = { atom: node.atom, ...node.params };
465
+ graph.order.push(node.id);
466
+ graph.nodes[node.id] = graphNode;
467
+ break;
468
+ }
469
+ case 'if': {
470
+ if (node.inlineCondAtom) {
471
+ const condNodeId = node.ref;
472
+ const condGraphNode = { atom: node.inlineCondAtom.atom, ...node.inlineCondAtom.params };
473
+ graph.order.push(condNodeId);
474
+ graph.nodes[condNodeId] = condGraphNode;
475
+ }
476
+ let ifNodeId;
477
+ if (node.id) {
478
+ ifNodeId = node.id;
479
+ }
480
+ else {
481
+ ifNodeId = `if_${node.ref}`;
482
+ if (graph.nodes[ifNodeId]) {
483
+ ifNodeId = `if_${node.ref}_${graph.order.length}`;
484
+ }
485
+ }
486
+ const thenGraph = this.compileSubGraph(node.body || []);
487
+ const elseGraph = node.elseBody ? this.compileSubGraph(node.elseBody) : undefined;
488
+ const graphNode = {
489
+ atom: 'branch',
490
+ cond: `{{${node.ref}}}`,
491
+ };
492
+ if (thenGraph.order.length > 0 || !elseGraph)
493
+ graphNode.then = thenGraph;
494
+ if (elseGraph)
495
+ graphNode.else = elseGraph;
496
+ graph.order.push(ifNodeId);
497
+ graph.nodes[ifNodeId] = graphNode;
498
+ break;
499
+ }
500
+ case 'loop': {
501
+ const loopNodeId = node.id || `loop_${graph.order.length}`;
502
+ const bodyGraph = this.compileSubGraph(node.body || []);
503
+ const graphNode = {
504
+ atom: 'loop',
505
+ nodes: bodyGraph,
506
+ };
507
+ if (node.maxIterations)
508
+ graphNode.maxIterations = node.maxIterations;
509
+ if (node.condKey)
510
+ graphNode.condKey = node.condKey;
511
+ graph.order.push(loopNodeId);
512
+ graph.nodes[loopNodeId] = graphNode;
513
+ break;
514
+ }
515
+ case 'forEach': {
516
+ const feNodeId = node.id || `forEach_${graph.order.length}`;
517
+ const bodyGraph = this.compileSubGraph(node.body || []);
518
+ const graphNode = {
519
+ atom: 'forEach',
520
+ array: `{{${node.arrayRef}}}`,
521
+ nodes: bodyGraph,
522
+ itemKey: node.itemKey,
523
+ };
524
+ if (node.indexKey)
525
+ graphNode.indexKey = node.indexKey;
526
+ if (node.maxItems)
527
+ graphNode.maxItems = node.maxItems;
528
+ graph.order.push(feNodeId);
529
+ graph.nodes[feNodeId] = graphNode;
530
+ break;
531
+ }
532
+ case 'filter': {
533
+ const fNodeId = node.id || `filter_${graph.order.length}`;
534
+ const bodyGraph = this.compileSubGraph(node.body || []);
535
+ const graphNode = {
536
+ atom: 'filter',
537
+ array: `{{${node.arrayRef}}}`,
538
+ nodes: bodyGraph,
539
+ itemKey: node.itemKey,
540
+ };
541
+ if (node.indexKey)
542
+ graphNode.indexKey = node.indexKey;
543
+ graph.order.push(fNodeId);
544
+ graph.nodes[fNodeId] = graphNode;
545
+ break;
546
+ }
547
+ }
548
+ }
549
+ }
550
+ compileSubGraph(acsNodes) {
551
+ const graph = { order: [], nodes: {} };
552
+ this.compileNodes(acsNodes, graph);
553
+ return graph;
554
+ }
555
+ }
556
+ exports.AcsCompiler = AcsCompiler;
557
+ class AcsDecompiler {
558
+ decompile(graph, name = 'unnamed') {
559
+ const lines = [];
560
+ lines.push(`graph ${name} {`);
561
+ if (graph.mode)
562
+ lines.push(` mode: ${graph.mode}`);
563
+ if (graph._meta) {
564
+ const parts = Object.entries(graph._meta).map(([k, v]) => `${k}: "${v}"`).join(', ');
565
+ lines.push(` meta: { ${parts} }`);
566
+ }
567
+ if (graph.interface) {
568
+ if (graph.interface.input.length === 0) {
569
+ lines.push(` in: none`);
570
+ }
571
+ else {
572
+ const inStr = graph.interface.input.map(i => `${i.name}: ${i.type}`).join(', ');
573
+ lines.push(` in: ${inStr}`);
574
+ }
575
+ lines.push(` out: ${graph.interface.output.type}`);
576
+ }
577
+ lines.push('');
578
+ for (const nodeId of graph.order) {
579
+ const node = graph.nodes[nodeId];
580
+ if (nodeId.startsWith('__inline_cond_') && node.atom !== 'branch')
581
+ continue;
582
+ lines.push(...this.decompileNode(nodeId, node, 1, graph.nodes));
583
+ }
584
+ lines.push('}');
585
+ return lines.join('\n');
586
+ }
587
+ decompileNode(nodeId, node, indent, allNodes) {
588
+ const prefix = ' '.repeat(indent);
589
+ const lines = [];
590
+ if (node.atom === 'branch') {
591
+ const condRef = this.extractCondRef(node.cond);
592
+ const isNamedIf = nodeId && !nodeId.startsWith('if_');
593
+ const ifPrefix = isNamedIf ? `${prefix}let ${nodeId} = ` : '';
594
+ let condStr = condRef || nodeId;
595
+ if (condRef && condRef.startsWith('__inline_cond_') && allNodes && allNodes[condRef]) {
596
+ const condNode = allNodes[condRef];
597
+ const condParams = this.formatParams(condNode);
598
+ condStr = `${condNode.atom}(${condParams})`;
599
+ lines.push(`${ifPrefix}if ${condStr} {`);
600
+ }
601
+ else {
602
+ lines.push(`${ifPrefix}if ${condStr} {`);
603
+ }
604
+ if (node.then)
605
+ lines.push(...this.decompileSubGraph(node.then, indent + 1));
606
+ if (node.else) {
607
+ lines.push(`${prefix}} else {`);
608
+ lines.push(...this.decompileSubGraph(node.else, indent + 1));
609
+ }
610
+ lines.push(`${prefix}}`);
611
+ }
612
+ else if (node.atom === 'loop') {
613
+ const isNamedLoop = nodeId && !nodeId.startsWith('loop_');
614
+ const loopPrefix = isNamedLoop ? `${prefix}let ${nodeId} = ` : '';
615
+ const extras = [];
616
+ if (node.maxIterations)
617
+ extras.push(`max: ${node.maxIterations}`);
618
+ if (node.condKey)
619
+ extras.push(`cond: "${node.condKey}"`);
620
+ lines.push(`${loopPrefix}loop ${extras.join(' ')} {`);
621
+ if (node.nodes)
622
+ lines.push(...this.decompileSubGraph(node.nodes, indent + 1));
623
+ lines.push(`${prefix}}`);
624
+ }
625
+ else if (node.atom === 'forEach') {
626
+ const isNamedForEach = nodeId && !nodeId.startsWith('forEach_');
627
+ const fePrefix = isNamedForEach ? `${prefix}let ${nodeId} = ` : '';
628
+ const extras = [];
629
+ if (node.maxItems)
630
+ extras.push(`max: ${node.maxItems}`);
631
+ const idx = node.indexKey ? `, ${node.indexKey}` : '';
632
+ lines.push(`${fePrefix}forEach ${node.itemKey || 'item'}${idx} in ${this.extractArrayRef(node.array)} ${extras.join(' ')} {`);
633
+ if (node.nodes)
634
+ lines.push(...this.decompileSubGraph(node.nodes, indent + 1));
635
+ lines.push(`${prefix}}`);
636
+ }
637
+ else if (node.atom === 'filter') {
638
+ const isNamedFilter = nodeId && !nodeId.startsWith('filter_');
639
+ const fPrefix = isNamedFilter ? `${prefix}let ${nodeId} = ` : '';
640
+ const idx = node.indexKey ? ` index: ${node.indexKey}` : '';
641
+ lines.push(`${fPrefix}filter ${node.itemKey || 'item'}${idx} in ${this.extractArrayRef(node.array)} {`);
642
+ if (node.nodes)
643
+ lines.push(...this.decompileSubGraph(node.nodes, indent + 1));
644
+ lines.push(`${prefix}}`);
645
+ }
646
+ else {
647
+ const params = this.formatParams(node);
648
+ lines.push(`${prefix}let ${nodeId} = ${node.atom}(${params})`);
649
+ }
650
+ return lines;
651
+ }
652
+ decompileSubGraph(graph, indent) {
653
+ const lines = [];
654
+ for (const nodeId of graph.order) {
655
+ if (nodeId.startsWith('__inline_cond_') && graph.nodes[nodeId].atom !== 'branch')
656
+ continue;
657
+ lines.push(...this.decompileNode(nodeId, graph.nodes[nodeId], indent, graph.nodes));
658
+ }
659
+ return lines;
660
+ }
661
+ formatParams(node) {
662
+ const SKIP = new Set(['atom', 'nodes', 'then', 'else', 'cond', 'maxIterations', 'itemKey', 'maxItems']);
663
+ if (node.atom === 'forEach' || node.atom === 'filter')
664
+ SKIP.add('array');
665
+ const parts = [];
666
+ for (const [key, value] of Object.entries(node)) {
667
+ if (SKIP.has(key))
668
+ continue;
669
+ parts.push(`${key}: ${this.formatValue(value)}`);
670
+ }
671
+ return parts.join(', ');
672
+ }
673
+ formatValue(value) {
674
+ if (typeof value === 'string') {
675
+ const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t');
676
+ return `"${escaped}"`;
677
+ }
678
+ if (typeof value === 'number' || typeof value === 'boolean')
679
+ return String(value);
680
+ if (value === null)
681
+ return 'null';
682
+ if (Array.isArray(value))
683
+ return `[${value.map(v => this.formatValue(v)).join(', ')}]`;
684
+ if (typeof value === 'object') {
685
+ const parts = Object.entries(value).map(([k, v]) => {
686
+ const keyStr = /^[a-zA-Z_]\w*$/.test(k) ? k : `"${k}"`;
687
+ return `${keyStr}: ${this.formatValue(v)}`;
688
+ });
689
+ return `{ ${parts.join(', ')} }`;
690
+ }
691
+ return String(value);
692
+ }
693
+ extractArrayRef(array) {
694
+ if (typeof array === 'string' && array.startsWith('{{')) {
695
+ const match = array.match(/^\{\{(\w+)\}\}$/);
696
+ return match ? match[1] : array;
697
+ }
698
+ return String(array);
699
+ }
700
+ extractCondRef(cond) {
701
+ if (typeof cond === 'string' && cond.startsWith('{{')) {
702
+ const match = cond.match(/^\{\{(\w+)(?:\.(.+?))?\}\}$/);
703
+ return match ? (match[2] ? `${match[1]}.${match[2]}` : match[1]) : String(cond);
704
+ }
705
+ return String(cond);
706
+ }
707
+ }
708
+ exports.AcsDecompiler = AcsDecompiler;
709
+ function compileAcs(text) {
710
+ const parser = new AcsParser();
711
+ const ast = parser.parse(text);
712
+ const compiler = new AcsCompiler();
713
+ return compiler.compile(ast);
714
+ }
715
+ function decompileAcs(graph, name) {
716
+ const decompiler = new AcsDecompiler();
717
+ return decompiler.decompile(graph, name);
718
+ }
719
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Fjcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRzs7O0FBaXJCSCxnQ0FLQztBQUVELG9DQUdDO0FBN3BCRCxNQUFhLFNBQVM7SUFBdEI7UUFDVSxRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsUUFBRyxHQUFHLEVBQUUsQ0FBQztJQXdZbkIsQ0FBQztJQXRZQyxLQUFLLENBQUMsSUFBWTtRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakIsTUFBTSxLQUFLLEdBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUVqQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUF1QixDQUFDO1lBQzFELENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7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Q0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBN0lELHNDQTZJQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ25DLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLEtBQVksRUFBRSxJQUFhO0lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDdkMsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBSVRPUyBDb21wYWN0IFN5bnRheCAoQUNTKVxuICpcbiAqIEFDUyBpcyBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgR3JhcGggSlNPTiwgZGVzaWduZWQgZm9yOlxuICogLSBBSSBnZW5lcmF0aW9uICgxMC0yMHggbW9yZSBjb21wYWN0IHRoYW4gSlNPTilcbiAqIC0gSHVtYW4gcmVhZGFiaWxpdHkgKGZvciBhdWRpdGluZyBBSSBvdXRwdXQpXG4gKiAtIFVuYW1iaWd1b3VzIGNvbXBpbGF0aW9uIHRvL2Zyb20gR3JhcGggSlNPTlxuICpcbiAqIFN5bnRheDpcbiAqICAgZ3JhcGggPG5hbWU+IHtcbiAqICAgICBbbW9kZToga2VybmVsfHVzZXJdXG4gKiAgICAgW2luOiA8dHlwZT4gfCA8bmFtZT46IDx0eXBlPiwgLi4uXVxuICogICAgIFtvdXQ6IDx0eXBlPl1cbiAqXG4gKiAgICAgbGV0IDxub2RlSWQ+ID0gPGF0b20+KDxwYXJhbT46IDx2YWx1ZT4sIC4uLilcbiAqICAgICBpZiA8cmVmTm9kZUlkPiB7XG4gKiAgICAgICA8bm9kZXMuLi4+XG4gKiAgICAgfSBbZWxzZSB7XG4gKiAgICAgICA8bm9kZXMuLi4+XG4gKiAgICAgfV1cbiAqICAgICBsb29wIFttYXg6IE5dIFtjb25kOiA8c3RvcmVLZXk+XSB7XG4gKiAgICAgICA8bm9kZXMuLi4+XG4gKiAgICAgfVxuICogICAgIGZvckVhY2ggPGl0ZW1LZXk+IGluIDxhcnJheVJlZj4gW21heDogTl0ge1xuICogICAgICAgPG5vZGVzLi4uPlxuICogICAgIH1cbiAqICAgfVxuICovXG5cbmltcG9ydCB7IEdyYXBoLCBHcmFwaE5vZGUgfSBmcm9tICcuL3R5cGVzJztcblxuaW50ZXJmYWNlIEFjc05vZGUge1xuICB0eXBlOiAnbGV0JyB8ICdpZicgfCAnbG9vcCcgfCAnZm9yRWFjaCcgfCAnZmlsdGVyJztcbiAgaWQ/OiBzdHJpbmc7XG4gIGF0b20/OiBzdHJpbmc7XG4gIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHJlZj86IHN0cmluZztcbiAgYm9keT86IEFjc05vZGVbXTtcbiAgZWxzZUJvZHk/OiBBY3NOb2RlW107XG4gIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIGNvbmRLZXk/OiBzdHJpbmc7XG4gIGl0ZW1LZXk/OiBzdHJpbmc7XG4gIGluZGV4S2V5Pzogc3RyaW5nO1xuICBhcnJheVJlZj86IHN0cmluZztcbiAgbWF4SXRlbXM/OiBudW1iZXI7XG4gIGlubGluZUNvbmRBdG9tPzogeyBhdG9tOiBzdHJpbmc7IHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB9O1xufVxuXG5pbnRlcmZhY2UgQWNzR3JhcGgge1xuICBuYW1lOiBzdHJpbmc7XG4gIG1vZGU/OiAna2VybmVsJyB8ICd1c2VyJztcbiAgbWV0YT86IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmcgfTtcbiAgaW5wdXQ/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuICBvdXRwdXQ/OiBzdHJpbmc7XG4gIG5vZGVzOiBBY3NOb2RlW107XG59XG5cbmV4cG9ydCBjbGFzcyBBY3NQYXJzZXIge1xuICBwcml2YXRlIHBvcyA9IDA7XG4gIHByaXZhdGUgc3JjID0gJyc7XG5cbiAgcGFyc2UodGV4dDogc3RyaW5nKTogQWNzR3JhcGgge1xuICAgIHRoaXMuc3JjID0gdGV4dC50cmltKCk7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHJldHVybiB0aGlzLnBhcnNlR3JhcGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VHcmFwaCgpOiBBY3NHcmFwaCB7XG4gICAgdGhpcy5leHBlY3QoJ2dyYXBoJyk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICB0aGlzLmV4cGVjdCgneycpO1xuXG4gICAgY29uc3QgZ3JhcGg6IEFjc0dyYXBoID0geyBuYW1lLCBub2RlczogW10gfTtcblxuICAgIHdoaWxlICghdGhpcy5wZWVrKCd9JykgJiYgdGhpcy5wb3MgPCB0aGlzLnNyYy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuXG4gICAgICBpZiAodGhpcy5wZWVrKCdtb2RlOicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSg1KTtcbiAgICAgICAgZ3JhcGgubW9kZSA9IHRoaXMucmVhZElkZW50aWZpZXIoKSBhcyAna2VybmVsJyB8ICd1c2VyJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCdtZXRhOicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSg1KTtcbiAgICAgICAgZ3JhcGgubWV0YSA9IHRoaXMucGFyc2VNZXRhRGVjbCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2luOicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgzKTtcbiAgICAgICAgZ3JhcGguaW5wdXQgPSB0aGlzLnBhcnNlSW5wdXREZWNsKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygnb3V0OicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSg0KTtcbiAgICAgICAgZ3JhcGgub3V0cHV0ID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2xldCcpKSB7XG4gICAgICAgIGdyYXBoLm5vZGVzLnB1c2godGhpcy5wYXJzZUxldCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCdpZicpKSB7XG4gICAgICAgIGdyYXBoLm5vZGVzLnB1c2godGhpcy5wYXJzZUlmKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2xvb3AnKSkge1xuICAgICAgICBncmFwaC5ub2Rlcy5wdXNoKHRoaXMucGFyc2VMb29wKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2ZvckVhY2gnKSkge1xuICAgICAgICBncmFwaC5ub2Rlcy5wdXNoKHRoaXMucGFyc2VGb3JFYWNoKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2ZpbHRlcicpKSB7XG4gICAgICAgIGdyYXBoLm5vZGVzLnB1c2godGhpcy5wYXJzZUZpbHRlcigpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQUNTIHBhcnNlIGVycm9yIGF0IHBvcyAke3RoaXMucG9zfTogdW5leHBlY3RlZCBcIiR7dGhpcy5zcmMuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgMjApfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxldCgpOiBBY3NOb2RlIHtcbiAgICB0aGlzLmV4cGVjdCgnbGV0Jyk7XG4gICAgY29uc3QgaWQgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgdGhpcy5leHBlY3QoJz0nKTtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdpZicpKSB7XG4gICAgICBjb25zdCBpZk5vZGUgPSB0aGlzLnBhcnNlSWYoKTtcbiAgICAgIGlmTm9kZS5pZCA9IGlkO1xuICAgICAgcmV0dXJuIGlmTm9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVlaygnZm9yRWFjaCcpKSB7XG4gICAgICBjb25zdCBmb3JFYWNoTm9kZSA9IHRoaXMucGFyc2VGb3JFYWNoKCk7XG4gICAgICBmb3JFYWNoTm9kZS5pZCA9IGlkO1xuICAgICAgcmV0dXJuIGZvckVhY2hOb2RlO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrKCdsb29wJykpIHtcbiAgICAgIGNvbnN0IGxvb3BOb2RlID0gdGhpcy5wYXJzZUxvb3AoKTtcbiAgICAgIGxvb3BOb2RlLmlkID0gaWQ7XG4gICAgICByZXR1cm4gbG9vcE5vZGU7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlZWsoJ2ZpbHRlcicpKSB7XG4gICAgICBjb25zdCBmaWx0ZXJOb2RlID0gdGhpcy5wYXJzZUZpbHRlcigpO1xuICAgICAgZmlsdGVyTm9kZS5pZCA9IGlkO1xuICAgICAgcmV0dXJuIGZpbHRlck5vZGU7XG4gICAgfVxuICAgIGNvbnN0IGF0b20gPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJzZVBhcmFtcygpO1xuICAgIHJldHVybiB7IHR5cGU6ICdsZXQnLCBpZCwgYXRvbSwgcGFyYW1zIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSWYoKTogQWNzTm9kZSB7XG4gICAgdGhpcy5leHBlY3QoJ2lmJyk7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG5cbiAgICBjb25zdCBzYXZlZFBvcyA9IHRoaXMucG9zO1xuICAgIGNvbnN0IGZpcnN0SWRlbnQgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG5cbiAgICBsZXQgcmVmOiBzdHJpbmc7XG4gICAgbGV0IGlubGluZUNvbmRBdG9tOiB7IGF0b206IHN0cmluZzsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGhpcy5wZWVrKCcoJykpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyc2VQYXJhbXMoKTtcbiAgICAgIGlubGluZUNvbmRBdG9tID0geyBhdG9tOiBmaXJzdElkZW50LCBwYXJhbXMgfTtcbiAgICAgIHJlZiA9IGBfX2lubGluZV9jb25kXyR7c2F2ZWRQb3N9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmID0gZmlyc3RJZGVudDtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGVjdCgneycpO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnBhcnNlQm9keSgpO1xuICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cbiAgICBsZXQgZWxzZUJvZHk6IEFjc05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdlbHNlJykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSg0KTtcbiAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgICBlbHNlQm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgICB0aGlzLmV4cGVjdCgnfScpO1xuICAgIH1cblxuICAgIGNvbnN0IGlmTm9kZTogQWNzTm9kZSA9IHsgdHlwZTogJ2lmJywgcmVmLCBib2R5LCBlbHNlQm9keSB9O1xuICAgIGlmIChpbmxpbmVDb25kQXRvbSkge1xuICAgICAgaWZOb2RlLmlubGluZUNvbmRBdG9tID0gaW5saW5lQ29uZEF0b207XG4gICAgfVxuICAgIHJldHVybiBpZk5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTG9vcCgpOiBBY3NOb2RlIHtcbiAgICB0aGlzLmV4cGVjdCgnbG9vcCcpO1xuICAgIGxldCBtYXhJdGVyYXRpb25zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbmRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGlmICh0aGlzLnBlZWsoJ21heDonKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKDQpO1xuICAgICAgbWF4SXRlcmF0aW9ucyA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgIH1cbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdjb25kOicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoNSk7XG4gICAgICBjb25kS2V5ID0gdGhpcy5yZWFkU3RyaW5nKCkgfHwgdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdsb29wJywgbWF4SXRlcmF0aW9ucywgY29uZEtleSwgYm9keSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZvckVhY2goKTogQWNzTm9kZSB7XG4gICAgdGhpcy5leHBlY3QoJ2ZvckVhY2gnKTtcbiAgICBjb25zdCBpdGVtS2V5ID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgIGxldCBpbmRleEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGlmICh0aGlzLnBlZWsoJywnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKDEpO1xuICAgICAgaW5kZXhLZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgfVxuICAgIHRoaXMuZXhwZWN0KCdpbicpO1xuICAgIGNvbnN0IGFycmF5UmVmID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgIGxldCBtYXhJdGVtczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgaWYgKHRoaXMucGVlaygnbWF4OicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoNCk7XG4gICAgICBtYXhJdGVtcyA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdmb3JFYWNoJywgaXRlbUtleSwgaW5kZXhLZXksIGFycmF5UmVmLCBtYXhJdGVtcywgYm9keSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZpbHRlcigpOiBBY3NOb2RlIHtcbiAgICB0aGlzLmV4cGVjdCgnZmlsdGVyJyk7XG4gICAgY29uc3QgaXRlbUtleSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICBsZXQgaW5kZXhLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGlmICh0aGlzLnBlZWsoJ2luZGV4OicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoNik7XG4gICAgICBpbmRleEtleSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGVjdCgnaW4nKTtcbiAgICBjb25zdCBhcnJheVJlZiA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcblxuICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdmaWx0ZXInLCBpdGVtS2V5LCBpbmRleEtleSwgYXJyYXlSZWYsIGJvZHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VCb2R5KCk6IEFjc05vZGVbXSB7XG4gICAgY29uc3Qgbm9kZXM6IEFjc05vZGVbXSA9IFtdO1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuXG4gICAgd2hpbGUgKCF0aGlzLnBlZWsoJ30nKSAmJiB0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMucGVlaygnbGV0JykpIG5vZGVzLnB1c2godGhpcy5wYXJzZUxldCgpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucGVlaygnaWYnKSkgbm9kZXMucHVzaCh0aGlzLnBhcnNlSWYoKSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBlZWsoJ2xvb3AnKSkgbm9kZXMucHVzaCh0aGlzLnBhcnNlTG9vcCgpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucGVlaygnZm9yRWFjaCcpKSBub2Rlcy5wdXNoKHRoaXMucGFyc2VGb3JFYWNoKCkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5wZWVrKCdmaWx0ZXInKSkgbm9kZXMucHVzaCh0aGlzLnBhcnNlRmlsdGVyKCkpO1xuICAgICAgZWxzZSBicmVhaztcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQYXJhbXMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCF0aGlzLnBlZWsoJygnKSkgcmV0dXJuIHt9O1xuICAgIHRoaXMuYWR2YW5jZSgxKTsgLy8gc2tpcCAoXG5cbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICB3aGlsZSAoIXRoaXMucGVlaygnKScpICYmIHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgICB0aGlzLmV4cGVjdCgnOicpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcblxuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCcpJyk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnB1dERlY2woKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PiB7XG4gICAgaWYgKHRoaXMucGVlaygnbm9uZScpKSB7IHRoaXMuYWR2YW5jZSg0KTsgcmV0dXJuIFtdOyB9XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+ID0gW107XG4gICAgd2hpbGUgKCF0aGlzLnBlZWsoJ1xcbicpICYmICF0aGlzLnBlZWsoJ30nKSAmJiB0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICAgIHRoaXMuZXhwZWN0KCc6Jyk7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgICAgcmVzdWx0LnB1c2goeyBuYW1lLCB0eXBlIH0pO1xuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1ldGFEZWNsKCk6IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmcgfSB7XG4gICAgdGhpcy5leHBlY3QoJ3snKTtcbiAgICBjb25zdCBtZXRhOiBhbnkgPSB7fTtcbiAgICB3aGlsZSAoIXRoaXMucGVlaygnfScpICYmIHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgICB0aGlzLmV4cGVjdCgnOicpO1xuICAgICAgbWV0YVtrZXldID0gdGhpcy5yZWFkU3RyaW5nKCkgfHwgdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCgnfScpO1xuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkVmFsdWUoKTogYW55IHtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdcIicpKSByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgaWYgKHRoaXMucGVlayhcIidcIikpIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICBpZiAodGhpcy5zcmNbdGhpcy5wb3NdID09PSAnLScgfHwgdGhpcy5zcmNbdGhpcy5wb3NdID49ICcwJyAmJiB0aGlzLnNyY1t0aGlzLnBvc10gPD0gJzknKSByZXR1cm4gdGhpcy5yZWFkTnVtYmVyKCk7XG4gICAgaWYgKHRoaXMucGVlaygndHJ1ZScpKSB7IHRoaXMuYWR2YW5jZSg0KTsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAodGhpcy5wZWVrKCdmYWxzZScpKSB7IHRoaXMuYWR2YW5jZSg1KTsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHRoaXMucGVlaygnbnVsbCcpKSB7IHRoaXMuYWR2YW5jZSg0KTsgcmV0dXJuIG51bGw7IH1cbiAgICBpZiAodGhpcy5wZWVrKCd7eycpKSByZXR1cm4gdGhpcy5yZWFkUmVmZXJlbmNlKCk7XG4gICAgaWYgKHRoaXMucGVlaygneycpKSByZXR1cm4gdGhpcy5yZWFkT2JqZWN0KCk7XG4gICAgaWYgKHRoaXMucGVlaygnWycpKSByZXR1cm4gdGhpcy5yZWFkQXJyYXkoKTtcbiAgICByZXR1cm4gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkUmVmZXJlbmNlKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBvcztcbiAgICB0aGlzLmFkdmFuY2UoMik7XG4gICAgY29uc3QgcmVmID0gdGhpcy5yZWFkVW50aWwoJ319Jyk7XG4gICAgdGhpcy5hZHZhbmNlKDIpO1xuICAgIHJldHVybiBge3ske3JlZn19fWA7XG4gIH1cblxuICBwcml2YXRlIHJlYWRPYmplY3QoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgdGhpcy5leHBlY3QoJ3snKTtcbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICB3aGlsZSAoIXRoaXMucGVlaygnfScpICYmIHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBsZXQga2V5OiBzdHJpbmc7XG4gICAgICBpZiAodGhpcy5wZWVrKCdcIicpIHx8IHRoaXMucGVlayhcIidcIikpIHtcbiAgICAgICAga2V5ID0gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdCgnOicpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgaWYgKHRoaXMucGVlaygnLCcpKSB0aGlzLmFkdmFuY2UoMSk7XG4gICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICB9XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkQXJyYXkoKTogYW55W10ge1xuICAgIHRoaXMuZXhwZWN0KCdbJyk7XG4gICAgY29uc3QgYXJyOiBhbnlbXSA9IFtdO1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIHdoaWxlICghdGhpcy5wZWVrKCddJykgJiYgdGhpcy5wb3MgPCB0aGlzLnNyYy5sZW5ndGgpIHtcbiAgICAgIGFyci5wdXNoKHRoaXMucmVhZFZhbHVlKCkpO1xuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCgnXScpO1xuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICBwcml2YXRlIHNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBpZiAoL1xccy8udGVzdCh0aGlzLnNyY1t0aGlzLnBvc10pKSB7IHRoaXMucG9zKys7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodGhpcy5zcmNbdGhpcy5wb3NdID09PSAnLycgJiYgdGhpcy5zcmNbdGhpcy5wb3MgKyAxXSA9PT0gJy8nKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCAmJiB0aGlzLnNyY1t0aGlzLnBvc10gIT09ICdcXG4nKSB0aGlzLnBvcysrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGVlayhzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zcmMuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgcy5sZW5ndGgpID09PSBzO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBlY3Qoczogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgaWYgKCF0aGlzLnBlZWsocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQUNTIHBhcnNlIGVycm9yIGF0IHBvcyAke3RoaXMucG9zfTogZXhwZWN0ZWQgXCIke3N9XCIsIGdvdCBcIiR7dGhpcy5zcmMuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgMTApfVwiYCk7XG4gICAgfVxuICAgIHRoaXMucG9zICs9IHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBhZHZhbmNlKG46IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucG9zICs9IG47XG4gIH1cblxuICBwcml2YXRlIHJlYWRJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoICYmIC9bYS16QS1aMC05X0BcXC0vLl0vLnRlc3QodGhpcy5zcmNbdGhpcy5wb3NdKSkgdGhpcy5wb3MrKztcbiAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0KSB0aHJvdyBuZXcgRXJyb3IoYEFDUyBwYXJzZSBlcnJvciBhdCBwb3MgJHt0aGlzLnBvc306IGV4cGVjdGVkIGlkZW50aWZpZXJgKTtcbiAgICByZXR1cm4gdGhpcy5zcmMuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZE51bWJlcigpOiBudW1iZXIge1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgIGlmICh0aGlzLnNyY1t0aGlzLnBvc10gPT09ICctJykgdGhpcy5wb3MrKztcbiAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLnNyYy5sZW5ndGggJiYgL1swLTkuXS8udGVzdCh0aGlzLnNyY1t0aGlzLnBvc10pKSB0aGlzLnBvcysrO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5zcmMuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBjb25zdCBxdW90ZSA9IHRoaXMuc3JjW3RoaXMucG9zXTtcbiAgICBpZiAocXVvdGUgIT09ICdcIicgJiYgcXVvdGUgIT09IFwiJ1wiKSB0aHJvdyBuZXcgRXJyb3IoYEFDUyBwYXJzZSBlcnJvciBhdCBwb3MgJHt0aGlzLnBvc306IGV4cGVjdGVkIHN0cmluZ2ApO1xuICAgIHRoaXMucG9zKys7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCAmJiB0aGlzLnNyY1t0aGlzLnBvc10gIT09IHF1b3RlKSB7XG4gICAgICBpZiAodGhpcy5zcmNbdGhpcy5wb3NdID09PSAnXFxcXCcpIHtcbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLnNyY1t0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ24nKSByZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAndCcpIHJlc3VsdCArPSAnXFx0JztcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdyJykgcmVzdWx0ICs9ICdcXHInO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gcXVvdGUpIHJlc3VsdCArPSBxdW90ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICd7JykgcmVzdWx0ICs9ICdcXFxceyc7XG4gICAgICAgIGVsc2UgcmVzdWx0ICs9IGNoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IHRoaXMuc3JjW3RoaXMucG9zXTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9zKys7XG4gICAgfVxuICAgIHRoaXMucG9zKys7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFVudGlsKGVuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoICYmICF0aGlzLnBlZWsoZW5kKSkge1xuICAgICAgcmVzdWx0ICs9IHRoaXMuc3JjW3RoaXMucG9zXTtcbiAgICAgIHRoaXMucG9zKys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjc0NvbXBpbGVyIHtcbiAgY29tcGlsZShhY3NHcmFwaDogQWNzR3JhcGgpOiBHcmFwaCB7XG4gICAgY29uc3QgZ3JhcGg6IEdyYXBoID0ge1xuICAgICAgb3JkZXI6IFtdLFxuICAgICAgbm9kZXM6IHt9LFxuICAgIH07XG5cbiAgICBpZiAoYWNzR3JhcGgubW9kZSkgZ3JhcGgubW9kZSA9IGFjc0dyYXBoLm1vZGU7XG4gICAgaWYgKGFjc0dyYXBoLm1ldGEpIGdyYXBoLl9tZXRhID0gYWNzR3JhcGgubWV0YTtcbiAgICBpZiAoYWNzR3JhcGguaW5wdXQgJiYgYWNzR3JhcGguaW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgZ3JhcGguaW50ZXJmYWNlID0ge1xuICAgICAgICBpbnB1dDogYWNzR3JhcGguaW5wdXQubWFwKGkgPT4gKHsgbmFtZTogaS5uYW1lLCB0eXBlOiBpLnR5cGUgfSkpLFxuICAgICAgICBvdXRwdXQ6IHsgdHlwZTogYWNzR3JhcGgub3V0cHV0IHx8ICd2b2lkJyB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBpbGVOb2RlcyhhY3NHcmFwaC5ub2RlcywgZ3JhcGgpO1xuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21waWxlTm9kZXMoYWNzTm9kZXM6IEFjc05vZGVbXSwgZ3JhcGg6IEdyYXBoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjc05vZGVzKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdsZXQnOiB7XG4gICAgICAgICAgY29uc3QgZ3JhcGhOb2RlOiBHcmFwaE5vZGUgPSB7IGF0b206IG5vZGUuYXRvbSEsIC4uLm5vZGUucGFyYW1zIH07XG4gICAgICAgICAgZ3JhcGgub3JkZXIucHVzaChub2RlLmlkISk7XG4gICAgICAgICAgZ3JhcGgubm9kZXNbbm9kZS5pZCFdID0gZ3JhcGhOb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2lmJzoge1xuICAgICAgICAgIGlmIChub2RlLmlubGluZUNvbmRBdG9tKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kTm9kZUlkID0gbm9kZS5yZWYhO1xuICAgICAgICAgICAgY29uc3QgY29uZEdyYXBoTm9kZTogR3JhcGhOb2RlID0geyBhdG9tOiBub2RlLmlubGluZUNvbmRBdG9tLmF0b20sIC4uLm5vZGUuaW5saW5lQ29uZEF0b20ucGFyYW1zIH07XG4gICAgICAgICAgICBncmFwaC5vcmRlci5wdXNoKGNvbmROb2RlSWQpO1xuICAgICAgICAgICAgZ3JhcGgubm9kZXNbY29uZE5vZGVJZF0gPSBjb25kR3JhcGhOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBpZk5vZGVJZDogc3RyaW5nO1xuICAgICAgICAgIGlmIChub2RlLmlkKSB7XG4gICAgICAgICAgICBpZk5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmTm9kZUlkID0gYGlmXyR7bm9kZS5yZWZ9YDtcbiAgICAgICAgICAgIGlmIChncmFwaC5ub2Rlc1tpZk5vZGVJZF0pIHtcbiAgICAgICAgICAgICAgaWZOb2RlSWQgPSBgaWZfJHtub2RlLnJlZn1fJHtncmFwaC5vcmRlci5sZW5ndGh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdGhlbkdyYXBoID0gdGhpcy5jb21waWxlU3ViR3JhcGgobm9kZS5ib2R5IHx8IFtdKTtcbiAgICAgICAgICBjb25zdCBlbHNlR3JhcGggPSBub2RlLmVsc2VCb2R5ID8gdGhpcy5jb21waWxlU3ViR3JhcGgobm9kZS5lbHNlQm9keSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCBncmFwaE5vZGU6IEdyYXBoTm9kZSA9IHtcbiAgICAgICAgICAgIGF0b206ICdicmFuY2gnLFxuICAgICAgICAgICAgY29uZDogYHt7JHtub2RlLnJlZn19fWAsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhlbkdyYXBoLm9yZGVyLmxlbmd0aCA+IDAgfHwgIWVsc2VHcmFwaCkgZ3JhcGhOb2RlLnRoZW4gPSB0aGVuR3JhcGg7XG4gICAgICAgICAgaWYgKGVsc2VHcmFwaCkgZ3JhcGhOb2RlLmVsc2UgPSBlbHNlR3JhcGg7XG5cbiAgICAgICAgICBncmFwaC5vcmRlci5wdXNoKGlmTm9kZUlkKTtcbiAgICAgICAgICBncmFwaC5ub2Rlc1tpZk5vZGVJZF0gPSBncmFwaE5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbG9vcCc6IHtcbiAgICAgICAgICBjb25zdCBsb29wTm9kZUlkID0gbm9kZS5pZCB8fCBgbG9vcF8ke2dyYXBoLm9yZGVyLmxlbmd0aH1gO1xuICAgICAgICAgIGNvbnN0IGJvZHlHcmFwaCA9IHRoaXMuY29tcGlsZVN1YkdyYXBoKG5vZGUuYm9keSB8fCBbXSk7XG5cbiAgICAgICAgICBjb25zdCBncmFwaE5vZGU6IEdyYXBoTm9kZSA9IHtcbiAgICAgICAgICAgIGF0b206ICdsb29wJyxcbiAgICAgICAgICAgIG5vZGVzOiBib2R5R3JhcGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobm9kZS5tYXhJdGVyYXRpb25zKSBncmFwaE5vZGUubWF4SXRlcmF0aW9ucyA9IG5vZGUubWF4SXRlcmF0aW9ucztcbiAgICAgICAgICBpZiAobm9kZS5jb25kS2V5KSBncmFwaE5vZGUuY29uZEtleSA9IG5vZGUuY29uZEtleTtcblxuICAgICAgICAgIGdyYXBoLm9yZGVyLnB1c2gobG9vcE5vZGVJZCk7XG4gICAgICAgICAgZ3JhcGgubm9kZXNbbG9vcE5vZGVJZF0gPSBncmFwaE5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZm9yRWFjaCc6IHtcbiAgICAgICAgICBjb25zdCBmZU5vZGVJZCA9IG5vZGUuaWQgfHwgYGZvckVhY2hfJHtncmFwaC5vcmRlci5sZW5ndGh9YDtcbiAgICAgICAgICBjb25zdCBib2R5R3JhcGggPSB0aGlzLmNvbXBpbGVTdWJHcmFwaChub2RlLmJvZHkgfHwgW10pO1xuXG4gICAgICAgICAgY29uc3QgZ3JhcGhOb2RlOiBHcmFwaE5vZGUgPSB7XG4gICAgICAgICAgICBhdG9tOiAnZm9yRWFjaCcsXG4gICAgICAgICAgICBhcnJheTogYHt7JHtub2RlLmFycmF5UmVmfX19YCxcbiAgICAgICAgICAgIG5vZGVzOiBib2R5R3JhcGgsXG4gICAgICAgICAgICBpdGVtS2V5OiBub2RlLml0ZW1LZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobm9kZS5pbmRleEtleSkgZ3JhcGhOb2RlLmluZGV4S2V5ID0gbm9kZS5pbmRleEtleTtcbiAgICAgICAgICBpZiAobm9kZS5tYXhJdGVtcykgZ3JhcGhOb2RlLm1heEl0ZW1zID0gbm9kZS5tYXhJdGVtcztcblxuICAgICAgICAgIGdyYXBoLm9yZGVyLnB1c2goZmVOb2RlSWQpO1xuICAgICAgICAgIGdyYXBoLm5vZGVzW2ZlTm9kZUlkXSA9IGdyYXBoTm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmaWx0ZXInOiB7XG4gICAgICAgICAgY29uc3QgZk5vZGVJZCA9IG5vZGUuaWQgfHwgYGZpbHRlcl8ke2dyYXBoLm9yZGVyLmxlbmd0aH1gO1xuICAgICAgICAgIGNvbnN0IGJvZHlHcmFwaCA9IHRoaXMuY29tcGlsZVN1YkdyYXBoKG5vZGUuYm9keSB8fCBbXSk7XG5cbiAgICAgICAgICBjb25zdCBncmFwaE5vZGU6IEdyYXBoTm9kZSA9IHtcbiAgICAgICAgICAgIGF0b206ICdmaWx0ZXInLFxuICAgICAgICAgICAgYXJyYXk6IGB7eyR7bm9kZS5hcnJheVJlZn19fWAsXG4gICAgICAgICAgICBub2RlczogYm9keUdyYXBoLFxuICAgICAgICAgICAgaXRlbUtleTogbm9kZS5pdGVtS2V5LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG5vZGUuaW5kZXhLZXkpIGdyYXBoTm9kZS5pbmRleEtleSA9IG5vZGUuaW5kZXhLZXk7XG5cbiAgICAgICAgICBncmFwaC5vcmRlci5wdXNoKGZOb2RlSWQpO1xuICAgICAgICAgIGdyYXBoLm5vZGVzW2ZOb2RlSWRdID0gZ3JhcGhOb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21waWxlU3ViR3JhcGgoYWNzTm9kZXM6IEFjc05vZGVbXSk6IEdyYXBoIHtcbiAgICBjb25zdCBncmFwaDogR3JhcGggPSB7IG9yZGVyOiBbXSwgbm9kZXM6IHt9IH07XG4gICAgdGhpcy5jb21waWxlTm9kZXMoYWNzTm9kZXMsIGdyYXBoKTtcbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjc0RlY29tcGlsZXIge1xuICBkZWNvbXBpbGUoZ3JhcGg6IEdyYXBoLCBuYW1lOiBzdHJpbmcgPSAndW5uYW1lZCcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxpbmVzLnB1c2goYGdyYXBoICR7bmFtZX0ge2ApO1xuXG4gICAgaWYgKGdyYXBoLm1vZGUpIGxpbmVzLnB1c2goYCAgbW9kZTogJHtncmFwaC5tb2RlfWApO1xuICAgIGlmIChncmFwaC5fbWV0YSkge1xuICAgICAgY29uc3QgcGFydHMgPSBPYmplY3QuZW50cmllcyhncmFwaC5fbWV0YSkubWFwKChbaywgdl0pID0+IGAke2t9OiBcIiR7dn1cImApLmpvaW4oJywgJyk7XG4gICAgICBsaW5lcy5wdXNoKGAgIG1ldGE6IHsgJHtwYXJ0c30gfWApO1xuICAgIH1cbiAgICBpZiAoZ3JhcGguaW50ZXJmYWNlKSB7XG4gICAgICBpZiAoZ3JhcGguaW50ZXJmYWNlLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgIGluOiBub25lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpblN0ciA9IGdyYXBoLmludGVyZmFjZS5pbnB1dC5tYXAoaSA9PiBgJHtpLm5hbWV9OiAke2kudHlwZX1gKS5qb2luKCcsICcpO1xuICAgICAgICBsaW5lcy5wdXNoKGAgIGluOiAke2luU3RyfWApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaChgICBvdXQ6ICR7Z3JhcGguaW50ZXJmYWNlLm91dHB1dC50eXBlfWApO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIGdyYXBoLm9yZGVyKSB7XG4gICAgICBjb25zdCBub2RlID0gZ3JhcGgubm9kZXNbbm9kZUlkXTtcbiAgICAgIGlmIChub2RlSWQuc3RhcnRzV2l0aCgnX19pbmxpbmVfY29uZF8nKSAmJiBub2RlLmF0b20gIT09ICdicmFuY2gnKSBjb250aW51ZTtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5kZWNvbXBpbGVOb2RlKG5vZGVJZCwgbm9kZSwgMSwgZ3JhcGgubm9kZXMpKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCd9Jyk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvbXBpbGVOb2RlKG5vZGVJZDogc3RyaW5nLCBub2RlOiBHcmFwaE5vZGUsIGluZGVudDogbnVtYmVyLCBhbGxOb2Rlcz86IFJlY29yZDxzdHJpbmcsIEdyYXBoTm9kZT4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcHJlZml4ID0gJyAgJy5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChub2RlLmF0b20gPT09ICdicmFuY2gnKSB7XG4gICAgICBjb25zdCBjb25kUmVmID0gdGhpcy5leHRyYWN0Q29uZFJlZihub2RlLmNvbmQpO1xuICAgICAgY29uc3QgaXNOYW1lZElmID0gbm9kZUlkICYmICFub2RlSWQuc3RhcnRzV2l0aCgnaWZfJyk7XG4gICAgICBjb25zdCBpZlByZWZpeCA9IGlzTmFtZWRJZiA/IGAke3ByZWZpeH1sZXQgJHtub2RlSWR9ID0gYCA6ICcnO1xuXG4gICAgICBsZXQgY29uZFN0ciA9IGNvbmRSZWYgfHwgbm9kZUlkO1xuICAgICAgaWYgKGNvbmRSZWYgJiYgY29uZFJlZi5zdGFydHNXaXRoKCdfX2lubGluZV9jb25kXycpICYmIGFsbE5vZGVzICYmIGFsbE5vZGVzW2NvbmRSZWZdKSB7XG4gICAgICAgIGNvbnN0IGNvbmROb2RlID0gYWxsTm9kZXNbY29uZFJlZl07XG4gICAgICAgIGNvbnN0IGNvbmRQYXJhbXMgPSB0aGlzLmZvcm1hdFBhcmFtcyhjb25kTm9kZSk7XG4gICAgICAgIGNvbmRTdHIgPSBgJHtjb25kTm9kZS5hdG9tfSgke2NvbmRQYXJhbXN9KWA7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7aWZQcmVmaXh9aWYgJHtjb25kU3RyfSB7YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGAke2lmUHJlZml4fWlmICR7Y29uZFN0cn0ge2ApO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUudGhlbikgbGluZXMucHVzaCguLi50aGlzLmRlY29tcGlsZVN1YkdyYXBoKG5vZGUudGhlbiwgaW5kZW50ICsgMSkpO1xuICAgICAgaWYgKG5vZGUuZWxzZSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAke3ByZWZpeH19IGVsc2Uge2ApO1xuICAgICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZGVjb21waWxlU3ViR3JhcGgobm9kZS5lbHNlLCBpbmRlbnQgKyAxKSk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKGAke3ByZWZpeH19YCk7XG4gICAgfSBlbHNlIGlmIChub2RlLmF0b20gPT09ICdsb29wJykge1xuICAgICAgY29uc3QgaXNOYW1lZExvb3AgPSBub2RlSWQgJiYgIW5vZGVJZC5zdGFydHNXaXRoKCdsb29wXycpO1xuICAgICAgY29uc3QgbG9vcFByZWZpeCA9IGlzTmFtZWRMb29wID8gYCR7cHJlZml4fWxldCAke25vZGVJZH0gPSBgIDogJyc7XG4gICAgICBjb25zdCBleHRyYXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAobm9kZS5tYXhJdGVyYXRpb25zKSBleHRyYXMucHVzaChgbWF4OiAke25vZGUubWF4SXRlcmF0aW9uc31gKTtcbiAgICAgIGlmIChub2RlLmNvbmRLZXkpIGV4dHJhcy5wdXNoKGBjb25kOiBcIiR7bm9kZS5jb25kS2V5fVwiYCk7XG4gICAgICBsaW5lcy5wdXNoKGAke2xvb3BQcmVmaXh9bG9vcCAke2V4dHJhcy5qb2luKCcgJyl9IHtgKTtcbiAgICAgIGlmIChub2RlLm5vZGVzKSBsaW5lcy5wdXNoKC4uLnRoaXMuZGVjb21waWxlU3ViR3JhcGgobm9kZS5ub2RlcywgaW5kZW50ICsgMSkpO1xuICAgICAgbGluZXMucHVzaChgJHtwcmVmaXh9fWApO1xuICAgIH0gZWxzZSBpZiAobm9kZS5hdG9tID09PSAnZm9yRWFjaCcpIHtcbiAgICAgIGNvbnN0IGlzTmFtZWRGb3JFYWNoID0gbm9kZUlkICYmICFub2RlSWQuc3RhcnRzV2l0aCgnZm9yRWFjaF8nKTtcbiAgICAgIGNvbnN0IGZlUHJlZml4ID0gaXNOYW1lZEZvckVhY2ggPyBgJHtwcmVmaXh9bGV0ICR7bm9kZUlkfSA9IGAgOiAnJztcbiAgICAgIGNvbnN0IGV4dHJhczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChub2RlLm1heEl0ZW1zKSBleHRyYXMucHVzaChgbWF4OiAke25vZGUubWF4SXRlbXN9YCk7XG4gICAgICBjb25zdCBpZHggPSBub2RlLmluZGV4S2V5ID8gYCwgJHtub2RlLmluZGV4S2V5fWAgOiAnJztcbiAgICAgIGxpbmVzLnB1c2goYCR7ZmVQcmVmaXh9Zm9yRWFjaCAke25vZGUuaXRlbUtleSB8fCAnaXRlbSd9JHtpZHh9IGluICR7dGhpcy5leHRyYWN0QXJyYXlSZWYobm9kZS5hcnJheSl9ICR7ZXh0cmFzLmpvaW4oJyAnKX0ge2ApO1xuICAgICAgaWYgKG5vZGUubm9kZXMpIGxpbmVzLnB1c2goLi4udGhpcy5kZWNvbXBpbGVTdWJHcmFwaChub2RlLm5vZGVzLCBpbmRlbnQgKyAxKSk7XG4gICAgICBsaW5lcy5wdXNoKGAke3ByZWZpeH19YCk7XG4gICAgfSBlbHNlIGlmIChub2RlLmF0b20gPT09ICdmaWx0ZXInKSB7XG4gICAgICBjb25zdCBpc05hbWVkRmlsdGVyID0gbm9kZUlkICYmICFub2RlSWQuc3RhcnRzV2l0aCgnZmlsdGVyXycpO1xuICAgICAgY29uc3QgZlByZWZpeCA9IGlzTmFtZWRGaWx0ZXIgPyBgJHtwcmVmaXh9bGV0ICR7bm9kZUlkfSA9IGAgOiAnJztcbiAgICAgIGNvbnN0IGlkeCA9IG5vZGUuaW5kZXhLZXkgPyBgIGluZGV4OiAke25vZGUuaW5kZXhLZXl9YCA6ICcnO1xuICAgICAgbGluZXMucHVzaChgJHtmUHJlZml4fWZpbHRlciAke25vZGUuaXRlbUtleSB8fCAnaXRlbSd9JHtpZHh9IGluICR7dGhpcy5leHRyYWN0QXJyYXlSZWYobm9kZS5hcnJheSl9IHtgKTtcbiAgICAgIGlmIChub2RlLm5vZGVzKSBsaW5lcy5wdXNoKC4uLnRoaXMuZGVjb21waWxlU3ViR3JhcGgobm9kZS5ub2RlcywgaW5kZW50ICsgMSkpO1xuICAgICAgbGluZXMucHVzaChgJHtwcmVmaXh9fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmZvcm1hdFBhcmFtcyhub2RlKTtcbiAgICAgIGxpbmVzLnB1c2goYCR7cHJlZml4fWxldCAke25vZGVJZH0gPSAke25vZGUuYXRvbX0oJHtwYXJhbXN9KWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZGVjb21waWxlU3ViR3JhcGgoZ3JhcGg6IEdyYXBoLCBpbmRlbnQ6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5vZGVJZCBvZiBncmFwaC5vcmRlcikge1xuICAgICAgaWYgKG5vZGVJZC5zdGFydHNXaXRoKCdfX2lubGluZV9jb25kXycpICYmIGdyYXBoLm5vZGVzW25vZGVJZF0uYXRvbSAhPT0gJ2JyYW5jaCcpIGNvbnRpbnVlO1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmRlY29tcGlsZU5vZGUobm9kZUlkLCBncmFwaC5ub2Rlc1tub2RlSWRdLCBpbmRlbnQsIGdyYXBoLm5vZGVzKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGFyYW1zKG5vZGU6IEdyYXBoTm9kZSk6IHN0cmluZyB7XG4gICAgY29uc3QgU0tJUCA9IG5ldyBTZXQoWydhdG9tJywgJ25vZGVzJywgJ3RoZW4nLCAnZWxzZScsICdjb25kJywgJ21heEl0ZXJhdGlvbnMnLCAnaXRlbUtleScsICdtYXhJdGVtcyddKTtcbiAgICBpZiAobm9kZS5hdG9tID09PSAnZm9yRWFjaCcgfHwgbm9kZS5hdG9tID09PSAnZmlsdGVyJykgU0tJUC5hZGQoJ2FycmF5Jyk7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgIGlmIChTS0lQLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIHBhcnRzLnB1c2goYCR7a2V5fTogJHt0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csICdcXFxcbicpLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKS5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0Jyk7XG4gICAgICByZXR1cm4gYFwiJHtlc2NhcGVkfVwiYDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBgWyR7dmFsdWUubWFwKHYgPT4gdGhpcy5mb3JtYXRWYWx1ZSh2KSkuam9pbignLCAnKX1dYDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgcGFydHMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSkubWFwKChbaywgdl0pID0+IHtcbiAgICAgICAgY29uc3Qga2V5U3RyID0gL15bYS16QS1aX11cXHcqJC8udGVzdChrKSA/IGsgOiBgXCIke2t9XCJgO1xuICAgICAgICByZXR1cm4gYCR7a2V5U3RyfTogJHt0aGlzLmZvcm1hdFZhbHVlKHYpfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBgeyAke3BhcnRzLmpvaW4oJywgJyl9IH1gO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEFycmF5UmVmKGFycmF5OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgYXJyYXkgPT09ICdzdHJpbmcnICYmIGFycmF5LnN0YXJ0c1dpdGgoJ3t7JykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gYXJyYXkubWF0Y2goL15cXHtcXHsoXFx3KylcXH1cXH0kLyk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IGFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdENvbmRSZWYoY29uZDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGNvbmQgPT09ICdzdHJpbmcnICYmIGNvbmQuc3RhcnRzV2l0aCgne3snKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBjb25kLm1hdGNoKC9eXFx7XFx7KFxcdyspKD86XFwuKC4rPykpP1xcfVxcfSQvKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IChtYXRjaFsyXSA/IGAke21hdGNoWzFdfS4ke21hdGNoWzJdfWAgOiBtYXRjaFsxXSkgOiBTdHJpbmcoY29uZCk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcoY29uZCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVBY3ModGV4dDogc3RyaW5nKTogR3JhcGgge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgQWNzUGFyc2VyKCk7XG4gIGNvbnN0IGFzdCA9IHBhcnNlci5wYXJzZSh0ZXh0KTtcbiAgY29uc3QgY29tcGlsZXIgPSBuZXcgQWNzQ29tcGlsZXIoKTtcbiAgcmV0dXJuIGNvbXBpbGVyLmNvbXBpbGUoYXN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29tcGlsZUFjcyhncmFwaDogR3JhcGgsIG5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkZWNvbXBpbGVyID0gbmV3IEFjc0RlY29tcGlsZXIoKTtcbiAgcmV0dXJuIGRlY29tcGlsZXIuZGVjb21waWxlKGdyYXBoLCBuYW1lKTtcbn1cbiJdfQ==