@mnemonica/tactica 0.3.0 → 0.3.5
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/README.md +146 -3
- package/lib/analyzer.d.ts +246 -6
- package/lib/analyzer.js +1323 -123
- package/lib/cli.d.ts +3 -2
- package/lib/cli.js +70 -9
- package/lib/generator.d.ts +21 -2
- package/lib/generator.js +43 -2
- package/lib/graph.d.ts +28 -0
- package/lib/graph.js +78 -1
- package/lib/plugins.d.ts +14 -0
- package/lib/plugins.js +3 -1
- package/lib/scopes.d.ts +8 -0
- package/lib/scopes.js +13 -2
- package/lib/types.d.ts +18 -1
- package/lib/types.js +1 -1
- package/package.json +2 -2
package/lib/generator.js
CHANGED
|
@@ -39,8 +39,10 @@ const path = __importStar(require("path"));
|
|
|
39
39
|
* TypeScript declaration file generator
|
|
40
40
|
*/
|
|
41
41
|
class TypesGenerator {
|
|
42
|
-
constructor(graph, esm = false, outputDir = '.tactica') {
|
|
42
|
+
constructor(graph, esm = false, outputDir = '.tactica', referenceResolver) {
|
|
43
43
|
this.graph = graph;
|
|
44
|
+
this.referenceResolver = referenceResolver;
|
|
45
|
+
this.resolutionErrors = [];
|
|
44
46
|
this.esm = esm;
|
|
45
47
|
this.outputDir = outputDir;
|
|
46
48
|
}
|
|
@@ -423,8 +425,33 @@ class TypesGenerator {
|
|
|
423
425
|
/**
|
|
424
426
|
* Resolve a simple type name to its full path name
|
|
425
427
|
* e.g., "DefinitionEntry" -> "Definitions_DefinitionEntry"
|
|
428
|
+
*
|
|
429
|
+
* With a referenceResolver installed (the CLI path), resolution is
|
|
430
|
+
* path-aware per the graph identity law: the resolver returns the unique
|
|
431
|
+
* type, 'ambiguous', or undefined — the latter two record a hard-fail
|
|
432
|
+
* ResolutionError and emit `unknown` instead of silently picking a
|
|
433
|
+
* first match. Without a resolver the legacy first-match scan stays.
|
|
426
434
|
*/
|
|
427
435
|
resolveTypeName(simpleName, currentNode) {
|
|
436
|
+
if (this.referenceResolver) {
|
|
437
|
+
const resolved = this.referenceResolver(simpleName, currentNode);
|
|
438
|
+
if (resolved && resolved !== 'ambiguous') {
|
|
439
|
+
const instanceName = this.getInstanceTypeName(resolved);
|
|
440
|
+
return instanceName;
|
|
441
|
+
}
|
|
442
|
+
const anchorLocation = `${currentNode.sourceFile}:${currentNode.line}:${currentNode.column}`;
|
|
443
|
+
const ambiguousGenerationMessage = `Ambiguous reference to mnemonica type '${simpleName}' ` +
|
|
444
|
+
`while generating '${this.getFullPath(currentNode)}'`;
|
|
445
|
+
const unresolvedGenerationMessage = `Unresolved reference to mnemonica type '${simpleName}' ` +
|
|
446
|
+
`while generating '${this.getFullPath(currentNode)}'`;
|
|
447
|
+
const message = resolved === 'ambiguous'
|
|
448
|
+
? ambiguousGenerationMessage
|
|
449
|
+
: unresolvedGenerationMessage;
|
|
450
|
+
const error = { message, locations: [anchorLocation] };
|
|
451
|
+
this.resolutionErrors.push(error);
|
|
452
|
+
const unknownResult = 'unknown';
|
|
453
|
+
return unknownResult;
|
|
454
|
+
}
|
|
428
455
|
// First check if it's the current node or its children
|
|
429
456
|
if (currentNode.name === simpleName) {
|
|
430
457
|
return this.getInstanceTypeName(currentNode);
|
|
@@ -442,6 +469,14 @@ class TypesGenerator {
|
|
|
442
469
|
}
|
|
443
470
|
return simpleName;
|
|
444
471
|
}
|
|
472
|
+
/**
|
|
473
|
+
* Hard-fail graph reference errors recorded while generating (see
|
|
474
|
+
* referenceResolver). The CLI prints every location and writes no output.
|
|
475
|
+
*/
|
|
476
|
+
getResolutionErrors() {
|
|
477
|
+
const result = [...this.resolutionErrors];
|
|
478
|
+
return result;
|
|
479
|
+
}
|
|
445
480
|
/**
|
|
446
481
|
* Resolve simple type names to full path names within a type string
|
|
447
482
|
* Handles complex types like Array<UsageEntry>, Map<string, TypeEntry>, etc.
|
|
@@ -458,6 +493,12 @@ class TypesGenerator {
|
|
|
458
493
|
// Replace each simple type name with its full path version
|
|
459
494
|
let result = typeStr;
|
|
460
495
|
for (const name of sortedNames) {
|
|
496
|
+
// Skip names that do not occur — with a referenceResolver installed,
|
|
497
|
+
// resolving absent names would record spurious errors
|
|
498
|
+
const occurs = new RegExp(`\\b${name}\\b`).test(result);
|
|
499
|
+
if (!occurs) {
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
461
502
|
// Use word boundary matching to avoid replacing partial names
|
|
462
503
|
const regex = new RegExp(`\\b${name}\\b`, 'g');
|
|
463
504
|
const fullTypeName = this.resolveTypeName(name, currentNode);
|
|
@@ -508,4 +549,4 @@ class TypesGenerator {
|
|
|
508
549
|
}
|
|
509
550
|
}
|
|
510
551
|
exports.TypesGenerator = TypesGenerator;
|
|
511
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUViLDJDQUE2QjtBQU03Qjs7R0FFRztBQUNILE1BQWEsY0FBYztJQUkxQixZQUFxQixLQUFvQixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsU0FBUyxHQUFHLFVBQVU7UUFBekQsVUFBSyxHQUFMLEtBQUssQ0FBZTtRQUN4QyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBRSxRQUFnQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7Ozs7VUFPRztJQUNILDBCQUEwQjtRQUN6QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBRXBDLDJEQUEyRDtRQUMzRCxLQUFLLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDL0QsS0FBSyxDQUFDLElBQUksQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO1FBQ3RGLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixLQUFLLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDM0UsS0FBSyxDQUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ3pFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFZixrQ0FBa0M7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FB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QUFFLElBQUksQ0FBRSxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFFLFVBQWtCO1FBQzVDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDN0QsNkNBQTZDO1FBQzdDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0Qsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sYUFBYSxDQUFDO0lBQ3RCLENBQUM7Q0FDRDtBQTVnQkQsd0NBNGdCQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG5cdFR5cGVOb2RlLCBHZW5lcmF0ZWRUeXBlcyBcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBUeXBlR3JhcGhJbXBsIH0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGdlbmVyYXRvclxuICovXG5leHBvcnQgY2xhc3MgVHlwZXNHZW5lcmF0b3Ige1xuXHRwcml2YXRlIGVzbTogYm9vbGVhbjtcblx0cHJpdmF0ZSBvdXRwdXREaXI6IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvciAocHJpdmF0ZSBncmFwaDogVHlwZUdyYXBoSW1wbCwgZXNtID0gZmFsc2UsIG91dHB1dERpciA9ICcudGFjdGljYScpIHtcblx0XHR0aGlzLmVzbSA9IGVzbTtcblx0XHR0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgaW1wb3J0IHBhdGggd2l0aCBvcHRpb25hbCAuanMgZXh0ZW5zaW9uIGZvciBFU00gTm9kZU5leHRcblx0ICovXG5cdHByaXZhdGUgaW1wb3J0UGF0aCAocmVsYXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXNtID8gYCR7cmVsYXRpdmV9LmpzYCA6IHJlbGF0aXZlO1xuXHR9XG5cblx0LyoqXG5cdFx0KiBHZW5lcmF0ZSBnbG9iYWwgYXVnbWVudGF0aW9uIGZpbGUgdGhhdCBhdWdtZW50cyB1c2VyIGNsYXNzZXMgZGlyZWN0bHlcblx0XHQqIFRoaXMgYWxsb3dzIHVzaW5nIGRlY29yYXRlZCBjbGFzc2VzIHdpdGhvdXQgbWFudWFsIHR5cGUgY2FzdGluZ1xuXHRcdCpcblx0XHQqIEFsbCB0eXBlcyBhcmUgcGxhY2VkIGluIHRoZSBnbG9iYWwgc2NvcGUgdmlhIGRlY2xhcmUgZ2xvYmFsLCB3aGljaCBhbGxvd3Ncblx0XHQqIHRoZW0gdG8gYmUgYWNjZXNzZWQgZnJvbSBhbnkgbW9kdWxlIHdpdGhvdXQgaW1wb3J0cy4gSW50ZXJmYWNlcyBkZWNsYXJlZFxuXHRcdCogaW4gdGhlIGdsb2JhbCBzY29wZSB3aWxsIG1lcmdlIHdpdGggY2xhc3NlcyBvZiB0aGUgc2FtZSBuYW1lIGluIHVzZXIgbW9kdWxlcy5cblx0XHQqL1xuXHRnZW5lcmF0ZUdsb2JhbEF1Z21lbnRhdGlvbiAoKTogR2VuZXJhdGVkVHlwZXMge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Ly8gSGVhZGVyIC0gbWFrZSB0aGlzIGEgbW9kdWxlIHNvIHdlIGNhbiB1c2UgZGVjbGFyZSBnbG9iYWxcblx0XHRsaW5lcy5wdXNoKCcvLyBHZW5lcmF0ZWQgYnkgQG1uZW1vbmljYS90YWN0aWNhIC0gRE8gTk9UIEVESVQnKTtcblx0XHRsaW5lcy5wdXNoKCcvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYXV0b21hdGljIHR5cGUgYXVnbWVudGF0aW9uIGZvciBkZWNvcmF0ZWQgY2xhc3NlcycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgKi8nKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEltcG9ydCBQcm90b0ZsYXQgZnJvbSBtbmVtb25pY2Fcblx0XHRsaW5lcy5wdXNoKCdpbXBvcnQgdHlwZSB7IFByb3RvRmxhdCB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gTWFrZSB0aGlzIGEgbW9kdWxlIHNvIHdlIGNhbiB1c2UgZGVjbGFyZSBnbG9iYWxcblx0XHRsaW5lcy5wdXNoKCdleHBvcnQge307Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBBbGwgdHlwZXMgZ28gaW5zaWRlIGRlY2xhcmUgZ2xvYmFsIHNvIHRoZXkgYXJlIGdsb2JhbGx5IGFjY2Vzc2libGVcblx0XHRsaW5lcy5wdXNoKCdkZWNsYXJlIGdsb2JhbCB7Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblxuXHRcdC8vIEdlbmVyYXRlIGluc3RhbmNlIHR5cGVzIGZvciBhbGwgZGVmYXVsdC1jb2xsZWN0aW9uIHR5cGVzIC0gaW4gZ2xvYmFsIHNjb3BlXG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cdFx0XHRcdGdlbmVyYXRlZFR5cGVzLnB1c2goaW5zdGFuY2VOYW1lKTtcblx0XHRcdFx0Ly8gUm9vdCB0eXBlcyBhcmUgZGVjbGFyZWQgYXMgaW50ZXJmYWNlcyBiZWxvdyAoZGVjbGFyYXRpb25cblx0XHRcdFx0Ly8gbWVyZ2luZyB3aXRoIEBkZWNvcmF0ZSBjbGFzc2VzKS4gRW1pdHRpbmcgYHR5cGUgWGAgaGVyZSBhc1xuXHRcdFx0XHQvLyB3ZWxsIHdvdWxkIGNvbGxpZGUgd2l0aCBgaW50ZXJmYWNlIFhgIGluIHRoZSBzYW1lIGdsb2JhbFxuXHRcdFx0XHQvLyBzY29wZSAoVFMyMzAwKSwgYW5kIHRoZSByb290IGludGVyZmFjZSBhbHJlYWR5IGNhcnJpZXNcblx0XHRcdFx0Ly8gZXZlcnl0aGluZyB0aGUgYWxpYXMgd291bGQgKHByb3BzICsgY2hpbGQgY29uc3RydWN0b3JzKS5cblx0XHRcdFx0aWYgKCFub2RlLnBhcmVudCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVJbnN0YW5jZVR5cGUobm9kZSwgbGluZXMsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEdlbmVyYXRlIGNsYXNzIGludGVyZmFjZXMgLSBpbiBnbG9iYWwgc2NvcGUgZm9yIGRlY2xhcmF0aW9uIG1lcmdpbmdcblx0XHQvLyBUaGVzZSBpbnRlcmZhY2VzIHdpbGwgbWVyZ2Ugd2l0aCBjbGFzc2VzIG9mIHRoZSBzYW1lIG5hbWUgaW4gdXNlciBtb2R1bGVzXG5cdFx0bGluZXMucHVzaCgnXHQvLyBDbGFzcyBpbnRlcmZhY2VzIGZvciBkZWNsYXJhdGlvbiBtZXJnaW5nJyk7XG5cdFx0bGluZXMucHVzaCgnXHQvLyBUaGVzZSBtZXJnZSB3aXRoIEBkZWNvcmF0ZSgpIGNsYXNzZXMgdG8gcHJvdmlkZSBwcm9wZXIgdHlwaW5nJyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdlbmVyYXRlQ2xhc3NJbnRlcmZhY2Uobm9kZSwgbGluZXMsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goJ30nKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50IDogbGluZXMuam9pbignXFxuJyksXG5cdFx0XHR0eXBlcyAgIDogZ2VuZXJhdGVkVHlwZXMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGluc3RhbmNlIHR5cGUgYWxpYXMgKGRlc2NyaWJlcyB3aGF0IHRoZSBpbnN0YW5jZSBJUylcblx0XHQgKiBVc2VzIFByb3RvRmxhdCBmb3IgcHJvcGVyIGluaGVyaXRhbmNlIChleGNsdWRlcyBvdmVycmlkZGVuIHBhcmVudCBwcm9wcylcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUluc3RhbmNlVHlwZSAobm9kZTogVHlwZU5vZGUsIGxpbmVzOiBzdHJpbmdbXSwgaW5kZW50OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRlbnRTdHIgPSAnXFx0Jy5yZXBlYXQoaW5kZW50KTtcblx0XHRjb25zdCBpbnN0YW5jZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIE5lc3RlZCB0eXBlOiBVc2UgUHJvdG9GbGF0IHRvIHByb3Blcmx5IGV4Y2x1ZGUgb3ZlcnJpZGRlbiBwcm9wZXJ0aWVzXG5cdFx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn10eXBlICR7aW5zdGFuY2VOYW1lfSA9IFByb3RvRmxhdDwke3RoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlLnBhcmVudCl9LCB7YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFJvb3QgdHlwZToganVzdCB0aGUgcHJvcGVydGllcyBvYmplY3Rcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfXR5cGUgJHtpbnN0YW5jZU5hbWV9ID0ge2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBpbnN0YW5jZSBwcm9wZXJ0aWVzXG5cdFx0Zm9yIChjb25zdCBbIHByb3BOYW1lLCBwcm9wSW5mbyBdIG9mIG5vZGUucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcblx0XHRcdGNvbnN0IG9wdGlvbmFsID0gcHJvcEluZm8ub3B0aW9uYWwgPyAnPycgOiAnJztcblx0XHRcdGNvbnN0IHJlYWRvbmx5ID0gcHJvcEluZm8ucmVhZG9ubHkgPyAncmVhZG9ubHkgJyA6ICcnO1xuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtyZWFkb25seX0ke3Byb3BOYW1lfSR7b3B0aW9uYWx9OiAke3Byb3BJbmZvLnR5cGV9O2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBuZXN0ZWQgY29uc3RydWN0b3IgcHJvcGVydGllcyBmb3Igbm9uLWxlYWYgbm9kZXMg4oCUIG1pcnJvcnNcblx0XHQvLyBnZW5lcmF0ZUNvbXBsZXRlSW5zdGFuY2VJbnRlcmZhY2UgKHR5cGVzLnRzKTogc3VidHlwZXMgY29uc3RydWN0XG5cdFx0Ly8gZnJvbSBwYXJlbnQgaW5zdGFuY2VzIGF0IGFueSBkZXB0aCwgbm90IG9ubHkgZnJvbSByb290c1xuXHRcdGlmIChub2RlLmNoaWxkcmVuLnNpemUgPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4udmFsdWVzKCkpIHtcblx0XHRcdFx0Y29uc3QgY2hpbGRJbnN0YW5jZVR5cGUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUoY2hpbGQpO1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShjaGlsZCk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdCR7Y2hpbGQubmFtZX06ICR7Y29uc3RydWN0b3JTaWd9ID0+ICR7Y2hpbGRJbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZvciBuZXN0ZWQgdHlwZXMsIGFkZCB0aGlzIG5vZGUncyBjb25zdHJ1Y3RvciBhbmQgYWxsIHNpYmxpbmdzIGFzXG5cdFx0Ly8gdW5kZWZpbmVkIChzdHJpY3QtY2hhaW4gYmVoYXZpb3I7IHBhcmVudCB1bmRlZmluZWRzIGNvbWUgdmlhIFByb3RvRmxhdClcblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdCR7bm9kZS5uYW1lfTogdW5kZWZpbmVkO2ApO1xuXHRcdFx0Zm9yIChjb25zdCBzaWJsaW5nIG9mIG5vZGUucGFyZW50LmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRcdGlmIChzaWJsaW5nLm5hbWUgIT09IG5vZGUubmFtZSkge1xuXHRcdFx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdCR7c2libGluZy5uYW1lfTogdW5kZWZpbmVkO2ApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvc2UgdGhlIHR5cGUgcHJvcGVybHkgLSBQcm90b0ZsYXQgdXNlcyB9PjsgZm9yIG5lc3RlZCwgfTsgZm9yIHJvb3Rcblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfX0+O2ApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn19O2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBlbXB0eSBsaW5lIGFmdGVyIGVhY2ggdHlwZVxuXHRcdGxpbmVzLnB1c2goJycpO1xuXHR9XG5cblx0LyoqXG5cdFx0ICogR2VuZXJhdGUgY2xhc3MgaW50ZXJmYWNlIGZvciBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIG1lcmdpbmdcblx0XHQgKiBUaGlzIG1lcmdlcyB3aXRoIHRoZSBhY3R1YWwgY2xhc3MgdG8gcHJvdmlkZSBwcm9wZXIgdHlwaW5nXG5cdFx0ICovXG5cdHByaXZhdGUgZ2VuZXJhdGVDbGFzc0ludGVyZmFjZSAobm9kZTogVHlwZU5vZGUsIGxpbmVzOiBzdHJpbmdbXSwgaW5kZW50OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRlbnRTdHIgPSAnXFx0Jy5yZXBlYXQoaW5kZW50KTtcblxuXHRcdC8vIEJ1aWxkIGV4dGVuZHMgY2xhdXNlXG5cdFx0Y29uc3QgZXh0ZW5kc1R5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0ZXh0ZW5kc1R5cGVzLnB1c2gobm9kZS5wYXJlbnQubmFtZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXh0ZW5kc0NsYXVzZSA9IGV4dGVuZHNUeXBlcy5sZW5ndGggPiAwXG5cdFx0XHQ/IGAgZXh0ZW5kcyAke2V4dGVuZHNUeXBlcy5qb2luKCcsICcpfWBcblx0XHRcdDogJyc7XG5cblx0XHQvLyBJbnRlcmZhY2Ugd2l0aCBzYW1lIG5hbWUgYXMgY2xhc3MgLSBUeXBlU2NyaXB0IG1lcmdlcyB0aGVzZVxuXHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfWludGVyZmFjZSAke25vZGUubmFtZX0ke2V4dGVuZHNDbGF1c2V9IHtgKTtcblx0XHRcdFxuXHRcdC8vIEFkZCBhbGwgaW5zdGFuY2UgcHJvcGVydGllcyAoZm9yIHR5cGUgbWVyZ2luZylcblx0XHRmb3IgKGNvbnN0IFsgcHJvcE5hbWUsIHByb3BJbmZvIF0gb2Ygbm9kZS5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuXHRcdFx0Y29uc3Qgb3B0aW9uYWwgPSBwcm9wSW5mby5vcHRpb25hbCA/ICc/JyA6ICcnO1xuXHRcdFx0Y29uc3QgcmVhZG9ubHkgPSBwcm9wSW5mby5yZWFkb25seSA/ICdyZWFkb25seSAnIDogJyc7XG5cdFx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn1cXHQke3JlYWRvbmx5fSR7cHJvcE5hbWV9JHtvcHRpb25hbH06ICR7cHJvcEluZm8udHlwZX07YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHN1YnR5cGUgY29uc3RydWN0b3JzIChub24tb3B0aW9uYWwgc28gdGhleSdyZSBhY2Nlc3NpYmxlKSAtIG9ubHkgZm9yIHJvb3QgdHlwZXNcblx0XHRpZiAoIW5vZGUucGFyZW50KSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4udmFsdWVzKCkpIHtcblx0XHRcdFx0Y29uc3QgY2hpbGRJbnN0YW5jZVR5cGUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUoY2hpbGQpO1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShjaGlsZCk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdCR7Y2hpbGQubmFtZX06ICR7Y29uc3RydWN0b3JTaWd9ID0+ICR7Y2hpbGRJbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0XG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9fWApO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXHR9XG5cdFx0XG5cdC8qKlxuXHRcdCogR2VuZXJhdGUgYSB0eXBlcy50cyBmaWxlIHdpdGggY29tcGxldGUgaW5zdGFuY2UgaW50ZXJmYWNlc1xuXHRcdCogVGhpcyBpbmNsdWRlcyBhbGwgcHJvcGVydGllcyBleHRyYWN0ZWQgZnJvbSB0aGUgY29uc3RydWN0b3JzXG5cdFx0Ki9cblx0Z2VuZXJhdGVUeXBlc0ZpbGUgKCk6IEdlbmVyYXRlZFR5cGVzIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEhlYWRlclxuXHRcdGxpbmVzLnB1c2goJy8vIEdlbmVyYXRlZCBieSBAbW5lbW9uaWNhL3RhY3RpY2EgLSBETyBOT1QgRURJVCcpO1xuXHRcdGxpbmVzLnB1c2goJy8vIFRoaXMgZmlsZSBwcm92aWRlcyBjb21wbGV0ZSBUeXBlU2NyaXB0IGludGVyZmFjZXMgZm9yIE1uZW1vbmljYSB0eXBlcycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgKi8nKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEltcG9ydCBQcm90b0ZsYXQgZnJvbSBtbmVtb25pY2Fcblx0XHRsaW5lcy5wdXNoKCdpbXBvcnQgdHlwZSB7IFByb3RvRmxhdCB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gR2VuZXJhdGUgY29tcGxldGUgaW5zdGFuY2UgaW50ZXJmYWNlcyBmb3IgZGVmYXVsdC1jb2xsZWN0aW9uIHR5cGVzIGFuZFxuXHRcdC8vIGZvciBjdXN0b20gY29sbGVjdGlvbnMgdGhhdCBkZWNsYXJlIGEgdXNlci1wcm92aWRlZCByZWdpc3RyeSBpbnRlcmZhY2Vcblx0XHQvLyAoT3B0aW9uIEIpLiBDdXN0b20tY29sbGVjdGlvbiB0eXBlcyB3aXRob3V0IGEgcmVnaXN0cnkgaW50ZXJmYWNlIGFyZVxuXHRcdC8vIGlzb2xhdGVkIGF0IHJ1bnRpbWUgYW5kIGFyZSBub3QgZW1pdHRlZC5cblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLmNvbGxlY3Rpb25JZCAmJiAhbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbnRlcmZhY2VOYW1lID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXHRcdFx0XHRnZW5lcmF0ZWRUeXBlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHRcdFx0XHR0aGlzLmdlbmVyYXRlQ29tcGxldGVJbnN0YW5jZUludGVyZmFjZShub2RlLCBsaW5lcyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbnRlbnQgOiBsaW5lcy5qb2luKCdcXG4nKSxcblx0XHRcdHR5cGVzICAgOiBnZW5lcmF0ZWRUeXBlcyxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdFx0ICogR2VuZXJhdGUgYSBjb21wbGV0ZSBpbnN0YW5jZSB0eXBlIGFsaWFzIHdpdGggYWxsIHByb3BlcnRpZXNcblx0XHQgKiBUaGlzIGlzIGZvciB0aGUgdHlwZXMudHMgZmlsZSB0aGF0IHVzZXJzIGltcG9ydCBmcm9tXG5cdFx0ICovXG5cdHByaXZhdGUgZ2VuZXJhdGVDb21wbGV0ZUluc3RhbmNlSW50ZXJmYWNlIChub2RlOiBUeXBlTm9kZSwgbGluZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0Y29uc3QgdHlwZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIE5lc3RlZCB0eXBlOiBVc2UgUHJvdG9GbGF0IHRvIHByb3Blcmx5IGV4Y2x1ZGUgb3ZlcnJpZGRlbiBwcm9wZXJ0aWVzXG5cdFx0XHRsaW5lcy5wdXNoKGBleHBvcnQgdHlwZSAke3R5cGVOYW1lfSA9IFByb3RvRmxhdDwke3RoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlLnBhcmVudCl9LCB7YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFJvb3QgdHlwZToganVzdCB0aGUgcHJvcGVydGllcyBvYmplY3Rcblx0XHRcdGxpbmVzLnB1c2goYGV4cG9ydCB0eXBlICR7dHlwZU5hbWV9ID0ge2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvclxuXHRcdGZvciAoY29uc3QgWyBwcm9wTmFtZSwgcHJvcEluZm8gXSBvZiBub2RlLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IHByb3BJbmZvLm9wdGlvbmFsID8gJz8nIDogJyc7XG5cdFx0XHRjb25zdCByZWFkb25seSA9IHByb3BJbmZvLnJlYWRvbmx5ID8gJ3JlYWRvbmx5ICcgOiAnJztcblx0XHRcdGxpbmVzLnB1c2goYFxcdCR7cmVhZG9ubHl9JHtwcm9wTmFtZX0ke29wdGlvbmFsfTogJHt0aGlzLnJlc29sdmVUeXBlSW5TdHJpbmcocHJvcEluZm8udHlwZSwgbm9kZSl9O2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBuZXN0ZWQgY29uc3RydWN0b3IgcHJvcGVydGllcyBmb3Igbm9uLWxlYWYgbm9kZXNcblx0XHQvLyBMZWFmIG5vZGVzIChubyBjaGlsZHJlbikgZG9uJ3QgZ2V0IGNvbnN0cnVjdG9yIHByb3BlcnRpZXNcblx0XHQvLyBUaGlzIGZvbGxvd3MgbW5lbW9uaWNhJ3Mgc3RyaWN0Q2hhaW4gYmVoYXZpb3Jcblx0XHRpZiAobm9kZS5jaGlsZHJlbi5zaXplID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRcdGNvbnN0IGNoaWxkSW5zdGFuY2VUeXBlID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKGNoaWxkKTtcblx0XHRcdFx0Y29uc3QgY29uc3RydWN0b3JTaWcgPSB0aGlzLmdlbmVyYXRlQ29uc3RydWN0b3JTaWduYXR1cmUoY2hpbGQpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGBcXHQke2NoaWxkLm5hbWV9OiAke2NvbnN0cnVjdG9yU2lnfSA9PiAke2NoaWxkSW5zdGFuY2VUeXBlfTtgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGb3IgbmVzdGVkIHR5cGVzLCBhZGQgdGhpcyBub2RlJ3MgY29uc3RydWN0b3IgYW5kIGFsbCBzaWJsaW5ncyBmcm9tIHNhbWUgcGFyZW50IGFzIHVuZGVmaW5lZFxuXHRcdC8vIFRoaXMgaXMgbmVlZGVkIGZvciBzdHJpY3QgY2hhaW4gYmVoYXZpb3IgLSBwYXJlbnQgdW5kZWZpbmVkcyBhcmUgaW5oZXJpdGVkIHZpYSBQcm90b0ZsYXRcblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIEFkZCB0aGlzIG5vZGUncyBvd24gY29uc3RydWN0b3IgYXMgdW5kZWZpbmVkXG5cdFx0XHRsaW5lcy5wdXNoKGBcXHQke25vZGUubmFtZX06IHVuZGVmaW5lZDtgKTtcblxuXHRcdFx0Ly8gQWRkIGFsbCBzaWJsaW5ncyAob3RoZXIgY2hpbGRyZW4gb2YgdGhlIHNhbWUgcGFyZW50KSBhcyB1bmRlZmluZWRcblx0XHRcdGZvciAoY29uc3Qgc2libGluZyBvZiBub2RlLnBhcmVudC5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0XHRpZiAoc2libGluZy5uYW1lICE9PSBub2RlLm5hbWUpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKGBcXHQke3NpYmxpbmcubmFtZX06IHVuZGVmaW5lZDtgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsb3NlIHRoZSB0eXBlIHByb3Blcmx5IC0gUHJvdG9GbGF0IHVzZXMgfT47IGZvciBuZXN0ZWQsIH07IGZvciByb290XG5cdFx0aWYgKG5vZGUucGFyZW50KSB7XG5cdFx0XHRsaW5lcy5wdXNoKCd9PjsnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGluZXMucHVzaCgnfTsnKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBhIHNpbXBsZSB0eXBlIGRlY2xhcmF0aW9uIGZvciBhIHNpbmdsZSB0eXBlXG5cdFx0ICovXG5cdGdlbmVyYXRlU2luZ2xlVHlwZSAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHRoaXMuZ2VuZXJhdGVDb21wbGV0ZUluc3RhbmNlSW50ZXJmYWNlKG5vZGUsIGxpbmVzKTtcblx0XHRyZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBUeXBlUmVnaXN0cnkgaW50ZXJmYWNlIGZvciB0eXBlLXNhZmUgbG9va3VwKCkgZnVuY3Rpb25cblx0XHQgKiBBdWdtZW50IG1uZW1vbmljYSdzIFR5cGVSZWdpc3RyeSBzbyBsb29rdXAoJ1R5cGVOYW1lJykgcmV0dXJucyB0aGUgdHlwZWQgY29uc3RydWN0b3Jcblx0XHQgKi9cblx0Z2VuZXJhdGVUeXBlUmVnaXN0cnkgKCk6IEdlbmVyYXRlZFR5cGVzIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEhlYWRlclxuXHRcdGxpbmVzLnB1c2goJy8vIEdlbmVyYXRlZCBUeXBlUmVnaXN0cnkgZm9yIHR5cGUtc2FmZSBtbmVtb25pY2EubG9va3VwKCknKTtcblx0XHRsaW5lcy5wdXNoKCcvLyBUaGlzIGZpbGUgYXVnbWVudHMgbW5lbW9uaWNhXFwncyBUeXBlUmVnaXN0cnkgdmlhIGRlY2xhcmF0aW9uIG1lcmdpbmcuJyk7XG5cdFx0bGluZXMucHVzaCgnLy8nKTtcblx0XHRsaW5lcy5wdXNoKCcvLyBVc2FnZTonKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIGltcG9ydCB7IGxvb2t1cCB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgaW1wb3J0IFxcJy4vLnRhY3RpY2EvcmVnaXN0cnlcXCc7ICAvLyBhcHBsaWVzIHRoZSBhdWdtZW50YXRpb24nKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIGNvbnN0IE15VHlwZSA9IGxvb2t1cChcXCdNeVR5cGVcXCcpOycpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgLy8gVHlwZVNjcmlwdCBrbm93czogTXlUeXBlIGlzIHRoZSB0eXBlZCBjb25zdHJ1Y3RvciBmb3IgTXlUeXBlJyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICBjb25zdCBpbnN0YW5jZSA9IG5ldyBNeVR5cGUoeyAvKiBjb25zdHJ1Y3RvciBhcmdzICovIH0pOycpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgLy8gaW5zdGFuY2UgaGFzIGZ1bGwgaW50ZWxsaXNlbnNlIGZvciB0aGUgZ2VuZXJhdGVkIHR5cGUnKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEltcG9ydCBpbnN0YW5jZSB0eXBlcyBmcm9tIHR5cGVzLnRzLlxuXHRcdC8vIFNraXAgY3VzdG9tLWNvbGxlY3Rpb24gdHlwZXMgdGhhdCBoYXZlIG5vIHVzZXItcHJvdmlkZWQgcmVnaXN0cnkgaW50ZXJmYWNlLlxuXHRcdGxpbmVzLnB1c2goJ2ltcG9ydCB0eXBlIHsnKTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLmNvbGxlY3Rpb25JZCAmJiAhbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZVR5cGVOYW1lID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGBcXHQke2luc3RhbmNlVHlwZU5hbWV9LGApO1xuXHRcdFx0XHRnZW5lcmF0ZWRUeXBlcy5wdXNoKGluc3RhbmNlVHlwZU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaW5lcy5wdXNoKGB9IGZyb20gJyR7dGhpcy5pbXBvcnRQYXRoKCcuL3R5cGVzJyl9JztgKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEdlbmVyYXRlIG1vZHVsZSBhdWdtZW50YXRpb24gZm9yIG1uZW1vbmljYSBUeXBlUmVnaXN0cnlcblx0XHRsaW5lcy5wdXNoKCcvKionKTtcblx0XHRsaW5lcy5wdXNoKCcgKiBUeXBlIHJlZ2lzdHJ5IGF1Z21lbnRpbmcgbW5lbW9uaWNhXFwncyBUeXBlUmVnaXN0cnkgaW50ZXJmYWNlJyk7XG5cdFx0bGluZXMucHVzaCgnICogVGhpcyBlbmFibGVzIHR5cGUtc2FmZSBsb29rdXAoKSB3aXRob3V0IGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzJyk7XG5cdFx0bGluZXMucHVzaCgnIConKTtcblx0XHRsaW5lcy5wdXNoKCcgKiBVc2FnZTogY29uc3QgU29tZVR5cGUgPSBsb29rdXAoXFwnU29tZVR5cGVcXCcpOyAvLyBGdWxseSB0eXBlZCEnKTtcblx0XHRsaW5lcy5wdXNoKCcgKi8nKTtcblx0XHRsaW5lcy5wdXNoKCdkZWNsYXJlIG1vZHVsZSBcXCdtbmVtb25pY2FcXCcgeycpO1xuXHRcdGxpbmVzLnB1c2goJ1x0aW50ZXJmYWNlIFR5cGVSZWdpc3RyeSB7Jyk7XG5cblx0XHQvLyBHZW5lcmF0ZSBlbnRyaWVzIGZvciBhbGwgdHlwZSBwYXRocyB0aGF0IGJlbG9uZyB0byB0aGUgZGVmYXVsdC9nbG9iYWwgY29sbGVjdGlvbi5cblx0XHQvLyBUeXBlcyB0aGF0IGxpdmUgaW4gYSBjdXN0b20gY29sbGVjdGlvbiAoY29sbGVjdGlvbklkIHNldCkgYXJlIGlzb2xhdGVkIGF0IHJ1bnRpbWVcblx0XHQvLyBhbmQgYXJlIG5vdCByZWFjaGFibGUgdGhyb3VnaCBmcmVlIGxvb2t1cCgpLCBzbyB0aGV5IG11c3Qgbm90IGJlIGFkZGVkIHRvIHRoZVxuXHRcdC8vIGdsb2JhbCBUeXBlUmVnaXN0cnkgYXVnbWVudGF0aW9uLlxuXHRcdGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5ncmFwaC5kZnMocm9vdCkpIHtcblx0XHRcdFx0aWYgKG5vZGUuY29sbGVjdGlvbklkKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKG5vZGUpO1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZVR5cGUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cdFx0XHRcdC8vIEdlbmVyYXRlIHR5cGVkIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBmb3IgbmVzdGVkIHR5cGVzIHdpdGggcHJvcGVydGllc1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShub2RlKTtcblx0XHRcdFx0bGluZXMucHVzaChgXFx0XFx0JyR7ZnVsbFBhdGh9JzogJHtjb25zdHJ1Y3RvclNpZ30gPT4gJHtpbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goJ1xcdH0nKTtcblx0XHRsaW5lcy5wdXNoKCd9Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBHZW5lcmF0ZSBwZXItY29sbGVjdGlvbiByZWdpc3RyeSBhdWdtZW50YXRpb25zIGZvciBPcHRpb24gQlxuXHRcdC8vICh1c2VyLXByb3ZpZGVkIHJlZ2lzdHJ5IGludGVyZmFjZXMpLlxuXHRcdGNvbnN0IGNvbGxlY3Rpb25Hcm91cHMgPSB0aGlzLmdyb3VwQ29sbGVjdGlvblJlZ2lzdHJ5Tm9kZXMoKTtcblx0XHRmb3IgKGNvbnN0IFsga2V5LCBub2RlcyBdIG9mIGNvbGxlY3Rpb25Hcm91cHMpIHtcblx0XHRcdGNvbnN0IFsgcmVnaXN0cnlJbnRlcmZhY2VOYW1lLCBzb3VyY2VGaWxlIF0gPSBrZXkuc3BsaXQoJzo6Jyk7XG5cdFx0XHRjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5yZXNvbHZlTW9kdWxlUGF0aChzb3VyY2VGaWxlKTtcblx0XHRcdGxpbmVzLnB1c2goYGRlY2xhcmUgbW9kdWxlICcke21vZHVsZVBhdGh9JyB7YCk7XG5cdFx0XHRsaW5lcy5wdXNoKGBcXHRpbnRlcmZhY2UgJHtyZWdpc3RyeUludGVyZmFjZU5hbWV9IHtgKTtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuXHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IHRoaXMuZ2V0RnVsbFBhdGgobm9kZSk7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRcdFx0Y29uc3QgY29uc3RydWN0b3JTaWcgPSB0aGlzLmdlbmVyYXRlQ29uc3RydWN0b3JTaWduYXR1cmUobm9kZSk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYFxcdFxcdCcke2Z1bGxQYXRofSc6ICR7Y29uc3RydWN0b3JTaWd9ID0+ICR7aW5zdGFuY2VUeXBlfTtgKTtcblx0XHRcdH1cblx0XHRcdGxpbmVzLnB1c2goJ1xcdH0nKTtcblx0XHRcdGxpbmVzLnB1c2goJ30nKTtcblx0XHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdC8vIFJlLWV4cG9ydCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgZXhwbGljaXQgdXNhZ2Vcblx0XHRsaW5lcy5wdXNoKCdpbXBvcnQgdHlwZSB7IFR5cGVSZWdpc3RyeSB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJ2V4cG9ydCB0eXBlIHsgVHlwZVJlZ2lzdHJ5IH07Jyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Y29udGVudCA6IGxpbmVzLmpvaW4oJ1xcbicpLFxuXHRcdFx0dHlwZXMgICA6IGdlbmVyYXRlZFR5cGVzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBzaWduYXR1cmUgZm9yIGEgdHlwZSBub2RlXG5cdFx0ICogVXNlcyBjb25zdHJ1Y3RvclBhcmFtcyBmb3IgVHlwZVJlZ2lzdHJ5IHNpZ25hdHVyZSAobm90IGluc3RhbmNlIHByb3BlcnRpZXMpXG5cdFx0ICovXG5cdHByaXZhdGUgZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZSAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdC8vIFVzZSBjb25zdHJ1Y3RvclBhcmFtcyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gZW1wdHkgc2lnbmF0dXJlXG5cdFx0Y29uc3QgcGFyYW1zID0gbm9kZS5jb25zdHJ1Y3RvclBhcmFtcztcblxuXHRcdGlmICghcGFyYW1zIHx8IHBhcmFtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiAnbmV3ICgpJztcblx0XHR9XG5cblx0XHQvLyBCdWlsZCB0eXBlZCBjb25zdHJ1Y3RvciBzaWduYXR1cmUgZnJvbSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzXG5cdFx0Y29uc3QgcHJvcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdGNvbnN0IG9wdGlvbmFsID0gcGFyYW0ub3B0aW9uYWwgPyAnPycgOiAnJztcblx0XHRcdHByb3BzLnB1c2goYCR7cGFyYW0ubmFtZX0ke29wdGlvbmFsfTogJHtwYXJhbS50eXBlfWApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBjb25zdHJ1Y3RvciBzaWduYXR1cmUgd2l0aCBkYXRhIHBhcmFtZXRlclxuXHRcdHJldHVybiBgbmV3ICgke3Byb3BzLmpvaW4oJywgJyl9KWA7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZXQgdGhlIGZ1bGwgZG90dGVkIHBhdGggZm9yIGEgdHlwZSBub2RlXG5cdFx0ICovXG5cdHByaXZhdGUgZ2V0RnVsbFBhdGggKG5vZGU6IFR5cGVOb2RlKTogc3RyaW5nIHtcblx0XHRpZiAoIW5vZGUucGFyZW50KSB7XG5cdFx0XHRyZXR1cm4gbm9kZS5uYW1lO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7dGhpcy5nZXRGdWxsUGF0aChub2RlLnBhcmVudCl9LiR7bm9kZS5uYW1lfWA7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBpbnN0YW5jZSB0eXBlIG5hbWUgZm9yIGEgbm9kZVxuXHQgKiBVc2VzIGZ1bGwgcGF0aCB3aXRoIHVuZGVyc2NvcmVzOiBVc2FnZXMuVXNhZ2VFbnRyeSAtPiBVc2FnZXNfVXNhZ2VFbnRyeVxuXHQgKiBGb3IgT3B0aW9uIEIgY3VzdG9tIGNvbGxlY3Rpb25zLCBwcmVmaXhlcyB3aXRoIHRoZSByZWdpc3RyeSBpbnRlcmZhY2UgbmFtZS5cblx0ICovXG5cdHByaXZhdGUgZ2V0SW5zdGFuY2VUeXBlTmFtZSAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5nZXRGdWxsUGF0aChub2RlKTtcblx0XHRjb25zdCBwcmVmaXggPSBub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZSA/IGAke25vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lfV9gIDogJyc7XG5cdFx0cmV0dXJuIGAke3ByZWZpeH0ke2Z1bGxQYXRoLnJlcGxhY2UoL1xcLi9nLCAnXycpfWA7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBhIHNpbXBsZSB0eXBlIG5hbWUgdG8gaXRzIGZ1bGwgcGF0aCBuYW1lXG5cdCAqIGUuZy4sIFwiRGVmaW5pdGlvbkVudHJ5XCIgLT4gXCJEZWZpbml0aW9uc19EZWZpbml0aW9uRW50cnlcIlxuXHQgKi9cblx0cHJpdmF0ZSByZXNvbHZlVHlwZU5hbWUgKHNpbXBsZU5hbWU6IHN0cmluZywgY3VycmVudE5vZGU6IFR5cGVOb2RlKTogc3RyaW5nIHtcblx0XHQvLyBGaXJzdCBjaGVjayBpZiBpdCdzIHRoZSBjdXJyZW50IG5vZGUgb3IgaXRzIGNoaWxkcmVuXG5cdFx0aWYgKGN1cnJlbnROb2RlLm5hbWUgPT09IHNpbXBsZU5hbWUpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUoY3VycmVudE5vZGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGN1cnJlbnROb2RlLmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRpZiAoY2hpbGQubmFtZSA9PT0gc2ltcGxlTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKGNoaWxkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gU2VhcmNoIGFsbCB0eXBlcyBpbiB0aGUgZ3JhcGhcblx0XHRmb3IgKGNvbnN0IHR5cGUgb2YgdGhpcy5ncmFwaC5nZXRBbGxUeXBlcygpKSB7XG5cdFx0XHRpZiAodHlwZS5uYW1lID09PSBzaW1wbGVOYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUodHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzaW1wbGVOYW1lO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgc2ltcGxlIHR5cGUgbmFtZXMgdG8gZnVsbCBwYXRoIG5hbWVzIHdpdGhpbiBhIHR5cGUgc3RyaW5nXG5cdCAqIEhhbmRsZXMgY29tcGxleCB0eXBlcyBsaWtlIEFycmF5PFVzYWdlRW50cnk+LCBNYXA8c3RyaW5nLCBUeXBlRW50cnk+LCBldGMuXG5cdCAqL1xuXHRwcml2YXRlIHJlc29sdmVUeXBlSW5TdHJpbmcgKHR5cGVTdHI6IHN0cmluZywgY3VycmVudE5vZGU6IFR5cGVOb2RlKTogc3RyaW5nIHtcblx0XHQvLyBHZXQgYWxsIHR5cGUgbmFtZXMgZnJvbSB0aGUgZ3JhcGhcblx0XHRjb25zdCBhbGxUeXBlcyA9IHRoaXMuZ3JhcGguZ2V0QWxsVHlwZXMoKTtcblx0XHRjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IHR5cGUgb2YgYWxsVHlwZXMpIHtcblx0XHRcdHR5cGVOYW1lcy5hZGQodHlwZS5uYW1lKTtcblx0XHR9XG5cblx0XHQvLyBTb3J0IGJ5IGxlbmd0aCAobG9uZ2VzdCBmaXJzdCkgdG8gYXZvaWQgcGFydGlhbCByZXBsYWNlbWVudHNcblx0XHRjb25zdCBzb3J0ZWROYW1lcyA9IEFycmF5LmZyb20odHlwZU5hbWVzKS5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKTtcblxuXHRcdC8vIFJlcGxhY2UgZWFjaCBzaW1wbGUgdHlwZSBuYW1lIHdpdGggaXRzIGZ1bGwgcGF0aCB2ZXJzaW9uXG5cdFx0bGV0IHJlc3VsdCA9IHR5cGVTdHI7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHNvcnRlZE5hbWVzKSB7XG5cdFx0XHQvLyBVc2Ugd29yZCBib3VuZGFyeSBtYXRjaGluZyB0byBhdm9pZCByZXBsYWNpbmcgcGFydGlhbCBuYW1lc1xuXHRcdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7bmFtZX1cXFxcYmAsICdnJyk7XG5cdFx0XHRjb25zdCBmdWxsVHlwZU5hbWUgPSB0aGlzLnJlc29sdmVUeXBlTmFtZShuYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAoZnVsbFR5cGVOYW1lICE9PSBuYW1lKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHJlZ2V4LCBmdWxsVHlwZU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdyb3VwIGNvbGxlY3Rpb24gdHlwZSBub2RlcyBieSB0aGVpciByZWdpc3RyeSBpbnRlcmZhY2UgbmFtZSBhbmQgc291cmNlIGZpbGUuXG5cdCAqIFJldHVybnMgYSBtYXAga2V5ZWQgYnkgYCR7cmVnaXN0cnlJbnRlcmZhY2VOYW1lfTo6JHtzb3VyY2VGaWxlfWAuXG5cdCAqL1xuXHRwcml2YXRlIGdyb3VwQ29sbGVjdGlvblJlZ2lzdHJ5Tm9kZXMgKCk6IE1hcDxzdHJpbmcsIFR5cGVOb2RlW10+IHtcblx0XHRjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZU5vZGVbXT4oKTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmICghbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBrZXkgPSBgJHtub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZX06OiR7bm9kZS5zb3VyY2VGaWxlfWA7XG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBzLmdldChrZXkpO1xuXHRcdFx0XHRpZiAoZXhpc3RpbmcpIHtcblx0XHRcdFx0XHRleGlzdGluZy5wdXNoKG5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGdyb3Vwcy5zZXQoa2V5LCBbIG5vZGUgXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGdyb3Vwcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIGEgc291cmNlIGZpbGUgcGF0aCB0byBhIG1vZHVsZSBzcGVjaWZpZXIgcmVsYXRpdmUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnksXG5cdCAqIHN1aXRhYmxlIGZvciB1c2UgaW4gYSBgZGVjbGFyZSBtb2R1bGUgJy4uLidgIGJsb2NrLlxuXHQgKi9cblx0cHJpdmF0ZSByZXNvbHZlTW9kdWxlUGF0aCAoc291cmNlRmlsZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBvdXRwdXRBYnNvbHV0ZSA9IHBhdGgucmVzb2x2ZSh0aGlzLm91dHB1dERpcik7XG5cdFx0Y29uc3Qgc291cmNlQWJzb2x1dGUgPSBwYXRoLnJlc29sdmUoc291cmNlRmlsZSk7XG5cdFx0bGV0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShvdXRwdXRBYnNvbHV0ZSwgc291cmNlQWJzb2x1dGUpO1xuXHRcdC8vIFJlbW92ZSAudHMgZXh0ZW5zaW9uOyBrZWVwIC50c3ggaWYgcHJlc2VudFxuXHRcdGlmIChyZWxhdGl2ZS5lbmRzV2l0aCgnLnRzJykgJiYgIXJlbGF0aXZlLmVuZHNXaXRoKCcudHN4JykpIHtcblx0XHRcdHJlbGF0aXZlID0gcmVsYXRpdmUuc2xpY2UoMCwgLTMpO1xuXHRcdH1cblx0XHQvLyBDb252ZXJ0IFdpbmRvd3Mgc2VwYXJhdG9ycyB0byBQT1NJWFxuXHRcdGNvbnN0IHBvc2l4UmVsYXRpdmUgPSByZWxhdGl2ZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cdFx0cmV0dXJuIHBvc2l4UmVsYXRpdmU7XG5cdH1cbn1cbiJdfQ==
|
|
552
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUViLDJDQUE2QjtBQWdCN0I7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFLMUIsWUFDUyxLQUFvQixFQUM1QixHQUFHLEdBQUcsS0FBSyxFQUNYLFNBQVMsR0FBRyxVQUFVLEVBQ2QsaUJBQTBDO1FBSDFDLFVBQUssR0FBTCxLQUFLLENBQWU7UUFHcEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQU4zQyxxQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBUWhELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFFLFFBQWdCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7OztVQU9HO0lBQ0gsMEJBQTBCO1FBQ3pCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFFcEMsMkRBQTJEO1FBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLHlFQUF5RSxDQUFDLENBQUM7UUFDdEYsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEtBQUssQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQztRQUMzRSxLQUFLLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDekUsS0FBSyxDQUFDLElBQUksQ0FB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dHJpY3QnO1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcblx0VHlwZU5vZGUsIEdlbmVyYXRlZFR5cGVzLCBSZXNvbHV0aW9uRXJyb3IgXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVHlwZUdyYXBoSW1wbCB9IGZyb20gJy4vZ3JhcGgnO1xuXG4vKipcbiAqIFBhdGgtYXdhcmUgcmVzb2x2ZXIgZm9yIG1uZW1vbmljYSBncmFwaCB0eXBlIG5hbWVzIHJlZmVyZW5jZWQgaW5zaWRlIHR5cGVcbiAqIHN0cmluZ3Mgd2hpbGUgZ2VuZXJhdGluZyBvdXRwdXQuIFJldHVybnMgdGhlIHVuaXF1ZSB0eXBlLCAnYW1iaWd1b3VzJywgb3JcbiAqIHVuZGVmaW5lZCAocmVzb2x2ZXMgdG8gbm90aGluZykg4oCUIHNlZSByZXNvbHZlR3JhcGhUeXBlUmVmZXJlbmNlLlxuICovXG5leHBvcnQgdHlwZSBHcmFwaFJlZmVyZW5jZVJlc29sdmVyID0gKFxuXHRzaW1wbGVOYW1lOiBzdHJpbmcsXG5cdGN1cnJlbnROb2RlOiBUeXBlTm9kZVxuKSA9PiBUeXBlTm9kZSB8ICdhbWJpZ3VvdXMnIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBnZW5lcmF0b3JcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVzR2VuZXJhdG9yIHtcblx0cHJpdmF0ZSBlc206IGJvb2xlYW47XG5cdHByaXZhdGUgb3V0cHV0RGlyOiBzdHJpbmc7XG5cdHByaXZhdGUgcmVzb2x1dGlvbkVycm9yczogUmVzb2x1dGlvbkVycm9yW10gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBncmFwaDogVHlwZUdyYXBoSW1wbCxcblx0XHRlc20gPSBmYWxzZSxcblx0XHRvdXRwdXREaXIgPSAnLnRhY3RpY2EnLFxuXHRcdHByaXZhdGUgcmVmZXJlbmNlUmVzb2x2ZXI/OiBHcmFwaFJlZmVyZW5jZVJlc29sdmVyXG5cdCkge1xuXHRcdHRoaXMuZXNtID0gZXNtO1xuXHRcdHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBpbXBvcnQgcGF0aCB3aXRoIG9wdGlvbmFsIC5qcyBleHRlbnNpb24gZm9yIEVTTSBOb2RlTmV4dFxuXHQgKi9cblx0cHJpdmF0ZSBpbXBvcnRQYXRoIChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5lc20gPyBgJHtyZWxhdGl2ZX0uanNgIDogcmVsYXRpdmU7XG5cdH1cblxuXHQvKipcblx0XHQqIEdlbmVyYXRlIGdsb2JhbCBhdWdtZW50YXRpb24gZmlsZSB0aGF0IGF1Z21lbnRzIHVzZXIgY2xhc3NlcyBkaXJlY3RseVxuXHRcdCogVGhpcyBhbGxvd3MgdXNpbmcgZGVjb3JhdGVkIGNsYXNzZXMgd2l0aG91dCBtYW51YWwgdHlwZSBjYXN0aW5nXG5cdFx0KlxuXHRcdCogQWxsIHR5cGVzIGFyZSBwbGFjZWQgaW4gdGhlIGdsb2JhbCBzY29wZSB2aWEgZGVjbGFyZSBnbG9iYWwsIHdoaWNoIGFsbG93c1xuXHRcdCogdGhlbSB0byBiZSBhY2Nlc3NlZCBmcm9tIGFueSBtb2R1bGUgd2l0aG91dCBpbXBvcnRzLiBJbnRlcmZhY2VzIGRlY2xhcmVkXG5cdFx0KiBpbiB0aGUgZ2xvYmFsIHNjb3BlIHdpbGwgbWVyZ2Ugd2l0aCBjbGFzc2VzIG9mIHRoZSBzYW1lIG5hbWUgaW4gdXNlciBtb2R1bGVzLlxuXHRcdCovXG5cdGdlbmVyYXRlR2xvYmFsQXVnbWVudGF0aW9uICgpOiBHZW5lcmF0ZWRUeXBlcyB7XG5cdFx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvLyBIZWFkZXIgLSBtYWtlIHRoaXMgYSBtb2R1bGUgc28gd2UgY2FuIHVzZSBkZWNsYXJlIGdsb2JhbFxuXHRcdGxpbmVzLnB1c2goJy8vIEdlbmVyYXRlZCBieSBAbW5lbW9uaWNhL3RhY3RpY2EgLSBETyBOT1QgRURJVCcpO1xuXHRcdGxpbmVzLnB1c2goJy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhdXRvbWF0aWMgdHlwZSBhdWdtZW50YXRpb24gZm9yIGRlY29yYXRlZCBjbGFzc2VzJyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdFx0bGluZXMucHVzaCgnLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlICovJyk7XG5cdFx0bGluZXMucHVzaCgnLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZSAqLycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gSW1wb3J0IFByb3RvRmxhdCBmcm9tIG1uZW1vbmljYVxuXHRcdGxpbmVzLnB1c2goJ2ltcG9ydCB0eXBlIHsgUHJvdG9GbGF0IH0gZnJvbSBcXCdtbmVtb25pY2FcXCc7Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBNYWtlIHRoaXMgYSBtb2R1bGUgc28gd2UgY2FuIHVzZSBkZWNsYXJlIGdsb2JhbFxuXHRcdGxpbmVzLnB1c2goJ2V4cG9ydCB7fTsnKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEFsbCB0eXBlcyBnbyBpbnNpZGUgZGVjbGFyZSBnbG9iYWwgc28gdGhleSBhcmUgZ2xvYmFsbHkgYWNjZXNzaWJsZVxuXHRcdGxpbmVzLnB1c2goJ2RlY2xhcmUgZ2xvYmFsIHsnKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXG5cdFx0Ly8gR2VuZXJhdGUgaW5zdGFuY2UgdHlwZXMgZm9yIGFsbCBkZWZhdWx0LWNvbGxlY3Rpb24gdHlwZXMgLSBpbiBnbG9iYWwgc2NvcGVcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLmNvbGxlY3Rpb25JZCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRcdFx0Z2VuZXJhdGVkVHlwZXMucHVzaChpbnN0YW5jZU5hbWUpO1xuXHRcdFx0XHQvLyBSb290IHR5cGVzIGFyZSBkZWNsYXJlZCBhcyBpbnRlcmZhY2VzIGJlbG93IChkZWNsYXJhdGlvblxuXHRcdFx0XHQvLyBtZXJnaW5nIHdpdGggQGRlY29yYXRlIGNsYXNzZXMpLiBFbWl0dGluZyBgdHlwZSBYYCBoZXJlIGFzXG5cdFx0XHRcdC8vIHdlbGwgd291bGQgY29sbGlkZSB3aXRoIGBpbnRlcmZhY2UgWGAgaW4gdGhlIHNhbWUgZ2xvYmFsXG5cdFx0XHRcdC8vIHNjb3BlIChUUzIzMDApLCBhbmQgdGhlIHJvb3QgaW50ZXJmYWNlIGFscmVhZHkgY2Fycmllc1xuXHRcdFx0XHQvLyBldmVyeXRoaW5nIHRoZSBhbGlhcyB3b3VsZCAocHJvcHMgKyBjaGlsZCBjb25zdHJ1Y3RvcnMpLlxuXHRcdFx0XHRpZiAoIW5vZGUucGFyZW50KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZW5lcmF0ZUluc3RhbmNlVHlwZShub2RlLCBsaW5lcywgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gR2VuZXJhdGUgY2xhc3MgaW50ZXJmYWNlcyAtIGluIGdsb2JhbCBzY29wZSBmb3IgZGVjbGFyYXRpb24gbWVyZ2luZ1xuXHRcdC8vIFRoZXNlIGludGVyZmFjZXMgd2lsbCBtZXJnZSB3aXRoIGNsYXNzZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiB1c2VyIG1vZHVsZXNcblx0XHRsaW5lcy5wdXNoKCdcdC8vIENsYXNzIGludGVyZmFjZXMgZm9yIGRlY2xhcmF0aW9uIG1lcmdpbmcnKTtcblx0XHRsaW5lcy5wdXNoKCdcdC8vIFRoZXNlIG1lcmdlIHdpdGggQGRlY29yYXRlKCkgY2xhc3NlcyB0byBwcm92aWRlIHByb3BlciB0eXBpbmcnKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLmNvbGxlY3Rpb25JZCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVDbGFzc0ludGVyZmFjZShub2RlLCBsaW5lcywgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGluZXMucHVzaCgnfScpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbnRlbnQgOiBsaW5lcy5qb2luKCdcXG4nKSxcblx0XHRcdHR5cGVzICAgOiBnZW5lcmF0ZWRUeXBlcyxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdFx0ICogR2VuZXJhdGUgaW5zdGFuY2UgdHlwZSBhbGlhcyAoZGVzY3JpYmVzIHdoYXQgdGhlIGluc3RhbmNlIElTKVxuXHRcdCAqIFVzZXMgUHJvdG9GbGF0IGZvciBwcm9wZXIgaW5oZXJpdGFuY2UgKGV4Y2x1ZGVzIG92ZXJyaWRkZW4gcGFyZW50IHByb3BzKVxuXHRcdCAqL1xuXHRwcml2YXRlIGdlbmVyYXRlSW5zdGFuY2VUeXBlIChub2RlOiBUeXBlTm9kZSwgbGluZXM6IHN0cmluZ1tdLCBpbmRlbnQ6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IGluZGVudFN0ciA9ICdcXHQnLnJlcGVhdChpbmRlbnQpO1xuXHRcdGNvbnN0IGluc3RhbmNlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0Ly8gTmVzdGVkIHR5cGU6IFVzZSBQcm90b0ZsYXQgdG8gcHJvcGVybHkgZXhjbHVkZSBvdmVycmlkZGVuIHByb3BlcnRpZXNcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfXR5cGUgJHtpbnN0YW5jZU5hbWV9ID0gUHJvdG9GbGF0PCR7dGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUucGFyZW50KX0sIHtgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUm9vdCB0eXBlOiBqdXN0IHRoZSBwcm9wZXJ0aWVzIG9iamVjdFxuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9dHlwZSAke2luc3RhbmNlTmFtZX0gPSB7YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGluc3RhbmNlIHByb3BlcnRpZXNcblx0XHRmb3IgKGNvbnN0IFsgcHJvcE5hbWUsIHByb3BJbmZvIF0gb2Ygbm9kZS5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuXHRcdFx0Y29uc3Qgb3B0aW9uYWwgPSBwcm9wSW5mby5vcHRpb25hbCA/ICc/JyA6ICcnO1xuXHRcdFx0Y29uc3QgcmVhZG9ubHkgPSBwcm9wSW5mby5yZWFkb25seSA/ICdyZWFkb25seSAnIDogJyc7XG5cdFx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn1cXHQke3JlYWRvbmx5fSR7cHJvcE5hbWV9JHtvcHRpb25hbH06ICR7cHJvcEluZm8udHlwZX07YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIG5lc3RlZCBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGZvciBub24tbGVhZiBub2RlcyDigJQgbWlycm9yc1xuXHRcdC8vIGdlbmVyYXRlQ29tcGxldGVJbnN0YW5jZUludGVyZmFjZSAodHlwZXMudHMpOiBzdWJ0eXBlcyBjb25zdHJ1Y3Rcblx0XHQvLyBmcm9tIHBhcmVudCBpbnN0YW5jZXMgYXQgYW55IGRlcHRoLCBub3Qgb25seSBmcm9tIHJvb3RzXG5cdFx0aWYgKG5vZGUuY2hpbGRyZW4uc2l6ZSA+IDApIHtcblx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0XHRjb25zdCBjaGlsZEluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShjaGlsZCk7XG5cdFx0XHRcdGNvbnN0IGNvbnN0cnVjdG9yU2lnID0gdGhpcy5nZW5lcmF0ZUNvbnN0cnVjdG9yU2lnbmF0dXJlKGNoaWxkKTtcblx0XHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtjaGlsZC5uYW1lfTogJHtjb25zdHJ1Y3RvclNpZ30gPT4gJHtjaGlsZEluc3RhbmNlVHlwZX07YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5lc3RlZCB0eXBlcywgYWRkIHRoaXMgbm9kZSdzIGNvbnN0cnVjdG9yIGFuZCBhbGwgc2libGluZ3MgYXNcblx0XHQvLyB1bmRlZmluZWQgKHN0cmljdC1jaGFpbiBiZWhhdmlvcjsgcGFyZW50IHVuZGVmaW5lZHMgY29tZSB2aWEgUHJvdG9GbGF0KVxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtub2RlLm5hbWV9OiB1bmRlZmluZWQ7YCk7XG5cdFx0XHRmb3IgKGNvbnN0IHNpYmxpbmcgb2Ygbm9kZS5wYXJlbnQuY2hpbGRyZW4udmFsdWVzKCkpIHtcblx0XHRcdFx0aWYgKHNpYmxpbmcubmFtZSAhPT0gbm9kZS5uYW1lKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtzaWJsaW5nLm5hbWV9OiB1bmRlZmluZWQ7YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDbG9zZSB0aGUgdHlwZSBwcm9wZXJseSAtIFByb3RvRmxhdCB1c2VzIH0+OyBmb3IgbmVzdGVkLCB9OyBmb3Igcm9vdFxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9fT47YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfX07YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGVtcHR5IGxpbmUgYWZ0ZXIgZWFjaCB0eXBlXG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBjbGFzcyBpbnRlcmZhY2UgZm9yIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gbWVyZ2luZ1xuXHRcdCAqIFRoaXMgbWVyZ2VzIHdpdGggdGhlIGFjdHVhbCBjbGFzcyB0byBwcm92aWRlIHByb3BlciB0eXBpbmdcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUNsYXNzSW50ZXJmYWNlIChub2RlOiBUeXBlTm9kZSwgbGluZXM6IHN0cmluZ1tdLCBpbmRlbnQ6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IGluZGVudFN0ciA9ICdcXHQnLnJlcGVhdChpbmRlbnQpO1xuXG5cdFx0Ly8gQnVpbGQgZXh0ZW5kcyBjbGF1c2Vcblx0XHRjb25zdCBleHRlbmRzVHlwZXM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKG5vZGUucGFyZW50KSB7XG5cdFx0XHRleHRlbmRzVHlwZXMucHVzaChub2RlLnBhcmVudC5uYW1lKTtcblx0XHR9XG5cblx0XHRjb25zdCBleHRlbmRzQ2xhdXNlID0gZXh0ZW5kc1R5cGVzLmxlbmd0aCA+IDBcblx0XHRcdD8gYCBleHRlbmRzICR7ZXh0ZW5kc1R5cGVzLmpvaW4oJywgJyl9YFxuXHRcdFx0OiAnJztcblxuXHRcdC8vIEludGVyZmFjZSB3aXRoIHNhbWUgbmFtZSBhcyBjbGFzcyAtIFR5cGVTY3JpcHQgbWVyZ2VzIHRoZXNlXG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9aW50ZXJmYWNlICR7bm9kZS5uYW1lfSR7ZXh0ZW5kc0NsYXVzZX0ge2ApO1xuXHRcdFx0XG5cdFx0Ly8gQWRkIGFsbCBpbnN0YW5jZSBwcm9wZXJ0aWVzIChmb3IgdHlwZSBtZXJnaW5nKVxuXHRcdGZvciAoY29uc3QgWyBwcm9wTmFtZSwgcHJvcEluZm8gXSBvZiBub2RlLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IHByb3BJbmZvLm9wdGlvbmFsID8gJz8nIDogJyc7XG5cdFx0XHRjb25zdCByZWFkb25seSA9IHByb3BJbmZvLnJlYWRvbmx5ID8gJ3JlYWRvbmx5ICcgOiAnJztcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdCR7cmVhZG9ubHl9JHtwcm9wTmFtZX0ke29wdGlvbmFsfTogJHtwcm9wSW5mby50eXBlfTtgKTtcblx0XHR9XG5cblx0XHQvLyBBZGQgc3VidHlwZSBjb25zdHJ1Y3RvcnMgKG5vbi1vcHRpb25hbCBzbyB0aGV5J3JlIGFjY2Vzc2libGUpIC0gb25seSBmb3Igcm9vdCB0eXBlc1xuXHRcdGlmICghbm9kZS5wYXJlbnQpIHtcblx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0XHRjb25zdCBjaGlsZEluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShjaGlsZCk7XG5cdFx0XHRcdGNvbnN0IGNvbnN0cnVjdG9yU2lnID0gdGhpcy5nZW5lcmF0ZUNvbnN0cnVjdG9yU2lnbmF0dXJlKGNoaWxkKTtcblx0XHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtjaGlsZC5uYW1lfTogJHtjb25zdHJ1Y3RvclNpZ30gPT4gJHtjaGlsZEluc3RhbmNlVHlwZX07YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcblx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn19YCk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdH1cblx0XHRcblx0LyoqXG5cdFx0KiBHZW5lcmF0ZSBhIHR5cGVzLnRzIGZpbGUgd2l0aCBjb21wbGV0ZSBpbnN0YW5jZSBpbnRlcmZhY2VzXG5cdFx0KiBUaGlzIGluY2x1ZGVzIGFsbCBwcm9wZXJ0aWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcnNcblx0XHQqL1xuXHRnZW5lcmF0ZVR5cGVzRmlsZSAoKTogR2VuZXJhdGVkVHlwZXMge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Ly8gSGVhZGVyXG5cdFx0bGluZXMucHVzaCgnLy8gR2VuZXJhdGVkIGJ5IEBtbmVtb25pY2EvdGFjdGljYSAtIERPIE5PVCBFRElUJyk7XG5cdFx0bGluZXMucHVzaCgnLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGNvbXBsZXRlIFR5cGVTY3JpcHQgaW50ZXJmYWNlcyBmb3IgTW5lbW9uaWNhIHR5cGVzJyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdFx0bGluZXMucHVzaCgnLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlICovJyk7XG5cdFx0bGluZXMucHVzaCgnLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZSAqLycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gSW1wb3J0IFByb3RvRmxhdCBmcm9tIG1uZW1vbmljYVxuXHRcdGxpbmVzLnB1c2goJ2ltcG9ydCB0eXBlIHsgUHJvdG9GbGF0IH0gZnJvbSBcXCdtbmVtb25pY2FcXCc7Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBHZW5lcmF0ZSBjb21wbGV0ZSBpbnN0YW5jZSBpbnRlcmZhY2VzIGZvciBkZWZhdWx0LWNvbGxlY3Rpb24gdHlwZXMgYW5kXG5cdFx0Ly8gZm9yIGN1c3RvbSBjb2xsZWN0aW9ucyB0aGF0IGRlY2xhcmUgYSB1c2VyLXByb3ZpZGVkIHJlZ2lzdHJ5IGludGVyZmFjZVxuXHRcdC8vIChPcHRpb24gQikuIEN1c3RvbS1jb2xsZWN0aW9uIHR5cGVzIHdpdGhvdXQgYSByZWdpc3RyeSBpbnRlcmZhY2UgYXJlXG5cdFx0Ly8gaXNvbGF0ZWQgYXQgcnVudGltZSBhbmQgYXJlIG5vdCBlbWl0dGVkLlxuXHRcdGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5ncmFwaC5kZnMocm9vdCkpIHtcblx0XHRcdFx0aWYgKG5vZGUuY29sbGVjdGlvbklkICYmICFub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGludGVyZmFjZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cdFx0XHRcdGdlbmVyYXRlZFR5cGVzLnB1c2goaW50ZXJmYWNlTmFtZSk7XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVDb21wbGV0ZUluc3RhbmNlSW50ZXJmYWNlKG5vZGUsIGxpbmVzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Y29udGVudCA6IGxpbmVzLmpvaW4oJ1xcbicpLFxuXHRcdFx0dHlwZXMgICA6IGdlbmVyYXRlZFR5cGVzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBhIGNvbXBsZXRlIGluc3RhbmNlIHR5cGUgYWxpYXMgd2l0aCBhbGwgcHJvcGVydGllc1xuXHRcdCAqIFRoaXMgaXMgZm9yIHRoZSB0eXBlcy50cyBmaWxlIHRoYXQgdXNlcnMgaW1wb3J0IGZyb21cblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUNvbXBsZXRlSW5zdGFuY2VJbnRlcmZhY2UgKG5vZGU6IFR5cGVOb2RlLCBsaW5lczogc3RyaW5nW10pOiB2b2lkIHtcblx0XHRjb25zdCB0eXBlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0Ly8gTmVzdGVkIHR5cGU6IFVzZSBQcm90b0ZsYXQgdG8gcHJvcGVybHkgZXhjbHVkZSBvdmVycmlkZGVuIHByb3BlcnRpZXNcblx0XHRcdGxpbmVzLnB1c2goYGV4cG9ydCB0eXBlICR7dHlwZU5hbWV9ID0gUHJvdG9GbGF0PCR7dGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUucGFyZW50KX0sIHtgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUm9vdCB0eXBlOiBqdXN0IHRoZSBwcm9wZXJ0aWVzIG9iamVjdFxuXHRcdFx0bGluZXMucHVzaChgZXhwb3J0IHR5cGUgJHt0eXBlTmFtZX0gPSB7YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGluc3RhbmNlIHByb3BlcnRpZXMgZXh0cmFjdGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yXG5cdFx0Zm9yIChjb25zdCBbIHByb3BOYW1lLCBwcm9wSW5mbyBdIG9mIG5vZGUucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcblx0XHRcdGNvbnN0IG9wdGlvbmFsID0gcHJvcEluZm8ub3B0aW9uYWwgPyAnPycgOiAnJztcblx0XHRcdGNvbnN0IHJlYWRvbmx5ID0gcHJvcEluZm8ucmVhZG9ubHkgPyAncmVhZG9ubHkgJyA6ICcnO1xuXHRcdFx0bGluZXMucHVzaChgXFx0JHtyZWFkb25seX0ke3Byb3BOYW1lfSR7b3B0aW9uYWx9OiAke3RoaXMucmVzb2x2ZVR5cGVJblN0cmluZyhwcm9wSW5mby50eXBlLCBub2RlKX07YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIG5lc3RlZCBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGZvciBub24tbGVhZiBub2Rlc1xuXHRcdC8vIExlYWYgbm9kZXMgKG5vIGNoaWxkcmVuKSBkb24ndCBnZXQgY29uc3RydWN0b3IgcHJvcGVydGllc1xuXHRcdC8vIFRoaXMgZm9sbG93cyBtbmVtb25pY2EncyBzdHJpY3RDaGFpbiBiZWhhdmlvclxuXHRcdGlmIChub2RlLmNoaWxkcmVuLnNpemUgPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4udmFsdWVzKCkpIHtcblx0XHRcdFx0Y29uc3QgY2hpbGRJbnN0YW5jZVR5cGUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUoY2hpbGQpO1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShjaGlsZCk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYFxcdCR7Y2hpbGQubmFtZX06ICR7Y29uc3RydWN0b3JTaWd9ID0+ICR7Y2hpbGRJbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZvciBuZXN0ZWQgdHlwZXMsIGFkZCB0aGlzIG5vZGUncyBjb25zdHJ1Y3RvciBhbmQgYWxsIHNpYmxpbmdzIGZyb20gc2FtZSBwYXJlbnQgYXMgdW5kZWZpbmVkXG5cdFx0Ly8gVGhpcyBpcyBuZWVkZWQgZm9yIHN0cmljdCBjaGFpbiBiZWhhdmlvciAtIHBhcmVudCB1bmRlZmluZWRzIGFyZSBpbmhlcml0ZWQgdmlhIFByb3RvRmxhdFxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0Ly8gQWRkIHRoaXMgbm9kZSdzIG93biBjb25zdHJ1Y3RvciBhcyB1bmRlZmluZWRcblx0XHRcdGxpbmVzLnB1c2goYFxcdCR7bm9kZS5uYW1lfTogdW5kZWZpbmVkO2ApO1xuXG5cdFx0XHQvLyBBZGQgYWxsIHNpYmxpbmdzIChvdGhlciBjaGlsZHJlbiBvZiB0aGUgc2FtZSBwYXJlbnQpIGFzIHVuZGVmaW5lZFxuXHRcdFx0Zm9yIChjb25zdCBzaWJsaW5nIG9mIG5vZGUucGFyZW50LmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRcdGlmIChzaWJsaW5nLm5hbWUgIT09IG5vZGUubmFtZSkge1xuXHRcdFx0XHRcdGxpbmVzLnB1c2goYFxcdCR7c2libGluZy5uYW1lfTogdW5kZWZpbmVkO2ApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvc2UgdGhlIHR5cGUgcHJvcGVybHkgLSBQcm90b0ZsYXQgdXNlcyB9PjsgZm9yIG5lc3RlZCwgfTsgZm9yIHJvb3Rcblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdGxpbmVzLnB1c2goJ30+OycpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5lcy5wdXNoKCd9OycpO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKCcnKTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGEgc2ltcGxlIHR5cGUgZGVjbGFyYXRpb24gZm9yIGEgc2luZ2xlIHR5cGVcblx0XHQgKi9cblx0Z2VuZXJhdGVTaW5nbGVUeXBlIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cdFx0dGhpcy5nZW5lcmF0ZUNvbXBsZXRlSW5zdGFuY2VJbnRlcmZhY2Uobm9kZSwgbGluZXMpO1xuXHRcdHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIFR5cGVSZWdpc3RyeSBpbnRlcmZhY2UgZm9yIHR5cGUtc2FmZSBsb29rdXAoKSBmdW5jdGlvblxuXHRcdCAqIEF1Z21lbnQgbW5lbW9uaWNhJ3MgVHlwZVJlZ2lzdHJ5IHNvIGxvb2t1cCgnVHlwZU5hbWUnKSByZXR1cm5zIHRoZSB0eXBlZCBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHRnZW5lcmF0ZVR5cGVSZWdpc3RyeSAoKTogR2VuZXJhdGVkVHlwZXMge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Ly8gSGVhZGVyXG5cdFx0bGluZXMucHVzaCgnLy8gR2VuZXJhdGVkIFR5cGVSZWdpc3RyeSBmb3IgdHlwZS1zYWZlIG1uZW1vbmljYS5sb29rdXAoKScpO1xuXHRcdGxpbmVzLnB1c2goJy8vIFRoaXMgZmlsZSBhdWdtZW50cyBtbmVtb25pY2FcXCdzIFR5cGVSZWdpc3RyeSB2aWEgZGVjbGFyYXRpb24gbWVyZ2luZy4nKTtcblx0XHRsaW5lcy5wdXNoKCcvLycpO1xuXHRcdGxpbmVzLnB1c2goJy8vIFVzYWdlOicpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgaW1wb3J0IHsgbG9va3VwIH0gZnJvbSBcXCdtbmVtb25pY2FcXCc7Jyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICBpbXBvcnQgXFwnLi8udGFjdGljYS9yZWdpc3RyeVxcJzsgIC8vIGFwcGxpZXMgdGhlIGF1Z21lbnRhdGlvbicpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgY29uc3QgTXlUeXBlID0gbG9va3VwKFxcJ015VHlwZVxcJyk7Jyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICAvLyBUeXBlU2NyaXB0IGtub3dzOiBNeVR5cGUgaXMgdGhlIHR5cGVkIGNvbnN0cnVjdG9yIGZvciBNeVR5cGUnKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE15VHlwZSh7IC8qIGNvbnN0cnVjdG9yIGFyZ3MgKi8gfSk7Jyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICAvLyBpbnN0YW5jZSBoYXMgZnVsbCBpbnRlbGxpc2Vuc2UgZm9yIHRoZSBnZW5lcmF0ZWQgdHlwZScpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gSW1wb3J0IGluc3RhbmNlIHR5cGVzIGZyb20gdHlwZXMudHMuXG5cdFx0Ly8gU2tpcCBjdXN0b20tY29sbGVjdGlvbiB0eXBlcyB0aGF0IGhhdmUgbm8gdXNlci1wcm92aWRlZCByZWdpc3RyeSBpbnRlcmZhY2UuXG5cdFx0bGluZXMucHVzaCgnaW1wb3J0IHR5cGUgeycpO1xuXHRcdGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5ncmFwaC5kZnMocm9vdCkpIHtcblx0XHRcdFx0aWYgKG5vZGUuY29sbGVjdGlvbklkICYmICFub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlVHlwZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYFxcdCR7aW5zdGFuY2VUeXBlTmFtZX0sYCk7XG5cdFx0XHRcdGdlbmVyYXRlZFR5cGVzLnB1c2goaW5zdGFuY2VUeXBlTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGxpbmVzLnB1c2goYH0gZnJvbSAnJHt0aGlzLmltcG9ydFBhdGgoJy4vdHlwZXMnKX0nO2ApO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gR2VuZXJhdGUgbW9kdWxlIGF1Z21lbnRhdGlvbiBmb3IgbW5lbW9uaWNhIFR5cGVSZWdpc3RyeVxuXHRcdGxpbmVzLnB1c2goJy8qKicpO1xuXHRcdGxpbmVzLnB1c2goJyAqIFR5cGUgcmVnaXN0cnkgYXVnbWVudGluZyBtbmVtb25pY2FcXCdzIFR5cGVSZWdpc3RyeSBpbnRlcmZhY2UnKTtcblx0XHRsaW5lcy5wdXNoKCcgKiBUaGlzIGVuYWJsZXMgdHlwZS1zYWZlIGxvb2t1cCgpIHdpdGhvdXQgZXhwbGljaXQgdHlwZSBhcmd1bWVudHMnKTtcblx0XHRsaW5lcy5wdXNoKCcgKicpO1xuXHRcdGxpbmVzLnB1c2goJyAqIFVzYWdlOiBjb25zdCBTb21lVHlwZSA9IGxvb2t1cChcXCdTb21lVHlwZVxcJyk7IC8vIEZ1bGx5IHR5cGVkIScpO1xuXHRcdGxpbmVzLnB1c2goJyAqLycpO1xuXHRcdGxpbmVzLnB1c2goJ2RlY2xhcmUgbW9kdWxlIFxcJ21uZW1vbmljYVxcJyB7Jyk7XG5cdFx0bGluZXMucHVzaCgnXHRpbnRlcmZhY2UgVHlwZVJlZ2lzdHJ5IHsnKTtcblxuXHRcdC8vIEdlbmVyYXRlIGVudHJpZXMgZm9yIGFsbCB0eXBlIHBhdGhzIHRoYXQgYmVsb25nIHRvIHRoZSBkZWZhdWx0L2dsb2JhbCBjb2xsZWN0aW9uLlxuXHRcdC8vIFR5cGVzIHRoYXQgbGl2ZSBpbiBhIGN1c3RvbSBjb2xsZWN0aW9uIChjb2xsZWN0aW9uSWQgc2V0KSBhcmUgaXNvbGF0ZWQgYXQgcnVudGltZVxuXHRcdC8vIGFuZCBhcmUgbm90IHJlYWNoYWJsZSB0aHJvdWdoIGZyZWUgbG9va3VwKCksIHNvIHRoZXkgbXVzdCBub3QgYmUgYWRkZWQgdG8gdGhlXG5cdFx0Ly8gZ2xvYmFsIFR5cGVSZWdpc3RyeSBhdWdtZW50YXRpb24uXG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IHRoaXMuZ2V0RnVsbFBhdGgobm9kZSk7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRcdFx0Ly8gR2VuZXJhdGUgdHlwZWQgY29uc3RydWN0b3Igc2lnbmF0dXJlIGZvciBuZXN0ZWQgdHlwZXMgd2l0aCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGNvbnN0IGNvbnN0cnVjdG9yU2lnID0gdGhpcy5nZW5lcmF0ZUNvbnN0cnVjdG9yU2lnbmF0dXJlKG5vZGUpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGBcXHRcXHQnJHtmdWxsUGF0aH0nOiAke2NvbnN0cnVjdG9yU2lnfSA9PiAke2luc3RhbmNlVHlwZX07YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGluZXMucHVzaCgnXFx0fScpO1xuXHRcdGxpbmVzLnB1c2goJ30nKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEdlbmVyYXRlIHBlci1jb2xsZWN0aW9uIHJlZ2lzdHJ5IGF1Z21lbnRhdGlvbnMgZm9yIE9wdGlvbiBCXG5cdFx0Ly8gKHVzZXItcHJvdmlkZWQgcmVnaXN0cnkgaW50ZXJmYWNlcykuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkdyb3VwcyA9IHRoaXMuZ3JvdXBDb2xsZWN0aW9uUmVnaXN0cnlOb2RlcygpO1xuXHRcdGZvciAoY29uc3QgWyBrZXksIG5vZGVzIF0gb2YgY29sbGVjdGlvbkdyb3Vwcykge1xuXHRcdFx0Y29uc3QgWyByZWdpc3RyeUludGVyZmFjZU5hbWUsIHNvdXJjZUZpbGUgXSA9IGtleS5zcGxpdCgnOjonKTtcblx0XHRcdGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLnJlc29sdmVNb2R1bGVQYXRoKHNvdXJjZUZpbGUpO1xuXHRcdFx0bGluZXMucHVzaChgZGVjbGFyZSBtb2R1bGUgJyR7bW9kdWxlUGF0aH0nIHtgKTtcblx0XHRcdGxpbmVzLnB1c2goYFxcdGludGVyZmFjZSAke3JlZ2lzdHJ5SW50ZXJmYWNlTmFtZX0ge2ApO1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG5cdFx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5nZXRGdWxsUGF0aChub2RlKTtcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VUeXBlID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShub2RlKTtcblx0XHRcdFx0bGluZXMucHVzaChgXFx0XFx0JyR7ZnVsbFBhdGh9JzogJHtjb25zdHJ1Y3RvclNpZ30gPT4gJHtpbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdFx0bGluZXMucHVzaCgnXFx0fScpO1xuXHRcdFx0bGluZXMucHVzaCgnfScpO1xuXHRcdFx0bGluZXMucHVzaCgnJyk7XG5cdFx0fVxuXG5cdFx0Ly8gUmUtZXhwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBleHBsaWNpdCB1c2FnZVxuXHRcdGxpbmVzLnB1c2goJ2ltcG9ydCB0eXBlIHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSBcXCdtbmVtb25pY2FcXCc7Jyk7XG5cdFx0bGluZXMucHVzaCgnZXhwb3J0IHR5cGUgeyBUeXBlUmVnaXN0cnkgfTsnKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50IDogbGluZXMuam9pbignXFxuJyksXG5cdFx0XHR0eXBlcyAgIDogZ2VuZXJhdGVkVHlwZXMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBmb3IgYSB0eXBlIG5vZGVcblx0XHQgKiBVc2VzIGNvbnN0cnVjdG9yUGFyYW1zIGZvciBUeXBlUmVnaXN0cnkgc2lnbmF0dXJlIChub3QgaW5zdGFuY2UgcHJvcGVydGllcylcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUNvbnN0cnVjdG9yU2lnbmF0dXJlIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0Ly8gVXNlIGNvbnN0cnVjdG9yUGFyYW1zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBlbXB0eSBzaWduYXR1cmVcblx0XHRjb25zdCBwYXJhbXMgPSBub2RlLmNvbnN0cnVjdG9yUGFyYW1zO1xuXG5cdFx0aWYgKCFwYXJhbXMgfHwgcGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuICduZXcgKCknO1xuXHRcdH1cblxuXHRcdC8vIEJ1aWxkIHR5cGVkIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBmcm9tIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnNcblx0XHRjb25zdCBwcm9wczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0Y29uc3Qgb3B0aW9uYWwgPSBwYXJhbS5vcHRpb25hbCA/ICc/JyA6ICcnO1xuXHRcdFx0cHJvcHMucHVzaChgJHtwYXJhbS5uYW1lfSR7b3B0aW9uYWx9OiAke3BhcmFtLnR5cGV9YCk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSB3aXRoIGRhdGEgcGFyYW1ldGVyXG5cdFx0cmV0dXJuIGBuZXcgKCR7cHJvcHMuam9pbignLCAnKX0pYDtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdldCB0aGUgZnVsbCBkb3R0ZWQgcGF0aCBmb3IgYSB0eXBlIG5vZGVcblx0XHQgKi9cblx0cHJpdmF0ZSBnZXRGdWxsUGF0aCAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGlmICghbm9kZS5wYXJlbnQpIHtcblx0XHRcdHJldHVybiBub2RlLm5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBgJHt0aGlzLmdldEZ1bGxQYXRoKG5vZGUucGFyZW50KX0uJHtub2RlLm5hbWV9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGluc3RhbmNlIHR5cGUgbmFtZSBmb3IgYSBub2RlXG5cdCAqIFVzZXMgZnVsbCBwYXRoIHdpdGggdW5kZXJzY29yZXM6IFVzYWdlcy5Vc2FnZUVudHJ5IC0+IFVzYWdlc19Vc2FnZUVudHJ5XG5cdCAqIEZvciBPcHRpb24gQiBjdXN0b20gY29sbGVjdGlvbnMsIHByZWZpeGVzIHdpdGggdGhlIHJlZ2lzdHJ5IGludGVyZmFjZSBuYW1lLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnN0YW5jZVR5cGVOYW1lIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKG5vZGUpO1xuXHRcdGNvbnN0IHByZWZpeCA9IG5vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lID8gYCR7bm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWV9X2AgOiAnJztcblx0XHRyZXR1cm4gYCR7cHJlZml4fSR7ZnVsbFBhdGgucmVwbGFjZSgvXFwuL2csICdfJyl9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIGEgc2ltcGxlIHR5cGUgbmFtZSB0byBpdHMgZnVsbCBwYXRoIG5hbWVcblx0ICogZS5nLiwgXCJEZWZpbml0aW9uRW50cnlcIiAtPiBcIkRlZmluaXRpb25zX0RlZmluaXRpb25FbnRyeVwiXG5cdCAqXG5cdCAqIFdpdGggYSByZWZlcmVuY2VSZXNvbHZlciBpbnN0YWxsZWQgKHRoZSBDTEkgcGF0aCksIHJlc29sdXRpb24gaXNcblx0ICogcGF0aC1hd2FyZSBwZXIgdGhlIGdyYXBoIGlkZW50aXR5IGxhdzogdGhlIHJlc29sdmVyIHJldHVybnMgdGhlIHVuaXF1ZVxuXHQgKiB0eXBlLCAnYW1iaWd1b3VzJywgb3IgdW5kZWZpbmVkIOKAlCB0aGUgbGF0dGVyIHR3byByZWNvcmQgYSBoYXJkLWZhaWxcblx0ICogUmVzb2x1dGlvbkVycm9yIGFuZCBlbWl0IGB1bmtub3duYCBpbnN0ZWFkIG9mIHNpbGVudGx5IHBpY2tpbmcgYVxuXHQgKiBmaXJzdCBtYXRjaC4gV2l0aG91dCBhIHJlc29sdmVyIHRoZSBsZWdhY3kgZmlyc3QtbWF0Y2ggc2NhbiBzdGF5cy5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZVR5cGVOYW1lIChzaW1wbGVOYW1lOiBzdHJpbmcsIGN1cnJlbnROb2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0aWYgKHRoaXMucmVmZXJlbmNlUmVzb2x2ZXIpIHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZWZlcmVuY2VSZXNvbHZlcihzaW1wbGVOYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAocmVzb2x2ZWQgJiYgcmVzb2x2ZWQgIT09ICdhbWJpZ3VvdXMnKSB7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShyZXNvbHZlZCk7XG5cdFx0XHRcdHJldHVybiBpbnN0YW5jZU5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhbmNob3JMb2NhdGlvbiA9IGAke2N1cnJlbnROb2RlLnNvdXJjZUZpbGV9OiR7Y3VycmVudE5vZGUubGluZX06JHtjdXJyZW50Tm9kZS5jb2x1bW59YDtcblx0XHRcdGNvbnN0IGFtYmlndW91c0dlbmVyYXRpb25NZXNzYWdlID0gYEFtYmlndW91cyByZWZlcmVuY2UgdG8gbW5lbW9uaWNhIHR5cGUgJyR7c2ltcGxlTmFtZX0nIGAgK1xuXHRcdFx0XHRgd2hpbGUgZ2VuZXJhdGluZyAnJHt0aGlzLmdldEZ1bGxQYXRoKGN1cnJlbnROb2RlKX0nYDtcblx0XHRcdGNvbnN0IHVucmVzb2x2ZWRHZW5lcmF0aW9uTWVzc2FnZSA9IGBVbnJlc29sdmVkIHJlZmVyZW5jZSB0byBtbmVtb25pY2EgdHlwZSAnJHtzaW1wbGVOYW1lfScgYCArXG5cdFx0XHRcdGB3aGlsZSBnZW5lcmF0aW5nICcke3RoaXMuZ2V0RnVsbFBhdGgoY3VycmVudE5vZGUpfSdgO1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IHJlc29sdmVkID09PSAnYW1iaWd1b3VzJ1xuXHRcdFx0XHQ/IGFtYmlndW91c0dlbmVyYXRpb25NZXNzYWdlXG5cdFx0XHRcdDogdW5yZXNvbHZlZEdlbmVyYXRpb25NZXNzYWdlO1xuXHRcdFx0Y29uc3QgZXJyb3I6IFJlc29sdXRpb25FcnJvciA9IHsgbWVzc2FnZSwgbG9jYXRpb25zIDogWyBhbmNob3JMb2NhdGlvbiBdIH07XG5cdFx0XHR0aGlzLnJlc29sdXRpb25FcnJvcnMucHVzaChlcnJvcik7XG5cdFx0XHRjb25zdCB1bmtub3duUmVzdWx0ID0gJ3Vua25vd24nO1xuXHRcdFx0cmV0dXJuIHVua25vd25SZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Ly8gRmlyc3QgY2hlY2sgaWYgaXQncyB0aGUgY3VycmVudCBub2RlIG9yIGl0cyBjaGlsZHJlblxuXHRcdGlmIChjdXJyZW50Tm9kZS5uYW1lID09PSBzaW1wbGVOYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKGN1cnJlbnROb2RlKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBjdXJyZW50Tm9kZS5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0aWYgKGNoaWxkLm5hbWUgPT09IHNpbXBsZU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIFNlYXJjaCBhbGwgdHlwZXMgaW4gdGhlIGdyYXBoXG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIHRoaXMuZ3JhcGguZ2V0QWxsVHlwZXMoKSkge1xuXHRcdFx0aWYgKHR5cGUubmFtZSA9PT0gc2ltcGxlTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKHR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2ltcGxlTmFtZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYXJkLWZhaWwgZ3JhcGggcmVmZXJlbmNlIGVycm9ycyByZWNvcmRlZCB3aGlsZSBnZW5lcmF0aW5nIChzZWVcblx0ICogcmVmZXJlbmNlUmVzb2x2ZXIpLiBUaGUgQ0xJIHByaW50cyBldmVyeSBsb2NhdGlvbiBhbmQgd3JpdGVzIG5vIG91dHB1dC5cblx0ICovXG5cdGdldFJlc29sdXRpb25FcnJvcnMgKCk6IFJlc29sdXRpb25FcnJvcltdIHtcblx0XHRjb25zdCByZXN1bHQgPSBbIC4uLnRoaXMucmVzb2x1dGlvbkVycm9ycyBdO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBzaW1wbGUgdHlwZSBuYW1lcyB0byBmdWxsIHBhdGggbmFtZXMgd2l0aGluIGEgdHlwZSBzdHJpbmdcblx0ICogSGFuZGxlcyBjb21wbGV4IHR5cGVzIGxpa2UgQXJyYXk8VXNhZ2VFbnRyeT4sIE1hcDxzdHJpbmcsIFR5cGVFbnRyeT4sIGV0Yy5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZVR5cGVJblN0cmluZyAodHlwZVN0cjogc3RyaW5nLCBjdXJyZW50Tm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdC8vIEdldCBhbGwgdHlwZSBuYW1lcyBmcm9tIHRoZSBncmFwaFxuXHRcdGNvbnN0IGFsbFR5cGVzID0gdGhpcy5ncmFwaC5nZXRBbGxUeXBlcygpO1xuXHRcdGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgdHlwZSBvZiBhbGxUeXBlcykge1xuXHRcdFx0dHlwZU5hbWVzLmFkZCh0eXBlLm5hbWUpO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgYnkgbGVuZ3RoIChsb25nZXN0IGZpcnN0KSB0byBhdm9pZCBwYXJ0aWFsIHJlcGxhY2VtZW50c1xuXHRcdGNvbnN0IHNvcnRlZE5hbWVzID0gQXJyYXkuZnJvbSh0eXBlTmFtZXMpLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xuXG5cdFx0Ly8gUmVwbGFjZSBlYWNoIHNpbXBsZSB0eXBlIG5hbWUgd2l0aCBpdHMgZnVsbCBwYXRoIHZlcnNpb25cblx0XHRsZXQgcmVzdWx0ID0gdHlwZVN0cjtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2Ygc29ydGVkTmFtZXMpIHtcblx0XHRcdC8vIFNraXAgbmFtZXMgdGhhdCBkbyBub3Qgb2NjdXIg4oCUIHdpdGggYSByZWZlcmVuY2VSZXNvbHZlciBpbnN0YWxsZWQsXG5cdFx0XHQvLyByZXNvbHZpbmcgYWJzZW50IG5hbWVzIHdvdWxkIHJlY29yZCBzcHVyaW91cyBlcnJvcnNcblx0XHRcdGNvbnN0IG9jY3VycyA9IG5ldyBSZWdFeHAoYFxcXFxiJHtuYW1lfVxcXFxiYCkudGVzdChyZXN1bHQpO1xuXHRcdFx0aWYgKCFvY2N1cnMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBVc2Ugd29yZCBib3VuZGFyeSBtYXRjaGluZyB0byBhdm9pZCByZXBsYWNpbmcgcGFydGlhbCBuYW1lc1xuXHRcdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7bmFtZX1cXFxcYmAsICdnJyk7XG5cdFx0XHRjb25zdCBmdWxsVHlwZU5hbWUgPSB0aGlzLnJlc29sdmVUeXBlTmFtZShuYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAoZnVsbFR5cGVOYW1lICE9PSBuYW1lKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHJlZ2V4LCBmdWxsVHlwZU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdyb3VwIGNvbGxlY3Rpb24gdHlwZSBub2RlcyBieSB0aGVpciByZWdpc3RyeSBpbnRlcmZhY2UgbmFtZSBhbmQgc291cmNlIGZpbGUuXG5cdCAqIFJldHVybnMgYSBtYXAga2V5ZWQgYnkgYCR7cmVnaXN0cnlJbnRlcmZhY2VOYW1lfTo6JHtzb3VyY2VGaWxlfWAuXG5cdCAqL1xuXHRwcml2YXRlIGdyb3VwQ29sbGVjdGlvblJlZ2lzdHJ5Tm9kZXMgKCk6IE1hcDxzdHJpbmcsIFR5cGVOb2RlW10+IHtcblx0XHRjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZU5vZGVbXT4oKTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmICghbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBrZXkgPSBgJHtub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZX06OiR7bm9kZS5zb3VyY2VGaWxlfWA7XG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBzLmdldChrZXkpO1xuXHRcdFx0XHRpZiAoZXhpc3RpbmcpIHtcblx0XHRcdFx0XHRleGlzdGluZy5wdXNoKG5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGdyb3Vwcy5zZXQoa2V5LCBbIG5vZGUgXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGdyb3Vwcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIGEgc291cmNlIGZpbGUgcGF0aCB0byBhIG1vZHVsZSBzcGVjaWZpZXIgcmVsYXRpdmUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnksXG5cdCAqIHN1aXRhYmxlIGZvciB1c2UgaW4gYSBgZGVjbGFyZSBtb2R1bGUgJy4uLidgIGJsb2NrLlxuXHQgKi9cblx0cHJpdmF0ZSByZXNvbHZlTW9kdWxlUGF0aCAoc291cmNlRmlsZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBvdXRwdXRBYnNvbHV0ZSA9IHBhdGgucmVzb2x2ZSh0aGlzLm91dHB1dERpcik7XG5cdFx0Y29uc3Qgc291cmNlQWJzb2x1dGUgPSBwYXRoLnJlc29sdmUoc291cmNlRmlsZSk7XG5cdFx0bGV0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShvdXRwdXRBYnNvbHV0ZSwgc291cmNlQWJzb2x1dGUpO1xuXHRcdC8vIFJlbW92ZSAudHMgZXh0ZW5zaW9uOyBrZWVwIC50c3ggaWYgcHJlc2VudFxuXHRcdGlmIChyZWxhdGl2ZS5lbmRzV2l0aCgnLnRzJykgJiYgIXJlbGF0aXZlLmVuZHNXaXRoKCcudHN4JykpIHtcblx0XHRcdHJlbGF0aXZlID0gcmVsYXRpdmUuc2xpY2UoMCwgLTMpO1xuXHRcdH1cblx0XHQvLyBDb252ZXJ0IFdpbmRvd3Mgc2VwYXJhdG9ycyB0byBQT1NJWFxuXHRcdGNvbnN0IHBvc2l4UmVsYXRpdmUgPSByZWxhdGl2ZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cdFx0cmV0dXJuIHBvc2l4UmVsYXRpdmU7XG5cdH1cbn1cbiJdfQ==
|
package/lib/graph.d.ts
CHANGED
|
@@ -42,3 +42,31 @@ export declare class TypeGraphImpl implements TypeGraph {
|
|
|
42
42
|
*/
|
|
43
43
|
private nodeToHierarchy;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Result of a path-aware mnemonica-graph type reference resolution.
|
|
47
|
+
*/
|
|
48
|
+
export type GraphTypeReferenceResult = {
|
|
49
|
+
status: 'unique';
|
|
50
|
+
node: TypeNode;
|
|
51
|
+
} | {
|
|
52
|
+
status: 'ambiguous';
|
|
53
|
+
candidates: TypeNode[];
|
|
54
|
+
} | {
|
|
55
|
+
status: 'none';
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Path-aware resolution of a mnemonica graph type name, mirroring the
|
|
59
|
+
* runtime lookup law (relative-first, then root; subtypes of different
|
|
60
|
+
* parents may share names legally):
|
|
61
|
+
* 1. self — the anchor's own name (a handler's `this: OwnName`
|
|
62
|
+
* annotation refers to the type being defined),
|
|
63
|
+
* 2. nearest-chain — walk the anchor's parent chain; the first level
|
|
64
|
+
* whose subtypes contain the name wins (own subtypes, then up),
|
|
65
|
+
* 3. root — roots of the anchor's collection (default collection when
|
|
66
|
+
* there is no anchor),
|
|
67
|
+
* 4. program-wide — the unique same-named type anywhere in the graph;
|
|
68
|
+
* several candidates are a genuine ambiguity.
|
|
69
|
+
* Value-scope anchoring (local bindings / imports) is the caller's tier
|
|
70
|
+
* and runs before this function — see MnemonicaAnalyzer.
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolveGraphTypeReference(graph: TypeGraphImpl, name: string, anchor: TypeNode | undefined): GraphTypeReferenceResult;
|
package/lib/graph.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TypeGraphImpl = void 0;
|
|
4
|
+
exports.resolveGraphTypeReference = resolveGraphTypeReference;
|
|
4
5
|
/**
|
|
5
6
|
* Trie-based type graph for storing Mnemonica type hierarchy
|
|
6
7
|
*/
|
|
@@ -123,4 +124,80 @@ class TypeGraphImpl {
|
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
exports.TypeGraphImpl = TypeGraphImpl;
|
|
126
|
-
|
|
127
|
+
/**
|
|
128
|
+
* Path-aware resolution of a mnemonica graph type name, mirroring the
|
|
129
|
+
* runtime lookup law (relative-first, then root; subtypes of different
|
|
130
|
+
* parents may share names legally):
|
|
131
|
+
* 1. self — the anchor's own name (a handler's `this: OwnName`
|
|
132
|
+
* annotation refers to the type being defined),
|
|
133
|
+
* 2. nearest-chain — walk the anchor's parent chain; the first level
|
|
134
|
+
* whose subtypes contain the name wins (own subtypes, then up),
|
|
135
|
+
* 3. root — roots of the anchor's collection (default collection when
|
|
136
|
+
* there is no anchor),
|
|
137
|
+
* 4. program-wide — the unique same-named type anywhere in the graph;
|
|
138
|
+
* several candidates are a genuine ambiguity.
|
|
139
|
+
* Value-scope anchoring (local bindings / imports) is the caller's tier
|
|
140
|
+
* and runs before this function — see MnemonicaAnalyzer.
|
|
141
|
+
*/
|
|
142
|
+
function resolveGraphTypeReference(graph, name, anchor) {
|
|
143
|
+
// dotted paths resolve as absolute paths from the collection root
|
|
144
|
+
if (name.includes('.')) {
|
|
145
|
+
const direct = graph.findType(name);
|
|
146
|
+
if (direct) {
|
|
147
|
+
const result = { status: 'unique', node: direct };
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
const dottedNoneResult = { status: 'none' };
|
|
151
|
+
return dottedNoneResult;
|
|
152
|
+
}
|
|
153
|
+
// 1. self — a handler's `this: OwnName` annotation refers to the type
|
|
154
|
+
// being defined; the anchor node is exactly that type
|
|
155
|
+
if (anchor && anchor.name === name) {
|
|
156
|
+
const selfResult = { status: 'unique', node: anchor };
|
|
157
|
+
return selfResult;
|
|
158
|
+
}
|
|
159
|
+
// 2. nearest-chain: first level up the anchor chain with a subtype `name`
|
|
160
|
+
let level = anchor;
|
|
161
|
+
while (level) {
|
|
162
|
+
const child = level.children.get(name);
|
|
163
|
+
if (child) {
|
|
164
|
+
const result = { status: 'unique', node: child };
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
level = level.parent;
|
|
168
|
+
}
|
|
169
|
+
// 2. root tier, scoped to the anchor's collection
|
|
170
|
+
const collectionId = anchor?.collectionId;
|
|
171
|
+
const rootMatches = [];
|
|
172
|
+
for (const root of graph.roots.values()) {
|
|
173
|
+
if (root.name === name && (root.collectionId ?? undefined) === collectionId) {
|
|
174
|
+
rootMatches.push(root);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (rootMatches.length === 1) {
|
|
178
|
+
const result = { status: 'unique', node: rootMatches[0] };
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
if (rootMatches.length > 1) {
|
|
182
|
+
const result = { status: 'ambiguous', candidates: rootMatches };
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
// 3. program-wide unique match
|
|
186
|
+
const matches = [];
|
|
187
|
+
for (const type of graph.allTypes.values()) {
|
|
188
|
+
if (type.name === name) {
|
|
189
|
+
matches.push(type);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (matches.length === 1) {
|
|
193
|
+
const result = { status: 'unique', node: matches[0] };
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
if (matches.length > 1) {
|
|
197
|
+
const result = { status: 'ambiguous', candidates: matches };
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
const noneResult = { status: 'none' };
|
|
201
|
+
return noneResult;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7QUE0S2IsOERBcUVDO0FBM09EOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBQTFCO1FBQ0M7Ozs7OztXQU1HO1FBQ0gsVUFBSyxHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLGFBQVEsR0FBMEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQWlJN0MsQ0FBQztJQS9IQSxPQUFPLENBQUUsSUFBYztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVEsQ0FBRSxNQUFnQixFQUFFLEtBQWU7UUFDMUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxRQUFRLENBQUUsUUFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUUsSUFBWTtRQUMzQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8s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LENBQUM7SUFDakUsT0FBTyxVQUFVLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtcblx0VHlwZU5vZGUsIFR5cGVHcmFwaCwgSGllcmFyY2h5Tm9kZSBcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVHJpZS1iYXNlZCB0eXBlIGdyYXBoIGZvciBzdG9yaW5nIE1uZW1vbmljYSB0eXBlIGhpZXJhcmNoeVxuICovXG5leHBvcnQgY2xhc3MgVHlwZUdyYXBoSW1wbCBpbXBsZW1lbnRzIFR5cGVHcmFwaCB7XG5cdC8qKlxuXHQgKiBLZXllZCBieSBmdWxsUGF0aCwgbm90IGJ5IHBsYWluIG5hbWU6IGEgY3VzdG9tIGNvbGxlY3Rpb24ncyByb290IHNoYXJlc1xuXHQgKiBpdHMgcGxhaW4gbmFtZSB3aXRoIGFueSBvdGhlciBjb2xsZWN0aW9uIChvciB0aGUgZGVmYXVsdCB0eXBlcykg4oCUIG9ubHlcblx0ICogdGhlIGBjb2xsZWN0aW9uSWQ6OmAtcHJlZml4ZWQgZnVsbFBhdGgga2VlcHMgdGhlbSBkaXN0aW5jdC4gTmFtZS1rZXlpbmdcblx0ICogc2lsZW50bHkgZHJvcHBlZCB0aGUgZWFybGllciByb290LCBhbmQgd2l0aCBpdCB0aGUgd2hvbGUgc3VidHJlZSwgZnJvbVxuXHQgKiBldmVyeSByb290cy1kcml2ZW4gd2FsayAoZ2VuZXJhdGlvbiwgaGllcmFyY2h5LCB2ZXJib3NlIHRyZWUpLlxuXHQgKi9cblx0cm9vdHM6IE1hcDxzdHJpbmcsIFR5cGVOb2RlPiA9IG5ldyBNYXAoKTtcblx0YWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVOb2RlPiA9IG5ldyBNYXAoKTtcblxuXHRhZGRSb290IChub2RlOiBUeXBlTm9kZSk6IHZvaWQge1xuXHRcdHRoaXMucm9vdHMuc2V0KG5vZGUuZnVsbFBhdGgsIG5vZGUpO1xuXHRcdHRoaXMuYWxsVHlwZXMuc2V0KG5vZGUuZnVsbFBhdGgsIG5vZGUpO1xuXHR9XG5cblx0YWRkQ2hpbGQgKHBhcmVudDogVHlwZU5vZGUsIGNoaWxkOiBUeXBlTm9kZSk6IHZvaWQge1xuXHRcdHBhcmVudC5jaGlsZHJlbi5zZXQoY2hpbGQubmFtZSwgY2hpbGQpO1xuXHRcdGNoaWxkLnBhcmVudCA9IHBhcmVudDtcblx0XHR0aGlzLmFsbFR5cGVzLnNldChjaGlsZC5mdWxsUGF0aCwgY2hpbGQpO1xuXHR9XG5cblx0ZmluZFR5cGUgKGZ1bGxQYXRoOiBzdHJpbmcpOiBUeXBlTm9kZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuYWxsVHlwZXMuZ2V0KGZ1bGxQYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kIGEgdHlwZSBieSBuYW1lIChzZWFyY2ggdGhyb3VnaCBhbGwgdHlwZXMsIHJldHVybiBmaXJzdCBtYXRjaClcblx0ICovXG5cdGZpbmRUeXBlQnlOYW1lIChuYW1lOiBzdHJpbmcpOiBUeXBlTm9kZSB8IHVuZGVmaW5lZCB7XG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIHRoaXMuYWxsVHlwZXMudmFsdWVzKCkpIHtcblx0XHRcdGlmICh0eXBlLm5hbWUgPT09IG5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRnZXRBbGxUeXBlcyAoKTogVHlwZU5vZGVbXSB7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy5hbGxUeXBlcy52YWx1ZXMoKSk7XG5cdH1cblxuXHRjbGVhciAoKTogdm9pZCB7XG5cdFx0dGhpcy5yb290cy5jbGVhcigpO1xuXHRcdHRoaXMuYWxsVHlwZXMuY2xlYXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgVHlwZU5vZGVcblx0ICovXG5cdHN0YXRpYyBjcmVhdGVOb2RlIChcblx0XHRuYW1lOiBzdHJpbmcsXG5cdFx0cGFyZW50OiBUeXBlTm9kZSB8IHVuZGVmaW5lZCxcblx0XHRzb3VyY2VGaWxlOiBzdHJpbmcsXG5cdFx0bGluZTogbnVtYmVyLFxuXHRcdGNvbHVtbjogbnVtYmVyLFxuXHRcdGNvbGxlY3Rpb25JZD86IHN0cmluZ1xuXHQpOiBUeXBlTm9kZSB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRDb2xsZWN0aW9uSWQgPSBjb2xsZWN0aW9uSWQgPz8gcGFyZW50Py5jb2xsZWN0aW9uSWQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBwYXJlbnRcblx0XHRcdD8gYCR7cGFyZW50LmZ1bGxQYXRofS4ke25hbWV9YFxuXHRcdFx0OiByZXNvbHZlZENvbGxlY3Rpb25JZFxuXHRcdFx0XHQ/IGAke3Jlc29sdmVkQ29sbGVjdGlvbklkfTo6JHtuYW1lfWBcblx0XHRcdFx0OiBuYW1lO1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lLFxuXHRcdFx0ZnVsbFBhdGgsXG5cdFx0XHRwcm9wZXJ0aWVzICAgOiBuZXcgTWFwKCksXG5cdFx0XHRwYXJlbnQsXG5cdFx0XHRjaGlsZHJlbiAgICAgOiBuZXcgTWFwKCksXG5cdFx0XHRzb3VyY2VGaWxlLFxuXHRcdFx0bGluZSxcblx0XHRcdGNvbHVtbixcblx0XHRcdGNvbGxlY3Rpb25JZCA6IHJlc29sdmVkQ29sbGVjdGlvbklkLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogVHJhdmVyc2UgdGhlIGdyYXBoIGluIGJyZWFkdGgtZmlyc3Qgb3JkZXJcblx0ICovXG5cdCpiZnMgKCk6IEdlbmVyYXRvcjxUeXBlTm9kZT4ge1xuXHRcdGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRjb25zdCBxdWV1ZTogVHlwZU5vZGVbXSA9IEFycmF5LmZyb20odGhpcy5yb290cy52YWx1ZXMoKSk7XG5cblx0XHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuXHRcdFx0aWYgKHZpc2l0ZWQuaGFzKG5vZGUuZnVsbFBhdGgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dmlzaXRlZC5hZGQobm9kZS5mdWxsUGF0aCk7XG5cdFx0XHR5aWVsZCBub2RlO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4udmFsdWVzKCkpIHtcblx0XHRcdFx0cXVldWUucHVzaChjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRyYXZlcnNlIHRoZSBncmFwaCBpbiBkZXB0aC1maXJzdCBvcmRlclxuXHQgKi9cblx0KmRmcyAobm9kZT86IFR5cGVOb2RlLCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCkpOiBHZW5lcmF0b3I8VHlwZU5vZGU+IHtcblx0XHRjb25zdCBzdGFydE5vZGUgPSBub2RlIHx8IHRoaXMucm9vdHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXHRcdGlmICghc3RhcnROb2RlIHx8IHZpc2l0ZWQuaGFzKHN0YXJ0Tm9kZS5mdWxsUGF0aCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2aXNpdGVkLmFkZChzdGFydE5vZGUuZnVsbFBhdGgpO1xuXHRcdHlpZWxkIHN0YXJ0Tm9kZTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhcnROb2RlLmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHR5aWVsZCogdGhpcy5kZnMoY2hpbGQsIHZpc2l0ZWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IHRoZSBncmFwaCB0byBhIHN0cnVjdHVyZWQgaGllcmFyY2h5IHN1aXRhYmxlIGZvciBKU09OIG91dHB1dC5cblx0ICovXG5cdHRvSGllcmFyY2h5ICgpOiBIaWVyYXJjaHlOb2RlW10ge1xuXHRcdGNvbnN0IHJvb3RzID0gQXJyYXkuZnJvbSh0aGlzLnJvb3RzLnZhbHVlcygpKTtcblx0XHRjb25zdCByZXN1bHQgPSByb290cy5tYXAocm9vdCA9PiB0aGlzLm5vZGVUb0hpZXJhcmNoeShyb290KSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWN1cnNpdmVseSBjb252ZXJ0IGEgVHlwZU5vZGUgdG8gYSBIaWVyYXJjaHlOb2RlLlxuXHQgKi9cblx0cHJpdmF0ZSBub2RlVG9IaWVyYXJjaHkgKG5vZGU6IFR5cGVOb2RlKTogSGllcmFyY2h5Tm9kZSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4udmFsdWVzKCkpLm1hcChjaGlsZCA9PlxuXHRcdFx0dGhpcy5ub2RlVG9IaWVyYXJjaHkoY2hpbGQpKTtcblx0XHRjb25zdCByZXN1bHQ6IEhpZXJhcmNoeU5vZGUgPSB7XG5cdFx0XHRuYW1lICAgICA6IG5vZGUubmFtZSxcblx0XHRcdGZ1bGxQYXRoIDogbm9kZS5mdWxsUGF0aCxcblx0XHRcdGxvY2F0aW9uIDogYCR7bm9kZS5zb3VyY2VGaWxlfToke25vZGUubGluZX06JHtub2RlLmNvbHVtbn1gLFxuXHRcdFx0Y2hpbGRyZW4sXG5cdFx0fTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgcGF0aC1hd2FyZSBtbmVtb25pY2EtZ3JhcGggdHlwZSByZWZlcmVuY2UgcmVzb2x1dGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgR3JhcGhUeXBlUmVmZXJlbmNlUmVzdWx0ID1cblx0fCB7IHN0YXR1czogJ3VuaXF1ZSc7IG5vZGU6IFR5cGVOb2RlIH1cblx0fCB7IHN0YXR1czogJ2FtYmlndW91cyc7IGNhbmRpZGF0ZXM6IFR5cGVOb2RlW10gfVxuXHR8IHsgc3RhdHVzOiAnbm9uZScgfTtcblxuLyoqXG4gKiBQYXRoLWF3YXJlIHJlc29sdXRpb24gb2YgYSBtbmVtb25pY2EgZ3JhcGggdHlwZSBuYW1lLCBtaXJyb3JpbmcgdGhlXG4gKiBydW50aW1lIGxvb2t1cCBsYXcgKHJlbGF0aXZlLWZpcnN0LCB0aGVuIHJvb3Q7IHN1YnR5cGVzIG9mIGRpZmZlcmVudFxuICogcGFyZW50cyBtYXkgc2hhcmUgbmFtZXMgbGVnYWxseSk6XG4gKiAgIDEuIHNlbGYg4oCUIHRoZSBhbmNob3IncyBvd24gbmFtZSAoYSBoYW5kbGVyJ3MgYHRoaXM6IE93bk5hbWVgXG4gKiAgICAgIGFubm90YXRpb24gcmVmZXJzIHRvIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQpLFxuICogICAyLiBuZWFyZXN0LWNoYWluIOKAlCB3YWxrIHRoZSBhbmNob3IncyBwYXJlbnQgY2hhaW47IHRoZSBmaXJzdCBsZXZlbFxuICogICAgICB3aG9zZSBzdWJ0eXBlcyBjb250YWluIHRoZSBuYW1lIHdpbnMgKG93biBzdWJ0eXBlcywgdGhlbiB1cCksXG4gKiAgIDMuIHJvb3Qg4oCUIHJvb3RzIG9mIHRoZSBhbmNob3IncyBjb2xsZWN0aW9uIChkZWZhdWx0IGNvbGxlY3Rpb24gd2hlblxuICogICAgICB0aGVyZSBpcyBubyBhbmNob3IpLFxuICogICA0LiBwcm9ncmFtLXdpZGUg4oCUIHRoZSB1bmlxdWUgc2FtZS1uYW1lZCB0eXBlIGFueXdoZXJlIGluIHRoZSBncmFwaDtcbiAqICAgICAgc2V2ZXJhbCBjYW5kaWRhdGVzIGFyZSBhIGdlbnVpbmUgYW1iaWd1aXR5LlxuICogVmFsdWUtc2NvcGUgYW5jaG9yaW5nIChsb2NhbCBiaW5kaW5ncyAvIGltcG9ydHMpIGlzIHRoZSBjYWxsZXIncyB0aWVyXG4gKiBhbmQgcnVucyBiZWZvcmUgdGhpcyBmdW5jdGlvbiDigJQgc2VlIE1uZW1vbmljYUFuYWx5emVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUdyYXBoVHlwZVJlZmVyZW5jZSAoXG5cdGdyYXBoOiBUeXBlR3JhcGhJbXBsLFxuXHRuYW1lOiBzdHJpbmcsXG5cdGFuY2hvcjogVHlwZU5vZGUgfCB1bmRlZmluZWRcbik6IEdyYXBoVHlwZVJlZmVyZW5jZVJlc3VsdCB7XG5cdC8vIGRvdHRlZCBwYXRocyByZXNvbHZlIGFzIGFic29sdXRlIHBhdGhzIGZyb20gdGhlIGNvbGxlY3Rpb24gcm9vdFxuXHRpZiAobmFtZS5pbmNsdWRlcygnLicpKSB7XG5cdFx0Y29uc3QgZGlyZWN0ID0gZ3JhcGguZmluZFR5cGUobmFtZSk7XG5cdFx0aWYgKGRpcmVjdCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0OiBHcmFwaFR5cGVSZWZlcmVuY2VSZXN1bHQgPSB7IHN0YXR1cyA6ICd1bmlxdWUnLCBub2RlIDogZGlyZWN0IH07XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRjb25zdCBkb3R0ZWROb25lUmVzdWx0OiBHcmFwaFR5cGVSZWZlcmVuY2VSZXN1bHQgPSB7IHN0YXR1cyA6ICdub25lJyB9O1xuXHRcdHJldHVybiBkb3R0ZWROb25lUmVzdWx0O1xuXHR9XG5cblx0Ly8gMS4gc2VsZiDigJQgYSBoYW5kbGVyJ3MgYHRoaXM6IE93bk5hbWVgIGFubm90YXRpb24gcmVmZXJzIHRvIHRoZSB0eXBlXG5cdC8vICAgIGJlaW5nIGRlZmluZWQ7IHRoZSBhbmNob3Igbm9kZSBpcyBleGFjdGx5IHRoYXQgdHlwZVxuXHRpZiAoYW5jaG9yICYmIGFuY2hvci5uYW1lID09PSBuYW1lKSB7XG5cdFx0Y29uc3Qgc2VsZlJlc3VsdDogR3JhcGhUeXBlUmVmZXJlbmNlUmVzdWx0ID0geyBzdGF0dXMgOiAndW5pcXVlJywgbm9kZSA6IGFuY2hvciB9O1xuXHRcdHJldHVybiBzZWxmUmVzdWx0O1xuXHR9XG5cblx0Ly8gMi4gbmVhcmVzdC1jaGFpbjogZmlyc3QgbGV2ZWwgdXAgdGhlIGFuY2hvciBjaGFpbiB3aXRoIGEgc3VidHlwZSBgbmFtZWBcblx0bGV0IGxldmVsOiBUeXBlTm9kZSB8IHVuZGVmaW5lZCA9IGFuY2hvcjtcblx0d2hpbGUgKGxldmVsKSB7XG5cdFx0Y29uc3QgY2hpbGQgPSBsZXZlbC5jaGlsZHJlbi5nZXQobmFtZSk7XG5cdFx0aWYgKGNoaWxkKSB7XG5cdFx0XHRjb25zdCByZXN1bHQ6IEdyYXBoVHlwZVJlZmVyZW5jZVJlc3VsdCA9IHsgc3RhdHVzIDogJ3VuaXF1ZScsIG5vZGUgOiBjaGlsZCB9O1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdFx0bGV2ZWwgPSBsZXZlbC5wYXJlbnQ7XG5cdH1cblxuXHQvLyAyLiByb290IHRpZXIsIHNjb3BlZCB0byB0aGUgYW5jaG9yJ3MgY29sbGVjdGlvblxuXHRjb25zdCBjb2xsZWN0aW9uSWQgPSBhbmNob3I/LmNvbGxlY3Rpb25JZDtcblx0Y29uc3Qgcm9vdE1hdGNoZXM6IFR5cGVOb2RlW10gPSBbXTtcblx0Zm9yIChjb25zdCByb290IG9mIGdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0aWYgKHJvb3QubmFtZSA9PT0gbmFtZSAmJiAocm9vdC5jb2xsZWN0aW9uSWQgPz8gdW5kZWZpbmVkKSA9PT0gY29sbGVjdGlvbklkKSB7XG5cdFx0XHRyb290TWF0Y2hlcy5wdXNoKHJvb3QpO1xuXHRcdH1cblx0fVxuXHRpZiAocm9vdE1hdGNoZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBHcmFwaFR5cGVSZWZlcmVuY2VSZXN1bHQgPSB7IHN0YXR1cyA6ICd1bmlxdWUnLCBub2RlIDogcm9vdE1hdGNoZXNbIDAgXSB9O1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblx0aWYgKHJvb3RNYXRjaGVzLmxlbmd0aCA+IDEpIHtcblx0XHRjb25zdCByZXN1bHQ6IEdyYXBoVHlwZVJlZmVyZW5jZVJlc3VsdCA9IHsgc3RhdHVzIDogJ2FtYmlndW91cycsIGNhbmRpZGF0ZXMgOiByb290TWF0Y2hlcyB9O1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyAzLiBwcm9ncmFtLXdpZGUgdW5pcXVlIG1hdGNoXG5cdGNvbnN0IG1hdGNoZXM6IFR5cGVOb2RlW10gPSBbXTtcblx0Zm9yIChjb25zdCB0eXBlIG9mIGdyYXBoLmFsbFR5cGVzLnZhbHVlcygpKSB7XG5cdFx0aWYgKHR5cGUubmFtZSA9PT0gbmFtZSkge1xuXHRcdFx0bWF0Y2hlcy5wdXNoKHR5cGUpO1xuXHRcdH1cblx0fVxuXHRpZiAobWF0Y2hlcy5sZW5ndGggPT09IDEpIHtcblx0XHRjb25zdCByZXN1bHQ6IEdyYXBoVHlwZVJlZmVyZW5jZVJlc3VsdCA9IHsgc3RhdHVzIDogJ3VuaXF1ZScsIG5vZGUgOiBtYXRjaGVzWyAwIF0gfTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cdGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcblx0XHRjb25zdCByZXN1bHQ6IEdyYXBoVHlwZVJlZmVyZW5jZVJlc3VsdCA9IHsgc3RhdHVzIDogJ2FtYmlndW91cycsIGNhbmRpZGF0ZXMgOiBtYXRjaGVzIH07XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGNvbnN0IG5vbmVSZXN1bHQ6IEdyYXBoVHlwZVJlZmVyZW5jZVJlc3VsdCA9IHsgc3RhdHVzIDogJ25vbmUnIH07XG5cdHJldHVybiBub25lUmVzdWx0O1xufVxuIl19
|
package/lib/plugins.d.ts
CHANGED
|
@@ -18,6 +18,16 @@ export interface TacticaPlugin {
|
|
|
18
18
|
useDecorators?: Record<string, InstrumentationKind>;
|
|
19
19
|
/** Provider token identifier -> kind (`{ provide: TOKEN, useClass: X }`) */
|
|
20
20
|
appTokens?: Record<string, InstrumentationKind>;
|
|
21
|
+
/**
|
|
22
|
+
* Decorator-arg factory method -> kind + target argument position
|
|
23
|
+
* (`@UsePipes(mvp.forType(Dto))`): a CallExpression arg whose callee is
|
|
24
|
+
* `<anything>.<name>(...)` matches when `name` is listed; the point's
|
|
25
|
+
* class is the identifier in `targetArg` (default 0).
|
|
26
|
+
*/
|
|
27
|
+
decoratorArgFactories?: Record<string, {
|
|
28
|
+
kind: InstrumentationKind;
|
|
29
|
+
targetArg?: number;
|
|
30
|
+
}>;
|
|
21
31
|
/**
|
|
22
32
|
* Enable middleware wiring detection: `consumer.apply(Mw).forRoutes(...)`
|
|
23
33
|
* inside a `configure()` method. Shape-based (no vocabulary keys), so it
|
|
@@ -33,6 +43,10 @@ export interface InstrumentationVocabulary {
|
|
|
33
43
|
interfaces: Record<string, InstrumentationKind>;
|
|
34
44
|
useDecorators: Record<string, InstrumentationKind>;
|
|
35
45
|
appTokens: Record<string, InstrumentationKind>;
|
|
46
|
+
decoratorArgFactories: Record<string, {
|
|
47
|
+
kind: InstrumentationKind;
|
|
48
|
+
targetArg?: number;
|
|
49
|
+
}>;
|
|
36
50
|
middlewareWiring: boolean;
|
|
37
51
|
}
|
|
38
52
|
/**
|
package/lib/plugins.js
CHANGED
|
@@ -12,16 +12,18 @@ function mergeTacticaPlugins(plugins) {
|
|
|
12
12
|
interfaces: {},
|
|
13
13
|
useDecorators: {},
|
|
14
14
|
appTokens: {},
|
|
15
|
+
decoratorArgFactories: {},
|
|
15
16
|
middlewareWiring: false,
|
|
16
17
|
};
|
|
17
18
|
for (const plugin of plugins) {
|
|
18
19
|
Object.assign(merged.interfaces, plugin.instrumentationInterfaces);
|
|
19
20
|
Object.assign(merged.useDecorators, plugin.useDecorators);
|
|
20
21
|
Object.assign(merged.appTokens, plugin.appTokens);
|
|
22
|
+
Object.assign(merged.decoratorArgFactories, plugin.decoratorArgFactories);
|
|
21
23
|
if (plugin.middlewareWiring) {
|
|
22
24
|
merged.middlewareWiring = true;
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
return merged;
|
|
26
28
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUF3RGIsa0RBa0JDO0FBeEJEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUUsT0FBd0I7SUFDNUQsTUFBTSxNQUFNLEdBQThCO1FBQ3pDLFVBQVUsRUFBYyxFQUFFO1FBQzFCLGFBQWEsRUFBVyxFQUFFO1FBQzFCLFNBQVMsRUFBZSxFQUFFO1FBQzFCLHFCQUFxQixFQUFHLEVBQUU7UUFDMUIsZ0JBQWdCLEVBQVEsS0FBSztLQUM3QixDQUFDO0lBQ0YsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFFLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO0lBQ0YsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHsgSW5zdHJ1bWVudGF0aW9uS2luZCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRhY3RpY2EgcGx1Z2luOiBzdXBwbGllcyB0aGUgZnJhbWV3b3JrIHZvY2FidWxhcnkgdGhlIGFuYWx5emVyIG1hdGNoZXNcbiAqIHN5bnRhY3RpY2FsbHkuIFRhY3RpY2EgY29yZSBpcyBmcmFtZXdvcmstYmxpbmQg4oCUIHdpdGggbm8gcGx1Z2lucyBsb2FkZWRcbiAqIGl0IGRldGVjdHMgbm8gaW5zdHJ1bWVudGF0aW9uIHBvaW50cyBhdCBhbGwuIEZyYW1ld29yayBhZGFwdGVycyAoZS5nLiBhXG4gKiBzZXJ2ZXItZnJhbWV3b3JrIGludGVncmF0aW9uIHBhY2thZ2UpIHNoaXAgYSBwbHVnaW47IHByb2plY3RzIGVuYWJsZSBpdFxuICogdGhyb3VnaCBhIGAudGFjdGljYS5qc2AgLyBgdGFjdGljYS5jb25maWcuanNgIGNvbmZpZyBmaWxlLlxuICpcbiAqIEFsbCBrZXlzIGFyZSBtYXRjaGVkIGJ5IGlkZW50aWZpZXIgVEVYVCBvbmx5IChubyBpbXBvcnQgcmVzb2x1dGlvbiwgbm9cbiAqIHR5cGUgY2hlY2tlciksIHNvIGEgcGx1Z2luIGVudHJ5IGZpcmVzIG9uIGFueSBzYW1lLW5hbWVkIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFjdGljYVBsdWdpbiB7XG5cdC8qKiBQbHVnaW4gbmFtZSwgdXNlZCBpbiB2ZXJib3NlIGxvZ2dpbmcgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqIEhlcml0YWdlIGludGVyZmFjZSBpZGVudGlmaWVyIC0+IGtpbmQgKGBpbXBsZW1lbnRzIFhgKSAqL1xuXHRpbnN0cnVtZW50YXRpb25JbnRlcmZhY2VzPzogUmVjb3JkPHN0cmluZywgSW5zdHJ1bWVudGF0aW9uS2luZD47XG5cdC8qKiBEZWNvcmF0b3IgaWRlbnRpZmllciAtPiBraW5kIChgQFgoSW1wbClgIG9uIGNsYXNzZXMvbWV0aG9kcykgKi9cblx0dXNlRGVjb3JhdG9ycz86IFJlY29yZDxzdHJpbmcsIEluc3RydW1lbnRhdGlvbktpbmQ+O1xuXHQvKiogUHJvdmlkZXIgdG9rZW4gaWRlbnRpZmllciAtPiBraW5kIChgeyBwcm92aWRlOiBUT0tFTiwgdXNlQ2xhc3M6IFggfWApICovXG5cdGFwcFRva2Vucz86IFJlY29yZDxzdHJpbmcsIEluc3RydW1lbnRhdGlvbktpbmQ+O1xuXHQvKipcblx0ICogRGVjb3JhdG9yLWFyZyBmYWN0b3J5IG1ldGhvZCAtPiBraW5kICsgdGFyZ2V0IGFyZ3VtZW50IHBvc2l0aW9uXG5cdCAqIChgQFVzZVBpcGVzKG12cC5mb3JUeXBlKER0bykpYCk6IGEgQ2FsbEV4cHJlc3Npb24gYXJnIHdob3NlIGNhbGxlZSBpc1xuXHQgKiBgPGFueXRoaW5nPi48bmFtZT4oLi4uKWAgbWF0Y2hlcyB3aGVuIGBuYW1lYCBpcyBsaXN0ZWQ7IHRoZSBwb2ludCdzXG5cdCAqIGNsYXNzIGlzIHRoZSBpZGVudGlmaWVyIGluIGB0YXJnZXRBcmdgIChkZWZhdWx0IDApLlxuXHQgKi9cblx0ZGVjb3JhdG9yQXJnRmFjdG9yaWVzPzogUmVjb3JkPHN0cmluZywgeyBraW5kOiBJbnN0cnVtZW50YXRpb25LaW5kOyB0YXJnZXRBcmc/OiBudW1iZXIgfT47XG5cdC8qKlxuXHQgKiBFbmFibGUgbWlkZGxld2FyZSB3aXJpbmcgZGV0ZWN0aW9uOiBgY29uc3VtZXIuYXBwbHkoTXcpLmZvclJvdXRlcyguLi4pYFxuXHQgKiBpbnNpZGUgYSBgY29uZmlndXJlKClgIG1ldGhvZC4gU2hhcGUtYmFzZWQgKG5vIHZvY2FidWxhcnkga2V5cyksIHNvIGl0XG5cdCAqIGlzIG9wdC1pbiBwZXIgcGx1Z2luLlxuXHQgKi9cblx0bWlkZGxld2FyZVdpcmluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGFuYWx5emVyJ3MgbWVyZ2VkIHZpZXcgb2YgYWxsIGxvYWRlZCBwbHVnaW5zOiBvbmUgbG9va3VwIHRhYmxlIHBlclxuICogZGV0ZWN0aW9uIGNoYW5uZWwsIHBsdXMgdGhlIG1pZGRsZXdhcmUtd2lyaW5nIHN3aXRjaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0cnVtZW50YXRpb25Wb2NhYnVsYXJ5IHtcblx0aW50ZXJmYWNlczogUmVjb3JkPHN0cmluZywgSW5zdHJ1bWVudGF0aW9uS2luZD47XG5cdHVzZURlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIEluc3RydW1lbnRhdGlvbktpbmQ+O1xuXHRhcHBUb2tlbnM6IFJlY29yZDxzdHJpbmcsIEluc3RydW1lbnRhdGlvbktpbmQ+O1xuXHRkZWNvcmF0b3JBcmdGYWN0b3JpZXM6IFJlY29yZDxzdHJpbmcsIHsga2luZDogSW5zdHJ1bWVudGF0aW9uS2luZDsgdGFyZ2V0QXJnPzogbnVtYmVyIH0+O1xuXHRtaWRkbGV3YXJlV2lyaW5nOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1lcmdlIHBsdWdpbnMgaW50byBvbmUgdm9jYWJ1bGFyeS4gTGF0ZXIgcGx1Z2lucyBvdmVycmlkZSBlYXJsaWVyIG9uZXMgb25cbiAqIHRoZSBzYW1lIGlkZW50aWZpZXIga2V5OyBtaWRkbGV3YXJlV2lyaW5nIGlzIGFuIE9SIChhbnkgcGx1Z2luIGVuYWJsZXMgaXQpLlxuICogQW4gZW1wdHkgcGx1Z2luIGxpc3QgeWllbGRzIGFuIGVtcHR5IHZvY2FidWxhcnkg4oCUIHRoZSBhbmFseXplciB0aGVuXG4gKiBjb2xsZWN0cyB6ZXJvIGluc3RydW1lbnRhdGlvbiBwb2ludHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRhY3RpY2FQbHVnaW5zIChwbHVnaW5zOiBUYWN0aWNhUGx1Z2luW10pOiBJbnN0cnVtZW50YXRpb25Wb2NhYnVsYXJ5IHtcblx0Y29uc3QgbWVyZ2VkOiBJbnN0cnVtZW50YXRpb25Wb2NhYnVsYXJ5ID0ge1xuXHRcdGludGVyZmFjZXMgICAgICAgICAgICA6IHt9LFxuXHRcdHVzZURlY29yYXRvcnMgICAgICAgICA6IHt9LFxuXHRcdGFwcFRva2VucyAgICAgICAgICAgICA6IHt9LFxuXHRcdGRlY29yYXRvckFyZ0ZhY3RvcmllcyA6IHt9LFxuXHRcdG1pZGRsZXdhcmVXaXJpbmcgICAgICA6IGZhbHNlLFxuXHR9O1xuXHRmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG5cdFx0T2JqZWN0LmFzc2lnbihtZXJnZWQuaW50ZXJmYWNlcywgcGx1Z2luLmluc3RydW1lbnRhdGlvbkludGVyZmFjZXMpO1xuXHRcdE9iamVjdC5hc3NpZ24obWVyZ2VkLnVzZURlY29yYXRvcnMsIHBsdWdpbi51c2VEZWNvcmF0b3JzKTtcblx0XHRPYmplY3QuYXNzaWduKG1lcmdlZC5hcHBUb2tlbnMsIHBsdWdpbi5hcHBUb2tlbnMpO1xuXHRcdE9iamVjdC5hc3NpZ24obWVyZ2VkLmRlY29yYXRvckFyZ0ZhY3RvcmllcywgcGx1Z2luLmRlY29yYXRvckFyZ0ZhY3Rvcmllcyk7XG5cdFx0aWYgKHBsdWdpbi5taWRkbGV3YXJlV2lyaW5nKSB7XG5cdFx0XHRtZXJnZWQubWlkZGxld2FyZVdpcmluZyA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtZXJnZWQ7XG59XG4iXX0=
|
package/lib/scopes.d.ts
CHANGED
|
@@ -10,6 +10,14 @@ export interface ScopeTypeResolver {
|
|
|
10
10
|
resolveByName(name: string): string | undefined;
|
|
11
11
|
/** True when the dotted path is a known mnemonica type */
|
|
12
12
|
hasPath(fullPath: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Optional lookup-law delegate: resolve a `lookup()` initializer call
|
|
15
|
+
* through the analyzer's full tier law (value scope, import scope,
|
|
16
|
+
* source-relative, root). The walker runs its own scope-chain
|
|
17
|
+
* value-scope tier first; this backs the tiers above it so scopes.json
|
|
18
|
+
* typePaths agree with the analyzer's (hard-fail) verdicts.
|
|
19
|
+
*/
|
|
20
|
+
resolveLookup?(call: ts.CallExpression): string | undefined;
|
|
13
21
|
}
|
|
14
22
|
/**
|
|
15
23
|
* Local-scope walker (instrumentation walker plan, Phase 2).
|