semantifold 0.8.0 → 0.10.0
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 +11 -5
- package/bin/semantifold.js +6 -0
- package/build/bin/semantifold.d.ts +3 -0
- package/build/bin/semantifold.d.ts.map +1 -0
- package/build/bin/semantifold.js +5 -0
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -1
- package/build/src/artifact-path.d.ts +16 -0
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +29 -3
- package/build/src/backends/c-check.d.ts +7 -0
- package/build/src/backends/c-check.d.ts.map +1 -0
- package/build/src/backends/c-check.js +65 -0
- package/build/src/backends/check-plan.d.ts +96 -0
- package/build/src/backends/check-plan.d.ts.map +1 -0
- package/build/src/backends/check-plan.js +135 -0
- package/build/src/backends/cpp-check.d.ts +7 -0
- package/build/src/backends/cpp-check.d.ts.map +1 -0
- package/build/src/backends/cpp-check.js +59 -0
- package/build/src/backends/csharp-check.d.ts +7 -0
- package/build/src/backends/csharp-check.d.ts.map +1 -0
- package/build/src/backends/csharp-check.js +125 -0
- package/build/src/backends/csharp.d.ts +1 -0
- package/build/src/backends/csharp.d.ts.map +1 -1
- package/build/src/backends/csharp.js +5 -4
- package/build/src/backends/dart-check.d.ts +7 -0
- package/build/src/backends/dart-check.d.ts.map +1 -0
- package/build/src/backends/dart-check.js +103 -0
- package/build/src/backends/dart.d.ts +2 -0
- package/build/src/backends/dart.d.ts.map +1 -1
- package/build/src/backends/dart.js +5 -5
- package/build/src/backends/go-check.d.ts +7 -0
- package/build/src/backends/go-check.d.ts.map +1 -0
- package/build/src/backends/go-check.js +77 -0
- package/build/src/backends/go.d.ts +1 -0
- package/build/src/backends/go.d.ts.map +1 -1
- package/build/src/backends/go.js +3 -3
- package/build/src/backends/java-check.d.ts +21 -0
- package/build/src/backends/java-check.d.ts.map +1 -0
- package/build/src/backends/java-check.js +73 -0
- package/build/src/backends/javascript-check.d.ts +7 -0
- package/build/src/backends/javascript-check.d.ts.map +1 -0
- package/build/src/backends/javascript-check.js +29 -0
- package/build/src/backends/kotlin-check.d.ts +7 -0
- package/build/src/backends/kotlin-check.d.ts.map +1 -0
- package/build/src/backends/kotlin-check.js +31 -0
- package/build/src/backends/php-check.d.ts +7 -0
- package/build/src/backends/php-check.d.ts.map +1 -0
- package/build/src/backends/php-check.js +21 -0
- package/build/src/backends/program.d.ts +7 -0
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +16 -1
- package/build/src/backends/python-check.d.ts +7 -0
- package/build/src/backends/python-check.d.ts.map +1 -0
- package/build/src/backends/python-check.js +28 -0
- package/build/src/backends/ruby-check.d.ts +7 -0
- package/build/src/backends/ruby-check.d.ts.map +1 -0
- package/build/src/backends/ruby-check.js +21 -0
- package/build/src/backends/rust-check.d.ts +7 -0
- package/build/src/backends/rust-check.d.ts.map +1 -0
- package/build/src/backends/rust-check.js +65 -0
- package/build/src/backends/swift-check.d.ts +7 -0
- package/build/src/backends/swift-check.d.ts.map +1 -0
- package/build/src/backends/swift-check.js +77 -0
- package/build/src/backends/typescript-check.d.ts +7 -0
- package/build/src/backends/typescript-check.d.ts.map +1 -0
- package/build/src/backends/typescript-check.js +33 -0
- package/build/src/backends/zig-check.d.ts +7 -0
- package/build/src/backends/zig-check.d.ts.map +1 -0
- package/build/src/backends/zig-check.js +70 -0
- package/build/src/diagnostic.d.ts +13 -1
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +14 -2
- package/build/src/frontends/program.d.ts +6 -0
- package/build/src/frontends/program.d.ts.map +1 -1
- package/build/src/frontends/program.js +9 -1
- package/build/src/language-registry.d.ts +54 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +107 -5
- package/build/src/project-build.d.ts +172 -0
- package/build/src/project-build.d.ts.map +1 -0
- package/build/src/project-build.js +320 -0
- package/build/src/project-cli.d.ts +40 -0
- package/build/src/project-cli.d.ts.map +1 -0
- package/build/src/project-cli.js +145 -0
- package/build/src/project-manifest.d.ts +148 -0
- package/build/src/project-manifest.d.ts.map +1 -0
- package/build/src/project-manifest.js +432 -0
- package/build/src/project-reporter.d.ts +81 -0
- package/build/src/project-reporter.d.ts.map +1 -0
- package/build/src/project-reporter.js +293 -0
- package/build/src/project-snapshot.d.ts +129 -0
- package/build/src/project-snapshot.d.ts.map +1 -0
- package/build/src/project-snapshot.js +362 -0
- package/build/src/project-watch-reporter.d.ts +125 -0
- package/build/src/project-watch-reporter.d.ts.map +1 -0
- package/build/src/project-watch-reporter.js +280 -0
- package/build/src/project-watch.d.ts +133 -0
- package/build/src/project-watch.d.ts.map +1 -0
- package/build/src/project-watch.js +839 -0
- package/build/src/publication.d.ts +218 -0
- package/build/src/publication.d.ts.map +1 -0
- package/build/src/publication.js +1832 -0
- package/build/src/semantic/types.d.ts +613 -0
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +163 -1
- package/build/src/subprocess.d.ts +8 -0
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +50 -9
- package/build/src/target-check.d.ts +52 -0
- package/build/src/target-check.d.ts.map +1 -0
- package/build/src/target-check.js +796 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +3 -3
- package/docs/architecture.md +3 -1
- package/docs/c.md +4 -0
- package/docs/cpp.md +4 -0
- package/docs/dart.md +4 -0
- package/docs/generated-artifact-publication.md +98 -0
- package/docs/kotlin.md +2 -2
- package/docs/language-support.md +29 -3
- package/docs/project-build-cli.md +147 -0
- package/docs/project-watch.md +60 -0
- package/docs/rust.md +4 -0
- package/docs/swift.md +2 -0
- package/docs/testing.md +70 -3
- package/docs/watch-build-pipeline.md +42 -26
- package/docs/zig.md +2 -0
- package/examples/jsdoc-java-watch/expected-output.txt +3 -0
- package/examples/jsdoc-java-watch/semantifold.json +23 -0
- package/examples/jsdoc-java-watch/src/main.js +21 -0
- package/index.js +9 -0
- package/package.json +6 -1
- package/src/artifact-path.js +31 -2
- package/src/backends/c-check.js +80 -0
- package/src/backends/check-plan.js +147 -0
- package/src/backends/cpp-check.js +73 -0
- package/src/backends/csharp-check.js +139 -0
- package/src/backends/csharp.js +4 -3
- package/src/backends/dart-check.js +117 -0
- package/src/backends/dart.js +4 -4
- package/src/backends/go-check.js +89 -0
- package/src/backends/go.js +2 -2
- package/src/backends/java-check.js +77 -0
- package/src/backends/javascript-check.js +33 -0
- package/src/backends/kotlin-check.js +41 -0
- package/src/backends/php-check.js +23 -0
- package/src/backends/program.js +17 -0
- package/src/backends/python-check.js +30 -0
- package/src/backends/ruby-check.js +23 -0
- package/src/backends/rust-check.js +78 -0
- package/src/backends/swift-check.js +89 -0
- package/src/backends/typescript-check.js +37 -0
- package/src/backends/zig-check.js +81 -0
- package/src/diagnostic.js +9 -1
- package/src/frontends/program.js +9 -0
- package/src/language-registry.js +113 -4
- package/src/project-build.js +353 -0
- package/src/project-cli.js +155 -0
- package/src/project-manifest.js +479 -0
- package/src/project-reporter.js +320 -0
- package/src/project-snapshot.js +403 -0
- package/src/project-watch-reporter.js +303 -0
- package/src/project-watch.js +870 -0
- package/src/publication.js +2071 -0
- package/src/semantic/types.js +184 -0
- package/src/subprocess.js +49 -8
- package/src/target-check.js +844 -0
- package/src/toolchains.js +3 -2
- package/tsconfig.json +1 -1
|
@@ -22,6 +22,21 @@ import { programImportName, SourceWriter } from "./writer.js";
|
|
|
22
22
|
const programTargets = new Set(["php", "ruby", "javascript", "typescript", "java"]);
|
|
23
23
|
/** @type {Readonly<Set<import("../semantic/types.js").BackendLanguage>>} */
|
|
24
24
|
const programApplicationTargets = new Set(["android", "ios", "flutter"]);
|
|
25
|
+
/**
|
|
26
|
+
* Reports whether program generation implements one registered target/role combination.
|
|
27
|
+
* @param {string} language - Registered target identity.
|
|
28
|
+
* @param {string} role - Explicit project target role.
|
|
29
|
+
* @returns {boolean} Whether complete semantic programs support the combination.
|
|
30
|
+
*/
|
|
31
|
+
export function supportsProgramArtifactRole(language, role) {
|
|
32
|
+
if (role == "text") {
|
|
33
|
+
return programTargets.has(/** @type {import("../semantic/types.js").SemanticLanguage} */ (language));
|
|
34
|
+
}
|
|
35
|
+
if (role == "application") {
|
|
36
|
+
return programApplicationTargets.has(/** @type {import("../semantic/types.js").BackendLanguage} */ (language));
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
25
40
|
/**
|
|
26
41
|
* Validates and prepares a complete semantic program for a non-text backend without allocating a writer.
|
|
27
42
|
* @param {object} input - Backend preflight request.
|
|
@@ -1306,4 +1321,4 @@ function isPlainObject(value) {
|
|
|
1306
1321
|
function invalidProgramGeneration(message) {
|
|
1307
1322
|
throw new SemantifoldDiagnostic({ code: "INVALID_PROGRAM", language: "program", message });
|
|
1308
1323
|
}
|
|
1309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9wcm9ncmFtLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3hFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzFELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM5RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzdGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqRSxPQUFPLEVBQUMsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEQsT0FBTyxFQUFDLCtCQUEr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QUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9GLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJO0lBQ2hDLE9BQU8sUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFBO0FBQ2hJLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxPQUFPO0lBQ3ZDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxFQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4uL2FycmF5LmpzXCJcbmltcG9ydCB7aXNTYWZlQXJ0aWZhY3RQYXRoLCBpc1NhZmVTb3VyY2VQYXRofSBmcm9tIFwiLi4vYXJ0aWZhY3QtcGF0aC5qc1wiXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0fSBmcm9tIFwiLi4vYXJ0aWZhY3RzLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljLCB1bnN1cHBvcnRlZENhcGFiaWxpdHksIHVuc3VwcG9ydGVkUm9sZX0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtwYXJzZVByb2dyYW1Tb3VyY2V9IGZyb20gXCIuLi9mcm9udGVuZHMvcHJvZ3JhbS5qc1wiXG5pbXBvcnQge2xhbmd1YWdlUmVnaXN0cnl9IGZyb20gXCIuLi9sYW5ndWFnZS1yZWdpc3RyeS5qc1wiXG5pbXBvcnQge2ZpbmFsaXplTWFwcGluZywgdG9Tb3VyY2VNYXBWM30gZnJvbSBcIi4uL21hcHBpbmcuanNcIlxuaW1wb3J0IHtjcmVhdGVDb29yZGluYXRlSW5kZXgsIGluZGV4ZWRQb2ludEF0LCBtb2R1bGVMb2NhdGlvbn0gZnJvbSBcIi4uL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7c2VtYW50aWNFbnRyaWVzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2xpc3RTdGRsaWJNb2R1bGVzLCBwYXJzZVN0ZGxpYlZlcnNpb25SYW5nZX0gZnJvbSBcIi4uL3NlbWFudGljL3N0ZGxpYi5qc1wiXG5pbXBvcnQge21vZHVsZVVuY2hlY2tlZEVycm9yRWZmZWN0c30gZnJvbSBcIi4uL3NlbWFudGljL3ZhbGlkYXRlLmpzXCJcbmltcG9ydCB7bmVnb3RpYXRlU3RkbGliUHJvdmlkZXJzfSBmcm9tIFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCJcbmltcG9ydCB7c3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3IsIHN0ZGxpYkZhY2FkZVJlZ2lzdHJ5fSBmcm9tIFwiLi4vc3RkbGliLWZhY2FkZXMuanNcIlxuaW1wb3J0IHtzdGRsaWJQcm92aWRlclJlZ2lzdHJ5fSBmcm9tIFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiXG5pbXBvcnQge3ByZWZsaWdodEVmZmVjdENhcGFiaWxpdGllc30gZnJvbSBcIi4vZWZmZWN0cy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlVGFyZ2V0QmluZGluZ0lkZW50aWZpZXIsIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllciwgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcn0gZnJvbSBcIi4vaWRlbnRpZmllcnMuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVN0ZGxpYlByb3ZpZGVyQ29udGVudH0gZnJvbSBcIi4vc3RkbGliLXN1cHBvcnQuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZUJhY2tlbmRNb2R1bGV9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge3Byb2dyYW1JbXBvcnROYW1lLCBTb3VyY2VXcml0ZXJ9IGZyb20gXCIuL3dyaXRlci5qc1wiXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2U+Pn0gKi9cbmNvbnN0IHByb2dyYW1UYXJnZXRzID0gbmV3IFNldChbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdKVxuLyoqIEB0eXBlIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlPj59ICovXG5jb25zdCBwcm9ncmFtQXBwbGljYXRpb25UYXJnZXRzID0gbmV3IFNldChbXCJhbmRyb2lkXCIsIFwiaW9zXCIsIFwiZmx1dHRlclwiXSlcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIHByZXBhcmVzIGEgY29tcGxldGUgc2VtYW50aWMgcHJvZ3JhbSBmb3IgYSBub24tdGV4dCBiYWNrZW5kIHdpdGhvdXQgYWxsb2NhdGluZyBhIHdyaXRlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIEJhY2tlbmQgcHJlZmxpZ2h0IHJlcXVlc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGlucHV0LmJhY2tlbmRMYW5ndWFnZSAtIEV4aXN0aW5nIHNlbWFudGljIGJhY2tlbmQgcHJvZmlsZSB0byBlbmZvcmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGlucHV0LmRpYWdub3N0aWNMYW5ndWFnZSAtIFB1YmxpYyB0YXJnZXQgaWRlbnRpdHkgZm9yIGNhcGFiaWxpdHkgZmFpbHVyZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gaW5wdXQucHJvZ3JhbSAtIENvbXBsZXRlIGNhbmRpZGF0ZSBwcm9ncmFtLlxuICogQHBhcmFtIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZT4+fSBbaW5wdXQuc291cmNlTGFuZ3VhZ2VzXSAtIEFjY2VwdGVkIHNvdXJjZSBwcm92ZW5hbmNlIGxhbmd1YWdlcy5cbiAqIEByZXR1cm5zIHt7bW9kdWxlczogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGVbXSwgcHJvZ3JhbTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtLCBzb3VyY2VzOiB7Y29udGVudDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119fSBQcmVwYXJlZCBpbW11dGFibGUtaW5wdXQgdmlld3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVmbGlnaHRTZW1hbnRpY1Byb2dyYW0oe2JhY2tlbmRMYW5ndWFnZSwgZGlhZ25vc3RpY0xhbmd1YWdlLCBwcm9ncmFtOiBjYW5kaWRhdGUsIHNvdXJjZUxhbmd1YWdlc30pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm9ncmFtID0gdmFsaWRhdGVQcm9ncmFtKGNhbmRpZGF0ZSwgYmFja2VuZExhbmd1YWdlLCBzb3VyY2VMYW5ndWFnZXMpXG4gICAgY29uc3QgbW9kdWxlcyA9IHByZXBhcmVFbWlzc2lvbk1vZHVsZXMocHJvZ3JhbSwgYmFja2VuZExhbmd1YWdlKVxuXG4gICAgdmFsaWRhdGVQcm9ncmFtU291cmNlT3duZXJzaGlwKHByb2dyYW0sIGJhY2tlbmRMYW5ndWFnZSlcbiAgICBjb25zdCBzb3VyY2VzID0gcHJvZ3JhbS5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiB7XG4gICAgICBpZiAoc291cmNlLmNvbnRlbnQgPT09IG51bGwpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihgUHJvZ3JhbSBzb3VyY2UgJyR7c291cmNlLmZpbGVuYW1lfScgaGFzIG5vIHJldGFpbmVkIGNvbnRlbnQuYClcblxuICAgICAgcmV0dXJuIHtjb250ZW50OiBzb3VyY2UuY29udGVudCwgZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSwgLi4uKHNvdXJjZS5sYW5ndWFnZSA/IHtsYW5ndWFnZTogc291cmNlLmxhbmd1YWdlfSA6IHt9KX1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHttb2R1bGVzLCBwcm9ncmFtLCBzb3VyY2VzfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYyAmJiBlcnJvci5jb2RlID09IFwiVU5TVVBQT1JURURfQ0FQQUJJTElUWVwiICYmXG4gICAgICBlcnJvci5sYW5ndWFnZSAhPSBkaWFnbm9zdGljTGFuZ3VhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIGNvZGU6IGVycm9yLmNvZGUsXG4gICAgICAgIGxhbmd1YWdlOiBkaWFnbm9zdGljTGFuZ3VhZ2UsXG4gICAgICAgIGxvY2F0aW9uOiBlcnJvci5sb2NhdGlvbixcbiAgICAgICAgbWVzc2FnZTogZXJyb3IuZGV0YWlsXG4gICAgICB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgY29tcGxldGUgZGV0ZXJtaW5pc3RpYyBtYXBwZWQgYXJ0aWZhY3Qgc2V0IGZvciBvbmUgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFByb2dyYW0gZ2VuZXJhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGlucHV0Lmxhbmd1YWdlIC0gUmVnaXN0ZXJlZCBwcm9ncmFtIHRhcmdldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBpbnB1dC5wcm9ncmFtIC0gQ29tcGxldGUgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7XCJ0ZXh0XCIgfCBcImFwcGxpY2F0aW9uXCJ9IFtpbnB1dC5yb2xlXSAtIEV4cGxpY2l0IGFydGlmYWN0IHJvbGU7IG9taXR0ZWQgcHJlc2VydmVzIHRleHQgZ2VuZXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXQgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXQgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GbHV0dGVyQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXR9IFtpbnB1dC5jb25maWd1cmF0aW9uXSAtIEFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklvc0FwcGxpY2F0aW9uQXNzZXRJbnB1dFtdIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlW10gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GbHV0dGVyQXBwbGljYXRpb25Bc3NldElucHV0W119IFtpbnB1dC5hc3NldHNdIC0gRXhhY3QgY2FsbGVyIGFzc2V0cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlW119IFtpbnB1dC5yZXNvdXJjZXNdIC0gRXhhY3QgQW5kcm9pZCBjYWxsZXIgcmVzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBUcmFuc2FjdGlvbmFsbHkgdmFsaWRhdGVkIGFydGlmYWN0IHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUHJvZ3JhbUFydGlmYWN0cyhpbnB1dCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXQpIHx8IHR5cGVvZiBpbnB1dC5sYW5ndWFnZSAhPSBcInN0cmluZ1wiKSBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oXCJQcm9ncmFtIGdlbmVyYXRpb24gcmVxdWlyZXMgYSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIHByb2dyYW0uXCIpXG4gIGNvbnN0IHJvbGUgPSBpbnB1dC5yb2xlID8/IFwidGV4dFwiXG5cbiAgaWYgKHJvbGUgIT0gXCJ0ZXh0XCIgJiYgcm9sZSAhPSBcImFwcGxpY2F0aW9uXCIpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihcIlByb2dyYW0gYXJ0aWZhY3Qgcm9sZSBtdXN0IGJlICd0ZXh0JyBvciAnYXBwbGljYXRpb24nLlwiKVxuICBsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZChpbnB1dC5sYW5ndWFnZSlcbiAgaWYgKHJvbGUgPT0gXCJhcHBsaWNhdGlvblwiKSB7XG4gICAgaWYgKCFwcm9ncmFtQXBwbGljYXRpb25UYXJnZXRzLmhhcyhpbnB1dC5sYW5ndWFnZSkpIHVuc3VwcG9ydGVkUm9sZShpbnB1dC5sYW5ndWFnZSwgXCJtdWx0aS1maWxlIGFwcGxpY2F0aW9uIGJhY2tlbmRcIilcbiAgICBjb25zdCBiYWNrZW5kID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZXNvbHZlKGlucHV0Lmxhbmd1YWdlLCBcImFwcGxpY2F0aW9uQmFja2VuZFwiKVxuXG4gICAgcmV0dXJuIGNyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0KGJhY2tlbmQoaW5wdXQpKVxuICB9XG4gIGlmICghcHJvZ3JhbVRhcmdldHMuaGFzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlucHV0Lmxhbmd1YWdlKSkpIHtcbiAgICB1bnN1cHBvcnRlZFJvbGUoaW5wdXQubGFuZ3VhZ2UsIFwibXVsdGktZmlsZSB0ZXh0IGJhY2tlbmRcIilcbiAgfVxuICBjb25zdCBsYW5ndWFnZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlucHV0Lmxhbmd1YWdlKVxuICBjb25zdCBwcm9ncmFtID0gdmFsaWRhdGVQcm9ncmFtKGlucHV0LnByb2dyYW0sIGxhbmd1YWdlKVxuICBjb25zdCBsaW5raW5nID0gcGxhblN0ZGxpYkxpbmtpbmcocHJvZ3JhbSwgbGFuZ3VhZ2UpXG4gIGNvbnN0IGVtaXNzaW9uTW9kdWxlcyA9IHByZXBhcmVFbWlzc2lvbk1vZHVsZXMocHJvZ3JhbSwgbGFuZ3VhZ2UsIGxpbmtpbmcpXG4gIHZhbGlkYXRlUHJvZ3JhbVNvdXJjZU93bmVyc2hpcChwcm9ncmFtLCBsYW5ndWFnZSlcbiAgY29uc3QgcGF0aHMgPSBwbGFuTW9kdWxlUGF0aHMocHJvZ3JhbSwgbGFuZ3VhZ2UsIGxpbmtpbmcpXG4gIGNvbnN0IHNvdXJjZXMgPSBwcm9ncmFtLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IHtcbiAgICBpZiAoc291cmNlLmNvbnRlbnQgPT09IG51bGwpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihgUHJvZ3JhbSBzb3VyY2UgJyR7c291cmNlLmZpbGVuYW1lfScgaGFzIG5vIHJldGFpbmVkIGNvbnRlbnQuYClcblxuICAgIHJldHVybiB7Y29udGVudDogc291cmNlLmNvbnRlbnQsIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsIC4uLihzb3VyY2UubGFuZ3VhZ2UgPyB7bGFuZ3VhZ2U6IHNvdXJjZS5sYW5ndWFnZX0gOiB7fSl9XG4gIH0pXG4gIGNvbnN0IGJhY2tlbmQgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2phdmFzY3JpcHQuanNcIikuZ2VuZXJhdGVKYXZhU2NyaXB0fSAqLyAoXG4gICAgbGFuZ3VhZ2VSZWdpc3RyeS5yZXNvbHZlKGxhbmd1YWdlLCBcInRleHRCYWNrZW5kXCIpKVxuICBjb25zdCBtZWRpYVR5cGUgPSBsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZChsYW5ndWFnZSkubWVkaWFUeXBlXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gKi9cbiAgY29uc3QgYXJ0aWZhY3RzID0gbGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgfHwgbGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgPyBbe1xuICAgIGNvbnRlbnQ6IFwie1xcbiAgXFxcInR5cGVcXFwiOiBcXFwibW9kdWxlXFxcIlxcbn1cXG5cIixcbiAgICBjb250ZW50S2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIG93bmVyc2hpcDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZ2VuZXJhdGVkXCIpLFxuICAgIHBhdGg6IFwicGFja2FnZS5qc29uXCIsXG4gICAgcHJvdmVuYW5jZToge1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgcmVhc29uOiBcIkRlY2xhcmVzIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdC1mYW1pbHkgYXJ0aWZhY3Qgc2V0IGFzIGNhbm9uaWNhbCBFU00uXCIsXG4gICAgICByZWxhdGVkT3JpZ2luczogW11cbiAgICB9LFxuICAgIHJvbGU6IFwibWFuaWZlc3RcIlxuICB9XSA6IFtdXG5cbiAgaWYgKGxpbmtpbmcgJiYgbGFuZ3VhZ2UgIT0gXCJqYXZhXCIpIHtcbiAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIGxpbmtpbmcubmVnb3RpYXRpb24ucHJvdmlkZXJzKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChsaW5raW5nLnJlY29yZHMuZ2V0KHByb3ZpZGVyLm1vZHVsZSkpXG5cbiAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgY29udGVudDogZ2VuZXJhdGVTdGRsaWJQcm92aWRlckNvbnRlbnQoLyoqIEB0eXBlIHtcInBocFwiIHwgXCJydWJ5XCIgfCBcImphdmFzY3JpcHRcIiB8IFwidHlwZXNjcmlwdFwifSAqLyAobGFuZ3VhZ2UpLFxuICAgICAgICAgIFsuLi5wcm92aWRlci5vcGVyYXRpb25zXSwgcHJvdmlkZXIubW9kdWxlKSxcbiAgICAgICAgY29udGVudEtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInRleHRcIiksXG4gICAgICAgIG1lZGlhVHlwZTogcmVjb3JkLmFydGlmYWN0Lm1lZGlhVHlwZSxcbiAgICAgICAgb3duZXJzaGlwOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJnZW5lcmF0ZWRcIiksXG4gICAgICAgIHBhdGg6IHJlY29yZC5hcnRpZmFjdC5wYXRoLFxuICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgICAgIHJlYXNvbjogYHNlbWFudGlmb2xkLXN0ZGxpYi1wcm92aWRlcjoke3JlY29yZC5pZGVudGl0eX1gLFxuICAgICAgICAgIHJlbGF0ZWRPcmlnaW5zOiBbXVxuICAgICAgICB9LFxuICAgICAgICByb2xlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzdXBwb3J0XCIpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZW1pc3Npb25Nb2R1bGUgb2YgZW1pc3Npb25Nb2R1bGVzKSB7XG4gICAgY29uc3QgbW9kdWxlSWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKFJlZmxlY3QuZ2V0KGVtaXNzaW9uTW9kdWxlLCBcImlkXCIpKVxuICAgIGNvbnN0IGZpbGVuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRocy5nZXQobW9kdWxlSWQpKVxuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoe1xuICAgICAgZmlsZW5hbWUsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIG1vZHVsZTogZW1pc3Npb25Nb2R1bGUsXG4gICAgICBwcm9ncmFtLFxuICAgICAgcHJvZ3JhbVBhdGhzOiBwYXRocyxcbiAgICAgIHNvdXJjZXMsXG4gICAgICAuLi4obGlua2luZyAmJiBlbWlzc2lvbk1vZHVsZS5jYXBhYmlsaXRpZXMgIT09IHVuZGVmaW5lZCA/IHtcbiAgICAgICAgc3RkbGliUHJvdmlkZXJFbnRyaWVzOiBPYmplY3QuZnJvbUVudHJpZXMoKGxpbmtpbmcudXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQobW9kdWxlSWQpID8/IFtdKS5tYXAoKHttb2R1bGUsIG9wZXJhdGlvbn0pID0+IFtcbiAgICAgICAgICBxdWFsaWZpZWRPcGVyYXRpb25LZXkobW9kdWxlLCBvcGVyYXRpb24pLFxuICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobGlua2luZy5yZWNvcmRzLmdldChtb2R1bGUpPy5uYXRpdmVFbnRyaWVzW29wZXJhdGlvbl0pXG4gICAgICAgIF0pKSxcbiAgICAgICAgc3RkbGliUHJvdmlkZXJJbXBvcnRzOiBsYW5ndWFnZSA9PSBcImphdmFcIiB8fCBsYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiA/XG4gICAgICAgICAgbGlua2luZy5wcm92aWRlckltcG9ydHNCeU1vZHVsZS5nZXQobW9kdWxlSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICBzdGRsaWJQcm92aWRlclBhdGhzOiBsaW5raW5nLnByb3ZpZGVyUGF0aHNCeU1vZHVsZS5nZXQobW9kdWxlSWQpLFxuICAgICAgICAuLi4obGFuZ3VhZ2UgPT0gXCJqYXZhXCIgPyB7XG4gICAgICAgICAgc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChsaW5raW5nLm93bmVyTW9kdWxlSWQpLFxuICAgICAgICAgIHN0ZGxpYlByb3ZpZGVyU2hpbXM6IG1vZHVsZUlkID09IGxpbmtpbmcub3duZXJNb2R1bGVJZCA/IGxpbmtpbmcudXNlZE9wZXJhdGlvbnMubWFwKCh7b3BlcmF0aW9ufSkgPT4gb3BlcmF0aW9uKSA6IHVuZGVmaW5lZFxuICAgICAgICB9IDoge30pXG4gICAgICB9IDoge30pXG4gICAgfSlcblxuICAgIGJhY2tlbmQoZW1pc3Npb25Nb2R1bGUsIHdyaXRlcilcbiAgICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcblxuICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgIGNvbnRlbnQ6IG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQsXG4gICAgICBjb250ZW50S2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICAgIG1lZGlhVHlwZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZWRpYVR5cGUpLFxuICAgICAgb3duZXJzaGlwOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJnZW5lcmF0ZWRcIiksXG4gICAgICBwYXRoOiBmaWxlbmFtZSxcbiAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICAgICAgbWFwcGluZyxcbiAgICAgICAgc291cmNlTWFwOiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpLFxuICAgICAgICBzb3VyY2VNYXBGaWxlbmFtZTogYCR7ZmlsZW5hbWV9Lm1hcGBcbiAgICAgIH0sXG4gICAgICByb2xlOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0Um9sZX0gKi8gKFxuICAgICAgICBtb2R1bGVJZCA9PSBwcm9ncmFtLmVudHJ5TW9kdWxlID8gXCJlbnRyeVwiIDogUmVmbGVjdC5nZXQoZW1pc3Npb25Nb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpID8gXCJzdXBwb3J0XCIgOiBcInNvdXJjZVwiKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoe1xuICAgIGFydGlmYWN0cyxcbiAgICAuLi4obGlua2luZyB8fCBwcm9ncmFtLnN0ZGxpYkZhY2FkZXMgPyB7bWV0YWRhdGE6IHN0ZGxpYkxpbmtNZXRhZGF0YShsaW5raW5nLCBwYXRocywgcHJvZ3JhbS5zdGRsaWJGYWNhZGVzKX0gOiB7fSksXG4gICAgdGFyZ2V0OiBsYW5ndWFnZVxuICB9KVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYlByb2dyYW1MaW5raW5nXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3N0ZGxpYi1uZWdvdGlhdGlvbi5qc1wiKS5TdGRsaWJOZWdvdGlhdGlvblJlc3VsdH0gbmVnb3RpYXRpb24gLSBOZWdvdGlhdGVkIHByb3ZpZGVyIGNsb3N1cmUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmQ+fSByZWNvcmRzIC0gTWF0ZXJpYWxpemVkIHByb3ZpZGVyIHJlY29yZHMgYnkgY2Fub25pY2FsIG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW119IHVzZWRPcGVyYXRpb25zIC0gUHJvZ3JhbS13aWRlIHVzZWQgY2Fub25pY2FsIG9wZXJhdGlvbnMgaW4gc3RhYmxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59IHVzZWRPcGVyYXRpb25zQnlNb2R1bGUgLSBVc2VkIGNhbm9uaWNhbCBvcGVyYXRpb25zIGJ5IHByb2dyYW0gbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59IHByb3ZpZGVySW1wb3J0c0J5TW9kdWxlIC0gT3JkZXJlZCBwcm92aWRlciBpbXBvcnQgbmFtZXMgYnkgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59IHByb3ZpZGVyUGF0aHNCeU1vZHVsZSAtIFByb3ZpZGVyIGFydGlmYWN0IGNsb3N1cmUgYnkgcHJvZ3JhbSBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IG93bmVyTW9kdWxlSWQgLSBKYXZhIHRhcmdldDogZmlyc3Qgb3BlcmF0aW9uLXVzaW5nIG1vZHVsZSBpZGVudGl0eSBob3N0aW5nIHRoZSBzaGFyZWQgc3VwcG9ydDsgbnVsbCBmb3IgYXJ0aWZhY3QtbWF0ZXJpYWxpemluZyB0YXJnZXRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlIC0gQ2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb24gLSBDYW5vbmljYWwgb3BlcmF0aW9uIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBQbGFucyB0aGUgbGlua2VkIHN0ZGxpYiBwcm92aWRlciBmb3Igb25lIHByb2dyYW0sIG9yIHJlcG9ydHMgdGhhdCBubyBvcGVyYXRpb24gaXMgdXNlZC5cbiAqIEphdmEgcmVzb2x2ZXMgdGhlIHNhbWUgbmVnb3RpYXRlZCBwcm92aWRlciByZWNvcmQgYnV0IGhvc3RzIGl0cyBzdXBwb3J0IGluIHRoZSBmaXJzdFxuICogb3BlcmF0aW9uLXVzaW5nIG1vZHVsZSBpbnN0ZWFkIG9mIGEgc2VwYXJhdGUgcHJvdmlkZXIgYXJ0aWZhY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEByZXR1cm5zIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IExpbmtpbmcgcGxhbiwgb3IgbnVsbCB3aGVuIG5vdGhpbmcgaXMgdXNlZC5cbiAqL1xuZnVuY3Rpb24gcGxhblN0ZGxpYkxpbmtpbmcocHJvZ3JhbSwgbGFuZ3VhZ2UpIHtcbiAgY29uc3Qge3Byb2dyYW1XaWRlLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlfSA9IGNvbGxlY3RVc2VkRWZmZWN0T3BlcmF0aW9ucyhwcm9ncmFtKVxuXG4gIGlmIChwcm9ncmFtV2lkZS5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGxcbiAgY29uc3QgY29udHJhY3RzID0gcHJvZ3JhbS5zdGRsaWJDb250cmFjdHMgPz8gWy8qKiBAdHlwZSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbj86IHN0cmluZ319ICovIChwcm9ncmFtLnN0ZGxpYkNvbnRyYWN0KV1cbiAgY29uc3QgY29udHJhY3RzQnlJZGVudGl0eSA9IG5ldyBNYXAoY29udHJhY3RzLm1hcCgoY29udHJhY3QpID0+IFtjb250cmFjdC5pZGVudGl0eSwgY29udHJhY3RdKSlcbiAgY29uc3QgcmVxdWlyZW1lbnRzQnlNb2R1bGUgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHF1YWxpZmllZCBvZiBwcm9ncmFtV2lkZSkge1xuICAgIGNvbnN0IHJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnRzQnlNb2R1bGUuZ2V0KHF1YWxpZmllZC5tb2R1bGUpID8/IFtdXG5cbiAgICByZXF1aXJlbWVudC5wdXNoKHF1YWxpZmllZC5vcGVyYXRpb24pXG4gICAgcmVxdWlyZW1lbnRzQnlNb2R1bGUuc2V0KHF1YWxpZmllZC5tb2R1bGUsIHJlcXVpcmVtZW50KVxuICB9XG4gIGNvbnN0IG5lZ290aWF0aW9uID0gbmVnb3RpYXRlU3RkbGliUHJvdmlkZXJzKHtcbiAgICByZXF1aXJlbWVudHM6IFsuLi5yZXF1aXJlbWVudHNCeU1vZHVsZV0ubWFwKChbbW9kdWxlLCBvcGVyYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgY29udHJhY3QgPSBjb250cmFjdHNCeUlkZW50aXR5LmdldChtb2R1bGUpXG5cbiAgICAgIGlmICghY29udHJhY3QpIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBSZWFjaGFibGUgY2Fub25pY2FsIG9wZXJhdGlvbiAnJHttb2R1bGV9LiR7b3BlcmF0aW9uc1swXX0nIGhhcyBubyBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0LmBcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge21vZHVsZSwgb3BlcmF0aW9ucywgLi4uKGNvbnRyYWN0LmNvbnRyYWN0VmVyc2lvbiAhPT0gdW5kZWZpbmVkID8ge3JhbmdlOiBjb250cmFjdC5jb250cmFjdFZlcnNpb259IDoge30pfVxuICAgIH0pLFxuICAgIHRhcmdldDogbGFuZ3VhZ2VcbiAgfSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gKi9cbiAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgc2VsZWN0ZWQgb2YgbmVnb3RpYXRpb24ubW9kdWxlcykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBzdGRsaWJQcm92aWRlclJlZ2lzdHJ5LnByb3ZpZGVyc0ZvcihsYW5ndWFnZSwgc2VsZWN0ZWQuaWRlbnRpdHksIHNlbGVjdGVkLnZlcnNpb24pXG5cbiAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggIT0gMSkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYEV4cGVjdGVkIGV4YWN0bHkgb25lIHJlZ2lzdGVyZWQgc3RkbGliIHByb3ZpZGVyIGZvciAnJHtzZWxlY3RlZC5pZGVudGl0eX0nIG9uICcke2xhbmd1YWdlfScuYFxuICAgICAgfSlcbiAgICB9XG4gICAgcmVjb3Jkcy5zZXQoc2VsZWN0ZWQuaWRlbnRpdHksIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZH0gKi8gKGNhbmRpZGF0ZXNbMF0pKVxuICB9XG4gIGNvbnN0IG93bmVyTW9kdWxlSWQgPSBsYW5ndWFnZSA9PSBcImphdmFcIlxuICAgID8gcHJvZ3JhbS5tb2R1bGVzLm1hcCgobW9kdWxlKSA9PiBtb2R1bGUuaWQpLmZpbmQoKGlkKSA9PiAodXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQoaWQpID8/IFtdKS5sZW5ndGggPiAwKVxuICAgIDogbnVsbFxuXG4gIGlmIChvd25lck1vZHVsZUlkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgIGxhbmd1YWdlLFxuICAgIG1lc3NhZ2U6IFwiSmF2YSBwcm9ncmFtIGxpbmtpbmcgcmVxdWlyZXMgb25lIG1vZHVsZSB1c2luZyBjYW5vbmljYWwgb3BlcmF0aW9ucy5cIlxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgbmVnb3RpYXRpb24sXG4gICAgb3duZXJNb2R1bGVJZCxcbiAgICBwcm92aWRlckltcG9ydHNCeU1vZHVsZTogY29sbGVjdFByb3ZpZGVySW1wb3J0cyhwcm9ncmFtLCBuZWdvdGlhdGlvbiwgcmVjb3JkcywgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSwgbGFuZ3VhZ2UsIG93bmVyTW9kdWxlSWQpLFxuICAgIHByb3ZpZGVyUGF0aHNCeU1vZHVsZTogY29sbGVjdFByb3ZpZGVyUGF0aHMobmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUpLFxuICAgIHJlY29yZHMsXG4gICAgdXNlZE9wZXJhdGlvbnM6IFsuLi5wcm9ncmFtV2lkZV0sXG4gICAgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZVxuICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZXhhY3QgcHJvdmlkZXIvdHlwZSBkZXBlbmRlbmN5IGNsb3N1cmUgcmVxdWlyZWQgYnkgZWFjaCBlbWl0dGluZyBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCIpLlN0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSBuZWdvdGlhdGlvbiAtIE5lZ290aWF0ZWQgcHJvZ3JhbSBjbG9zdXJlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gcmVjb3JkcyAtIFNlbGVjdGVkIHByb3ZpZGVyIHJlY29yZHMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn0gdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSAtIFJlYWNoYWJsZSBvcGVyYXRpb25zIGJ5IHByb2dyYW0gbW9kdWxlLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gT3JkZXJlZCBwcm92aWRlciBwYXRocyBieSBwcm9ncmFtIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFByb3ZpZGVyUGF0aHMobmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUpIHtcbiAgY29uc3QgcGF0aHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IFttb2R1bGVJZCwgb3BlcmF0aW9uc10gb2YgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldChvcGVyYXRpb25zLm1hcCgoe21vZHVsZX0pID0+IG1vZHVsZSkpXG4gICAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgICB3aGlsZSAoY2hhbmdlZCkge1xuICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBbLi4uc2VsZWN0ZWRdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiByZWNvcmRzLmdldChtb2R1bGUpPy5kZXBlbmRlbmNpZXMgPz8gW10pIHtcbiAgICAgICAgICBpZiAoIXNlbGVjdGVkLmhhcyhkZXBlbmRlbmN5Lm1vZHVsZSkpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkLmFkZChkZXBlbmRlbmN5Lm1vZHVsZSlcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHBhdGhzLnNldChtb2R1bGVJZCwgbmVnb3RpYXRpb24ucHJvdmlkZXJzLmZpbHRlcigoe21vZHVsZX0pID0+IHNlbGVjdGVkLmhhcyhtb2R1bGUpKS5tYXAoKHttb2R1bGV9KSA9PlxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAocmVjb3Jkcy5nZXQobW9kdWxlKSkuYXJ0aWZhY3QucGF0aCkpXG4gIH1cbiAgcmV0dXJuIHBhdGhzXG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIGNhbm9uaWNhbCBvcGVyYXRpb25zIGludm9rZWQgYnkgZWFjaCBwcm9ncmFtIG1vZHVsZSBpbiBzdGFibGUgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHJldHVybnMge3twcm9ncmFtV2lkZTogUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10sIHVzZWRPcGVyYXRpb25zQnlNb2R1bGU6IE1hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn19IFVzZWQgb3BlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFVzZWRFZmZlY3RPcGVyYXRpb25zKHByb2dyYW0pIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59ICovXG4gIGNvbnN0IHVzZWRPcGVyYXRpb25zQnlNb2R1bGUgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb24+fSAqL1xuICBjb25zdCBwcm9ncmFtV2lkZSA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtib2R5OiB1bmtub3duLCBtb2R1bGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0+fSAqL1xuICBjb25zdCBib2RpZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIGJvZGllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHtib2R5OiBkZWNsYXJhdGlvbi5ib2R5LCBtb2R1bGV9KVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICAgIGJvZGllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5pZCksIHtib2R5OiBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5LCBtb2R1bGV9KVxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcykgYm9kaWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKG1ldGhvZC5pZCksIHtib2R5OiBtZXRob2QuYm9keSwgbW9kdWxlfSlcbiAgICB9XG4gICAgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5zZXQobW9kdWxlLmlkLCBbXSlcbiAgfVxuICBjb25zdCBlbnRyeU1vZHVsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAoXG4gICAgcHJvZ3JhbS5tb2R1bGVzLmZpbmQoKHtpZH0pID0+IGlkID09IHByb2dyYW0uZW50cnlNb2R1bGUpKVxuICAvKiogQHR5cGUge3tib2R5OiB1bmtub3duLCBtb2R1bGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX1bXX0gKi9cbiAgY29uc3QgcGVuZGluZyA9IFt7Ym9keTogZW50cnlNb2R1bGUuZW50cnlQb2ludD8uYm9keSwgbW9kdWxlOiBlbnRyeU1vZHVsZX1dXG4gIGNvbnN0IHJlYWNoZWREZWNsYXJhdGlvbnMgPSBuZXcgU2V0KClcblxuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY3VycmVudCA9IC8qKiBAdHlwZSB7e2JvZHk6IHVua25vd24sIG1vZHVsZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfX0gKi8gKHBlbmRpbmcuc2hpZnQoKSlcbiAgICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBNYXAoY3VycmVudC5tb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKChjYXBhYmlsaXR5KSA9PlxuICAgICAgY2FwYWJpbGl0eS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCB7bW9kdWxlOiBjYXBhYmlsaXR5LmF1dGhvcml0eUlkLCBvcGVyYXRpb246IG9wZXJhdGlvbi5uYW1lfV0pKSA/PyBbXSlcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBWaXNpdHMgb25lIHJlYWNoYWJsZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICAgKi9cbiAgICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVyblxuICAgICAgc2Vlbi5hZGQodmFsdWUpXG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIilcblxuICAgICAgICBpZiAoa2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJvcGVyYXRpb25cIilcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpZmllZCA9IG9wZXJhdGlvbk5hbWVzLmdldChvcGVyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChxdWFsaWZpZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRPcGVyYXRpb25LZXkocXVhbGlmaWVkLm1vZHVsZSwgcXVhbGlmaWVkLm9wZXJhdGlvbilcbiAgICAgICAgICAgICAgY29uc3QgbW9kdWxlT3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7UXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW119ICovICh1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChjdXJyZW50Lm1vZHVsZS5pZCkpXG5cbiAgICAgICAgICAgICAgaWYgKCFtb2R1bGVPcGVyYXRpb25zLnNvbWUoKGl0ZW0pID0+IHF1YWxpZmllZE9wZXJhdGlvbktleShpdGVtLm1vZHVsZSwgaXRlbS5vcGVyYXRpb24pID09IGtleSkpIG1vZHVsZU9wZXJhdGlvbnMucHVzaChxdWFsaWZpZWQpXG4gICAgICAgICAgICAgIHByb2dyYW1XaWRlLnNldChrZXksIHF1YWxpZmllZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25JZCA9IGlzUGxhaW5PYmplY3QoUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb2x1dGlvblwiKSlcbiAgICAgICAgICA/IFJlZmxlY3QuZ2V0KFJlZmxlY3QuZ2V0KHZhbHVlLCBcInJlc29sdXRpb25cIiksIFwiZGVjbGFyYXRpb25JZFwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmICFyZWFjaGVkRGVjbGFyYXRpb25zLmhhcyhkZWNsYXJhdGlvbklkKSkge1xuICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gYm9kaWVzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZWFjaGVkRGVjbGFyYXRpb25zLmFkZChkZWNsYXJhdGlvbklkKVxuICAgICAgICAgICAgcGVuZGluZy5wdXNoKGRlY2xhcmF0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoW1wiY2FwYWJpbGl0aWVzXCIsIFwibG9jYXRpb25cIiwgXCJwcm92ZW5hbmNlXCIsIFwicmVzb2x1dGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgICAgICB2aXNpdChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWUpIHZpc2l0KGNoaWxkKVxuICAgIH1cblxuICAgIHZpc2l0KGN1cnJlbnQuYm9keSlcbiAgfVxuICBmb3IgKGNvbnN0IG9wZXJhdGlvbnMgb2YgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZS52YWx1ZXMoKSkge1xuICAgIG9wZXJhdGlvbnMuc29ydCgobGVmdCwgcmlnaHQpID0+IHF1YWxpZmllZE9wZXJhdGlvbktleShsZWZ0Lm1vZHVsZSwgbGVmdC5vcGVyYXRpb24pXG4gICAgICAubG9jYWxlQ29tcGFyZShxdWFsaWZpZWRPcGVyYXRpb25LZXkocmlnaHQubW9kdWxlLCByaWdodC5vcGVyYXRpb24pLCBcImVuXCIpKVxuICB9XG4gIHJldHVybiB7cHJvZ3JhbVdpZGU6IFsuLi5wcm9ncmFtV2lkZS52YWx1ZXMoKV0uc29ydCgobGVmdCwgcmlnaHQpID0+IHF1YWxpZmllZE9wZXJhdGlvbktleShsZWZ0Lm1vZHVsZSwgbGVmdC5vcGVyYXRpb24pXG4gICAgLmxvY2FsZUNvbXBhcmUocXVhbGlmaWVkT3BlcmF0aW9uS2V5KHJpZ2h0Lm1vZHVsZSwgcmlnaHQub3BlcmF0aW9uKSwgXCJlblwiKSksIHVzZWRPcGVyYXRpb25zQnlNb2R1bGV9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIHVuYW1iaWd1b3VzIGludGVybmFsIGtleSBmb3Igb25lIGNhbm9uaWNhbCBvcGVyYXRpb24gYXV0aG9yaXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gQ2Fub25pY2FsIG9wZXJhdGlvbiBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gUXVhbGlmaWVkIGludGVybmFsIGtleS5cbiAqL1xuZnVuY3Rpb24gcXVhbGlmaWVkT3BlcmF0aW9uS2V5KG1vZHVsZSwgb3BlcmF0aW9uKSB7XG4gIHJldHVybiBgJHttb2R1bGV9XFx1MDAwMCR7b3BlcmF0aW9ufWBcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgb3JkZXJlZCBwcm92aWRlciBpbXBvcnQgbmFtZXMgZWFjaCBtb2R1bGUgbXVzdCBwdWxsIGZyb20gdGhlIGxpbmtlZCBwcm92aWRlci5cbiAqIEphdmEgbW9kdWxlcyBsaXN0IHJlZmVyZW5jZWQgY2FwYWJpbGl0eSB0eXBlIG5hbWVzIG9ubHk7IHRoZSBvd25lciBsaXN0cyBub25lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBWYWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCIpLlN0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSBuZWdvdGlhdGlvbiAtIE5lZ290aWF0ZWQgY2xvc3VyZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZD59IHJlY29yZHMgLSBQcm92aWRlciByZWNvcmRzIGJ5IGNhbm9uaWNhbCBtb2R1bGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn0gdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSAtIFVzZWQgY2Fub25pY2FsIG9wZXJhdGlvbnMgYnkgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gW293bmVyTW9kdWxlSWRdIC0gSmF2YSBvd25lciBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgc3RyaW5nW10+fSBPcmRlcmVkIHByb3ZpZGVyIGltcG9ydCBuYW1lcyBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQcm92aWRlckltcG9ydHMocHJvZ3JhbSwgbmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUsIGxhbmd1YWdlLCBvd25lck1vZHVsZUlkID0gbnVsbCkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gKi9cbiAgY29uc3QgcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGUgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBpZiAobW9kdWxlLmNhcGFiaWxpdGllcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KCh1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChtb2R1bGUuaWQpID8/IFtdKS5tYXAoKHttb2R1bGU6IG93bmVyLCBvcGVyYXRpb259KSA9PlxuICAgICAgcXVhbGlmaWVkT3BlcmF0aW9uS2V5KG93bmVyLCBvcGVyYXRpb24pKSlcbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHN1cmZhY2UgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lQnlJZCA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uTmFtZXMgPSBuZXcgTWFwKChtb2R1bGUucmVjb3JkcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbi5uYW1lXSkpXG5cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5lcnJvcnMgPz8gW10pIHtcbiAgICAgIGRlY2xhcmF0aW9uTmFtZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbi5uYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBtb2R1bGUuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNhcGFiaWxpdHkucmVzb3VyY2VzKSB7XG4gICAgICAgIHN1cmZhY2UuYWRkKHJlc291cmNlLm5hbWUpXG4gICAgICAgIHJlc291cmNlTmFtZUJ5SWQuc2V0KHJlc291cmNlLmlkLCByZXNvdXJjZS5uYW1lKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMpIHtcbiAgICAgICAgc3VyZmFjZS5hZGQoZmFpbHVyZS5uYW1lKVxuICAgICAgICBkZWNsYXJhdGlvbk5hbWVzLnNldChmYWlsdXJlLmlkLCBmYWlsdXJlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBuZXcgU2V0KClcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBWaXNpdHMgb25lIHNlbWFudGljIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVyblxuICAgICAgc2Vlbi5hZGQodmFsdWUpXG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIilcblxuICAgICAgICBpZiAoa2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHtcbiAgICAgICAgICBjb25zdCByZXNvdXJjZUlkID0gUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb3VyY2VJZFwiKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZUlkID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSByZXNvdXJjZU5hbWVCeUlkLmdldChyZXNvdXJjZUlkKVxuXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSByZWZlcmVuY2VkLmFkZChuYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09IFwiUmVmZXJlbmNlVHlwZVwiIHx8IGtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiB8fCBraW5kID09IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gUmVmbGVjdC5nZXQodmFsdWUsIFwiZGVjbGFyYXRpb25JZFwiKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNsYXJhdGlvbk5hbWVzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkICYmIHN1cmZhY2UuaGFzKG5hbWUpKSByZWZlcmVuY2VkLmFkZChuYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoa2V5ID09IFwiY2FwYWJpbGl0aWVzXCIgfHwga2V5ID09IFwibG9jYXRpb25cIiB8fCBrZXkgPT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpIGNvbnRpbnVlXG4gICAgICAgICAgdmlzaXQoY2hpbGQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlKSB2aXNpdChjaGlsZClcbiAgICB9XG5cbiAgICB2aXNpdChtb2R1bGUpXG4gICAgY29uc3QgbmFtZXMgPSBbXVxuXG4gICAgaWYgKGxhbmd1YWdlICE9IFwiamF2YVwiIHx8IG1vZHVsZS5pZCAhPSBvd25lck1vZHVsZUlkKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgbW9kdWxlLmNhcGFiaWxpdGllcykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNhcGFiaWxpdHkucmVzb3VyY2VzKSBpZiAocmVmZXJlbmNlZC5oYXMocmVzb3VyY2UubmFtZSkpIG5hbWVzLnB1c2gocmVzb3VyY2UubmFtZSlcbiAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMpIGlmIChyZWZlcmVuY2VkLmhhcyhmYWlsdXJlLm5hbWUpKSBuYW1lcy5wdXNoKGZhaWx1cmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxhbmd1YWdlICE9IFwiamF2YVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIG5lZ290aWF0aW9uLnByb3ZpZGVycykge1xuICAgICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzLmdldChwcm92aWRlci5tb2R1bGUpXG5cbiAgICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgcHJvdmlkZXIub3BlcmF0aW9ucykge1xuICAgICAgICAgIGlmICh1c2VkLmhhcyhxdWFsaWZpZWRPcGVyYXRpb25LZXkocHJvdmlkZXIubW9kdWxlLCBvcGVyYXRpb24pKSkge1xuICAgICAgICAgICAgbmFtZXMucHVzaCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlY29yZD8ubmF0aXZlRW50cmllc1tvcGVyYXRpb25dKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm92aWRlckltcG9ydHNCeU1vZHVsZS5zZXQobW9kdWxlLmlkLCBuYW1lcylcbiAgfVxuICByZXR1cm4gcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGVcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHRydXRoZnVsIGdlbmVyYXRlZCBzdGRsaWIgbGluayBtZXRhZGF0YSBmb3Igb25lIG5lZ290aWF0ZWQgY2xvc3VyZS5cbiAqIEphdmEgcmVwb3J0cyB0aGUgb3duZXIgbW9kdWxlIGZpbGUgYXMgdGhlIHByb3ZpZGVyIGNhcnJpZXIgaW5zdGVhZCBvZiBhIHNlcGFyYXRlIGFydGlmYWN0LlxuICogQHBhcmFtIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IGxpbmtpbmcgLSBMaW5raW5nIHBsYW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHBhdGhzIC0gUGxhbm5lZCBhcnRpZmFjdCBwYXRoIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3IgfCB1bmRlZmluZWR9IGZhY2FkZXMgLSBTZWxlY3RlZCBzb3VyY2UgZmFjYWRlIGNsb3N1cmUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFBsYWluIEpTT04gbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIHN0ZGxpYkxpbmtNZXRhZGF0YShsaW5raW5nLCBwYXRocywgZmFjYWRlcykge1xuICByZXR1cm4ge1xuICAgIC4uLihmYWNhZGVzID8ge2ZhY2FkZXN9IDoge30pLFxuICAgIG1vZHVsZXM6IChsaW5raW5nPy5uZWdvdGlhdGlvbi5tb2R1bGVzID8/IFtdKS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICBpZGVudGl0eTogaXRlbS5pZGVudGl0eSxcbiAgICAgIG9wZXJhdGlvbnM6IFsuLi5pdGVtLm9wZXJhdGlvbnNdLFxuICAgICAgdmVyc2lvbjogaXRlbS52ZXJzaW9uXG4gICAgfSkpLFxuICAgIHByb3ZpZGVyczogKGxpbmtpbmc/Lm5lZ290aWF0aW9uLnByb3ZpZGVycyA/PyBbXSkubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSBsaW5raW5nPy5yZWNvcmRzLmdldChpdGVtLm1vZHVsZSlcbiAgICAgIGNvbnN0IGFydGlmYWN0UGF0aCA9IGxpbmtpbmc/Lm93bmVyTW9kdWxlSWQgIT09IG51bGwgJiYgbGlua2luZz8ub3duZXJNb2R1bGVJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRocy5nZXQobGlua2luZy5vd25lck1vZHVsZUlkKSlcbiAgICAgICAgOiByZWNvcmQ/LmFydGlmYWN0LnBhdGhcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJ0aWZhY3Q6IHttZWRpYVR5cGU6IHJlY29yZD8uYXJ0aWZhY3QubWVkaWFUeXBlLCBwYXRoOiBhcnRpZmFjdFBhdGh9LFxuICAgICAgICBkZXBlbmRlbmNpZXM6IChyZWNvcmQ/LmRlcGVuZGVuY2llcyA/PyBbXSkubWFwKChkZXBlbmRlbmN5KSA9PiAoe21vZHVsZTogZGVwZW5kZW5jeS5tb2R1bGUsIHJhbmdlOiBkZXBlbmRlbmN5LnJhbmdlfSkpLFxuICAgICAgICBpZGVudGl0eTogaXRlbS5pZGVudGl0eSxcbiAgICAgICAgbW9kdWxlOiBpdGVtLm1vZHVsZSxcbiAgICAgICAgbmF0aXZlRW50cmllczogey4uLml0ZW0ubmF0aXZlRW50cmllc30sXG4gICAgICAgIG9wZXJhdGlvbnM6IFsuLi5pdGVtLm9wZXJhdGlvbnNdLFxuICAgICAgICB0YXJnZXQ6IGl0ZW0udGFyZ2V0LFxuICAgICAgICB2ZXJzaW9uOiBpdGVtLnZlcnNpb25cbiAgICAgIH1cbiAgICB9KSxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRTdGRsaWJMaW5rXCIsXG4gICAgdmVyc2lvbjogMVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGV2ZXJ5IG1hbmRhdG9yeSBzZW1hbnRpYyBsb2NhdGlvbiBhZ2FpbnN0IGl0cyBvd25pbmcgbW9kdWxlIHNvdXJjZSBiZWZvcmUgd3JpdGVyIGFsbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFN0cnVjdHVyYWxseSBhbmQgc2VtYW50aWNhbGx5IHZhbGlkYXRlZCBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW1Tb3VyY2VPd25lcnNoaXAocHJvZ3JhbSwgbGFuZ3VhZ2UpIHtcbiAgY29uc3Qgc291cmNlcyA9IG5ldyBNYXAocHJvZ3JhbS5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmZpbGVuYW1lLCB7XG4gICAgLi4uc291cmNlLFxuICAgIGNvb3JkaW5hdGVzOiBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXG4gIH1dKSlcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLmdldChtb2R1bGUuc291cmNlRmlsZW5hbWUpXG5cbiAgICBpZiAoIXNvdXJjZSkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInNlbWFudGljIHByb2dyYW0gbW9kdWxlIHNvdXJjZSBvd25lcnNoaXBcIiwgdW5kZWZpbmVkKVxuICAgIGNvbnN0IGZhbGxiYWNrID0gbW9kdWxlTG9jYXRpb24oc291cmNlLmZpbGVuYW1lLCAvKiogQHR5cGUge3N0cmluZ30gKi8gKHNvdXJjZS5jb250ZW50KSlcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc2VtYW50aWNFbnRyaWVzKG1vZHVsZSkpIHtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBlbnRyeS5ub2RlLmtpbmQgPT0gXCJNb2R1bGVcIiA/IFwibW9kdWxlXCIgOiBlbnRyeS5ub2RlLmtpbmQgPT0gXCJJbXBvcnRcIiA/IFwiaW1wb3J0XCIgOlxuICAgICAgICBlbnRyeS5ub2RlLmtpbmQgPT0gXCJFeHBvcnRcIiA/IFwiZXhwb3J0XCIgOiBcInNlbWFudGljIG5vZGVcIlxuXG4gICAgICBpZiAoIShcImxvY2F0aW9uXCIgaW4gZW50cnkubm9kZSkpIHtcbiAgICAgICAgaWYgKHN1YmplY3QgIT0gXCJzZW1hbnRpYyBub2RlXCIpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHNlbWFudGljIHByb2dyYW0gJHtzdWJqZWN0fSBsb2NhdGlvbmAsIGZhbGxiYWNrKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgbG9jYXRpb24gPSBlbnRyeS5ub2RlLmxvY2F0aW9uXG5cbiAgICAgIGlmIChzb3VyY2VPd25zTG9jYXRpb24oc291cmNlLCBsb2NhdGlvbikpIGNvbnRpbnVlXG5cbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHNlbWFudGljIHByb2dyYW0gJHtzdWJqZWN0fSBsb2NhdGlvbiBzb3VyY2Ugb3duZXJzaGlwYCwgZmFsbGJhY2spXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9ybWFsaXplZCBVVEYtMTYgbG9jYXRpb24gYWdhaW5zdCBvbmUgZXhhY3QgcmVnaXN0ZXJlZCBzb3VyY2Ugd2l0aG91dCB0aHJvd2luZy5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwsIGNvb3JkaW5hdGVzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+fX0gc291cmNlIC0gT3duaW5nIHNvdXJjZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIGxvY2F0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNvdXJjZSBvd25zIHRoZSBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gc291cmNlT3duc0xvY2F0aW9uKHNvdXJjZSwgY2FuZGlkYXRlKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5maWxlbmFtZSAhPSBzb3VyY2UuZmlsZW5hbWUgfHwgIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlLnN0YXJ0KSB8fFxuICAgICFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZS5lbmQpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydC5vZmZzZXQpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5lbmQub2Zmc2V0KSB8fFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydC5saW5lKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuc3RhcnQuY29sdW1uKSB8fFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5lbmQubGluZSkgfHwgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLmVuZC5jb2x1bW4pKSByZXR1cm4gZmFsc2VcbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNhbmRpZGF0ZS5zdGFydC5vZmZzZXQpXG4gIGNvbnN0IGVuZE9mZnNldCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLmVuZC5vZmZzZXQpXG5cbiAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCB8fCBlbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCBlbmRPZmZzZXQgPiBzb3VyY2UuY29vcmRpbmF0ZXMuc291cmNlLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGV4cGVjdGVkU3RhcnQgPSBpbmRleGVkUG9pbnRBdChzb3VyY2UuY29vcmRpbmF0ZXMsIHN0YXJ0T2Zmc2V0KVxuICBjb25zdCBleHBlY3RlZEVuZCA9IGluZGV4ZWRQb2ludEF0KHNvdXJjZS5jb29yZGluYXRlcywgZW5kT2Zmc2V0KVxuXG4gIHJldHVybiBzYW1lUG9pbnQoY2FuZGlkYXRlLnN0YXJ0LCBleHBlY3RlZFN0YXJ0KSAmJiBzYW1lUG9pbnQoY2FuZGlkYXRlLmVuZCwgZXhwZWN0ZWRFbmQpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgYW4gdW50cnVzdGVkIHBvaW50IHdpdGggb25lIGNhbm9uaWNhbCBpbmRleGVkIHBvaW50LlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIHBvaW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gZXhwZWN0ZWQgLSBDYW5vbmljYWwgcG9pbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBldmVyeSBjb29yZGluYXRlIGFncmVlcy5cbiAqL1xuZnVuY3Rpb24gc2FtZVBvaW50KGNhbmRpZGF0ZSwgZXhwZWN0ZWQpIHtcbiAgcmV0dXJuIGNhbmRpZGF0ZS5vZmZzZXQgPT0gZXhwZWN0ZWQub2Zmc2V0ICYmIGNhbmRpZGF0ZS5saW5lID09IGV4cGVjdGVkLmxpbmUgJiYgY2FuZGlkYXRlLmNvbHVtbiA9PSBleHBlY3RlZC5jb2x1bW5cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcyByZWZlcmVuY2VkIGJ5IGV4ZWN1dGFibGUvdHlwZSBub2RlcyBvdXRzaWRlIHRoZSBtb2R1bGUncyBhdXRob3JpdHkgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9IG1vZHVsZSAtIFByb2dyYW0gbW9kdWxlLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBSZWZlcmVuY2VkIGZhaWx1cmUgZGVjbGFyYXRpb24gaWRlbnRpdGllcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZWRGYWlsdXJlSWRzKG1vZHVsZSkge1xuICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICBjb25zdCBpZHMgPSBuZXcgU2V0KClcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAvKipcbiAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyBzdWJ0cmVlIGZvciByZWZlcmVuY2VkIGZhaWx1cmVzLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm5cbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIkVycm9yVHlwZVwiICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWRzLmFkZChSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpKVxuICAgICAgfVxuICAgICAgY29uc3QgZmFpbHVyZUlkcyA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImZhaWx1cmVJZHNcIilcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmFpbHVyZUlkcykpIGZvciAoY29uc3QgaWQgb2YgZmFpbHVyZUlkcykgaWYgKHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiKSBpZHMuYWRkKGlkKVxuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGlmIChbXCJjYXBhYmlsaXRpZXNcIiwgXCJsb2NhdGlvblwiLCBcInByb3ZlbmFuY2VcIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICAgIHZpc2l0KGNoaWxkKVxuICAgICAgfVxuICAgIH0gZWxzZSBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlKSB2aXNpdChjaGlsZClcbiAgfVxuXG4gIHZpc2l0KHtjbGFzc2VzOiBtb2R1bGUuY2xhc3NlcywgZW50cnlQb2ludDogbW9kdWxlLmVudHJ5UG9pbnQsIGZ1bmN0aW9uczogbW9kdWxlLmZ1bmN0aW9uc30pXG4gIHJldHVybiBpZHNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCB2YWxpZGF0ZXMgZXZlcnkgYmFja2VuZC1zaGFwZWQgbW9kdWxlIGJlZm9yZSBhbnkgd3JpdGVyIGlzIGFsbG9jYXRlZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IFtsaW5raW5nXSAtIFBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGxpbmsuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGVbXX0gRW1pc3Npb24gdmlld3MgaW4gZGVwZW5kZW5jeSBvcmRlci5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUVtaXNzaW9uTW9kdWxlcyhwcm9ncmFtLCBsYW5ndWFnZSwgbGlua2luZyA9IG51bGwpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59ICovXG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLnJlY29yZHMgPz8gW10pIGRlY2xhcmF0aW9ucy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uKVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIGRlY2xhcmF0aW9ucy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uKVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmVycm9ycyA/PyBbXSkgZGVjbGFyYXRpb25zLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24pXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSBkZWNsYXJhdGlvbnMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbilcbiAgfVxuICBjb25zdCBtb2R1bGVzID0gcHJvZ3JhbS5tb2R1bGVzLm1hcCgobW9kdWxlKSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSAqLyAoe1xuICAgIC4uLm1vZHVsZSxcbiAgICBlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCA/PyB7XG4gICAgICBib2R5OiB7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmxvY2tcIiksIGxvY2F0aW9uOiBtb2R1bGUubG9jYXRpb24sIHN0YXRlbWVudHM6IFtdfSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkVudHJ5UG9pbnRcIiksXG4gICAgICBsb2NhdGlvbjogbW9kdWxlLmxvY2F0aW9uXG4gICAgfVxuICB9KSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59ICovXG4gIGNvbnN0IGNhbGxFZmZlY3RzQnlEZWNsYXJhdGlvbklkID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgIGNvbnN0IHByb2dyYW1Nb2R1bGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG1vZHVsZSkpXG4gICAgY29uc3QgdmlzaWJsZUZ1bmN0aW9ucyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHZpc2libGVDYWxsRWZmZWN0cyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHZpc2libGVSZWNvcmRzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdmlzaWJsZUNsYXNzZXMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2aXNpYmxlRXJyb3JzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgZXh0ZXJuYWxEZWNsYXJhdGlvbklkcyA9IG5ldyBTZXQoKVxuXG4gICAgY29uc3QgbmVlZGVkRmFpbHVyZUlkcyA9IGNvbGxlY3RSZWZlcmVuY2VkRmFpbHVyZUlkcyhwcm9ncmFtTW9kdWxlKVxuICAgIGNvbnN0IGxvY2FsRmFpbHVyZUlkcyA9IG5ldyBTZXQocHJvZ3JhbU1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzLm1hcCgoe2lkfSkgPT4gaWQpKSA/PyBbXSlcblxuICAgIGZvciAoY29uc3Qgb3duZXIgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgICBpZiAob3duZXIuaWQgPT0gcHJvZ3JhbU1vZHVsZS5pZCkgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBvd25lci5jYXBhYmlsaXRpZXMgPz8gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMpIHtcbiAgICAgICAgICBpZiAoIWxvY2FsRmFpbHVyZUlkcy5oYXMoZmFpbHVyZS5pZCkgJiYgbmVlZGVkRmFpbHVyZUlkcy5oYXMoZmFpbHVyZS5pZCkpIHZpc2libGVFcnJvcnMuc2V0KGZhaWx1cmUuaWQsIGZhaWx1cmUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIHByb2dyYW1Nb2R1bGUuaW1wb3J0cykge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnMuZ2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQpXG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24pIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIGltcG9ydCB3aXRob3V0IGEgZGVjbGFyYXRpb25cIiwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICBleHRlcm5hbERlY2xhcmF0aW9uSWRzLmFkZChpbXBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICAgICAgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHZpc2libGVGdW5jdGlvbnMuc2V0KGltcG9ydGVkLmxvY2FsTmFtZSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb24pKVxuICAgICAgICB2aXNpYmxlQ2FsbEVmZmVjdHMuc2V0KGltcG9ydGVkLmxvY2FsTmFtZSwgbmV3IFNldChjYWxsRWZmZWN0c0J5RGVjbGFyYXRpb25JZC5nZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCkgPz8gW10pKVxuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kID09IFwicmVjb3JkXCIpIHtcbiAgICAgICAgdmlzaWJsZVJlY29yZHMuc2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICB9IGVsc2UgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIHZpc2libGVDbGFzc2VzLnNldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aXNpYmxlRXJyb3JzLnNldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2R1bGUuY2FwYWJpbGl0aWVzICE9PSB1bmRlZmluZWQgfHwgIWxpbmtpbmcpIHtcbiAgICAgIHByZWZsaWdodEVmZmVjdENhcGFiaWxpdGllcyhtb2R1bGUsIGxhbmd1YWdlLCBsaW5raW5nID8ge3VzZWRPcGVyYXRpb25zOiAobGlua2luZy51c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChwcm9ncmFtTW9kdWxlLmlkKSA/PyBbXSlcbiAgICAgICAgLm1hcCgoe29wZXJhdGlvbn0pID0+IG9wZXJhdGlvbil9IDoge30pXG4gICAgfVxuICAgIHZhbGlkYXRlQmFja2VuZE1vZHVsZShtb2R1bGUsIGxhbmd1YWdlLCB7XG4gICAgICBleHRlcm5hbERlY2xhcmF0aW9uSWRzLFxuICAgICAgcHJvZ3JhbTogdHJ1ZSxcbiAgICAgIHZpc2libGVDYWxsRWZmZWN0cyxcbiAgICAgIHZpc2libGVDbGFzc2VzLFxuICAgICAgdmlzaWJsZUVycm9ycyxcbiAgICAgIHZpc2libGVGdW5jdGlvbnMsXG4gICAgICB2aXNpYmxlUmVjb3Jkc1xuICAgIH0pXG4gICAgY29uc3QgbG9jYWxDYWxsRWZmZWN0cyA9IG1vZHVsZVVuY2hlY2tlZEVycm9yRWZmZWN0cyhtb2R1bGUsIHtjYWxsRWZmZWN0czogdmlzaWJsZUNhbGxFZmZlY3RzLCBmdW5jdGlvbnM6IHZpc2libGVGdW5jdGlvbnN9KVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB7XG4gICAgICBjYWxsRWZmZWN0c0J5RGVjbGFyYXRpb25JZC5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIG5ldyBTZXQobG9jYWxDYWxsRWZmZWN0cy5nZXQoZGVjbGFyYXRpb24ubmFtZSkgPz8gW10pKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2R1bGVzXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBjbG9zZWQgcGFyc2VyLW5ldXRyYWwgcHJvZ3JhbSBncmFwaCBiZWZvcmUgYW55IHRhcmdldCBlbWlzc2lvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZT4+fSBbc291cmNlTGFuZ3VhZ2VzXSAtIEFjY2VwdGVkIHNvdXJjZSBsYW5ndWFnZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBWYWxpZGF0ZWQgcHJvZ3JhbS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtKGNhbmRpZGF0ZSwgbGFuZ3VhZ2UsIHNvdXJjZUxhbmd1YWdlcyA9IHByb2dyYW1UYXJnZXRzKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5raW5kICE9IFwiUHJvZ3JhbVwiIHx8IHR5cGVvZiBjYW5kaWRhdGUuZW50cnlNb2R1bGUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlLm1vZHVsZXMpIHx8IGNhbmRpZGF0ZS5tb2R1bGVzLmxlbmd0aCA9PSAwIHx8ICFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlLnNvdXJjZXMpIHx8IGNhbmRpZGF0ZS5zb3VyY2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKFwiTWFsZm9ybWVkIHNlbWFudGljIHByb2dyYW0uXCIpXG4gIH1cbiAgY29uc3QgcHJvZ3JhbSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSAqLyAoY2FuZGlkYXRlKVxuICBjb25zdCBtb2R1bGVzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2RlY2xhcmF0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbiwgbW9kdWxlOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9Pn0gKi9cbiAgY29uc3QgZGVjbGFyYXRpb25zID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlW119ICovXG4gIGNvbnN0IGNhcGFiaWxpdHlNb2R1bGVzID0gW11cbiAgbGV0IGVudHJ5Q291bnQgPSAwXG4gIGNvbnN0IHNvdXJjZUlkcyA9IG5ldyBTZXQoKVxuICBjb25zdCBzb3VyY2VGaWxlbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9ncmFtLnNvdXJjZXMpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc291cmNlKSB8fCB0eXBlb2Ygc291cmNlLmlkICE9IFwic3RyaW5nXCIgfHwgc291cmNlSWRzLmhhcyhzb3VyY2UuaWQpIHx8XG4gICAgICB0eXBlb2Ygc291cmNlLmZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgIWlzU2FmZVNvdXJjZVBhdGgoc291cmNlLmZpbGVuYW1lKSB8fCBzb3VyY2VGaWxlbmFtZXMuaGFzKHNvdXJjZS5maWxlbmFtZSkgfHxcbiAgICAgIHR5cGVvZiBzb3VyY2UuY29udGVudCAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBzb3VyY2UubGFuZ3VhZ2UgIT0gXCJzdHJpbmdcIiB8fCAhc291cmNlTGFuZ3VhZ2VzLmhhcyhzb3VyY2UubGFuZ3VhZ2UpKSB7XG4gICAgICBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIHByb2dyYW0gc291cmNlIHJlZ2lzdHJ5LlwiKVxuICAgIH1cbiAgICBzb3VyY2VJZHMuYWRkKHNvdXJjZS5pZClcbiAgICBzb3VyY2VGaWxlbmFtZXMuYWRkKHNvdXJjZS5maWxlbmFtZSlcbiAgfVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChtb2R1bGUpIHx8IG1vZHVsZS5raW5kICE9IFwiTW9kdWxlXCIgfHwgdHlwZW9mIG1vZHVsZS5pZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAhL15bYS16XVthLXowLTlfXSooPzpbLi1dW2Etel1bYS16MC05X10qKSokL3UudGVzdChtb2R1bGUuaWQpIHx8IG1vZHVsZXMuaGFzKG1vZHVsZS5pZCkgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkobW9kdWxlLmZ1bmN0aW9ucykgfHwgbW9kdWxlLnJlY29yZHMgIT09IHVuZGVmaW5lZCAmJiAhaXNEZW5zZUFycmF5KG1vZHVsZS5yZWNvcmRzKSB8fFxuICAgICAgbW9kdWxlLmVycm9ycyAhPT0gdW5kZWZpbmVkICYmICFpc0RlbnNlQXJyYXkobW9kdWxlLmVycm9ycykgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkobW9kdWxlLmltcG9ydHMpIHx8ICFpc0RlbnNlQXJyYXkobW9kdWxlLmV4cG9ydHMpKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwibWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBzZW1hbnRpYyBwcm9ncmFtIG1vZHVsZVwiLCBtb2R1bGU/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoUmVmbGVjdC5nZXQobW9kdWxlLCBcImNsYXNzZXNcIikgIT09IHVuZGVmaW5lZCAmJiAoIWlzRGVuc2VBcnJheShtb2R1bGUuY2xhc3NlcykgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIikgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJUYXNrIDAzMyByZWZlcmVuY2UgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBzZW1hbnRpYyBwcm9ncmFtIGdlbmVyYXRpb25cIixcbiAgICAgICAgUmVmbGVjdC5nZXQobW9kdWxlLCBcImNsYXNzZXNcIik/LlswXT8ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoUmVmbGVjdC5nZXQobW9kdWxlLCBcImNhcGFiaWxpdGllc1wiKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWlzRGVuc2VBcnJheShtb2R1bGUuY2FwYWJpbGl0aWVzKSB8fCBtb2R1bGUuY2FwYWJpbGl0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJtYWxmb3JtZWQgb3IgZW1wdHkgVGFzayAwMzQgY2FwYWJpbGl0eSBncmFwaFwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjYXBhYmlsaXR5TW9kdWxlcy5wdXNoKG1vZHVsZSlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUuc291cmNlRmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhc291cmNlRmlsZW5hbWVzLmhhcyhtb2R1bGUuc291cmNlRmlsZW5hbWUpKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwic2VtYW50aWMgcHJvZ3JhbSBtb2R1bGUgc291cmNlIGlkZW50aXR5XCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG1vZHVsZS5lbnRyeVBvaW50KSB7XG4gICAgICBlbnRyeUNvdW50KytcbiAgICAgIGlmIChtb2R1bGUuaWQgIT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcImVudHJ5IHBvaW50IG9uIGFuIHVuc2VsZWN0ZWQgbW9kdWxlXCIsIG1vZHVsZS5lbnRyeVBvaW50LmxvY2F0aW9uKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW10sIC4uLm1vZHVsZS5mdW5jdGlvbnNdKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QoZGVjbGFyYXRpb24pIHx8IHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFkZWNsYXJhdGlvbi5pZC5zdGFydHNXaXRoKGAke21vZHVsZS5pZH0jYCkgfHwgZGVjbGFyYXRpb25zLmhhcyhkZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcImR1cGxpY2F0ZSBvciB1bnN0YWJsZSBwcm9ncmFtIGRlY2xhcmF0aW9uIGlkZW50aXR5XCIsIGRlY2xhcmF0aW9uPy5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBkZWNsYXJhdGlvbnMuc2V0KGRlY2xhcmF0aW9uLmlkLCB7ZGVjbGFyYXRpb24sIG1vZHVsZX0pXG4gICAgfVxuICAgIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgbW9kdWxlLmltcG9ydHMpIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChpbXBvcnRlZCkgfHwgaW1wb3J0ZWQua2luZCAhPSBcIkltcG9ydFwiIHx8IHR5cGVvZiBpbXBvcnRlZC5tb2R1bGVJZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGVvZiBpbXBvcnRlZC5pbXBvcnRlZE5hbWUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaW1wb3J0ZWQubG9jYWxOYW1lICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICAgdHlwZW9mIGltcG9ydGVkLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhW1wiZnVuY3Rpb25cIiwgXCJyZWNvcmRcIiwgXCJjbGFzc1wiLCBcImVycm9yXCJdLmluY2x1ZGVzKGltcG9ydGVkLnN5bWJvbEtpbmQpIHx8XG4gICAgICAgIHR5cGVvZiBpbXBvcnRlZC50eXBlT25seSAhPSBcImJvb2xlYW5cIikge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwibWFsZm9ybWVkIHNlbWFudGljIHByb2dyYW0gaW1wb3J0XCIsIGltcG9ydGVkPy5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhwb3J0ZWQgb2YgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChleHBvcnRlZCkgfHwgZXhwb3J0ZWQua2luZCAhPSBcIkV4cG9ydFwiIHx8IHR5cGVvZiBleHBvcnRlZC5leHBvcnRlZE5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0eXBlb2YgZXhwb3J0ZWQuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFbXCJmdW5jdGlvblwiLCBcInJlY29yZFwiLCBcImNsYXNzXCIsIFwiZXJyb3JcIl0uaW5jbHVkZXMoZXhwb3J0ZWQuc3ltYm9sS2luZCkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIm1hbGZvcm1lZCBzZW1hbnRpYyBwcm9ncmFtIGV4cG9ydFwiLCBleHBvcnRlZD8ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBtb2R1bGVzLnNldChtb2R1bGUuaWQsIG1vZHVsZSlcbiAgfVxuICBpZiAoZW50cnlDb3VudCAhPSAxIHx8ICFtb2R1bGVzLmdldChwcm9ncmFtLmVudHJ5TW9kdWxlKT8uZW50cnlQb2ludCkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIHdpdGhvdXQgZXhhY3RseSBvbmUgc2VsZWN0ZWQgZW50cnkgcG9pbnRcIiwgbW9kdWxlcy5nZXQocHJvZ3JhbS5lbnRyeU1vZHVsZSk/LmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IHNlbGVjdGVkTW9kdWxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9ICovIChtb2R1bGVzLmdldChwcm9ncmFtLmVudHJ5TW9kdWxlKSlcbiAgY29uc3Qgc2VsZWN0ZWRFbnRyeSA9IHNlbGVjdGVkTW9kdWxlLmVudHJ5UG9pbnRcblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoc2VsZWN0ZWRFbnRyeT8uYm9keSkgfHwgIWlzRGVuc2VBcnJheShzZWxlY3RlZEVudHJ5LmJvZHkuc3RhdGVtZW50cykgfHwgc2VsZWN0ZWRFbnRyeS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoID09IDApIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSB3aXRob3V0IGEgZGVuc2Ugbm9uLWVtcHR5IHNlbGVjdGVkIGVudHJ5IHBvaW50IGJsb2NrXCIsXG4gICAgICBzZWxlY3RlZEVudHJ5Py5sb2NhdGlvbiA/PyBzZWxlY3RlZE1vZHVsZS5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBlYXJsaWVyID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgY29uc3QgbG9jYWxUYXJnZXROYW1lcyA9IG5ldyBTZXQoWy4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4ubW9kdWxlLmZ1bmN0aW9uc11cbiAgICAgIC5tYXAoKHtuYW1lfSkgPT4gdGFyZ2V0TmFtZShsYW5ndWFnZSwgbmFtZSkpKVxuICAgIGNvbnN0IGltcG9ydGVkVGFyZ2V0TmFtZXMgPSBuZXcgU2V0KClcbiAgICBjb25zdCBsb2NhbEphdmFDbGFzcyA9IG1vZHVsZS5yZWNvcmRzPy5bMF0/Lm5hbWUgPz8gbW9kdWxlLmNsYXNzZXM/LlswXT8ubmFtZSA/PyBtb2R1bGUuZXJyb3JzPy5bMF0/Lm5hbWUgPz9cbiAgICAgIChtb2R1bGUuaWQgPT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSA/IFwiTWFpblwiIDogbW9kdWxlQ2xhc3NOYW1lKG1vZHVsZS5pZCkpXG4gICAgY29uc3QgamF2YUltcG9ydENsYXNzZXMgPSBuZXcgTWFwKGxhbmd1YWdlID09IFwiamF2YVwiID8gW1tsb2NhbEphdmFDbGFzcywgbW9kdWxlLmlkXV0gOiBbXSlcblxuICAgIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgbW9kdWxlLmltcG9ydHMpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gZGVjbGFyYXRpb25zLmdldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICAgICAgY29uc3QgcmVtb3RlRXhwb3J0ID0gcmVzb2x2ZWQ/Lm1vZHVsZS5leHBvcnRzLmZpbmQoKGl0ZW0pID0+XG4gICAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBpbXBvcnRlZC5kZWNsYXJhdGlvbklkICYmIGl0ZW0uZXhwb3J0ZWROYW1lID09IGltcG9ydGVkLmltcG9ydGVkTmFtZSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCB8fCByZXNvbHZlZC5tb2R1bGUuaWQgIT0gaW1wb3J0ZWQubW9kdWxlSWQgfHwgIWVhcmxpZXIuaGFzKGltcG9ydGVkLm1vZHVsZUlkKSB8fFxuICAgICAgICAhcmVtb3RlRXhwb3J0KSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJ1bnJlc29sdmVkLCBwcml2YXRlLCBjeWNsaWMsIG9yIG91dC1vZi1vcmRlciBwcm9ncmFtIGltcG9ydFwiLCBpbXBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbktpbmQgPSByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiID8gXCJmdW5jdGlvblwiIDpcbiAgICAgICAgcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIgPyBcInJlY29yZFwiIDpcbiAgICAgICAgICByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiID8gXCJjbGFzc1wiIDogXCJlcnJvclwiXG5cbiAgICAgIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kICE9IHJlbW90ZUV4cG9ydC5zeW1ib2xLaW5kIHx8IGltcG9ydGVkLnN5bWJvbEtpbmQgIT0gZGVjbGFyYXRpb25LaW5kIHx8XG4gICAgICAgIGltcG9ydGVkLnR5cGVPbmx5ICYmIGRlY2xhcmF0aW9uS2luZCAhPSBcInJlY29yZFwiICYmIGRlY2xhcmF0aW9uS2luZCAhPSBcImNsYXNzXCIpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gaW1wb3J0IGRlY2xhcmF0aW9uIGtpbmQgbWlzbWF0Y2hcIiwgaW1wb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgaW1wb3J0TmFtZSA9IHByb2dyYW1JbXBvcnROYW1lKHByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpXG5cbiAgICAgIGlmIChsYW5ndWFnZSAhPSBcInJ1YnlcIiAmJiBsYW5ndWFnZSAhPSBcImphdmFcIikge1xuICAgICAgICBpZiAoaW1wb3J0ZWQuc3ltYm9sS2luZCAhPSBcImZ1bmN0aW9uXCIpIHZhbGlkYXRlVGFyZ2V0VHlwZUlkZW50aWZpZXIobGFuZ3VhZ2UsIGltcG9ydE5hbWUsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgICBlbHNlIHZhbGlkYXRlVGFyZ2V0QmluZGluZ0lkZW50aWZpZXIobGFuZ3VhZ2UsIGltcG9ydE5hbWUsIFwiaW1wb3J0XCIsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IHRhcmdldE5hbWUobGFuZ3VhZ2UsIGltcG9ydE5hbWUpXG5cbiAgICAgIGlmIChsYW5ndWFnZSAhPSBcInJ1YnlcIiAmJiBsYW5ndWFnZSAhPSBcImphdmFcIiAmJiAobG9jYWxUYXJnZXROYW1lcy5oYXMobmFtZSkgfHwgaW1wb3J0ZWRUYXJnZXROYW1lcy5oYXMobmFtZSkpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBpbXBvcnQtbmFtZSBjb2xsaXNpb24gJyR7aW1wb3J0TmFtZX0nYCwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRDbGFzcyA9IGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJmdW5jdGlvblwiID8gbW9kdWxlQ2xhc3NOYW1lKHJlc29sdmVkLm1vZHVsZS5pZCkgOiByZXNvbHZlZC5kZWNsYXJhdGlvbi5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nT3duZXIgPSBqYXZhSW1wb3J0Q2xhc3Nlcy5nZXQoaW1wb3J0ZWRDbGFzcylcblxuICAgICAgICBpZiAoZXhpc3RpbmdPd25lciAmJiBleGlzdGluZ093bmVyICE9IHJlc29sdmVkLm1vZHVsZS5pZCkge1xuICAgICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBpbXBvcnQtY2xhc3MgY29sbGlzaW9uICcke2ltcG9ydGVkQ2xhc3N9J2AsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGphdmFJbXBvcnRDbGFzc2VzLnNldChpbXBvcnRlZENsYXNzLCByZXNvbHZlZC5tb2R1bGUuaWQpXG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRNb2R1bGUgPSBtb2R1bGVDbGFzc05hbWUocmVzb2x2ZWQubW9kdWxlLmlkKVxuXG4gICAgICAgIGlmIChsb2NhbFRhcmdldE5hbWVzLmhhcyhpbXBvcnRlZE1vZHVsZSkpIHtcbiAgICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB0YXJnZXQgaW1wb3J0LW1vZHVsZSBjb2xsaXNpb24gJyR7aW1wb3J0ZWRNb2R1bGV9J2AsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbXBvcnRlZFRhcmdldE5hbWVzLmFkZChuYW1lKVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZURlY2xhcmF0aW9uSWRzID0gbmV3IFNldChtb2R1bGUuaW1wb3J0cy5maWx0ZXIoKHt0eXBlT25seX0pID0+ICF0eXBlT25seSkubWFwKCh7ZGVjbGFyYXRpb25JZH0pID0+IGRlY2xhcmF0aW9uSWQpKVxuICAgIGNvbnN0IHR5cGVPbmx5RGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KG1vZHVsZS5pbXBvcnRzXG4gICAgICAuZmlsdGVyKCh7ZGVjbGFyYXRpb25JZCwgdHlwZU9ubHl9KSA9PiB0eXBlT25seSAmJiAhdmFsdWVEZWNsYXJhdGlvbklkcy5oYXMoZGVjbGFyYXRpb25JZCkpXG4gICAgICAubWFwKCh7ZGVjbGFyYXRpb25JZH0pID0+IGRlY2xhcmF0aW9uSWQpKVxuICAgIGNvbnN0IHZhbHVlQ29uc3RydWN0aW9uID0gZmluZFR5cGVPbmx5VmFsdWVDb25zdHJ1Y3Rpb24obW9kdWxlLCB0eXBlT25seURlY2xhcmF0aW9uSWRzKVxuXG4gICAgaWYgKHZhbHVlQ29uc3RydWN0aW9uKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwidHlwZS1vbmx5IHByb2dyYW0gaW1wb3J0IHVzZWQgYXMgYSB2YWx1ZVwiLCB2YWx1ZUNvbnN0cnVjdGlvbi5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGV4cG9ydE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGV4cG9ydGVkIG9mIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGRlY2xhcmF0aW9ucy5nZXQoZXhwb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROYW1lKGxhbmd1YWdlLCBleHBvcnRlZC5leHBvcnRlZE5hbWUpXG5cbiAgICAgIGlmIChsYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIikge1xuICAgICAgICB2YWxpZGF0ZVRhcmdldElkZW50aWZpZXIobGFuZ3VhZ2UsIGV4cG9ydGVkLmV4cG9ydGVkTmFtZSwgXCJleHBvcnRcIiwgZXhwb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc29sdmVkIHx8IHJlc29sdmVkLm1vZHVsZS5pZCAhPSBtb2R1bGUuaWQgfHwgZXhwb3J0TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHVucmVzb2x2ZWQgb3IgY29sbGlkaW5nIHRhcmdldCBleHBvcnQgJyR7ZXhwb3J0ZWQuZXhwb3J0ZWROYW1lfSdgLCBleHBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbktpbmQgPSByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiID8gXCJmdW5jdGlvblwiIDpcbiAgICAgICAgcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIgPyBcInJlY29yZFwiIDpcbiAgICAgICAgICByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiID8gXCJjbGFzc1wiIDogXCJlcnJvclwiXG5cbiAgICAgIGlmIChleHBvcnRlZC5zeW1ib2xLaW5kICE9IGRlY2xhcmF0aW9uS2luZCkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSBleHBvcnQgZGVjbGFyYXRpb24ga2luZCBtaXNtYXRjaFwiLCBleHBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UgIT0gXCJqYXZhc2NyaXB0XCIgJiYgbGFuZ3VhZ2UgIT0gXCJ0eXBlc2NyaXB0XCIgJiYgZXhwb3J0ZWQuZXhwb3J0ZWROYW1lICE9IHJlc29sdmVkLmRlY2xhcmF0aW9uLm5hbWUpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgZXhwb3J0IGFsaWFzICcke2V4cG9ydGVkLmV4cG9ydGVkTmFtZX0nIHdpdGhvdXQgYW4gZXF1aXZhbGVudCB0YXJnZXQgYmluZGluZ2AsXG4gICAgICAgICAgZXhwb3J0ZWQubG9jYXRpb24gPz8gcmVzb2x2ZWQuZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBleHBvcnROYW1lcy5hZGQobmFtZSlcbiAgICB9XG4gICAgaWYgKGxhbmd1YWdlID09IFwicGhwXCIpIHtcbiAgICAgIGNvbnN0IGV4cG9ydGVkRGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KG1vZHVsZS5leHBvcnRzLm1hcCgoe2RlY2xhcmF0aW9uSWR9KSA9PiBkZWNsYXJhdGlvbklkKSlcbiAgICAgIGNvbnN0IHByaXZhdGVEZWNsYXJhdGlvbiA9IFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW10sIC4uLm1vZHVsZS5mdW5jdGlvbnNdLmZpbmQoKHtpZH0pID0+XG4gICAgICAgIHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiICYmICFleHBvcnRlZERlY2xhcmF0aW9uSWRzLmhhcyhpZCkpXG5cbiAgICAgIGlmIChwcml2YXRlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgbm9uLWV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ByaXZhdGVEZWNsYXJhdGlvbi5uYW1lfScgd2l0aG91dCB0YXJnZXQtcHJpdmF0ZSBtb2R1bGUgdmlzaWJpbGl0eWAsXG4gICAgICAgICAgcHJpdmF0ZURlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBlYXJsaWVyLmFkZChtb2R1bGUuaWQpXG4gIH1cblxuICB2YWxpZGF0ZVByb2dyYW1TdGRsaWJDb250cmFjdChwcm9ncmFtLCBsYW5ndWFnZSwgY2FwYWJpbGl0eU1vZHVsZXMpXG4gIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkZhY2FkZXMocHJvZ3JhbSwgbGFuZ3VhZ2UpXG5cbiAgcmV0dXJuIHByb2dyYW1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgY29tcGlsZXItc2VsZWN0ZWQgZmFjYWRlIGRlc2NyaXB0b3JzLCBleGVjdXRhYmxlIHNvdXJjZXMsIG1vZHVsZSBtYXJrZXJzLCBhbmQgbmF0aXZlIGlkZW50aXR5IGV2aWRlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBDYW5kaWRhdGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UgZm9yIGRpYWdub3N0aWNzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkZhY2FkZXMocHJvZ3JhbSwgbGFuZ3VhZ2UpIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0KHByb2dyYW0sIFwic3RkbGliRmFjYWRlc1wiKVxuICBjb25zdCBtYXJrZWRNb2R1bGVzID0gcHJvZ3JhbS5tb2R1bGVzLmZpbHRlcigobW9kdWxlKSA9PiBSZWZsZWN0LmdldChtb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpICE9PSB1bmRlZmluZWQpXG4gIGNvbnN0IGZhY2FkZVNvdXJjZXMgPSBwcm9ncmFtLnNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IFJlZmxlY3QuZ2V0KHNvdXJjZSwgXCJvd25lcnNoaXBcIikgPT0gXCJmYWNhZGVcIilcbiAgY29uc3QgZXZpZGVuY2VkSW1wb3J0cyA9IHByb2dyYW0ubW9kdWxlcy5mbGF0TWFwKChtb2R1bGUpID0+IG1vZHVsZS5pbXBvcnRzLmZpbHRlcigoaXRlbSkgPT4gUmVmbGVjdC5nZXQoaXRlbSwgXCJzdGRsaWJGYWNhZGVcIikgIT09IHVuZGVmaW5lZCkpXG5cbiAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChtYXJrZWRNb2R1bGVzLmxlbmd0aCA+IDAgfHwgZmFjYWRlU291cmNlcy5sZW5ndGggPiAwIHx8IGV2aWRlbmNlZEltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiRmFjYWRlIG1vZHVsZXMsIHNvdXJjZXMsIG9yIGltcG9ydCBldmlkZW5jZSByZXF1aXJlIGEgY29tcGxldGUgcHJvZ3JhbSBmYWNhZGUgZGVzY3JpcHRvci5cIilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRlc2NyaXB0b3IpIHx8IGRlc2NyaXB0b3Iuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVzXCIgfHwgZGVzY3JpcHRvci52ZXJzaW9uICE9IDEgfHxcbiAgICB0eXBlb2YgZGVzY3JpcHRvci5sYW5ndWFnZSAhPSBcInN0cmluZ1wiIHx8ICFwcm9ncmFtVGFyZ2V0cy5oYXMoZGVzY3JpcHRvci5sYW5ndWFnZSkgfHwgIWlzRGVuc2VBcnJheShkZXNjcmlwdG9yLm1vZHVsZXMpIHx8XG4gICAgZGVzY3JpcHRvci5tb2R1bGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHByb2dyYW0gZmFjYWRlIGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLlwiKVxuICB9XG4gIGNvbnN0IGZhY2FkZUxhbmd1YWdlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSAqLyAoZGVzY3JpcHRvci5sYW5ndWFnZSlcbiAgY29uc3QgcmVjb3JkcyA9IGRlc2NyaXB0b3IubW9kdWxlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoaXRlbSkgfHwgdHlwZW9mIGl0ZW0uaWRlbnRpdHkgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaXRlbS52ZXJzaW9uICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBtb2R1bGUgZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuXCIpXG4gICAgfVxuICAgIHJldHVybiBzdGRsaWJGYWNhZGVSZWdpc3RyeS5yZXNvbHZlSWRlbnRpdHkoaXRlbS5pZGVudGl0eSwgZmFjYWRlTGFuZ3VhZ2UsIGl0ZW0udmVyc2lvbilcbiAgfSlcbiAgY29uc3QgZXhwZWN0ZWQgPSBzdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvcihmYWNhZGVMYW5ndWFnZSwgcmVjb3JkcylcblxuICBpZiAoIWVxdWFsUGxhaW5EYXRhKGRlc2NyaXB0b3IsIGV4cGVjdGVkKSkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBkZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIHRoZSByZWdpc3RlcmVkIHZlcnNpb25lZCBmYWNhZGUgY2xvc3VyZS5cIilcbiAgfVxuICBjb25zdCBzZWxlY3RlZFJlY29yZHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgaWYgKHNlbGVjdGVkUmVjb3Jkcy5oYXMocmVjb3JkLmlkZW50aXR5KSkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgaXMgc2VsZWN0ZWQgbW9yZSB0aGFuIG9uY2UuYClcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlY29yZC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gc3RkbGliRmFjYWRlUmVnaXN0cnkucmVzb2x2ZUlkZW50aXR5KGRlcGVuZGVuY3kuaWRlbnRpdHksIGZhY2FkZUxhbmd1YWdlLCBkZXBlbmRlbmN5LnJhbmdlKVxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3RlZFJlY29yZHMuZ2V0KHJlc29sdmVkLmlkZW50aXR5KVxuXG4gICAgICBpZiAoIXNlbGVjdGVkIHx8IHNlbGVjdGVkLnZlcnNpb24gIT0gcmVzb2x2ZWQudmVyc2lvbikge1xuICAgICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBkZXBlbmRlbmN5ICcke3Jlc29sdmVkLmlkZW50aXR5fUAke3Jlc29sdmVkLnZlcnNpb259JyBpcyBtaXNzaW5nIG9yIG91dCBvZiBvcmRlci5gKVxuICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3RlZFJlY29yZHMuc2V0KHJlY29yZC5pZGVudGl0eSwgcmVjb3JkKVxuICB9XG4gIGlmIChtYXJrZWRNb2R1bGVzLmxlbmd0aCAhPSByZWNvcmRzLmxlbmd0aCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBkZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIGl0cyBleGVjdXRhYmxlIHNlbWFudGljIG1vZHVsZXMuXCIpXG4gIH1cbiAgaWYgKHByb2dyYW0uc291cmNlcy5zb21lKChzb3VyY2UpID0+IHNvdXJjZS5sYW5ndWFnZSAhPSBmYWNhZGVMYW5ndWFnZSB8fFxuICAgICFbXCJhcHBsaWNhdGlvblwiLCBcImZhY2FkZVwiXS5pbmNsdWRlcyhTdHJpbmcoUmVmbGVjdC5nZXQoc291cmNlLCBcIm93bmVyc2hpcFwiKSkpKSkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIkZhY2FkZSBwcm9ncmFtcyByZXF1aXJlIG9uZSBzb3VyY2UgbGFuZ3VhZ2UgYW5kIGV4cGxpY2l0IGFwcGxpY2F0aW9uL2ZhY2FkZSBvd25lcnNoaXAuXCIpXG4gIH1cbiAgY29uc3Qgc2VsZWN0ZWRJZGVudGl0aWVzID0gbmV3IFNldChyZWNvcmRzLm1hcCgoe2lkZW50aXR5fSkgPT4gaWRlbnRpdHkpKVxuICBjb25zdCByZWdpc3RlcmVkTW9kdWxlcyA9IHJlcGFyc2VSZWdpc3RlcmVkRmFjYWRlTW9kdWxlcyhwcm9ncmFtLCBmYWNhZGVMYW5ndWFnZSwgbGFuZ3VhZ2UpXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJlY29yZHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc1tpbmRleF1cbiAgICBjb25zdCBtb2R1bGUgPSBtYXJrZWRNb2R1bGVzW2luZGV4XVxuICAgIGNvbnN0IG1hcmtlciA9IFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIilcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChtYXJrZXIpIHx8IE9iamVjdC5rZXlzKG1hcmtlcikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiaWRlbnRpdHksdmVyc2lvblwiIHx8XG4gICAgICBtYXJrZXIuaWRlbnRpdHkgIT0gcmVjb3JkLmlkZW50aXR5IHx8IG1hcmtlci52ZXJzaW9uICE9IHJlY29yZC52ZXJzaW9uIHx8IG1vZHVsZS5pZCAhPSByZWNvcmQuc291cmNlLmlkIHx8XG4gICAgICBtb2R1bGUuc291cmNlRmlsZW5hbWUgIT0gcmVjb3JkLnNvdXJjZS5maWxlbmFtZSkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5IGlzIG5vdCBjYW5vbmljYWwuYClcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gcHJvZ3JhbS5zb3VyY2VzLmZpbmQoKHtmaWxlbmFtZX0pID0+IGZpbGVuYW1lID09IHJlY29yZC5zb3VyY2UuZmlsZW5hbWUpXG5cbiAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuY29udGVudCAhPSByZWNvcmQuc291cmNlLmNvbnRlbnQgfHwgUmVmbGVjdC5nZXQoc291cmNlLCBcIm93bmVyc2hpcFwiKSAhPSBcImZhY2FkZVwiKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBleGVjdXRhYmxlIHNvdXJjZSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVnaXN0ZXJlZCBkZWZpbml0aW9uLmApXG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdGVyZWRNb2R1bGUgPSByZWdpc3RlcmVkTW9kdWxlcy5nZXQocmVjb3JkLmlkZW50aXR5KVxuXG4gICAgaWYgKCFyZWdpc3RlcmVkTW9kdWxlIHx8ICFlcXVhbFBsYWluRGF0YShtb2R1bGUsIHJlZ2lzdGVyZWRNb2R1bGUpKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlQXV0aG9yaXR5KGxhbmd1YWdlLFxuICAgICAgICBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIHNlbWFudGljIG1vZHVsZSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVnaXN0ZXJlZCBleGVjdXRhYmxlIHNvdXJjZS5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGFsbG93ZWRPcGVyYXRpb25zID0gbmV3IFNldChyZWNvcmQucmVxdWlyZW1lbnRzLmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT4gb3BlcmF0aW9ucykpXG4gICAgY29uc3QgdXNlZE9wZXJhdGlvbnMgPSBjb2xsZWN0RGVjbGFyZWRFZmZlY3RPcGVyYXRpb25zKG1vZHVsZSlcblxuICAgIGlmIChhbGxvd2VkT3BlcmF0aW9ucy5zaXplICE9IHVzZWRPcGVyYXRpb25zLnNpemUgfHwgWy4uLmFsbG93ZWRPcGVyYXRpb25zXS5zb21lKChvcGVyYXRpb24pID0+ICF1c2VkT3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uKSkpIHtcbiAgICAgIGludmFsaWRGYWNhZGVBdXRob3JpdHkobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgc2VtYW50aWMgYm9keSBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyZWQgY2Fub25pY2FsIHJlcXVpcmVtZW50cy5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICB9XG4gIGlmIChmYWNhZGVTb3VyY2VzLmxlbmd0aCAhPSByZWNvcmRzLmxlbmd0aCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGNvbnRhaW5zIGFuIHVuc2VsZWN0ZWQgY29tcGlsZXItb3duZWQgZmFjYWRlIHNvdXJjZS5cIilcbiAgfVxuICBpZiAoZXZpZGVuY2VkSW1wb3J0cy5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBzZWxlY3RlZCBmYWNhZGUgY2xvc3VyZSBoYXMgbm8gcGFyc2VyLXByb3ZlZCBuYXRpdmUgaW1wb3J0IGV2aWRlbmNlLlwiKVxuICB9XG4gIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgZXZpZGVuY2VkSW1wb3J0cykge1xuICAgIGNvbnN0IGV2aWRlbmNlID0gUmVmbGVjdC5nZXQoaW1wb3J0ZWQsIFwic3RkbGliRmFjYWRlXCIpXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoZXZpZGVuY2UpIHx8IE9iamVjdC5rZXlzKGV2aWRlbmNlKS5zb3J0KCkuam9pbihcIixcIikgIT1cbiAgICAgIFwiZmFjYWRlSWRlbnRpdHksZmFjYWRlVmVyc2lvbixuYXRpdmVNb2R1bGUsbmF0aXZlU3ltYm9sLHNjaGVtYSx2ZXJzaW9uXCIgfHxcbiAgICAgIGV2aWRlbmNlLnNjaGVtYSAhPSBcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwiIHx8IGV2aWRlbmNlLnZlcnNpb24gIT0gMSB8fFxuICAgICAgdHlwZW9mIGV2aWRlbmNlLmZhY2FkZUlkZW50aXR5ICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIGV2aWRlbmNlLmZhY2FkZVZlcnNpb24gIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIGV2aWRlbmNlLm5hdGl2ZU1vZHVsZSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBldmlkZW5jZS5uYXRpdmVTeW1ib2wgIT0gXCJzdHJpbmdcIikge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiQSBmYWNhZGUgaW1wb3J0IGhhcyBtYWxmb3JtZWQgbmF0aXZlIGlkZW50aXR5IGV2aWRlbmNlLlwiKVxuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBzdGRsaWJGYWNhZGVSZWdpc3RyeS5yZXNvbHZlRmFjYWRlKGZhY2FkZUxhbmd1YWdlLCBldmlkZW5jZS5uYXRpdmVNb2R1bGUsIGV2aWRlbmNlLm5hdGl2ZVN5bWJvbCxcbiAgICAgIGV2aWRlbmNlLmZhY2FkZVZlcnNpb24pXG5cbiAgICBpZiAocmVjb3JkLmlkZW50aXR5ICE9IGV2aWRlbmNlLmZhY2FkZUlkZW50aXR5IHx8ICFzZWxlY3RlZElkZW50aXRpZXMuaGFzKHJlY29yZC5pZGVudGl0eSkgfHwgaW1wb3J0ZWQubW9kdWxlSWQgIT0gcmVjb3JkLnNvdXJjZS5pZCB8fFxuICAgICAgaW1wb3J0ZWQuaW1wb3J0ZWROYW1lICE9IGV2aWRlbmNlLm5hdGl2ZVN5bWJvbCkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiQSBmYWNhZGUgaW1wb3J0IGRvZXMgbm90IG1hdGNoIGl0cyByZWdpc3RlcmVkIG5hdGl2ZSBtb2R1bGUgYW5kIHN5bWJvbCBpZGVudGl0eS5cIilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBjYW5vbmljYWwgb3BlcmF0aW9uIHByZXNlbnQgaW4gb25lIHZhbGlkYXRlZCBmYWNhZGUgaW1wbGVtZW50YXRpb24uXG4gKiBUaGlzIGNoZWNrcyB0aGUgZmFjYWRlJ3MgY29tcGxldGUgZGVjbGFyZWQgYXV0aG9yaXR5IGluZGVwZW5kZW50bHkgZnJvbSBwcm9ncmFtIHJlYWNoYWJpbGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBGYWNhZGUgbW9kdWxlLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBVc2VkIG9wZXJhdGlvbiBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdERlY2xhcmVkRWZmZWN0T3BlcmF0aW9ucyhtb2R1bGUpIHtcbiAgY29uc3Qgb3BlcmF0aW9uTmFtZXMgPSBuZXcgTWFwKG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT5cbiAgICBvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBvcGVyYXRpb24ubmFtZV0pKSA/PyBbXSlcbiAgY29uc3QgdXNlZCA9IG5ldyBTZXQoKVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGZhY2FkZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm5cbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIiA/IFJlZmxlY3QuZ2V0KHZhbHVlLCBcIm9wZXJhdGlvblwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiA9PSBcInN0cmluZ1wiICYmIG9wZXJhdGlvbk5hbWVzLmhhcyhvcGVyYXRpb24pKSB1c2VkLmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKG9wZXJhdGlvbk5hbWVzLmdldChvcGVyYXRpb24pKSlcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICBpZiAoW1wiY2FwYWJpbGl0aWVzXCIsIFwibG9jYXRpb25cIiwgXCJwcm92ZW5hbmNlXCIsIFwicmVzb2x1dGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgICAgdmlzaXQoY2hpbGQpXG4gICAgICB9XG4gICAgfSBlbHNlIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWUpIHZpc2l0KGNoaWxkKVxuICB9XG5cbiAgdmlzaXQoe2NsYXNzZXM6IG1vZHVsZS5jbGFzc2VzLCBlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCwgZnVuY3Rpb25zOiBtb2R1bGUuZnVuY3Rpb25zfSlcbiAgcmV0dXJuIHVzZWRcbn1cblxuLyoqXG4gKiBSZWNvbXBpbGVzIHRoZSByZWdpc3RyeS1zZWxlY3RlZCBmYWNhZGUgY2xvc3VyZSBmcm9tIHJldGFpbmVkIGNhbGxlciBpbnB1dHMgYW5kIHJlZ2lzdGVyZWQgZmFjYWRlIHNvdXJjZS5cbiAqIFRoaXMgcGFyc2VyLWJhY2tlZCByZWZlcmVuY2UgZ3JhcGggaXMgY3JlYXRlZCBkdXJpbmcgdmFsaWRhdGlvbiwgYmVmb3JlIHByb3ZpZGVyIHBsYW5uaW5nIG9yIHdyaXRlciBhbGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBVbnRydXN0ZWQgbXV0YWJsZSBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBmYWNhZGVMYW5ndWFnZSAtIFNlbGVjdGVkIHNvdXJjZS1sYW5ndWFnZSBmYWNhZGUgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gZGlhZ25vc3RpY0xhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlIGZvciBib3VuZGFyeSBkaWFnbm9zdGljcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSBDYW5vbmljYWwgc2VtYW50aWMgbW9kdWxlcyBieSBmYWNhZGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlcGFyc2VSZWdpc3RlcmVkRmFjYWRlTW9kdWxlcyhwcm9ncmFtLCBmYWNhZGVMYW5ndWFnZSwgZGlhZ25vc3RpY0xhbmd1YWdlKSB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uTW9kdWxlcyA9IHByb2dyYW0ubW9kdWxlcy5maWx0ZXIoKG1vZHVsZSkgPT4gUmVmbGVjdC5nZXQobW9kdWxlLCBcInN0ZGxpYkZhY2FkZVwiKSA9PT0gdW5kZWZpbmVkKVxuICBjb25zdCBtb2R1bGVzQnlGaWxlbmFtZSA9IG5ldyBNYXAoYXBwbGljYXRpb25Nb2R1bGVzLm1hcCgobW9kdWxlKSA9PiBbbW9kdWxlLnNvdXJjZUZpbGVuYW1lLCBtb2R1bGVdKSlcbiAgY29uc3QgYXBwbGljYXRpb25Tb3VyY2VzID0gcHJvZ3JhbS5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBSZWZsZWN0LmdldChzb3VyY2UsIFwib3duZXJzaGlwXCIpID09IFwiYXBwbGljYXRpb25cIikubWFwKChzb3VyY2UpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzQnlGaWxlbmFtZS5nZXQoc291cmNlLmZpbGVuYW1lKVxuXG4gICAgaWYgKCFtb2R1bGUpIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGRpYWdub3N0aWNMYW5ndWFnZSxcbiAgICAgIGBBcHBsaWNhdGlvbiBzb3VyY2UgJyR7c291cmNlLmZpbGVuYW1lfScgaGFzIG5vIG1hdGNoaW5nIHNlbWFudGljIG1vZHVsZSBmb3IgZmFjYWRlIHZlcmlmaWNhdGlvbi5gKVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLFxuICAgICAgaWQ6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAobW9kdWxlKS5pZCxcbiAgICAgIGxhbmd1YWdlOiBmYWNhZGVMYW5ndWFnZSxcbiAgICAgIHNvdXJjZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudClcbiAgICB9XG4gIH0pXG5cbiAgaWYgKGFwcGxpY2F0aW9uU291cmNlcy5sZW5ndGggIT0gYXBwbGljYXRpb25Nb2R1bGVzLmxlbmd0aCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGRpYWdub3N0aWNMYW5ndWFnZSwgXCJGYWNhZGUgdmVyaWZpY2F0aW9uIHJlcXVpcmVzIG9uZSByZXRhaW5lZCBhcHBsaWNhdGlvbiBzb3VyY2UgcGVyIHNlbWFudGljIG1vZHVsZS5cIilcbiAgfVxuICBjb25zdCByZXBhcnNlZCA9IHBhcnNlUHJvZ3JhbVNvdXJjZSh7ZW50cnlNb2R1bGU6IHByb2dyYW0uZW50cnlNb2R1bGUsIHNvdXJjZXM6IGFwcGxpY2F0aW9uU291cmNlc30pXG4gIGNvbnN0IG1vZHVsZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiByZXBhcnNlZC5tb2R1bGVzKSB7XG4gICAgaWYgKCFtb2R1bGUuc3RkbGliRmFjYWRlKSBjb250aW51ZVxuICAgIGlmIChtb2R1bGVzLmhhcyhtb2R1bGUuc3RkbGliRmFjYWRlLmlkZW50aXR5KSkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IoZGlhZ25vc3RpY0xhbmd1YWdlLCBgUmVnaXN0ZXJlZCBmYWNhZGUgJyR7bW9kdWxlLnN0ZGxpYkZhY2FkZS5pZGVudGl0eX0nIHJlcGFyc2VkIG1vcmUgdGhhbiBvbmNlLmApXG4gICAgfVxuICAgIG1vZHVsZXMuc2V0KG1vZHVsZS5zdGRsaWJGYWNhZGUuaWRlbnRpdHksIG1vZHVsZSlcbiAgfVxuICByZXR1cm4gbW9kdWxlc1xufVxuXG4vKipcbiAqIENvbXBhcmVzIGNsb3NlZCBwbGFpbiBKU09OLXNoYXBlZCBkYXRhIHdpdGhvdXQgY29lcmNpb24gb3Iga2V5LW9yZGVyIGFzc3VtcHRpb25zLlxuICogQHBhcmFtIHt1bmtub3dufSBsZWZ0IC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIEV4cGVjdGVkIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IEV4YWN0IHJlY3Vyc2l2ZSBlcXVpdmFsZW5jZS5cbiAqL1xuZnVuY3Rpb24gZXF1YWxQbGFpbkRhdGEobGVmdCwgcmlnaHQpIHtcbiAgaWYgKGxlZnQgPT09IHJpZ2h0KSByZXR1cm4gdHJ1ZVxuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGxlZnQpICYmIEFycmF5LmlzQXJyYXkocmlnaHQpICYmIGlzRGVuc2VBcnJheShsZWZ0KSAmJiBpc0RlbnNlQXJyYXkocmlnaHQpICYmXG4gICAgICBsZWZ0Lmxlbmd0aCA9PSByaWdodC5sZW5ndGggJiYgbGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBlcXVhbFBsYWluRGF0YSh2YWx1ZSwgcmlnaHRbaW5kZXhdKSlcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3QobGVmdCkgfHwgIWlzUGxhaW5PYmplY3QocmlnaHQpKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgbGVmdEtleXMgPSBPYmplY3Qua2V5cyhsZWZ0KS5zb3J0KClcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpLnNvcnQoKVxuXG4gIHJldHVybiBsZWZ0S2V5cy5sZW5ndGggPT0gcmlnaHRLZXlzLmxlbmd0aCAmJiBsZWZ0S2V5cy5ldmVyeSgoa2V5LCBpbmRleCkgPT5cbiAgICBrZXkgPT0gcmlnaHRLZXlzW2luZGV4XSAmJiBlcXVhbFBsYWluRGF0YShsZWZ0W2tleV0sIHJpZ2h0W2tleV0pKVxufVxuXG4vKipcbiAqIFRocm93cyBvbmUgc3RhYmxlIGZhY2FkZSBhcnRpZmFjdC1ib3VuZGFyeSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRGlhZ25vc3RpYyBkZXRhaWwuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBtZXNzYWdlKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiU1RETElCX0ZBQ0FERV9ERVNDUklQVE9SX0lOVkFMSURcIiwgbGFuZ3VhZ2UsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIFRocm93cyB3aGVuIGEgZmFjYWRlIHNlbWFudGljIGJvZHkgZXhjZWVkcyBvciBvbWl0cyBpdHMgcmVnaXN0cnktZGVjbGFyZWQgYXV0aG9yaXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRGlhZ25vc3RpYyBkZXRhaWwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEZhY2FkZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRGYWNhZGVBdXRob3JpdHkobGFuZ3VhZ2UsIG1lc3NhZ2UsIGxvY2F0aW9uKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiU1RETElCX0ZBQ0FERV9BVVRIT1JJVFlfRk9SR0VEXCIsIGxhbmd1YWdlLCBsb2NhdGlvbiwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwcm9ncmFtIHN0ZGxpYiBsaW5rIGRlc2NyaXB0b3IgYWdhaW5zdCBpdHMgY2FwYWJpbGl0eSBtb2R1bGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBDYW5kaWRhdGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZVtdfSBjYXBhYmlsaXR5TW9kdWxlcyAtIE1vZHVsZXMgY2FycnlpbmcgY2FwYWJpbGl0aWVzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkNvbnRyYWN0KHByb2dyYW0sIGxhbmd1YWdlLCBjYXBhYmlsaXR5TW9kdWxlcykge1xuICBjb25zdCBjb250cmFjdCA9IFJlZmxlY3QuZ2V0KHByb2dyYW0sIFwic3RkbGliQ29udHJhY3RcIilcbiAgY29uc3QgY29udHJhY3RzID0gUmVmbGVjdC5nZXQocHJvZ3JhbSwgXCJzdGRsaWJDb250cmFjdHNcIilcblxuICBpZiAoY2FwYWJpbGl0eU1vZHVsZXMubGVuZ3RoID09IDApIHtcbiAgICBpZiAoY29udHJhY3QgIT09IHVuZGVmaW5lZCB8fCBjb250cmFjdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogXCJBIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgcmVxdWlyZXMgY2FwYWJpbGl0eSBtb2R1bGVzLlwiXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoY29udHJhY3QgIT09IHVuZGVmaW5lZCAmJiBjb250cmFjdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIG1lc3NhZ2U6IFwiQSBwcm9ncmFtIGNhbm5vdCBkZWNsYXJlIGJvdGggc2luZ3VsYXIgYW5kIHBsdXJhbCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IGRlc2NyaXB0b3JzLlwiXG4gICAgfSlcbiAgfVxuICBpZiAoY29udHJhY3QgPT09IHVuZGVmaW5lZCAmJiBjb250cmFjdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIG1vZHVsZXMgd2l0aCBjYXBhYmlsaXRpZXMgcmVxdWlyZSBhIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3RcIixcbiAgICAgIGNhcGFiaWxpdHlNb2R1bGVzWzBdLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGRlY2xhcmVkID0gY29udHJhY3RzID09PSB1bmRlZmluZWQgPyBbY29udHJhY3RdIDogY29udHJhY3RzXG5cbiAgaWYgKCFpc0RlbnNlQXJyYXkoZGVjbGFyZWQpIHx8IGRlY2xhcmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgbWVzc2FnZTogXCJUaGUgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCBkZXNjcmlwdG9yIGxpc3QgaXMgbWFsZm9ybWVkIG9yIGVtcHR5LlwiXG4gICAgfSlcbiAgfVxuICBjb25zdCBpZGVudGl0aWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIGRlY2xhcmVkKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGRlc2NyaXB0b3IpIHx8IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLnNvbWUoKGtleSkgPT4ga2V5ICE9IFwiaWRlbnRpdHlcIiAmJiBrZXkgIT0gXCJjb250cmFjdFZlcnNpb25cIikpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IFwiVGhlIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuXCJcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IGlkZW50aXR5ID0gZGVzY3JpcHRvci5pZGVudGl0eVxuXG4gICAgaWYgKHR5cGVvZiBpZGVudGl0eSAhPSBcInN0cmluZ1wiIHx8IGlkZW50aXR5Lmxlbmd0aCA9PSAwIHx8IGlkZW50aXRpZXMuaGFzKGlkZW50aXR5KSB8fFxuICAgICAgIWxpc3RTdGRsaWJNb2R1bGVzKCkuc29tZSgoe2lkZW50aXR5OiByZWdpc3RlcmVkfSkgPT4gcmVnaXN0ZXJlZCA9PSBpZGVudGl0eSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0ICcke1N0cmluZyhpZGVudGl0eSl9JyBpcyBkdXBsaWNhdGUgb3Igbm90IGEgcmVnaXN0ZXJlZCBjYW5vbmljYWwgbW9kdWxlLmBcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChkZXNjcmlwdG9yLmNvbnRyYWN0VmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHBhcnNlU3RkbGliVmVyc2lvblJhbmdlKGRlc2NyaXB0b3IuY29udHJhY3RWZXJzaW9uKSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYERlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgdmVyc2lvbiAnJHtTdHJpbmcoZGVzY3JpcHRvci5jb250cmFjdFZlcnNpb24pfScgaXMgbm90IGNhbm9uaWNhbC5gXG4gICAgICB9KVxuICAgIH1cbiAgICBpZGVudGl0aWVzLmFkZChpZGVudGl0eSlcbiAgfVxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBjYXBhYmlsaXR5TW9kdWxlcykge1xuICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FwYWJpbGl0eSkgfHwgdHlwZW9mIGNhcGFiaWxpdHkuYXV0aG9yaXR5SWQgIT0gXCJzdHJpbmdcIiB8fCAhaWRlbnRpdGllcy5oYXMoY2FwYWJpbGl0eS5hdXRob3JpdHlJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgbWVzc2FnZTogYENhcGFiaWxpdHkgYXV0aG9yaXR5ICcke1N0cmluZyhSZWZsZWN0LmdldChjYXBhYmlsaXR5LCBcImF1dGhvcml0eUlkXCIpKX0nIGRvZXMgbm90IG1hdGNoIGEgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdC5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluZHMgYSByZWNvcmQgY29uc3RydWN0aW9uIHRoYXQgY3Jvc3NlcyBhIHR5cGUtb25seSBpbXBvcnQgZWRnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBJbXBvcnRpbmcgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdHlwZU9ubHlEZWNsYXJhdGlvbklkcyAtIEltcG9ydGVkIGlkZW50aXRpZXMgdW5hdmFpbGFibGUgaW4gdmFsdWUgcG9zaXRpb25zLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZENvbnN0cnVjdGlvbiB8IHVuZGVmaW5lZH0gSW52YWxpZCBjb25zdHJ1Y3Rpb24gd2hlbiBwcmVzZW50LlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZU9ubHlWYWx1ZUNvbnN0cnVjdGlvbihtb2R1bGUsIHR5cGVPbmx5RGVjbGFyYXRpb25JZHMpIHtcbiAgaWYgKHR5cGVPbmx5RGVjbGFyYXRpb25JZHMuc2l6ZSA9PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpXG5cbiAgLyoqXG4gICAqIFZpc2l0cyBvbmUgc2VtYW50aWMgdmFsdWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZENvbnN0cnVjdGlvbiB8IHVuZGVmaW5lZH0gSW52YWxpZCBjb25zdHJ1Y3Rpb24gd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGNvbnN0IG9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcblxuICAgIGlmIChvYmplY3Qua2luZCA9PSBcIlJlY29yZENvbnN0cnVjdGlvblwiICYmIGlzUGxhaW5PYmplY3Qob2JqZWN0LnJlY29yZCkgJiZcbiAgICAgIHR5cGVvZiBvYmplY3QucmVjb3JkLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiB0eXBlT25seURlY2xhcmF0aW9uSWRzLmhhcyhvYmplY3QucmVjb3JkLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmRDb25zdHJ1Y3Rpb259ICovICh2YWx1ZSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG9iamVjdCkpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdmlzaXQoY2hpbGQpXG5cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIHZpc2l0KHtlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCwgZnVuY3Rpb25zOiBtb2R1bGUuZnVuY3Rpb25zfSlcbn1cblxuLyoqXG4gKiBQbGFucyBhbGwgcGF0aHMgYmVmb3JlIGVtaXNzaW9uIGFuZCByZWplY3RzIGV4YWN0L2Nhc2UvZmlsZS1kaXJlY3RvcnkgY29sbGlzaW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IFtsaW5raW5nXSAtIFBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGxpbmsuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgc3RyaW5nPn0gUGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHBsYW5Nb2R1bGVQYXRocyhwcm9ncmFtLCBsYW5ndWFnZSwgbGlua2luZyA9IG51bGwpIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gbGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgPyBcIi5qc1wiIDogbGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgPyBcIi50c1wiIDogbGFuZ3VhZ2UgPT0gXCJydWJ5XCIgPyBcIi5yYlwiIDpcbiAgICBsYW5ndWFnZSA9PSBcInBocFwiID8gXCIucGhwXCIgOiBcIi5qYXZhXCJcbiAgY29uc3QgcGF0aHMgPSBuZXcgTWFwKClcbiAgY29uc3QgZm9sZGVkID0gbmV3IFNldCgpXG4gIGNvbnN0IHRhcmdldE1vZHVsZU5hbWVzID0gbmV3IFNldCgpXG4gIGNvbnN0IHByb3ZpZGVyUGF0aHMgPSBsaW5raW5nID8gbGlua2luZy5uZWdvdGlhdGlvbi5wcm92aWRlcnMubWFwKCh7bW9kdWxlfSkgPT5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChsaW5raW5nLnJlY29yZHMuZ2V0KG1vZHVsZSkpLmFydGlmYWN0LnBhdGgpIDogW11cbiAgY29uc3QgZm9sZGVkUHJvdmlkZXJzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBwcm92aWRlclBhdGggb2YgcHJvdmlkZXJQYXRocykge1xuICAgIGNvbnN0IGtleSA9IHByb3ZpZGVyUGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpXG5cbiAgICBpZiAoIWlzU2FmZUFydGlmYWN0UGF0aChwcm92aWRlclBhdGgpIHx8IGZvbGRlZC5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJTVERMSUJfTkFNRV9DT0xMSVNJT05cIiwgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aCAnJHtwcm92aWRlclBhdGh9JyBpcyB1bnNhZmUgb3IgY29sbGlkaW5nLmB9KVxuICAgIH1cbiAgICBmb2xkZWQuYWRkKGtleSlcbiAgICBmb2xkZWRQcm92aWRlcnMuc2V0KHByb3ZpZGVyUGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKSwgcHJvdmlkZXJQYXRoKVxuICB9XG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgbGV0IHBhdGggPSBgJHttb2R1bGUuaWQucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfSR7ZXh0ZW5zaW9ufWBcbiAgICBjb25zdCBwcm92aWRlclBhdGggPSBmb2xkZWRQcm92aWRlcnMuZ2V0KHBhdGgudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKS5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIikpXG5cbiAgICBpZiAocHJvdmlkZXJQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9OQU1FX0NPTExJU0lPTlwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYE1vZHVsZSBwYXRoICcke3BhdGh9JyBjb2xsaWRlcyB3aXRoIHRoZSBzdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgJyR7cHJvdmlkZXJQYXRofScuYFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0TW9kdWxlTmFtZSA9IG1vZHVsZUNsYXNzTmFtZShtb2R1bGUuaWQpXG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJwaHBcIiB8fCBsYW5ndWFnZSA9PSBcInJ1YnlcIikge1xuICAgICAgY29uc3Qga2V5ID0gbGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IHRhcmdldE1vZHVsZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKSA6IHRhcmdldE1vZHVsZU5hbWVcblxuICAgICAgaWYgKHRhcmdldE1vZHVsZU5hbWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBtb2R1bGUtbmFtZSBjb2xsaXNpb24gJyR7dGFyZ2V0TW9kdWxlTmFtZX0nYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgdGFyZ2V0TW9kdWxlTmFtZXMuYWRkKGtleSlcbiAgICB9XG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJwaHBcIikge1xuICAgICAgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCB0YXJnZXRNb2R1bGVOYW1lLCBcIm1vZHVsZVwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyKGxhbmd1YWdlLCB0YXJnZXRNb2R1bGVOYW1lLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSA9PSBcInJ1YnlcIikgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcihsYW5ndWFnZSwgdGFyZ2V0TW9kdWxlTmFtZSwgbW9kdWxlLmxvY2F0aW9uKVxuXG4gICAgaWYgKGxhbmd1YWdlID09IFwiamF2YVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbW9kdWxlLmlkLnNwbGl0KFwiLlwiKSkgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCBzZWdtZW50LCBcIm1vZHVsZVwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICBjb25zdCBub21pbmFsQ291bnQgPSAobW9kdWxlLnJlY29yZHM/Lmxlbmd0aCA/PyAwKSArIChtb2R1bGUuY2xhc3Nlcz8ubGVuZ3RoID8/IDApICsgKG1vZHVsZS5lcnJvcnM/Lmxlbmd0aCA/PyAwKVxuXG4gICAgICBpZiAobW9kdWxlLmlkLmluY2x1ZGVzKFwiLVwiKSB8fCBub21pbmFsQ291bnQgPiAxIHx8XG4gICAgICAgIG5vbWluYWxDb3VudCA+IDAgJiYgKG1vZHVsZS5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fCBtb2R1bGUuZW50cnlQb2ludCkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIkphdmEgbW9kdWxlIGxheW91dCByZXF1aXJpbmcgbXVsdGlwbGUgcHVibGljIGRlY2xhcmF0aW9ucyBpbiBvbmUgc2VtYW50aWMgbW9kdWxlXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IG1vZHVsZS5yZWNvcmRzPy5bMF0/Lm5hbWUgPz8gbW9kdWxlLmNsYXNzZXM/LlswXT8ubmFtZSA/PyBtb2R1bGUuZXJyb3JzPy5bMF0/Lm5hbWUgPz9cbiAgICAgICAgKG1vZHVsZS5pZCA9PSBwcm9ncmFtLmVudHJ5TW9kdWxlID8gXCJNYWluXCIgOiB0YXJnZXRNb2R1bGVOYW1lKVxuXG4gICAgICBpZiAoIS9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC91LnRlc3QoY2xhc3NOYW1lKSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGBpbnZhbGlkIEphdmEgcHVibGljIGNsYXNzIG5hbWUgJyR7Y2xhc3NOYW1lfSdgLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmlkICE9IHByb2dyYW0uZW50cnlNb2R1bGUpIHZhbGlkYXRlVGFyZ2V0VHlwZUlkZW50aWZpZXIobGFuZ3VhZ2UsIGNsYXNzTmFtZSwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgcGF0aCA9IGBzZW1hbnRpZm9sZC9nZW5lcmF0ZWQvJHttb2R1bGUuaWQucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfS8ke2NsYXNzTmFtZX0uamF2YWBcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpXG5cbiAgICBpZiAoIWlzU2FmZUFydGlmYWN0UGF0aChwYXRoKSB8fCBmb2xkZWQuaGFzKGtleSkpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHVuc2FmZSBvciBjb2xsaWRpbmcgdGFyZ2V0IHBhdGggJyR7cGF0aH0nYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIGZvbGRlZC5hZGQoa2V5KVxuICAgIHBhdGhzLnNldChtb2R1bGUuaWQsIHBhdGgpXG4gIH1cblxuICByZXR1cm4gcGF0aHNcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxvZ2ljYWwgbW9kdWxlIGlkZW50aXR5IHRvIGl0cyBjYW5vbmljYWwgdGFyZ2V0IHR5cGUgc2VnbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIExvZ2ljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IGNsYXNzIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUNsYXNzTmFtZShpZCkge1xuICByZXR1cm4gaWQuc3BsaXQoL1suXy1dKy91KS5tYXAoKHBhcnQpID0+IGAke3BhcnRbMF0udG9VcHBlckNhc2UoKX0ke3BhcnQuc2xpY2UoMSl9YCkuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJhdGlvbiBvciBiaW5kaW5nIG5hbWUgZm9yIHRhcmdldCBjb2xsaXNpb24gY2hlY2tzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbGxpc2lvbiBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldE5hbWUobGFuZ3VhZ2UsIG5hbWUpIHtcbiAgcmV0dXJuIGxhbmd1YWdlID09IFwicGhwXCIgPyBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIikgOiBuYW1lXG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIGEgY2FuZGlkYXRlIGlzIGEgZGlyZWN0IHBsYWluIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogUmFpc2VzIGEgc3RhYmxlIG1hbGZvcm1lZCBwcm9ncmFtLWdlbmVyYXRpb24gcmVxdWVzdCBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBTdGFibGUgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKG1lc3NhZ2UpIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJJTlZBTElEX1BST0dSQU1cIiwgbGFuZ3VhZ2U6IFwicHJvZ3JhbVwiLCBtZXNzYWdlfSlcbn1cbiJdfQ==
|
|
1324
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9wcm9ncmFtLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3hFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzFELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM5RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzdGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqRSxPQUFPLEVBQUMsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEQsT0FBTyxFQUFDLCtCQUEr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QUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtBQUMxRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi4vYXJyYXkuanNcIlxuaW1wb3J0IHtpc1NhZmVBcnRpZmFjdFBhdGgsIGlzU2FmZVNvdXJjZVBhdGh9IGZyb20gXCIuLi9hcnRpZmFjdC1wYXRoLmpzXCJcbmltcG9ydCB7Y3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGZyb20gXCIuLi9hcnRpZmFjdHMuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWMsIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eSwgdW5zdXBwb3J0ZWRSb2xlfSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge3BhcnNlUHJvZ3JhbVNvdXJjZX0gZnJvbSBcIi4uL2Zyb250ZW5kcy9wcm9ncmFtLmpzXCJcbmltcG9ydCB7bGFuZ3VhZ2VSZWdpc3RyeX0gZnJvbSBcIi4uL2xhbmd1YWdlLXJlZ2lzdHJ5LmpzXCJcbmltcG9ydCB7ZmluYWxpemVNYXBwaW5nLCB0b1NvdXJjZU1hcFYzfSBmcm9tIFwiLi4vbWFwcGluZy5qc1wiXG5pbXBvcnQge2NyZWF0ZUNvb3JkaW5hdGVJbmRleCwgaW5kZXhlZFBvaW50QXQsIG1vZHVsZUxvY2F0aW9ufSBmcm9tIFwiLi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHtzZW1hbnRpY0VudHJpZXN9IGZyb20gXCIuLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcbmltcG9ydCB7bGlzdFN0ZGxpYk1vZHVsZXMsIHBhcnNlU3RkbGliVmVyc2lvblJhbmdlfSBmcm9tIFwiLi4vc2VtYW50aWMvc3RkbGliLmpzXCJcbmltcG9ydCB7bW9kdWxlVW5jaGVja2VkRXJyb3JFZmZlY3RzfSBmcm9tIFwiLi4vc2VtYW50aWMvdmFsaWRhdGUuanNcIlxuaW1wb3J0IHtuZWdvdGlhdGVTdGRsaWJQcm92aWRlcnN9IGZyb20gXCIuLi9zdGRsaWItbmVnb3RpYXRpb24uanNcIlxuaW1wb3J0IHtzdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvciwgc3RkbGliRmFjYWRlUmVnaXN0cnl9IGZyb20gXCIuLi9zdGRsaWItZmFjYWRlcy5qc1wiXG5pbXBvcnQge3N0ZGxpYlByb3ZpZGVyUmVnaXN0cnl9IGZyb20gXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCJcbmltcG9ydCB7cHJlZmxpZ2h0RWZmZWN0Q2FwYWJpbGl0aWVzfSBmcm9tIFwiLi9lZmZlY3RzLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVUYXJnZXRCaW5kaW5nSWRlbnRpZmllciwgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyLCB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyfSBmcm9tIFwiLi9pZGVudGlmaWVycy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlU3RkbGliUHJvdmlkZXJDb250ZW50fSBmcm9tIFwiLi9zdGRsaWItc3VwcG9ydC5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7cHJvZ3JhbUltcG9ydE5hbWUsIFNvdXJjZVdyaXRlcn0gZnJvbSBcIi4vd3JpdGVyLmpzXCJcblxuLyoqIEB0eXBlIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZT4+fSAqL1xuY29uc3QgcHJvZ3JhbVRhcmdldHMgPSBuZXcgU2V0KFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0pXG4vKiogQHR5cGUge1JlYWRvbmx5PFNldDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2U+Pn0gKi9cbmNvbnN0IHByb2dyYW1BcHBsaWNhdGlvblRhcmdldHMgPSBuZXcgU2V0KFtcImFuZHJvaWRcIiwgXCJpb3NcIiwgXCJmbHV0dGVyXCJdKVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBwcm9ncmFtIGdlbmVyYXRpb24gaW1wbGVtZW50cyBvbmUgcmVnaXN0ZXJlZCB0YXJnZXQvcm9sZSBjb21iaW5hdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIFJlZ2lzdGVyZWQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCByb2xlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgY29tcGxldGUgc2VtYW50aWMgcHJvZ3JhbXMgc3VwcG9ydCB0aGUgY29tYmluYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Byb2dyYW1BcnRpZmFjdFJvbGUobGFuZ3VhZ2UsIHJvbGUpIHtcbiAgaWYgKHJvbGUgPT0gXCJ0ZXh0XCIpIHtcbiAgICByZXR1cm4gcHJvZ3JhbVRhcmdldHMuaGFzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGxhbmd1YWdlKSlcbiAgfVxuICBpZiAocm9sZSA9PSBcImFwcGxpY2F0aW9uXCIpIHtcbiAgICByZXR1cm4gcHJvZ3JhbUFwcGxpY2F0aW9uVGFyZ2V0cy5oYXMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9ICovIChsYW5ndWFnZSkpXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIHByZXBhcmVzIGEgY29tcGxldGUgc2VtYW50aWMgcHJvZ3JhbSBmb3IgYSBub24tdGV4dCBiYWNrZW5kIHdpdGhvdXQgYWxsb2NhdGluZyBhIHdyaXRlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIEJhY2tlbmQgcHJlZmxpZ2h0IHJlcXVlc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGlucHV0LmJhY2tlbmRMYW5ndWFnZSAtIEV4aXN0aW5nIHNlbWFudGljIGJhY2tlbmQgcHJvZmlsZSB0byBlbmZvcmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGlucHV0LmRpYWdub3N0aWNMYW5ndWFnZSAtIFB1YmxpYyB0YXJnZXQgaWRlbnRpdHkgZm9yIGNhcGFiaWxpdHkgZmFpbHVyZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gaW5wdXQucHJvZ3JhbSAtIENvbXBsZXRlIGNhbmRpZGF0ZSBwcm9ncmFtLlxuICogQHBhcmFtIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZT4+fSBbaW5wdXQuc291cmNlTGFuZ3VhZ2VzXSAtIEFjY2VwdGVkIHNvdXJjZSBwcm92ZW5hbmNlIGxhbmd1YWdlcy5cbiAqIEByZXR1cm5zIHt7bW9kdWxlczogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGVbXSwgcHJvZ3JhbTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtLCBzb3VyY2VzOiB7Y29udGVudDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119fSBQcmVwYXJlZCBpbW11dGFibGUtaW5wdXQgdmlld3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVmbGlnaHRTZW1hbnRpY1Byb2dyYW0oe2JhY2tlbmRMYW5ndWFnZSwgZGlhZ25vc3RpY0xhbmd1YWdlLCBwcm9ncmFtOiBjYW5kaWRhdGUsIHNvdXJjZUxhbmd1YWdlc30pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm9ncmFtID0gdmFsaWRhdGVQcm9ncmFtKGNhbmRpZGF0ZSwgYmFja2VuZExhbmd1YWdlLCBzb3VyY2VMYW5ndWFnZXMpXG4gICAgY29uc3QgbW9kdWxlcyA9IHByZXBhcmVFbWlzc2lvbk1vZHVsZXMocHJvZ3JhbSwgYmFja2VuZExhbmd1YWdlKVxuXG4gICAgdmFsaWRhdGVQcm9ncmFtU291cmNlT3duZXJzaGlwKHByb2dyYW0sIGJhY2tlbmRMYW5ndWFnZSlcbiAgICBjb25zdCBzb3VyY2VzID0gcHJvZ3JhbS5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiB7XG4gICAgICBpZiAoc291cmNlLmNvbnRlbnQgPT09IG51bGwpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihgUHJvZ3JhbSBzb3VyY2UgJyR7c291cmNlLmZpbGVuYW1lfScgaGFzIG5vIHJldGFpbmVkIGNvbnRlbnQuYClcblxuICAgICAgcmV0dXJuIHtjb250ZW50OiBzb3VyY2UuY29udGVudCwgZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSwgLi4uKHNvdXJjZS5sYW5ndWFnZSA/IHtsYW5ndWFnZTogc291cmNlLmxhbmd1YWdlfSA6IHt9KX1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHttb2R1bGVzLCBwcm9ncmFtLCBzb3VyY2VzfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYyAmJiBlcnJvci5jb2RlID09IFwiVU5TVVBQT1JURURfQ0FQQUJJTElUWVwiICYmXG4gICAgICBlcnJvci5sYW5ndWFnZSAhPSBkaWFnbm9zdGljTGFuZ3VhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIGNvZGU6IGVycm9yLmNvZGUsXG4gICAgICAgIGxhbmd1YWdlOiBkaWFnbm9zdGljTGFuZ3VhZ2UsXG4gICAgICAgIGxvY2F0aW9uOiBlcnJvci5sb2NhdGlvbixcbiAgICAgICAgbWVzc2FnZTogZXJyb3IuZGV0YWlsXG4gICAgICB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgY29tcGxldGUgZGV0ZXJtaW5pc3RpYyBtYXBwZWQgYXJ0aWZhY3Qgc2V0IGZvciBvbmUgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFByb2dyYW0gZ2VuZXJhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGlucHV0Lmxhbmd1YWdlIC0gUmVnaXN0ZXJlZCBwcm9ncmFtIHRhcmdldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBpbnB1dC5wcm9ncmFtIC0gQ29tcGxldGUgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7XCJ0ZXh0XCIgfCBcImFwcGxpY2F0aW9uXCJ9IFtpbnB1dC5yb2xlXSAtIEV4cGxpY2l0IGFydGlmYWN0IHJvbGU7IG9taXR0ZWQgcHJlc2VydmVzIHRleHQgZ2VuZXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXQgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXQgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GbHV0dGVyQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXR9IFtpbnB1dC5jb25maWd1cmF0aW9uXSAtIEFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklvc0FwcGxpY2F0aW9uQXNzZXRJbnB1dFtdIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlW10gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GbHV0dGVyQXBwbGljYXRpb25Bc3NldElucHV0W119IFtpbnB1dC5hc3NldHNdIC0gRXhhY3QgY2FsbGVyIGFzc2V0cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlW119IFtpbnB1dC5yZXNvdXJjZXNdIC0gRXhhY3QgQW5kcm9pZCBjYWxsZXIgcmVzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBUcmFuc2FjdGlvbmFsbHkgdmFsaWRhdGVkIGFydGlmYWN0IHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUHJvZ3JhbUFydGlmYWN0cyhpbnB1dCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXQpIHx8IHR5cGVvZiBpbnB1dC5sYW5ndWFnZSAhPSBcInN0cmluZ1wiKSBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oXCJQcm9ncmFtIGdlbmVyYXRpb24gcmVxdWlyZXMgYSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIHByb2dyYW0uXCIpXG4gIGNvbnN0IHJvbGUgPSBpbnB1dC5yb2xlID8/IFwidGV4dFwiXG5cbiAgaWYgKHJvbGUgIT0gXCJ0ZXh0XCIgJiYgcm9sZSAhPSBcImFwcGxpY2F0aW9uXCIpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihcIlByb2dyYW0gYXJ0aWZhY3Qgcm9sZSBtdXN0IGJlICd0ZXh0JyBvciAnYXBwbGljYXRpb24nLlwiKVxuICBsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZChpbnB1dC5sYW5ndWFnZSlcbiAgaWYgKHJvbGUgPT0gXCJhcHBsaWNhdGlvblwiKSB7XG4gICAgaWYgKCFwcm9ncmFtQXBwbGljYXRpb25UYXJnZXRzLmhhcyhpbnB1dC5sYW5ndWFnZSkpIHVuc3VwcG9ydGVkUm9sZShpbnB1dC5sYW5ndWFnZSwgXCJtdWx0aS1maWxlIGFwcGxpY2F0aW9uIGJhY2tlbmRcIilcbiAgICBjb25zdCBiYWNrZW5kID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZXNvbHZlKGlucHV0Lmxhbmd1YWdlLCBcImFwcGxpY2F0aW9uQmFja2VuZFwiKVxuXG4gICAgcmV0dXJuIGNyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0KGJhY2tlbmQoaW5wdXQpKVxuICB9XG4gIGlmICghcHJvZ3JhbVRhcmdldHMuaGFzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlucHV0Lmxhbmd1YWdlKSkpIHtcbiAgICB1bnN1cHBvcnRlZFJvbGUoaW5wdXQubGFuZ3VhZ2UsIFwibXVsdGktZmlsZSB0ZXh0IGJhY2tlbmRcIilcbiAgfVxuICBjb25zdCBsYW5ndWFnZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlucHV0Lmxhbmd1YWdlKVxuICBjb25zdCBwcm9ncmFtID0gdmFsaWRhdGVQcm9ncmFtKGlucHV0LnByb2dyYW0sIGxhbmd1YWdlKVxuICBjb25zdCBsaW5raW5nID0gcGxhblN0ZGxpYkxpbmtpbmcocHJvZ3JhbSwgbGFuZ3VhZ2UpXG4gIGNvbnN0IGVtaXNzaW9uTW9kdWxlcyA9IHByZXBhcmVFbWlzc2lvbk1vZHVsZXMocHJvZ3JhbSwgbGFuZ3VhZ2UsIGxpbmtpbmcpXG4gIHZhbGlkYXRlUHJvZ3JhbVNvdXJjZU93bmVyc2hpcChwcm9ncmFtLCBsYW5ndWFnZSlcbiAgY29uc3QgcGF0aHMgPSBwbGFuTW9kdWxlUGF0aHMocHJvZ3JhbSwgbGFuZ3VhZ2UsIGxpbmtpbmcpXG4gIGNvbnN0IHNvdXJjZXMgPSBwcm9ncmFtLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IHtcbiAgICBpZiAoc291cmNlLmNvbnRlbnQgPT09IG51bGwpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihgUHJvZ3JhbSBzb3VyY2UgJyR7c291cmNlLmZpbGVuYW1lfScgaGFzIG5vIHJldGFpbmVkIGNvbnRlbnQuYClcblxuICAgIHJldHVybiB7Y29udGVudDogc291cmNlLmNvbnRlbnQsIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsIC4uLihzb3VyY2UubGFuZ3VhZ2UgPyB7bGFuZ3VhZ2U6IHNvdXJjZS5sYW5ndWFnZX0gOiB7fSl9XG4gIH0pXG4gIGNvbnN0IGJhY2tlbmQgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2phdmFzY3JpcHQuanNcIikuZ2VuZXJhdGVKYXZhU2NyaXB0fSAqLyAoXG4gICAgbGFuZ3VhZ2VSZWdpc3RyeS5yZXNvbHZlKGxhbmd1YWdlLCBcInRleHRCYWNrZW5kXCIpKVxuICBjb25zdCBtZWRpYVR5cGUgPSBsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZChsYW5ndWFnZSkubWVkaWFUeXBlXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gKi9cbiAgY29uc3QgYXJ0aWZhY3RzID0gbGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgfHwgbGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgPyBbe1xuICAgIGNvbnRlbnQ6IFwie1xcbiAgXFxcInR5cGVcXFwiOiBcXFwibW9kdWxlXFxcIlxcbn1cXG5cIixcbiAgICBjb250ZW50S2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIG93bmVyc2hpcDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZ2VuZXJhdGVkXCIpLFxuICAgIHBhdGg6IFwicGFja2FnZS5qc29uXCIsXG4gICAgcHJvdmVuYW5jZToge1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgcmVhc29uOiBcIkRlY2xhcmVzIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdC1mYW1pbHkgYXJ0aWZhY3Qgc2V0IGFzIGNhbm9uaWNhbCBFU00uXCIsXG4gICAgICByZWxhdGVkT3JpZ2luczogW11cbiAgICB9LFxuICAgIHJvbGU6IFwibWFuaWZlc3RcIlxuICB9XSA6IFtdXG5cbiAgaWYgKGxpbmtpbmcgJiYgbGFuZ3VhZ2UgIT0gXCJqYXZhXCIpIHtcbiAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIGxpbmtpbmcubmVnb3RpYXRpb24ucHJvdmlkZXJzKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChsaW5raW5nLnJlY29yZHMuZ2V0KHByb3ZpZGVyLm1vZHVsZSkpXG5cbiAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgY29udGVudDogZ2VuZXJhdGVTdGRsaWJQcm92aWRlckNvbnRlbnQoLyoqIEB0eXBlIHtcInBocFwiIHwgXCJydWJ5XCIgfCBcImphdmFzY3JpcHRcIiB8IFwidHlwZXNjcmlwdFwifSAqLyAobGFuZ3VhZ2UpLFxuICAgICAgICAgIFsuLi5wcm92aWRlci5vcGVyYXRpb25zXSwgcHJvdmlkZXIubW9kdWxlKSxcbiAgICAgICAgY29udGVudEtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInRleHRcIiksXG4gICAgICAgIG1lZGlhVHlwZTogcmVjb3JkLmFydGlmYWN0Lm1lZGlhVHlwZSxcbiAgICAgICAgb3duZXJzaGlwOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJnZW5lcmF0ZWRcIiksXG4gICAgICAgIHBhdGg6IHJlY29yZC5hcnRpZmFjdC5wYXRoLFxuICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgICAgIHJlYXNvbjogYHNlbWFudGlmb2xkLXN0ZGxpYi1wcm92aWRlcjoke3JlY29yZC5pZGVudGl0eX1gLFxuICAgICAgICAgIHJlbGF0ZWRPcmlnaW5zOiBbXVxuICAgICAgICB9LFxuICAgICAgICByb2xlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzdXBwb3J0XCIpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZW1pc3Npb25Nb2R1bGUgb2YgZW1pc3Npb25Nb2R1bGVzKSB7XG4gICAgY29uc3QgbW9kdWxlSWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKFJlZmxlY3QuZ2V0KGVtaXNzaW9uTW9kdWxlLCBcImlkXCIpKVxuICAgIGNvbnN0IGZpbGVuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRocy5nZXQobW9kdWxlSWQpKVxuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoe1xuICAgICAgZmlsZW5hbWUsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIG1vZHVsZTogZW1pc3Npb25Nb2R1bGUsXG4gICAgICBwcm9ncmFtLFxuICAgICAgcHJvZ3JhbVBhdGhzOiBwYXRocyxcbiAgICAgIHNvdXJjZXMsXG4gICAgICAuLi4obGlua2luZyAmJiBlbWlzc2lvbk1vZHVsZS5jYXBhYmlsaXRpZXMgIT09IHVuZGVmaW5lZCA/IHtcbiAgICAgICAgc3RkbGliUHJvdmlkZXJFbnRyaWVzOiBPYmplY3QuZnJvbUVudHJpZXMoKGxpbmtpbmcudXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQobW9kdWxlSWQpID8/IFtdKS5tYXAoKHttb2R1bGUsIG9wZXJhdGlvbn0pID0+IFtcbiAgICAgICAgICBxdWFsaWZpZWRPcGVyYXRpb25LZXkobW9kdWxlLCBvcGVyYXRpb24pLFxuICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobGlua2luZy5yZWNvcmRzLmdldChtb2R1bGUpPy5uYXRpdmVFbnRyaWVzW29wZXJhdGlvbl0pXG4gICAgICAgIF0pKSxcbiAgICAgICAgc3RkbGliUHJvdmlkZXJJbXBvcnRzOiBsYW5ndWFnZSA9PSBcImphdmFcIiB8fCBsYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiA/XG4gICAgICAgICAgbGlua2luZy5wcm92aWRlckltcG9ydHNCeU1vZHVsZS5nZXQobW9kdWxlSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICBzdGRsaWJQcm92aWRlclBhdGhzOiBsaW5raW5nLnByb3ZpZGVyUGF0aHNCeU1vZHVsZS5nZXQobW9kdWxlSWQpLFxuICAgICAgICAuLi4obGFuZ3VhZ2UgPT0gXCJqYXZhXCIgPyB7XG4gICAgICAgICAgc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChsaW5raW5nLm93bmVyTW9kdWxlSWQpLFxuICAgICAgICAgIHN0ZGxpYlByb3ZpZGVyU2hpbXM6IG1vZHVsZUlkID09IGxpbmtpbmcub3duZXJNb2R1bGVJZCA/IGxpbmtpbmcudXNlZE9wZXJhdGlvbnMubWFwKCh7b3BlcmF0aW9ufSkgPT4gb3BlcmF0aW9uKSA6IHVuZGVmaW5lZFxuICAgICAgICB9IDoge30pXG4gICAgICB9IDoge30pXG4gICAgfSlcblxuICAgIGJhY2tlbmQoZW1pc3Npb25Nb2R1bGUsIHdyaXRlcilcbiAgICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcblxuICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgIGNvbnRlbnQ6IG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQsXG4gICAgICBjb250ZW50S2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICAgIG1lZGlhVHlwZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZWRpYVR5cGUpLFxuICAgICAgb3duZXJzaGlwOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJnZW5lcmF0ZWRcIiksXG4gICAgICBwYXRoOiBmaWxlbmFtZSxcbiAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICAgICAgbWFwcGluZyxcbiAgICAgICAgc291cmNlTWFwOiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpLFxuICAgICAgICBzb3VyY2VNYXBGaWxlbmFtZTogYCR7ZmlsZW5hbWV9Lm1hcGBcbiAgICAgIH0sXG4gICAgICByb2xlOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0Um9sZX0gKi8gKFxuICAgICAgICBtb2R1bGVJZCA9PSBwcm9ncmFtLmVudHJ5TW9kdWxlID8gXCJlbnRyeVwiIDogUmVmbGVjdC5nZXQoZW1pc3Npb25Nb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpID8gXCJzdXBwb3J0XCIgOiBcInNvdXJjZVwiKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoe1xuICAgIGFydGlmYWN0cyxcbiAgICAuLi4obGlua2luZyB8fCBwcm9ncmFtLnN0ZGxpYkZhY2FkZXMgPyB7bWV0YWRhdGE6IHN0ZGxpYkxpbmtNZXRhZGF0YShsaW5raW5nLCBwYXRocywgcHJvZ3JhbS5zdGRsaWJGYWNhZGVzKX0gOiB7fSksXG4gICAgdGFyZ2V0OiBsYW5ndWFnZVxuICB9KVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYlByb2dyYW1MaW5raW5nXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3N0ZGxpYi1uZWdvdGlhdGlvbi5qc1wiKS5TdGRsaWJOZWdvdGlhdGlvblJlc3VsdH0gbmVnb3RpYXRpb24gLSBOZWdvdGlhdGVkIHByb3ZpZGVyIGNsb3N1cmUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmQ+fSByZWNvcmRzIC0gTWF0ZXJpYWxpemVkIHByb3ZpZGVyIHJlY29yZHMgYnkgY2Fub25pY2FsIG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW119IHVzZWRPcGVyYXRpb25zIC0gUHJvZ3JhbS13aWRlIHVzZWQgY2Fub25pY2FsIG9wZXJhdGlvbnMgaW4gc3RhYmxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59IHVzZWRPcGVyYXRpb25zQnlNb2R1bGUgLSBVc2VkIGNhbm9uaWNhbCBvcGVyYXRpb25zIGJ5IHByb2dyYW0gbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59IHByb3ZpZGVySW1wb3J0c0J5TW9kdWxlIC0gT3JkZXJlZCBwcm92aWRlciBpbXBvcnQgbmFtZXMgYnkgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59IHByb3ZpZGVyUGF0aHNCeU1vZHVsZSAtIFByb3ZpZGVyIGFydGlmYWN0IGNsb3N1cmUgYnkgcHJvZ3JhbSBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IG93bmVyTW9kdWxlSWQgLSBKYXZhIHRhcmdldDogZmlyc3Qgb3BlcmF0aW9uLXVzaW5nIG1vZHVsZSBpZGVudGl0eSBob3N0aW5nIHRoZSBzaGFyZWQgc3VwcG9ydDsgbnVsbCBmb3IgYXJ0aWZhY3QtbWF0ZXJpYWxpemluZyB0YXJnZXRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlIC0gQ2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb24gLSBDYW5vbmljYWwgb3BlcmF0aW9uIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBQbGFucyB0aGUgbGlua2VkIHN0ZGxpYiBwcm92aWRlciBmb3Igb25lIHByb2dyYW0sIG9yIHJlcG9ydHMgdGhhdCBubyBvcGVyYXRpb24gaXMgdXNlZC5cbiAqIEphdmEgcmVzb2x2ZXMgdGhlIHNhbWUgbmVnb3RpYXRlZCBwcm92aWRlciByZWNvcmQgYnV0IGhvc3RzIGl0cyBzdXBwb3J0IGluIHRoZSBmaXJzdFxuICogb3BlcmF0aW9uLXVzaW5nIG1vZHVsZSBpbnN0ZWFkIG9mIGEgc2VwYXJhdGUgcHJvdmlkZXIgYXJ0aWZhY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEByZXR1cm5zIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IExpbmtpbmcgcGxhbiwgb3IgbnVsbCB3aGVuIG5vdGhpbmcgaXMgdXNlZC5cbiAqL1xuZnVuY3Rpb24gcGxhblN0ZGxpYkxpbmtpbmcocHJvZ3JhbSwgbGFuZ3VhZ2UpIHtcbiAgY29uc3Qge3Byb2dyYW1XaWRlLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlfSA9IGNvbGxlY3RVc2VkRWZmZWN0T3BlcmF0aW9ucyhwcm9ncmFtKVxuXG4gIGlmIChwcm9ncmFtV2lkZS5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGxcbiAgY29uc3QgY29udHJhY3RzID0gcHJvZ3JhbS5zdGRsaWJDb250cmFjdHMgPz8gWy8qKiBAdHlwZSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbj86IHN0cmluZ319ICovIChwcm9ncmFtLnN0ZGxpYkNvbnRyYWN0KV1cbiAgY29uc3QgY29udHJhY3RzQnlJZGVudGl0eSA9IG5ldyBNYXAoY29udHJhY3RzLm1hcCgoY29udHJhY3QpID0+IFtjb250cmFjdC5pZGVudGl0eSwgY29udHJhY3RdKSlcbiAgY29uc3QgcmVxdWlyZW1lbnRzQnlNb2R1bGUgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHF1YWxpZmllZCBvZiBwcm9ncmFtV2lkZSkge1xuICAgIGNvbnN0IHJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnRzQnlNb2R1bGUuZ2V0KHF1YWxpZmllZC5tb2R1bGUpID8/IFtdXG5cbiAgICByZXF1aXJlbWVudC5wdXNoKHF1YWxpZmllZC5vcGVyYXRpb24pXG4gICAgcmVxdWlyZW1lbnRzQnlNb2R1bGUuc2V0KHF1YWxpZmllZC5tb2R1bGUsIHJlcXVpcmVtZW50KVxuICB9XG4gIGNvbnN0IG5lZ290aWF0aW9uID0gbmVnb3RpYXRlU3RkbGliUHJvdmlkZXJzKHtcbiAgICByZXF1aXJlbWVudHM6IFsuLi5yZXF1aXJlbWVudHNCeU1vZHVsZV0ubWFwKChbbW9kdWxlLCBvcGVyYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgY29udHJhY3QgPSBjb250cmFjdHNCeUlkZW50aXR5LmdldChtb2R1bGUpXG5cbiAgICAgIGlmICghY29udHJhY3QpIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBSZWFjaGFibGUgY2Fub25pY2FsIG9wZXJhdGlvbiAnJHttb2R1bGV9LiR7b3BlcmF0aW9uc1swXX0nIGhhcyBubyBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0LmBcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge21vZHVsZSwgb3BlcmF0aW9ucywgLi4uKGNvbnRyYWN0LmNvbnRyYWN0VmVyc2lvbiAhPT0gdW5kZWZpbmVkID8ge3JhbmdlOiBjb250cmFjdC5jb250cmFjdFZlcnNpb259IDoge30pfVxuICAgIH0pLFxuICAgIHRhcmdldDogbGFuZ3VhZ2VcbiAgfSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gKi9cbiAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgc2VsZWN0ZWQgb2YgbmVnb3RpYXRpb24ubW9kdWxlcykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBzdGRsaWJQcm92aWRlclJlZ2lzdHJ5LnByb3ZpZGVyc0ZvcihsYW5ndWFnZSwgc2VsZWN0ZWQuaWRlbnRpdHksIHNlbGVjdGVkLnZlcnNpb24pXG5cbiAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggIT0gMSkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYEV4cGVjdGVkIGV4YWN0bHkgb25lIHJlZ2lzdGVyZWQgc3RkbGliIHByb3ZpZGVyIGZvciAnJHtzZWxlY3RlZC5pZGVudGl0eX0nIG9uICcke2xhbmd1YWdlfScuYFxuICAgICAgfSlcbiAgICB9XG4gICAgcmVjb3Jkcy5zZXQoc2VsZWN0ZWQuaWRlbnRpdHksIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZH0gKi8gKGNhbmRpZGF0ZXNbMF0pKVxuICB9XG4gIGNvbnN0IG93bmVyTW9kdWxlSWQgPSBsYW5ndWFnZSA9PSBcImphdmFcIlxuICAgID8gcHJvZ3JhbS5tb2R1bGVzLm1hcCgobW9kdWxlKSA9PiBtb2R1bGUuaWQpLmZpbmQoKGlkKSA9PiAodXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQoaWQpID8/IFtdKS5sZW5ndGggPiAwKVxuICAgIDogbnVsbFxuXG4gIGlmIChvd25lck1vZHVsZUlkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgIGxhbmd1YWdlLFxuICAgIG1lc3NhZ2U6IFwiSmF2YSBwcm9ncmFtIGxpbmtpbmcgcmVxdWlyZXMgb25lIG1vZHVsZSB1c2luZyBjYW5vbmljYWwgb3BlcmF0aW9ucy5cIlxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgbmVnb3RpYXRpb24sXG4gICAgb3duZXJNb2R1bGVJZCxcbiAgICBwcm92aWRlckltcG9ydHNCeU1vZHVsZTogY29sbGVjdFByb3ZpZGVySW1wb3J0cyhwcm9ncmFtLCBuZWdvdGlhdGlvbiwgcmVjb3JkcywgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSwgbGFuZ3VhZ2UsIG93bmVyTW9kdWxlSWQpLFxuICAgIHByb3ZpZGVyUGF0aHNCeU1vZHVsZTogY29sbGVjdFByb3ZpZGVyUGF0aHMobmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUpLFxuICAgIHJlY29yZHMsXG4gICAgdXNlZE9wZXJhdGlvbnM6IFsuLi5wcm9ncmFtV2lkZV0sXG4gICAgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZVxuICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZXhhY3QgcHJvdmlkZXIvdHlwZSBkZXBlbmRlbmN5IGNsb3N1cmUgcmVxdWlyZWQgYnkgZWFjaCBlbWl0dGluZyBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCIpLlN0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSBuZWdvdGlhdGlvbiAtIE5lZ290aWF0ZWQgcHJvZ3JhbSBjbG9zdXJlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gcmVjb3JkcyAtIFNlbGVjdGVkIHByb3ZpZGVyIHJlY29yZHMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn0gdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSAtIFJlYWNoYWJsZSBvcGVyYXRpb25zIGJ5IHByb2dyYW0gbW9kdWxlLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gT3JkZXJlZCBwcm92aWRlciBwYXRocyBieSBwcm9ncmFtIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFByb3ZpZGVyUGF0aHMobmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUpIHtcbiAgY29uc3QgcGF0aHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IFttb2R1bGVJZCwgb3BlcmF0aW9uc10gb2YgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldChvcGVyYXRpb25zLm1hcCgoe21vZHVsZX0pID0+IG1vZHVsZSkpXG4gICAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgICB3aGlsZSAoY2hhbmdlZCkge1xuICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBbLi4uc2VsZWN0ZWRdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiByZWNvcmRzLmdldChtb2R1bGUpPy5kZXBlbmRlbmNpZXMgPz8gW10pIHtcbiAgICAgICAgICBpZiAoIXNlbGVjdGVkLmhhcyhkZXBlbmRlbmN5Lm1vZHVsZSkpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkLmFkZChkZXBlbmRlbmN5Lm1vZHVsZSlcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHBhdGhzLnNldChtb2R1bGVJZCwgbmVnb3RpYXRpb24ucHJvdmlkZXJzLmZpbHRlcigoe21vZHVsZX0pID0+IHNlbGVjdGVkLmhhcyhtb2R1bGUpKS5tYXAoKHttb2R1bGV9KSA9PlxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAocmVjb3Jkcy5nZXQobW9kdWxlKSkuYXJ0aWZhY3QucGF0aCkpXG4gIH1cbiAgcmV0dXJuIHBhdGhzXG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIGNhbm9uaWNhbCBvcGVyYXRpb25zIGludm9rZWQgYnkgZWFjaCBwcm9ncmFtIG1vZHVsZSBpbiBzdGFibGUgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHJldHVybnMge3twcm9ncmFtV2lkZTogUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10sIHVzZWRPcGVyYXRpb25zQnlNb2R1bGU6IE1hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn19IFVzZWQgb3BlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFVzZWRFZmZlY3RPcGVyYXRpb25zKHByb2dyYW0pIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59ICovXG4gIGNvbnN0IHVzZWRPcGVyYXRpb25zQnlNb2R1bGUgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb24+fSAqL1xuICBjb25zdCBwcm9ncmFtV2lkZSA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtib2R5OiB1bmtub3duLCBtb2R1bGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0+fSAqL1xuICBjb25zdCBib2RpZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIGJvZGllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHtib2R5OiBkZWNsYXJhdGlvbi5ib2R5LCBtb2R1bGV9KVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICAgIGJvZGllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5pZCksIHtib2R5OiBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5LCBtb2R1bGV9KVxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcykgYm9kaWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKG1ldGhvZC5pZCksIHtib2R5OiBtZXRob2QuYm9keSwgbW9kdWxlfSlcbiAgICB9XG4gICAgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5zZXQobW9kdWxlLmlkLCBbXSlcbiAgfVxuICBjb25zdCBlbnRyeU1vZHVsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAoXG4gICAgcHJvZ3JhbS5tb2R1bGVzLmZpbmQoKHtpZH0pID0+IGlkID09IHByb2dyYW0uZW50cnlNb2R1bGUpKVxuICAvKiogQHR5cGUge3tib2R5OiB1bmtub3duLCBtb2R1bGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX1bXX0gKi9cbiAgY29uc3QgcGVuZGluZyA9IFt7Ym9keTogZW50cnlNb2R1bGUuZW50cnlQb2ludD8uYm9keSwgbW9kdWxlOiBlbnRyeU1vZHVsZX1dXG4gIGNvbnN0IHJlYWNoZWREZWNsYXJhdGlvbnMgPSBuZXcgU2V0KClcblxuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY3VycmVudCA9IC8qKiBAdHlwZSB7e2JvZHk6IHVua25vd24sIG1vZHVsZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfX0gKi8gKHBlbmRpbmcuc2hpZnQoKSlcbiAgICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBNYXAoY3VycmVudC5tb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKChjYXBhYmlsaXR5KSA9PlxuICAgICAgY2FwYWJpbGl0eS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCB7bW9kdWxlOiBjYXBhYmlsaXR5LmF1dGhvcml0eUlkLCBvcGVyYXRpb246IG9wZXJhdGlvbi5uYW1lfV0pKSA/PyBbXSlcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBWaXNpdHMgb25lIHJlYWNoYWJsZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICAgKi9cbiAgICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVyblxuICAgICAgc2Vlbi5hZGQodmFsdWUpXG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIilcblxuICAgICAgICBpZiAoa2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJvcGVyYXRpb25cIilcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpZmllZCA9IG9wZXJhdGlvbk5hbWVzLmdldChvcGVyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChxdWFsaWZpZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRPcGVyYXRpb25LZXkocXVhbGlmaWVkLm1vZHVsZSwgcXVhbGlmaWVkLm9wZXJhdGlvbilcbiAgICAgICAgICAgICAgY29uc3QgbW9kdWxlT3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7UXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW119ICovICh1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChjdXJyZW50Lm1vZHVsZS5pZCkpXG5cbiAgICAgICAgICAgICAgaWYgKCFtb2R1bGVPcGVyYXRpb25zLnNvbWUoKGl0ZW0pID0+IHF1YWxpZmllZE9wZXJhdGlvbktleShpdGVtLm1vZHVsZSwgaXRlbS5vcGVyYXRpb24pID09IGtleSkpIG1vZHVsZU9wZXJhdGlvbnMucHVzaChxdWFsaWZpZWQpXG4gICAgICAgICAgICAgIHByb2dyYW1XaWRlLnNldChrZXksIHF1YWxpZmllZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25JZCA9IGlzUGxhaW5PYmplY3QoUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb2x1dGlvblwiKSlcbiAgICAgICAgICA/IFJlZmxlY3QuZ2V0KFJlZmxlY3QuZ2V0KHZhbHVlLCBcInJlc29sdXRpb25cIiksIFwiZGVjbGFyYXRpb25JZFwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmICFyZWFjaGVkRGVjbGFyYXRpb25zLmhhcyhkZWNsYXJhdGlvbklkKSkge1xuICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gYm9kaWVzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZWFjaGVkRGVjbGFyYXRpb25zLmFkZChkZWNsYXJhdGlvbklkKVxuICAgICAgICAgICAgcGVuZGluZy5wdXNoKGRlY2xhcmF0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoW1wiY2FwYWJpbGl0aWVzXCIsIFwibG9jYXRpb25cIiwgXCJwcm92ZW5hbmNlXCIsIFwicmVzb2x1dGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgICAgICB2aXNpdChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWUpIHZpc2l0KGNoaWxkKVxuICAgIH1cblxuICAgIHZpc2l0KGN1cnJlbnQuYm9keSlcbiAgfVxuICBmb3IgKGNvbnN0IG9wZXJhdGlvbnMgb2YgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZS52YWx1ZXMoKSkge1xuICAgIG9wZXJhdGlvbnMuc29ydCgobGVmdCwgcmlnaHQpID0+IHF1YWxpZmllZE9wZXJhdGlvbktleShsZWZ0Lm1vZHVsZSwgbGVmdC5vcGVyYXRpb24pXG4gICAgICAubG9jYWxlQ29tcGFyZShxdWFsaWZpZWRPcGVyYXRpb25LZXkocmlnaHQubW9kdWxlLCByaWdodC5vcGVyYXRpb24pLCBcImVuXCIpKVxuICB9XG4gIHJldHVybiB7cHJvZ3JhbVdpZGU6IFsuLi5wcm9ncmFtV2lkZS52YWx1ZXMoKV0uc29ydCgobGVmdCwgcmlnaHQpID0+IHF1YWxpZmllZE9wZXJhdGlvbktleShsZWZ0Lm1vZHVsZSwgbGVmdC5vcGVyYXRpb24pXG4gICAgLmxvY2FsZUNvbXBhcmUocXVhbGlmaWVkT3BlcmF0aW9uS2V5KHJpZ2h0Lm1vZHVsZSwgcmlnaHQub3BlcmF0aW9uKSwgXCJlblwiKSksIHVzZWRPcGVyYXRpb25zQnlNb2R1bGV9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIHVuYW1iaWd1b3VzIGludGVybmFsIGtleSBmb3Igb25lIGNhbm9uaWNhbCBvcGVyYXRpb24gYXV0aG9yaXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gQ2Fub25pY2FsIG9wZXJhdGlvbiBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gUXVhbGlmaWVkIGludGVybmFsIGtleS5cbiAqL1xuZnVuY3Rpb24gcXVhbGlmaWVkT3BlcmF0aW9uS2V5KG1vZHVsZSwgb3BlcmF0aW9uKSB7XG4gIHJldHVybiBgJHttb2R1bGV9XFx1MDAwMCR7b3BlcmF0aW9ufWBcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgb3JkZXJlZCBwcm92aWRlciBpbXBvcnQgbmFtZXMgZWFjaCBtb2R1bGUgbXVzdCBwdWxsIGZyb20gdGhlIGxpbmtlZCBwcm92aWRlci5cbiAqIEphdmEgbW9kdWxlcyBsaXN0IHJlZmVyZW5jZWQgY2FwYWJpbGl0eSB0eXBlIG5hbWVzIG9ubHk7IHRoZSBvd25lciBsaXN0cyBub25lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBWYWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCIpLlN0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSBuZWdvdGlhdGlvbiAtIE5lZ290aWF0ZWQgY2xvc3VyZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZD59IHJlY29yZHMgLSBQcm92aWRlciByZWNvcmRzIGJ5IGNhbm9uaWNhbCBtb2R1bGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn0gdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSAtIFVzZWQgY2Fub25pY2FsIG9wZXJhdGlvbnMgYnkgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gW293bmVyTW9kdWxlSWRdIC0gSmF2YSBvd25lciBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgc3RyaW5nW10+fSBPcmRlcmVkIHByb3ZpZGVyIGltcG9ydCBuYW1lcyBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQcm92aWRlckltcG9ydHMocHJvZ3JhbSwgbmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUsIGxhbmd1YWdlLCBvd25lck1vZHVsZUlkID0gbnVsbCkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gKi9cbiAgY29uc3QgcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGUgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBpZiAobW9kdWxlLmNhcGFiaWxpdGllcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KCh1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChtb2R1bGUuaWQpID8/IFtdKS5tYXAoKHttb2R1bGU6IG93bmVyLCBvcGVyYXRpb259KSA9PlxuICAgICAgcXVhbGlmaWVkT3BlcmF0aW9uS2V5KG93bmVyLCBvcGVyYXRpb24pKSlcbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHN1cmZhY2UgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lQnlJZCA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uTmFtZXMgPSBuZXcgTWFwKChtb2R1bGUucmVjb3JkcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbi5uYW1lXSkpXG5cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5lcnJvcnMgPz8gW10pIHtcbiAgICAgIGRlY2xhcmF0aW9uTmFtZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbi5uYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBtb2R1bGUuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNhcGFiaWxpdHkucmVzb3VyY2VzKSB7XG4gICAgICAgIHN1cmZhY2UuYWRkKHJlc291cmNlLm5hbWUpXG4gICAgICAgIHJlc291cmNlTmFtZUJ5SWQuc2V0KHJlc291cmNlLmlkLCByZXNvdXJjZS5uYW1lKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMpIHtcbiAgICAgICAgc3VyZmFjZS5hZGQoZmFpbHVyZS5uYW1lKVxuICAgICAgICBkZWNsYXJhdGlvbk5hbWVzLnNldChmYWlsdXJlLmlkLCBmYWlsdXJlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBuZXcgU2V0KClcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBWaXNpdHMgb25lIHNlbWFudGljIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVyblxuICAgICAgc2Vlbi5hZGQodmFsdWUpXG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIilcblxuICAgICAgICBpZiAoa2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHtcbiAgICAgICAgICBjb25zdCByZXNvdXJjZUlkID0gUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb3VyY2VJZFwiKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZUlkID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSByZXNvdXJjZU5hbWVCeUlkLmdldChyZXNvdXJjZUlkKVxuXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSByZWZlcmVuY2VkLmFkZChuYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09IFwiUmVmZXJlbmNlVHlwZVwiIHx8IGtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiB8fCBraW5kID09IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gUmVmbGVjdC5nZXQodmFsdWUsIFwiZGVjbGFyYXRpb25JZFwiKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNsYXJhdGlvbk5hbWVzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkICYmIHN1cmZhY2UuaGFzKG5hbWUpKSByZWZlcmVuY2VkLmFkZChuYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoa2V5ID09IFwiY2FwYWJpbGl0aWVzXCIgfHwga2V5ID09IFwibG9jYXRpb25cIiB8fCBrZXkgPT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpIGNvbnRpbnVlXG4gICAgICAgICAgdmlzaXQoY2hpbGQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlKSB2aXNpdChjaGlsZClcbiAgICB9XG5cbiAgICB2aXNpdChtb2R1bGUpXG4gICAgY29uc3QgbmFtZXMgPSBbXVxuXG4gICAgaWYgKGxhbmd1YWdlICE9IFwiamF2YVwiIHx8IG1vZHVsZS5pZCAhPSBvd25lck1vZHVsZUlkKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgbW9kdWxlLmNhcGFiaWxpdGllcykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNhcGFiaWxpdHkucmVzb3VyY2VzKSBpZiAocmVmZXJlbmNlZC5oYXMocmVzb3VyY2UubmFtZSkpIG5hbWVzLnB1c2gocmVzb3VyY2UubmFtZSlcbiAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMpIGlmIChyZWZlcmVuY2VkLmhhcyhmYWlsdXJlLm5hbWUpKSBuYW1lcy5wdXNoKGZhaWx1cmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxhbmd1YWdlICE9IFwiamF2YVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIG5lZ290aWF0aW9uLnByb3ZpZGVycykge1xuICAgICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzLmdldChwcm92aWRlci5tb2R1bGUpXG5cbiAgICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgcHJvdmlkZXIub3BlcmF0aW9ucykge1xuICAgICAgICAgIGlmICh1c2VkLmhhcyhxdWFsaWZpZWRPcGVyYXRpb25LZXkocHJvdmlkZXIubW9kdWxlLCBvcGVyYXRpb24pKSkge1xuICAgICAgICAgICAgbmFtZXMucHVzaCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlY29yZD8ubmF0aXZlRW50cmllc1tvcGVyYXRpb25dKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm92aWRlckltcG9ydHNCeU1vZHVsZS5zZXQobW9kdWxlLmlkLCBuYW1lcylcbiAgfVxuICByZXR1cm4gcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGVcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHRydXRoZnVsIGdlbmVyYXRlZCBzdGRsaWIgbGluayBtZXRhZGF0YSBmb3Igb25lIG5lZ290aWF0ZWQgY2xvc3VyZS5cbiAqIEphdmEgcmVwb3J0cyB0aGUgb3duZXIgbW9kdWxlIGZpbGUgYXMgdGhlIHByb3ZpZGVyIGNhcnJpZXIgaW5zdGVhZCBvZiBhIHNlcGFyYXRlIGFydGlmYWN0LlxuICogQHBhcmFtIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IGxpbmtpbmcgLSBMaW5raW5nIHBsYW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHBhdGhzIC0gUGxhbm5lZCBhcnRpZmFjdCBwYXRoIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3IgfCB1bmRlZmluZWR9IGZhY2FkZXMgLSBTZWxlY3RlZCBzb3VyY2UgZmFjYWRlIGNsb3N1cmUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFBsYWluIEpTT04gbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIHN0ZGxpYkxpbmtNZXRhZGF0YShsaW5raW5nLCBwYXRocywgZmFjYWRlcykge1xuICByZXR1cm4ge1xuICAgIC4uLihmYWNhZGVzID8ge2ZhY2FkZXN9IDoge30pLFxuICAgIG1vZHVsZXM6IChsaW5raW5nPy5uZWdvdGlhdGlvbi5tb2R1bGVzID8/IFtdKS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICBpZGVudGl0eTogaXRlbS5pZGVudGl0eSxcbiAgICAgIG9wZXJhdGlvbnM6IFsuLi5pdGVtLm9wZXJhdGlvbnNdLFxuICAgICAgdmVyc2lvbjogaXRlbS52ZXJzaW9uXG4gICAgfSkpLFxuICAgIHByb3ZpZGVyczogKGxpbmtpbmc/Lm5lZ290aWF0aW9uLnByb3ZpZGVycyA/PyBbXSkubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSBsaW5raW5nPy5yZWNvcmRzLmdldChpdGVtLm1vZHVsZSlcbiAgICAgIGNvbnN0IGFydGlmYWN0UGF0aCA9IGxpbmtpbmc/Lm93bmVyTW9kdWxlSWQgIT09IG51bGwgJiYgbGlua2luZz8ub3duZXJNb2R1bGVJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRocy5nZXQobGlua2luZy5vd25lck1vZHVsZUlkKSlcbiAgICAgICAgOiByZWNvcmQ/LmFydGlmYWN0LnBhdGhcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJ0aWZhY3Q6IHttZWRpYVR5cGU6IHJlY29yZD8uYXJ0aWZhY3QubWVkaWFUeXBlLCBwYXRoOiBhcnRpZmFjdFBhdGh9LFxuICAgICAgICBkZXBlbmRlbmNpZXM6IChyZWNvcmQ/LmRlcGVuZGVuY2llcyA/PyBbXSkubWFwKChkZXBlbmRlbmN5KSA9PiAoe21vZHVsZTogZGVwZW5kZW5jeS5tb2R1bGUsIHJhbmdlOiBkZXBlbmRlbmN5LnJhbmdlfSkpLFxuICAgICAgICBpZGVudGl0eTogaXRlbS5pZGVudGl0eSxcbiAgICAgICAgbW9kdWxlOiBpdGVtLm1vZHVsZSxcbiAgICAgICAgbmF0aXZlRW50cmllczogey4uLml0ZW0ubmF0aXZlRW50cmllc30sXG4gICAgICAgIG9wZXJhdGlvbnM6IFsuLi5pdGVtLm9wZXJhdGlvbnNdLFxuICAgICAgICB0YXJnZXQ6IGl0ZW0udGFyZ2V0LFxuICAgICAgICB2ZXJzaW9uOiBpdGVtLnZlcnNpb25cbiAgICAgIH1cbiAgICB9KSxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRTdGRsaWJMaW5rXCIsXG4gICAgdmVyc2lvbjogMVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGV2ZXJ5IG1hbmRhdG9yeSBzZW1hbnRpYyBsb2NhdGlvbiBhZ2FpbnN0IGl0cyBvd25pbmcgbW9kdWxlIHNvdXJjZSBiZWZvcmUgd3JpdGVyIGFsbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFN0cnVjdHVyYWxseSBhbmQgc2VtYW50aWNhbGx5IHZhbGlkYXRlZCBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW1Tb3VyY2VPd25lcnNoaXAocHJvZ3JhbSwgbGFuZ3VhZ2UpIHtcbiAgY29uc3Qgc291cmNlcyA9IG5ldyBNYXAocHJvZ3JhbS5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmZpbGVuYW1lLCB7XG4gICAgLi4uc291cmNlLFxuICAgIGNvb3JkaW5hdGVzOiBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXG4gIH1dKSlcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLmdldChtb2R1bGUuc291cmNlRmlsZW5hbWUpXG5cbiAgICBpZiAoIXNvdXJjZSkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInNlbWFudGljIHByb2dyYW0gbW9kdWxlIHNvdXJjZSBvd25lcnNoaXBcIiwgdW5kZWZpbmVkKVxuICAgIGNvbnN0IGZhbGxiYWNrID0gbW9kdWxlTG9jYXRpb24oc291cmNlLmZpbGVuYW1lLCAvKiogQHR5cGUge3N0cmluZ30gKi8gKHNvdXJjZS5jb250ZW50KSlcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc2VtYW50aWNFbnRyaWVzKG1vZHVsZSkpIHtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBlbnRyeS5ub2RlLmtpbmQgPT0gXCJNb2R1bGVcIiA/IFwibW9kdWxlXCIgOiBlbnRyeS5ub2RlLmtpbmQgPT0gXCJJbXBvcnRcIiA/IFwiaW1wb3J0XCIgOlxuICAgICAgICBlbnRyeS5ub2RlLmtpbmQgPT0gXCJFeHBvcnRcIiA/IFwiZXhwb3J0XCIgOiBcInNlbWFudGljIG5vZGVcIlxuXG4gICAgICBpZiAoIShcImxvY2F0aW9uXCIgaW4gZW50cnkubm9kZSkpIHtcbiAgICAgICAgaWYgKHN1YmplY3QgIT0gXCJzZW1hbnRpYyBub2RlXCIpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHNlbWFudGljIHByb2dyYW0gJHtzdWJqZWN0fSBsb2NhdGlvbmAsIGZhbGxiYWNrKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgbG9jYXRpb24gPSBlbnRyeS5ub2RlLmxvY2F0aW9uXG5cbiAgICAgIGlmIChzb3VyY2VPd25zTG9jYXRpb24oc291cmNlLCBsb2NhdGlvbikpIGNvbnRpbnVlXG5cbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHNlbWFudGljIHByb2dyYW0gJHtzdWJqZWN0fSBsb2NhdGlvbiBzb3VyY2Ugb3duZXJzaGlwYCwgZmFsbGJhY2spXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9ybWFsaXplZCBVVEYtMTYgbG9jYXRpb24gYWdhaW5zdCBvbmUgZXhhY3QgcmVnaXN0ZXJlZCBzb3VyY2Ugd2l0aG91dCB0aHJvd2luZy5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwsIGNvb3JkaW5hdGVzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+fX0gc291cmNlIC0gT3duaW5nIHNvdXJjZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIGxvY2F0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNvdXJjZSBvd25zIHRoZSBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gc291cmNlT3duc0xvY2F0aW9uKHNvdXJjZSwgY2FuZGlkYXRlKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5maWxlbmFtZSAhPSBzb3VyY2UuZmlsZW5hbWUgfHwgIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlLnN0YXJ0KSB8fFxuICAgICFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZS5lbmQpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydC5vZmZzZXQpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5lbmQub2Zmc2V0KSB8fFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydC5saW5lKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuc3RhcnQuY29sdW1uKSB8fFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5lbmQubGluZSkgfHwgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLmVuZC5jb2x1bW4pKSByZXR1cm4gZmFsc2VcbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNhbmRpZGF0ZS5zdGFydC5vZmZzZXQpXG4gIGNvbnN0IGVuZE9mZnNldCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLmVuZC5vZmZzZXQpXG5cbiAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCB8fCBlbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCBlbmRPZmZzZXQgPiBzb3VyY2UuY29vcmRpbmF0ZXMuc291cmNlLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGV4cGVjdGVkU3RhcnQgPSBpbmRleGVkUG9pbnRBdChzb3VyY2UuY29vcmRpbmF0ZXMsIHN0YXJ0T2Zmc2V0KVxuICBjb25zdCBleHBlY3RlZEVuZCA9IGluZGV4ZWRQb2ludEF0KHNvdXJjZS5jb29yZGluYXRlcywgZW5kT2Zmc2V0KVxuXG4gIHJldHVybiBzYW1lUG9pbnQoY2FuZGlkYXRlLnN0YXJ0LCBleHBlY3RlZFN0YXJ0KSAmJiBzYW1lUG9pbnQoY2FuZGlkYXRlLmVuZCwgZXhwZWN0ZWRFbmQpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgYW4gdW50cnVzdGVkIHBvaW50IHdpdGggb25lIGNhbm9uaWNhbCBpbmRleGVkIHBvaW50LlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIHBvaW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gZXhwZWN0ZWQgLSBDYW5vbmljYWwgcG9pbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBldmVyeSBjb29yZGluYXRlIGFncmVlcy5cbiAqL1xuZnVuY3Rpb24gc2FtZVBvaW50KGNhbmRpZGF0ZSwgZXhwZWN0ZWQpIHtcbiAgcmV0dXJuIGNhbmRpZGF0ZS5vZmZzZXQgPT0gZXhwZWN0ZWQub2Zmc2V0ICYmIGNhbmRpZGF0ZS5saW5lID09IGV4cGVjdGVkLmxpbmUgJiYgY2FuZGlkYXRlLmNvbHVtbiA9PSBleHBlY3RlZC5jb2x1bW5cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcyByZWZlcmVuY2VkIGJ5IGV4ZWN1dGFibGUvdHlwZSBub2RlcyBvdXRzaWRlIHRoZSBtb2R1bGUncyBhdXRob3JpdHkgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9IG1vZHVsZSAtIFByb2dyYW0gbW9kdWxlLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBSZWZlcmVuY2VkIGZhaWx1cmUgZGVjbGFyYXRpb24gaWRlbnRpdGllcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZWRGYWlsdXJlSWRzKG1vZHVsZSkge1xuICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICBjb25zdCBpZHMgPSBuZXcgU2V0KClcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAvKipcbiAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyBzdWJ0cmVlIGZvciByZWZlcmVuY2VkIGZhaWx1cmVzLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm5cbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIkVycm9yVHlwZVwiICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWRzLmFkZChSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpKVxuICAgICAgfVxuICAgICAgY29uc3QgZmFpbHVyZUlkcyA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImZhaWx1cmVJZHNcIilcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmFpbHVyZUlkcykpIGZvciAoY29uc3QgaWQgb2YgZmFpbHVyZUlkcykgaWYgKHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiKSBpZHMuYWRkKGlkKVxuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGlmIChbXCJjYXBhYmlsaXRpZXNcIiwgXCJsb2NhdGlvblwiLCBcInByb3ZlbmFuY2VcIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICAgIHZpc2l0KGNoaWxkKVxuICAgICAgfVxuICAgIH0gZWxzZSBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlKSB2aXNpdChjaGlsZClcbiAgfVxuXG4gIHZpc2l0KHtjbGFzc2VzOiBtb2R1bGUuY2xhc3NlcywgZW50cnlQb2ludDogbW9kdWxlLmVudHJ5UG9pbnQsIGZ1bmN0aW9uczogbW9kdWxlLmZ1bmN0aW9uc30pXG4gIHJldHVybiBpZHNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCB2YWxpZGF0ZXMgZXZlcnkgYmFja2VuZC1zaGFwZWQgbW9kdWxlIGJlZm9yZSBhbnkgd3JpdGVyIGlzIGFsbG9jYXRlZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IFtsaW5raW5nXSAtIFBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGxpbmsuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGVbXX0gRW1pc3Npb24gdmlld3MgaW4gZGVwZW5kZW5jeSBvcmRlci5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUVtaXNzaW9uTW9kdWxlcyhwcm9ncmFtLCBsYW5ndWFnZSwgbGlua2luZyA9IG51bGwpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59ICovXG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLnJlY29yZHMgPz8gW10pIGRlY2xhcmF0aW9ucy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uKVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIGRlY2xhcmF0aW9ucy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uKVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmVycm9ycyA/PyBbXSkgZGVjbGFyYXRpb25zLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24pXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSBkZWNsYXJhdGlvbnMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbilcbiAgfVxuICBjb25zdCBtb2R1bGVzID0gcHJvZ3JhbS5tb2R1bGVzLm1hcCgobW9kdWxlKSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSAqLyAoe1xuICAgIC4uLm1vZHVsZSxcbiAgICBlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCA/PyB7XG4gICAgICBib2R5OiB7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmxvY2tcIiksIGxvY2F0aW9uOiBtb2R1bGUubG9jYXRpb24sIHN0YXRlbWVudHM6IFtdfSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkVudHJ5UG9pbnRcIiksXG4gICAgICBsb2NhdGlvbjogbW9kdWxlLmxvY2F0aW9uXG4gICAgfVxuICB9KSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59ICovXG4gIGNvbnN0IGNhbGxFZmZlY3RzQnlEZWNsYXJhdGlvbklkID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgIGNvbnN0IHByb2dyYW1Nb2R1bGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG1vZHVsZSkpXG4gICAgY29uc3QgdmlzaWJsZUZ1bmN0aW9ucyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHZpc2libGVDYWxsRWZmZWN0cyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHZpc2libGVSZWNvcmRzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdmlzaWJsZUNsYXNzZXMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2aXNpYmxlRXJyb3JzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgZXh0ZXJuYWxEZWNsYXJhdGlvbklkcyA9IG5ldyBTZXQoKVxuXG4gICAgY29uc3QgbmVlZGVkRmFpbHVyZUlkcyA9IGNvbGxlY3RSZWZlcmVuY2VkRmFpbHVyZUlkcyhwcm9ncmFtTW9kdWxlKVxuICAgIGNvbnN0IGxvY2FsRmFpbHVyZUlkcyA9IG5ldyBTZXQocHJvZ3JhbU1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzLm1hcCgoe2lkfSkgPT4gaWQpKSA/PyBbXSlcblxuICAgIGZvciAoY29uc3Qgb3duZXIgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgICBpZiAob3duZXIuaWQgPT0gcHJvZ3JhbU1vZHVsZS5pZCkgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBvd25lci5jYXBhYmlsaXRpZXMgPz8gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMpIHtcbiAgICAgICAgICBpZiAoIWxvY2FsRmFpbHVyZUlkcy5oYXMoZmFpbHVyZS5pZCkgJiYgbmVlZGVkRmFpbHVyZUlkcy5oYXMoZmFpbHVyZS5pZCkpIHZpc2libGVFcnJvcnMuc2V0KGZhaWx1cmUuaWQsIGZhaWx1cmUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIHByb2dyYW1Nb2R1bGUuaW1wb3J0cykge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnMuZ2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQpXG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24pIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIGltcG9ydCB3aXRob3V0IGEgZGVjbGFyYXRpb25cIiwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICBleHRlcm5hbERlY2xhcmF0aW9uSWRzLmFkZChpbXBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICAgICAgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHZpc2libGVGdW5jdGlvbnMuc2V0KGltcG9ydGVkLmxvY2FsTmFtZSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb24pKVxuICAgICAgICB2aXNpYmxlQ2FsbEVmZmVjdHMuc2V0KGltcG9ydGVkLmxvY2FsTmFtZSwgbmV3IFNldChjYWxsRWZmZWN0c0J5RGVjbGFyYXRpb25JZC5nZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCkgPz8gW10pKVxuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kID09IFwicmVjb3JkXCIpIHtcbiAgICAgICAgdmlzaWJsZVJlY29yZHMuc2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICB9IGVsc2UgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIHZpc2libGVDbGFzc2VzLnNldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aXNpYmxlRXJyb3JzLnNldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2R1bGUuY2FwYWJpbGl0aWVzICE9PSB1bmRlZmluZWQgfHwgIWxpbmtpbmcpIHtcbiAgICAgIHByZWZsaWdodEVmZmVjdENhcGFiaWxpdGllcyhtb2R1bGUsIGxhbmd1YWdlLCBsaW5raW5nID8ge3VzZWRPcGVyYXRpb25zOiAobGlua2luZy51c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChwcm9ncmFtTW9kdWxlLmlkKSA/PyBbXSlcbiAgICAgICAgLm1hcCgoe29wZXJhdGlvbn0pID0+IG9wZXJhdGlvbil9IDoge30pXG4gICAgfVxuICAgIHZhbGlkYXRlQmFja2VuZE1vZHVsZShtb2R1bGUsIGxhbmd1YWdlLCB7XG4gICAgICBleHRlcm5hbERlY2xhcmF0aW9uSWRzLFxuICAgICAgcHJvZ3JhbTogdHJ1ZSxcbiAgICAgIHZpc2libGVDYWxsRWZmZWN0cyxcbiAgICAgIHZpc2libGVDbGFzc2VzLFxuICAgICAgdmlzaWJsZUVycm9ycyxcbiAgICAgIHZpc2libGVGdW5jdGlvbnMsXG4gICAgICB2aXNpYmxlUmVjb3Jkc1xuICAgIH0pXG4gICAgY29uc3QgbG9jYWxDYWxsRWZmZWN0cyA9IG1vZHVsZVVuY2hlY2tlZEVycm9yRWZmZWN0cyhtb2R1bGUsIHtjYWxsRWZmZWN0czogdmlzaWJsZUNhbGxFZmZlY3RzLCBmdW5jdGlvbnM6IHZpc2libGVGdW5jdGlvbnN9KVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB7XG4gICAgICBjYWxsRWZmZWN0c0J5RGVjbGFyYXRpb25JZC5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIG5ldyBTZXQobG9jYWxDYWxsRWZmZWN0cy5nZXQoZGVjbGFyYXRpb24ubmFtZSkgPz8gW10pKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2R1bGVzXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBjbG9zZWQgcGFyc2VyLW5ldXRyYWwgcHJvZ3JhbSBncmFwaCBiZWZvcmUgYW55IHRhcmdldCBlbWlzc2lvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZT4+fSBbc291cmNlTGFuZ3VhZ2VzXSAtIEFjY2VwdGVkIHNvdXJjZSBsYW5ndWFnZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBWYWxpZGF0ZWQgcHJvZ3JhbS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtKGNhbmRpZGF0ZSwgbGFuZ3VhZ2UsIHNvdXJjZUxhbmd1YWdlcyA9IHByb2dyYW1UYXJnZXRzKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5raW5kICE9IFwiUHJvZ3JhbVwiIHx8IHR5cGVvZiBjYW5kaWRhdGUuZW50cnlNb2R1bGUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlLm1vZHVsZXMpIHx8IGNhbmRpZGF0ZS5tb2R1bGVzLmxlbmd0aCA9PSAwIHx8ICFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlLnNvdXJjZXMpIHx8IGNhbmRpZGF0ZS5zb3VyY2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKFwiTWFsZm9ybWVkIHNlbWFudGljIHByb2dyYW0uXCIpXG4gIH1cbiAgY29uc3QgcHJvZ3JhbSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSAqLyAoY2FuZGlkYXRlKVxuICBjb25zdCBtb2R1bGVzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2RlY2xhcmF0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbiwgbW9kdWxlOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9Pn0gKi9cbiAgY29uc3QgZGVjbGFyYXRpb25zID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlW119ICovXG4gIGNvbnN0IGNhcGFiaWxpdHlNb2R1bGVzID0gW11cbiAgbGV0IGVudHJ5Q291bnQgPSAwXG4gIGNvbnN0IHNvdXJjZUlkcyA9IG5ldyBTZXQoKVxuICBjb25zdCBzb3VyY2VGaWxlbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9ncmFtLnNvdXJjZXMpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc291cmNlKSB8fCB0eXBlb2Ygc291cmNlLmlkICE9IFwic3RyaW5nXCIgfHwgc291cmNlSWRzLmhhcyhzb3VyY2UuaWQpIHx8XG4gICAgICB0eXBlb2Ygc291cmNlLmZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgIWlzU2FmZVNvdXJjZVBhdGgoc291cmNlLmZpbGVuYW1lKSB8fCBzb3VyY2VGaWxlbmFtZXMuaGFzKHNvdXJjZS5maWxlbmFtZSkgfHxcbiAgICAgIHR5cGVvZiBzb3VyY2UuY29udGVudCAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBzb3VyY2UubGFuZ3VhZ2UgIT0gXCJzdHJpbmdcIiB8fCAhc291cmNlTGFuZ3VhZ2VzLmhhcyhzb3VyY2UubGFuZ3VhZ2UpKSB7XG4gICAgICBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIHByb2dyYW0gc291cmNlIHJlZ2lzdHJ5LlwiKVxuICAgIH1cbiAgICBzb3VyY2VJZHMuYWRkKHNvdXJjZS5pZClcbiAgICBzb3VyY2VGaWxlbmFtZXMuYWRkKHNvdXJjZS5maWxlbmFtZSlcbiAgfVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChtb2R1bGUpIHx8IG1vZHVsZS5raW5kICE9IFwiTW9kdWxlXCIgfHwgdHlwZW9mIG1vZHVsZS5pZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAhL15bYS16XVthLXowLTlfXSooPzpbLi1dW2Etel1bYS16MC05X10qKSokL3UudGVzdChtb2R1bGUuaWQpIHx8IG1vZHVsZXMuaGFzKG1vZHVsZS5pZCkgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkobW9kdWxlLmZ1bmN0aW9ucykgfHwgbW9kdWxlLnJlY29yZHMgIT09IHVuZGVmaW5lZCAmJiAhaXNEZW5zZUFycmF5KG1vZHVsZS5yZWNvcmRzKSB8fFxuICAgICAgbW9kdWxlLmVycm9ycyAhPT0gdW5kZWZpbmVkICYmICFpc0RlbnNlQXJyYXkobW9kdWxlLmVycm9ycykgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkobW9kdWxlLmltcG9ydHMpIHx8ICFpc0RlbnNlQXJyYXkobW9kdWxlLmV4cG9ydHMpKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwibWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBzZW1hbnRpYyBwcm9ncmFtIG1vZHVsZVwiLCBtb2R1bGU/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoUmVmbGVjdC5nZXQobW9kdWxlLCBcImNsYXNzZXNcIikgIT09IHVuZGVmaW5lZCAmJiAoIWlzRGVuc2VBcnJheShtb2R1bGUuY2xhc3NlcykgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIikgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJUYXNrIDAzMyByZWZlcmVuY2UgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBzZW1hbnRpYyBwcm9ncmFtIGdlbmVyYXRpb25cIixcbiAgICAgICAgUmVmbGVjdC5nZXQobW9kdWxlLCBcImNsYXNzZXNcIik/LlswXT8ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoUmVmbGVjdC5nZXQobW9kdWxlLCBcImNhcGFiaWxpdGllc1wiKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWlzRGVuc2VBcnJheShtb2R1bGUuY2FwYWJpbGl0aWVzKSB8fCBtb2R1bGUuY2FwYWJpbGl0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJtYWxmb3JtZWQgb3IgZW1wdHkgVGFzayAwMzQgY2FwYWJpbGl0eSBncmFwaFwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjYXBhYmlsaXR5TW9kdWxlcy5wdXNoKG1vZHVsZSlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUuc291cmNlRmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhc291cmNlRmlsZW5hbWVzLmhhcyhtb2R1bGUuc291cmNlRmlsZW5hbWUpKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwic2VtYW50aWMgcHJvZ3JhbSBtb2R1bGUgc291cmNlIGlkZW50aXR5XCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG1vZHVsZS5lbnRyeVBvaW50KSB7XG4gICAgICBlbnRyeUNvdW50KytcbiAgICAgIGlmIChtb2R1bGUuaWQgIT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcImVudHJ5IHBvaW50IG9uIGFuIHVuc2VsZWN0ZWQgbW9kdWxlXCIsIG1vZHVsZS5lbnRyeVBvaW50LmxvY2F0aW9uKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW10sIC4uLm1vZHVsZS5mdW5jdGlvbnNdKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QoZGVjbGFyYXRpb24pIHx8IHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFkZWNsYXJhdGlvbi5pZC5zdGFydHNXaXRoKGAke21vZHVsZS5pZH0jYCkgfHwgZGVjbGFyYXRpb25zLmhhcyhkZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcImR1cGxpY2F0ZSBvciB1bnN0YWJsZSBwcm9ncmFtIGRlY2xhcmF0aW9uIGlkZW50aXR5XCIsIGRlY2xhcmF0aW9uPy5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBkZWNsYXJhdGlvbnMuc2V0KGRlY2xhcmF0aW9uLmlkLCB7ZGVjbGFyYXRpb24sIG1vZHVsZX0pXG4gICAgfVxuICAgIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgbW9kdWxlLmltcG9ydHMpIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChpbXBvcnRlZCkgfHwgaW1wb3J0ZWQua2luZCAhPSBcIkltcG9ydFwiIHx8IHR5cGVvZiBpbXBvcnRlZC5tb2R1bGVJZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGVvZiBpbXBvcnRlZC5pbXBvcnRlZE5hbWUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaW1wb3J0ZWQubG9jYWxOYW1lICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICAgdHlwZW9mIGltcG9ydGVkLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhW1wiZnVuY3Rpb25cIiwgXCJyZWNvcmRcIiwgXCJjbGFzc1wiLCBcImVycm9yXCJdLmluY2x1ZGVzKGltcG9ydGVkLnN5bWJvbEtpbmQpIHx8XG4gICAgICAgIHR5cGVvZiBpbXBvcnRlZC50eXBlT25seSAhPSBcImJvb2xlYW5cIikge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwibWFsZm9ybWVkIHNlbWFudGljIHByb2dyYW0gaW1wb3J0XCIsIGltcG9ydGVkPy5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhwb3J0ZWQgb2YgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChleHBvcnRlZCkgfHwgZXhwb3J0ZWQua2luZCAhPSBcIkV4cG9ydFwiIHx8IHR5cGVvZiBleHBvcnRlZC5leHBvcnRlZE5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0eXBlb2YgZXhwb3J0ZWQuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFbXCJmdW5jdGlvblwiLCBcInJlY29yZFwiLCBcImNsYXNzXCIsIFwiZXJyb3JcIl0uaW5jbHVkZXMoZXhwb3J0ZWQuc3ltYm9sS2luZCkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIm1hbGZvcm1lZCBzZW1hbnRpYyBwcm9ncmFtIGV4cG9ydFwiLCBleHBvcnRlZD8ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBtb2R1bGVzLnNldChtb2R1bGUuaWQsIG1vZHVsZSlcbiAgfVxuICBpZiAoZW50cnlDb3VudCAhPSAxIHx8ICFtb2R1bGVzLmdldChwcm9ncmFtLmVudHJ5TW9kdWxlKT8uZW50cnlQb2ludCkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIHdpdGhvdXQgZXhhY3RseSBvbmUgc2VsZWN0ZWQgZW50cnkgcG9pbnRcIiwgbW9kdWxlcy5nZXQocHJvZ3JhbS5lbnRyeU1vZHVsZSk/LmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IHNlbGVjdGVkTW9kdWxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9ICovIChtb2R1bGVzLmdldChwcm9ncmFtLmVudHJ5TW9kdWxlKSlcbiAgY29uc3Qgc2VsZWN0ZWRFbnRyeSA9IHNlbGVjdGVkTW9kdWxlLmVudHJ5UG9pbnRcblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoc2VsZWN0ZWRFbnRyeT8uYm9keSkgfHwgIWlzRGVuc2VBcnJheShzZWxlY3RlZEVudHJ5LmJvZHkuc3RhdGVtZW50cykgfHwgc2VsZWN0ZWRFbnRyeS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoID09IDApIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSB3aXRob3V0IGEgZGVuc2Ugbm9uLWVtcHR5IHNlbGVjdGVkIGVudHJ5IHBvaW50IGJsb2NrXCIsXG4gICAgICBzZWxlY3RlZEVudHJ5Py5sb2NhdGlvbiA/PyBzZWxlY3RlZE1vZHVsZS5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBlYXJsaWVyID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgY29uc3QgbG9jYWxUYXJnZXROYW1lcyA9IG5ldyBTZXQoWy4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4ubW9kdWxlLmZ1bmN0aW9uc11cbiAgICAgIC5tYXAoKHtuYW1lfSkgPT4gdGFyZ2V0TmFtZShsYW5ndWFnZSwgbmFtZSkpKVxuICAgIGNvbnN0IGltcG9ydGVkVGFyZ2V0TmFtZXMgPSBuZXcgU2V0KClcbiAgICBjb25zdCBsb2NhbEphdmFDbGFzcyA9IG1vZHVsZS5yZWNvcmRzPy5bMF0/Lm5hbWUgPz8gbW9kdWxlLmNsYXNzZXM/LlswXT8ubmFtZSA/PyBtb2R1bGUuZXJyb3JzPy5bMF0/Lm5hbWUgPz9cbiAgICAgIChtb2R1bGUuaWQgPT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSA/IFwiTWFpblwiIDogbW9kdWxlQ2xhc3NOYW1lKG1vZHVsZS5pZCkpXG4gICAgY29uc3QgamF2YUltcG9ydENsYXNzZXMgPSBuZXcgTWFwKGxhbmd1YWdlID09IFwiamF2YVwiID8gW1tsb2NhbEphdmFDbGFzcywgbW9kdWxlLmlkXV0gOiBbXSlcblxuICAgIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgbW9kdWxlLmltcG9ydHMpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gZGVjbGFyYXRpb25zLmdldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICAgICAgY29uc3QgcmVtb3RlRXhwb3J0ID0gcmVzb2x2ZWQ/Lm1vZHVsZS5leHBvcnRzLmZpbmQoKGl0ZW0pID0+XG4gICAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBpbXBvcnRlZC5kZWNsYXJhdGlvbklkICYmIGl0ZW0uZXhwb3J0ZWROYW1lID09IGltcG9ydGVkLmltcG9ydGVkTmFtZSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCB8fCByZXNvbHZlZC5tb2R1bGUuaWQgIT0gaW1wb3J0ZWQubW9kdWxlSWQgfHwgIWVhcmxpZXIuaGFzKGltcG9ydGVkLm1vZHVsZUlkKSB8fFxuICAgICAgICAhcmVtb3RlRXhwb3J0KSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJ1bnJlc29sdmVkLCBwcml2YXRlLCBjeWNsaWMsIG9yIG91dC1vZi1vcmRlciBwcm9ncmFtIGltcG9ydFwiLCBpbXBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbktpbmQgPSByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiID8gXCJmdW5jdGlvblwiIDpcbiAgICAgICAgcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIgPyBcInJlY29yZFwiIDpcbiAgICAgICAgICByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiID8gXCJjbGFzc1wiIDogXCJlcnJvclwiXG5cbiAgICAgIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kICE9IHJlbW90ZUV4cG9ydC5zeW1ib2xLaW5kIHx8IGltcG9ydGVkLnN5bWJvbEtpbmQgIT0gZGVjbGFyYXRpb25LaW5kIHx8XG4gICAgICAgIGltcG9ydGVkLnR5cGVPbmx5ICYmIGRlY2xhcmF0aW9uS2luZCAhPSBcInJlY29yZFwiICYmIGRlY2xhcmF0aW9uS2luZCAhPSBcImNsYXNzXCIpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gaW1wb3J0IGRlY2xhcmF0aW9uIGtpbmQgbWlzbWF0Y2hcIiwgaW1wb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgaW1wb3J0TmFtZSA9IHByb2dyYW1JbXBvcnROYW1lKHByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpXG5cbiAgICAgIGlmIChsYW5ndWFnZSAhPSBcInJ1YnlcIiAmJiBsYW5ndWFnZSAhPSBcImphdmFcIikge1xuICAgICAgICBpZiAoaW1wb3J0ZWQuc3ltYm9sS2luZCAhPSBcImZ1bmN0aW9uXCIpIHZhbGlkYXRlVGFyZ2V0VHlwZUlkZW50aWZpZXIobGFuZ3VhZ2UsIGltcG9ydE5hbWUsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgICBlbHNlIHZhbGlkYXRlVGFyZ2V0QmluZGluZ0lkZW50aWZpZXIobGFuZ3VhZ2UsIGltcG9ydE5hbWUsIFwiaW1wb3J0XCIsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IHRhcmdldE5hbWUobGFuZ3VhZ2UsIGltcG9ydE5hbWUpXG5cbiAgICAgIGlmIChsYW5ndWFnZSAhPSBcInJ1YnlcIiAmJiBsYW5ndWFnZSAhPSBcImphdmFcIiAmJiAobG9jYWxUYXJnZXROYW1lcy5oYXMobmFtZSkgfHwgaW1wb3J0ZWRUYXJnZXROYW1lcy5oYXMobmFtZSkpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBpbXBvcnQtbmFtZSBjb2xsaXNpb24gJyR7aW1wb3J0TmFtZX0nYCwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRDbGFzcyA9IGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJmdW5jdGlvblwiID8gbW9kdWxlQ2xhc3NOYW1lKHJlc29sdmVkLm1vZHVsZS5pZCkgOiByZXNvbHZlZC5kZWNsYXJhdGlvbi5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nT3duZXIgPSBqYXZhSW1wb3J0Q2xhc3Nlcy5nZXQoaW1wb3J0ZWRDbGFzcylcblxuICAgICAgICBpZiAoZXhpc3RpbmdPd25lciAmJiBleGlzdGluZ093bmVyICE9IHJlc29sdmVkLm1vZHVsZS5pZCkge1xuICAgICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBpbXBvcnQtY2xhc3MgY29sbGlzaW9uICcke2ltcG9ydGVkQ2xhc3N9J2AsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGphdmFJbXBvcnRDbGFzc2VzLnNldChpbXBvcnRlZENsYXNzLCByZXNvbHZlZC5tb2R1bGUuaWQpXG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRNb2R1bGUgPSBtb2R1bGVDbGFzc05hbWUocmVzb2x2ZWQubW9kdWxlLmlkKVxuXG4gICAgICAgIGlmIChsb2NhbFRhcmdldE5hbWVzLmhhcyhpbXBvcnRlZE1vZHVsZSkpIHtcbiAgICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB0YXJnZXQgaW1wb3J0LW1vZHVsZSBjb2xsaXNpb24gJyR7aW1wb3J0ZWRNb2R1bGV9J2AsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbXBvcnRlZFRhcmdldE5hbWVzLmFkZChuYW1lKVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZURlY2xhcmF0aW9uSWRzID0gbmV3IFNldChtb2R1bGUuaW1wb3J0cy5maWx0ZXIoKHt0eXBlT25seX0pID0+ICF0eXBlT25seSkubWFwKCh7ZGVjbGFyYXRpb25JZH0pID0+IGRlY2xhcmF0aW9uSWQpKVxuICAgIGNvbnN0IHR5cGVPbmx5RGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KG1vZHVsZS5pbXBvcnRzXG4gICAgICAuZmlsdGVyKCh7ZGVjbGFyYXRpb25JZCwgdHlwZU9ubHl9KSA9PiB0eXBlT25seSAmJiAhdmFsdWVEZWNsYXJhdGlvbklkcy5oYXMoZGVjbGFyYXRpb25JZCkpXG4gICAgICAubWFwKCh7ZGVjbGFyYXRpb25JZH0pID0+IGRlY2xhcmF0aW9uSWQpKVxuICAgIGNvbnN0IHZhbHVlQ29uc3RydWN0aW9uID0gZmluZFR5cGVPbmx5VmFsdWVDb25zdHJ1Y3Rpb24obW9kdWxlLCB0eXBlT25seURlY2xhcmF0aW9uSWRzKVxuXG4gICAgaWYgKHZhbHVlQ29uc3RydWN0aW9uKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwidHlwZS1vbmx5IHByb2dyYW0gaW1wb3J0IHVzZWQgYXMgYSB2YWx1ZVwiLCB2YWx1ZUNvbnN0cnVjdGlvbi5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGV4cG9ydE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGV4cG9ydGVkIG9mIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGRlY2xhcmF0aW9ucy5nZXQoZXhwb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROYW1lKGxhbmd1YWdlLCBleHBvcnRlZC5leHBvcnRlZE5hbWUpXG5cbiAgICAgIGlmIChsYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIikge1xuICAgICAgICB2YWxpZGF0ZVRhcmdldElkZW50aWZpZXIobGFuZ3VhZ2UsIGV4cG9ydGVkLmV4cG9ydGVkTmFtZSwgXCJleHBvcnRcIiwgZXhwb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc29sdmVkIHx8IHJlc29sdmVkLm1vZHVsZS5pZCAhPSBtb2R1bGUuaWQgfHwgZXhwb3J0TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHVucmVzb2x2ZWQgb3IgY29sbGlkaW5nIHRhcmdldCBleHBvcnQgJyR7ZXhwb3J0ZWQuZXhwb3J0ZWROYW1lfSdgLCBleHBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbktpbmQgPSByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiID8gXCJmdW5jdGlvblwiIDpcbiAgICAgICAgcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIgPyBcInJlY29yZFwiIDpcbiAgICAgICAgICByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiID8gXCJjbGFzc1wiIDogXCJlcnJvclwiXG5cbiAgICAgIGlmIChleHBvcnRlZC5zeW1ib2xLaW5kICE9IGRlY2xhcmF0aW9uS2luZCkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSBleHBvcnQgZGVjbGFyYXRpb24ga2luZCBtaXNtYXRjaFwiLCBleHBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UgIT0gXCJqYXZhc2NyaXB0XCIgJiYgbGFuZ3VhZ2UgIT0gXCJ0eXBlc2NyaXB0XCIgJiYgZXhwb3J0ZWQuZXhwb3J0ZWROYW1lICE9IHJlc29sdmVkLmRlY2xhcmF0aW9uLm5hbWUpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgZXhwb3J0IGFsaWFzICcke2V4cG9ydGVkLmV4cG9ydGVkTmFtZX0nIHdpdGhvdXQgYW4gZXF1aXZhbGVudCB0YXJnZXQgYmluZGluZ2AsXG4gICAgICAgICAgZXhwb3J0ZWQubG9jYXRpb24gPz8gcmVzb2x2ZWQuZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBleHBvcnROYW1lcy5hZGQobmFtZSlcbiAgICB9XG4gICAgaWYgKGxhbmd1YWdlID09IFwicGhwXCIpIHtcbiAgICAgIGNvbnN0IGV4cG9ydGVkRGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KG1vZHVsZS5leHBvcnRzLm1hcCgoe2RlY2xhcmF0aW9uSWR9KSA9PiBkZWNsYXJhdGlvbklkKSlcbiAgICAgIGNvbnN0IHByaXZhdGVEZWNsYXJhdGlvbiA9IFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW10sIC4uLm1vZHVsZS5mdW5jdGlvbnNdLmZpbmQoKHtpZH0pID0+XG4gICAgICAgIHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiICYmICFleHBvcnRlZERlY2xhcmF0aW9uSWRzLmhhcyhpZCkpXG5cbiAgICAgIGlmIChwcml2YXRlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgbm9uLWV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ByaXZhdGVEZWNsYXJhdGlvbi5uYW1lfScgd2l0aG91dCB0YXJnZXQtcHJpdmF0ZSBtb2R1bGUgdmlzaWJpbGl0eWAsXG4gICAgICAgICAgcHJpdmF0ZURlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBlYXJsaWVyLmFkZChtb2R1bGUuaWQpXG4gIH1cblxuICB2YWxpZGF0ZVByb2dyYW1TdGRsaWJDb250cmFjdChwcm9ncmFtLCBsYW5ndWFnZSwgY2FwYWJpbGl0eU1vZHVsZXMpXG4gIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkZhY2FkZXMocHJvZ3JhbSwgbGFuZ3VhZ2UpXG5cbiAgcmV0dXJuIHByb2dyYW1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgY29tcGlsZXItc2VsZWN0ZWQgZmFjYWRlIGRlc2NyaXB0b3JzLCBleGVjdXRhYmxlIHNvdXJjZXMsIG1vZHVsZSBtYXJrZXJzLCBhbmQgbmF0aXZlIGlkZW50aXR5IGV2aWRlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBDYW5kaWRhdGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UgZm9yIGRpYWdub3N0aWNzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkZhY2FkZXMocHJvZ3JhbSwgbGFuZ3VhZ2UpIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0KHByb2dyYW0sIFwic3RkbGliRmFjYWRlc1wiKVxuICBjb25zdCBtYXJrZWRNb2R1bGVzID0gcHJvZ3JhbS5tb2R1bGVzLmZpbHRlcigobW9kdWxlKSA9PiBSZWZsZWN0LmdldChtb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpICE9PSB1bmRlZmluZWQpXG4gIGNvbnN0IGZhY2FkZVNvdXJjZXMgPSBwcm9ncmFtLnNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IFJlZmxlY3QuZ2V0KHNvdXJjZSwgXCJvd25lcnNoaXBcIikgPT0gXCJmYWNhZGVcIilcbiAgY29uc3QgZXZpZGVuY2VkSW1wb3J0cyA9IHByb2dyYW0ubW9kdWxlcy5mbGF0TWFwKChtb2R1bGUpID0+IG1vZHVsZS5pbXBvcnRzLmZpbHRlcigoaXRlbSkgPT4gUmVmbGVjdC5nZXQoaXRlbSwgXCJzdGRsaWJGYWNhZGVcIikgIT09IHVuZGVmaW5lZCkpXG5cbiAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChtYXJrZWRNb2R1bGVzLmxlbmd0aCA+IDAgfHwgZmFjYWRlU291cmNlcy5sZW5ndGggPiAwIHx8IGV2aWRlbmNlZEltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiRmFjYWRlIG1vZHVsZXMsIHNvdXJjZXMsIG9yIGltcG9ydCBldmlkZW5jZSByZXF1aXJlIGEgY29tcGxldGUgcHJvZ3JhbSBmYWNhZGUgZGVzY3JpcHRvci5cIilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRlc2NyaXB0b3IpIHx8IGRlc2NyaXB0b3Iuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVzXCIgfHwgZGVzY3JpcHRvci52ZXJzaW9uICE9IDEgfHxcbiAgICB0eXBlb2YgZGVzY3JpcHRvci5sYW5ndWFnZSAhPSBcInN0cmluZ1wiIHx8ICFwcm9ncmFtVGFyZ2V0cy5oYXMoZGVzY3JpcHRvci5sYW5ndWFnZSkgfHwgIWlzRGVuc2VBcnJheShkZXNjcmlwdG9yLm1vZHVsZXMpIHx8XG4gICAgZGVzY3JpcHRvci5tb2R1bGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHByb2dyYW0gZmFjYWRlIGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLlwiKVxuICB9XG4gIGNvbnN0IGZhY2FkZUxhbmd1YWdlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSAqLyAoZGVzY3JpcHRvci5sYW5ndWFnZSlcbiAgY29uc3QgcmVjb3JkcyA9IGRlc2NyaXB0b3IubW9kdWxlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoaXRlbSkgfHwgdHlwZW9mIGl0ZW0uaWRlbnRpdHkgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaXRlbS52ZXJzaW9uICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBtb2R1bGUgZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuXCIpXG4gICAgfVxuICAgIHJldHVybiBzdGRsaWJGYWNhZGVSZWdpc3RyeS5yZXNvbHZlSWRlbnRpdHkoaXRlbS5pZGVudGl0eSwgZmFjYWRlTGFuZ3VhZ2UsIGl0ZW0udmVyc2lvbilcbiAgfSlcbiAgY29uc3QgZXhwZWN0ZWQgPSBzdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvcihmYWNhZGVMYW5ndWFnZSwgcmVjb3JkcylcblxuICBpZiAoIWVxdWFsUGxhaW5EYXRhKGRlc2NyaXB0b3IsIGV4cGVjdGVkKSkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBkZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIHRoZSByZWdpc3RlcmVkIHZlcnNpb25lZCBmYWNhZGUgY2xvc3VyZS5cIilcbiAgfVxuICBjb25zdCBzZWxlY3RlZFJlY29yZHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgaWYgKHNlbGVjdGVkUmVjb3Jkcy5oYXMocmVjb3JkLmlkZW50aXR5KSkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgaXMgc2VsZWN0ZWQgbW9yZSB0aGFuIG9uY2UuYClcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlY29yZC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gc3RkbGliRmFjYWRlUmVnaXN0cnkucmVzb2x2ZUlkZW50aXR5KGRlcGVuZGVuY3kuaWRlbnRpdHksIGZhY2FkZUxhbmd1YWdlLCBkZXBlbmRlbmN5LnJhbmdlKVxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3RlZFJlY29yZHMuZ2V0KHJlc29sdmVkLmlkZW50aXR5KVxuXG4gICAgICBpZiAoIXNlbGVjdGVkIHx8IHNlbGVjdGVkLnZlcnNpb24gIT0gcmVzb2x2ZWQudmVyc2lvbikge1xuICAgICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBkZXBlbmRlbmN5ICcke3Jlc29sdmVkLmlkZW50aXR5fUAke3Jlc29sdmVkLnZlcnNpb259JyBpcyBtaXNzaW5nIG9yIG91dCBvZiBvcmRlci5gKVxuICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3RlZFJlY29yZHMuc2V0KHJlY29yZC5pZGVudGl0eSwgcmVjb3JkKVxuICB9XG4gIGlmIChtYXJrZWRNb2R1bGVzLmxlbmd0aCAhPSByZWNvcmRzLmxlbmd0aCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBkZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIGl0cyBleGVjdXRhYmxlIHNlbWFudGljIG1vZHVsZXMuXCIpXG4gIH1cbiAgaWYgKHByb2dyYW0uc291cmNlcy5zb21lKChzb3VyY2UpID0+IHNvdXJjZS5sYW5ndWFnZSAhPSBmYWNhZGVMYW5ndWFnZSB8fFxuICAgICFbXCJhcHBsaWNhdGlvblwiLCBcImZhY2FkZVwiXS5pbmNsdWRlcyhTdHJpbmcoUmVmbGVjdC5nZXQoc291cmNlLCBcIm93bmVyc2hpcFwiKSkpKSkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIkZhY2FkZSBwcm9ncmFtcyByZXF1aXJlIG9uZSBzb3VyY2UgbGFuZ3VhZ2UgYW5kIGV4cGxpY2l0IGFwcGxpY2F0aW9uL2ZhY2FkZSBvd25lcnNoaXAuXCIpXG4gIH1cbiAgY29uc3Qgc2VsZWN0ZWRJZGVudGl0aWVzID0gbmV3IFNldChyZWNvcmRzLm1hcCgoe2lkZW50aXR5fSkgPT4gaWRlbnRpdHkpKVxuICBjb25zdCByZWdpc3RlcmVkTW9kdWxlcyA9IHJlcGFyc2VSZWdpc3RlcmVkRmFjYWRlTW9kdWxlcyhwcm9ncmFtLCBmYWNhZGVMYW5ndWFnZSwgbGFuZ3VhZ2UpXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJlY29yZHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc1tpbmRleF1cbiAgICBjb25zdCBtb2R1bGUgPSBtYXJrZWRNb2R1bGVzW2luZGV4XVxuICAgIGNvbnN0IG1hcmtlciA9IFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIilcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChtYXJrZXIpIHx8IE9iamVjdC5rZXlzKG1hcmtlcikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiaWRlbnRpdHksdmVyc2lvblwiIHx8XG4gICAgICBtYXJrZXIuaWRlbnRpdHkgIT0gcmVjb3JkLmlkZW50aXR5IHx8IG1hcmtlci52ZXJzaW9uICE9IHJlY29yZC52ZXJzaW9uIHx8IG1vZHVsZS5pZCAhPSByZWNvcmQuc291cmNlLmlkIHx8XG4gICAgICBtb2R1bGUuc291cmNlRmlsZW5hbWUgIT0gcmVjb3JkLnNvdXJjZS5maWxlbmFtZSkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5IGlzIG5vdCBjYW5vbmljYWwuYClcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gcHJvZ3JhbS5zb3VyY2VzLmZpbmQoKHtmaWxlbmFtZX0pID0+IGZpbGVuYW1lID09IHJlY29yZC5zb3VyY2UuZmlsZW5hbWUpXG5cbiAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuY29udGVudCAhPSByZWNvcmQuc291cmNlLmNvbnRlbnQgfHwgUmVmbGVjdC5nZXQoc291cmNlLCBcIm93bmVyc2hpcFwiKSAhPSBcImZhY2FkZVwiKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBleGVjdXRhYmxlIHNvdXJjZSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVnaXN0ZXJlZCBkZWZpbml0aW9uLmApXG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdGVyZWRNb2R1bGUgPSByZWdpc3RlcmVkTW9kdWxlcy5nZXQocmVjb3JkLmlkZW50aXR5KVxuXG4gICAgaWYgKCFyZWdpc3RlcmVkTW9kdWxlIHx8ICFlcXVhbFBsYWluRGF0YShtb2R1bGUsIHJlZ2lzdGVyZWRNb2R1bGUpKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlQXV0aG9yaXR5KGxhbmd1YWdlLFxuICAgICAgICBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIHNlbWFudGljIG1vZHVsZSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVnaXN0ZXJlZCBleGVjdXRhYmxlIHNvdXJjZS5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGFsbG93ZWRPcGVyYXRpb25zID0gbmV3IFNldChyZWNvcmQucmVxdWlyZW1lbnRzLmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT4gb3BlcmF0aW9ucykpXG4gICAgY29uc3QgdXNlZE9wZXJhdGlvbnMgPSBjb2xsZWN0RGVjbGFyZWRFZmZlY3RPcGVyYXRpb25zKG1vZHVsZSlcblxuICAgIGlmIChhbGxvd2VkT3BlcmF0aW9ucy5zaXplICE9IHVzZWRPcGVyYXRpb25zLnNpemUgfHwgWy4uLmFsbG93ZWRPcGVyYXRpb25zXS5zb21lKChvcGVyYXRpb24pID0+ICF1c2VkT3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uKSkpIHtcbiAgICAgIGludmFsaWRGYWNhZGVBdXRob3JpdHkobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgc2VtYW50aWMgYm9keSBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyZWQgY2Fub25pY2FsIHJlcXVpcmVtZW50cy5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICB9XG4gIGlmIChmYWNhZGVTb3VyY2VzLmxlbmd0aCAhPSByZWNvcmRzLmxlbmd0aCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGNvbnRhaW5zIGFuIHVuc2VsZWN0ZWQgY29tcGlsZXItb3duZWQgZmFjYWRlIHNvdXJjZS5cIilcbiAgfVxuICBpZiAoZXZpZGVuY2VkSW1wb3J0cy5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBzZWxlY3RlZCBmYWNhZGUgY2xvc3VyZSBoYXMgbm8gcGFyc2VyLXByb3ZlZCBuYXRpdmUgaW1wb3J0IGV2aWRlbmNlLlwiKVxuICB9XG4gIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgZXZpZGVuY2VkSW1wb3J0cykge1xuICAgIGNvbnN0IGV2aWRlbmNlID0gUmVmbGVjdC5nZXQoaW1wb3J0ZWQsIFwic3RkbGliRmFjYWRlXCIpXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoZXZpZGVuY2UpIHx8IE9iamVjdC5rZXlzKGV2aWRlbmNlKS5zb3J0KCkuam9pbihcIixcIikgIT1cbiAgICAgIFwiZmFjYWRlSWRlbnRpdHksZmFjYWRlVmVyc2lvbixuYXRpdmVNb2R1bGUsbmF0aXZlU3ltYm9sLHNjaGVtYSx2ZXJzaW9uXCIgfHxcbiAgICAgIGV2aWRlbmNlLnNjaGVtYSAhPSBcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwiIHx8IGV2aWRlbmNlLnZlcnNpb24gIT0gMSB8fFxuICAgICAgdHlwZW9mIGV2aWRlbmNlLmZhY2FkZUlkZW50aXR5ICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIGV2aWRlbmNlLmZhY2FkZVZlcnNpb24gIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIGV2aWRlbmNlLm5hdGl2ZU1vZHVsZSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBldmlkZW5jZS5uYXRpdmVTeW1ib2wgIT0gXCJzdHJpbmdcIikge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiQSBmYWNhZGUgaW1wb3J0IGhhcyBtYWxmb3JtZWQgbmF0aXZlIGlkZW50aXR5IGV2aWRlbmNlLlwiKVxuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBzdGRsaWJGYWNhZGVSZWdpc3RyeS5yZXNvbHZlRmFjYWRlKGZhY2FkZUxhbmd1YWdlLCBldmlkZW5jZS5uYXRpdmVNb2R1bGUsIGV2aWRlbmNlLm5hdGl2ZVN5bWJvbCxcbiAgICAgIGV2aWRlbmNlLmZhY2FkZVZlcnNpb24pXG5cbiAgICBpZiAocmVjb3JkLmlkZW50aXR5ICE9IGV2aWRlbmNlLmZhY2FkZUlkZW50aXR5IHx8ICFzZWxlY3RlZElkZW50aXRpZXMuaGFzKHJlY29yZC5pZGVudGl0eSkgfHwgaW1wb3J0ZWQubW9kdWxlSWQgIT0gcmVjb3JkLnNvdXJjZS5pZCB8fFxuICAgICAgaW1wb3J0ZWQuaW1wb3J0ZWROYW1lICE9IGV2aWRlbmNlLm5hdGl2ZVN5bWJvbCkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiQSBmYWNhZGUgaW1wb3J0IGRvZXMgbm90IG1hdGNoIGl0cyByZWdpc3RlcmVkIG5hdGl2ZSBtb2R1bGUgYW5kIHN5bWJvbCBpZGVudGl0eS5cIilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBjYW5vbmljYWwgb3BlcmF0aW9uIHByZXNlbnQgaW4gb25lIHZhbGlkYXRlZCBmYWNhZGUgaW1wbGVtZW50YXRpb24uXG4gKiBUaGlzIGNoZWNrcyB0aGUgZmFjYWRlJ3MgY29tcGxldGUgZGVjbGFyZWQgYXV0aG9yaXR5IGluZGVwZW5kZW50bHkgZnJvbSBwcm9ncmFtIHJlYWNoYWJpbGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBGYWNhZGUgbW9kdWxlLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBVc2VkIG9wZXJhdGlvbiBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdERlY2xhcmVkRWZmZWN0T3BlcmF0aW9ucyhtb2R1bGUpIHtcbiAgY29uc3Qgb3BlcmF0aW9uTmFtZXMgPSBuZXcgTWFwKG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT5cbiAgICBvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBvcGVyYXRpb24ubmFtZV0pKSA/PyBbXSlcbiAgY29uc3QgdXNlZCA9IG5ldyBTZXQoKVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGZhY2FkZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm5cbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIiA/IFJlZmxlY3QuZ2V0KHZhbHVlLCBcIm9wZXJhdGlvblwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiA9PSBcInN0cmluZ1wiICYmIG9wZXJhdGlvbk5hbWVzLmhhcyhvcGVyYXRpb24pKSB1c2VkLmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKG9wZXJhdGlvbk5hbWVzLmdldChvcGVyYXRpb24pKSlcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICBpZiAoW1wiY2FwYWJpbGl0aWVzXCIsIFwibG9jYXRpb25cIiwgXCJwcm92ZW5hbmNlXCIsIFwicmVzb2x1dGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgICAgdmlzaXQoY2hpbGQpXG4gICAgICB9XG4gICAgfSBlbHNlIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWUpIHZpc2l0KGNoaWxkKVxuICB9XG5cbiAgdmlzaXQoe2NsYXNzZXM6IG1vZHVsZS5jbGFzc2VzLCBlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCwgZnVuY3Rpb25zOiBtb2R1bGUuZnVuY3Rpb25zfSlcbiAgcmV0dXJuIHVzZWRcbn1cblxuLyoqXG4gKiBSZWNvbXBpbGVzIHRoZSByZWdpc3RyeS1zZWxlY3RlZCBmYWNhZGUgY2xvc3VyZSBmcm9tIHJldGFpbmVkIGNhbGxlciBpbnB1dHMgYW5kIHJlZ2lzdGVyZWQgZmFjYWRlIHNvdXJjZS5cbiAqIFRoaXMgcGFyc2VyLWJhY2tlZCByZWZlcmVuY2UgZ3JhcGggaXMgY3JlYXRlZCBkdXJpbmcgdmFsaWRhdGlvbiwgYmVmb3JlIHByb3ZpZGVyIHBsYW5uaW5nIG9yIHdyaXRlciBhbGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBVbnRydXN0ZWQgbXV0YWJsZSBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBmYWNhZGVMYW5ndWFnZSAtIFNlbGVjdGVkIHNvdXJjZS1sYW5ndWFnZSBmYWNhZGUgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gZGlhZ25vc3RpY0xhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlIGZvciBib3VuZGFyeSBkaWFnbm9zdGljcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSBDYW5vbmljYWwgc2VtYW50aWMgbW9kdWxlcyBieSBmYWNhZGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlcGFyc2VSZWdpc3RlcmVkRmFjYWRlTW9kdWxlcyhwcm9ncmFtLCBmYWNhZGVMYW5ndWFnZSwgZGlhZ25vc3RpY0xhbmd1YWdlKSB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uTW9kdWxlcyA9IHByb2dyYW0ubW9kdWxlcy5maWx0ZXIoKG1vZHVsZSkgPT4gUmVmbGVjdC5nZXQobW9kdWxlLCBcInN0ZGxpYkZhY2FkZVwiKSA9PT0gdW5kZWZpbmVkKVxuICBjb25zdCBtb2R1bGVzQnlGaWxlbmFtZSA9IG5ldyBNYXAoYXBwbGljYXRpb25Nb2R1bGVzLm1hcCgobW9kdWxlKSA9PiBbbW9kdWxlLnNvdXJjZUZpbGVuYW1lLCBtb2R1bGVdKSlcbiAgY29uc3QgYXBwbGljYXRpb25Tb3VyY2VzID0gcHJvZ3JhbS5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBSZWZsZWN0LmdldChzb3VyY2UsIFwib3duZXJzaGlwXCIpID09IFwiYXBwbGljYXRpb25cIikubWFwKChzb3VyY2UpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzQnlGaWxlbmFtZS5nZXQoc291cmNlLmZpbGVuYW1lKVxuXG4gICAgaWYgKCFtb2R1bGUpIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGRpYWdub3N0aWNMYW5ndWFnZSxcbiAgICAgIGBBcHBsaWNhdGlvbiBzb3VyY2UgJyR7c291cmNlLmZpbGVuYW1lfScgaGFzIG5vIG1hdGNoaW5nIHNlbWFudGljIG1vZHVsZSBmb3IgZmFjYWRlIHZlcmlmaWNhdGlvbi5gKVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLFxuICAgICAgaWQ6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAobW9kdWxlKS5pZCxcbiAgICAgIGxhbmd1YWdlOiBmYWNhZGVMYW5ndWFnZSxcbiAgICAgIHNvdXJjZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudClcbiAgICB9XG4gIH0pXG5cbiAgaWYgKGFwcGxpY2F0aW9uU291cmNlcy5sZW5ndGggIT0gYXBwbGljYXRpb25Nb2R1bGVzLmxlbmd0aCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGRpYWdub3N0aWNMYW5ndWFnZSwgXCJGYWNhZGUgdmVyaWZpY2F0aW9uIHJlcXVpcmVzIG9uZSByZXRhaW5lZCBhcHBsaWNhdGlvbiBzb3VyY2UgcGVyIHNlbWFudGljIG1vZHVsZS5cIilcbiAgfVxuICBjb25zdCByZXBhcnNlZCA9IHBhcnNlUHJvZ3JhbVNvdXJjZSh7ZW50cnlNb2R1bGU6IHByb2dyYW0uZW50cnlNb2R1bGUsIHNvdXJjZXM6IGFwcGxpY2F0aW9uU291cmNlc30pXG4gIGNvbnN0IG1vZHVsZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiByZXBhcnNlZC5tb2R1bGVzKSB7XG4gICAgaWYgKCFtb2R1bGUuc3RkbGliRmFjYWRlKSBjb250aW51ZVxuICAgIGlmIChtb2R1bGVzLmhhcyhtb2R1bGUuc3RkbGliRmFjYWRlLmlkZW50aXR5KSkge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IoZGlhZ25vc3RpY0xhbmd1YWdlLCBgUmVnaXN0ZXJlZCBmYWNhZGUgJyR7bW9kdWxlLnN0ZGxpYkZhY2FkZS5pZGVudGl0eX0nIHJlcGFyc2VkIG1vcmUgdGhhbiBvbmNlLmApXG4gICAgfVxuICAgIG1vZHVsZXMuc2V0KG1vZHVsZS5zdGRsaWJGYWNhZGUuaWRlbnRpdHksIG1vZHVsZSlcbiAgfVxuICByZXR1cm4gbW9kdWxlc1xufVxuXG4vKipcbiAqIENvbXBhcmVzIGNsb3NlZCBwbGFpbiBKU09OLXNoYXBlZCBkYXRhIHdpdGhvdXQgY29lcmNpb24gb3Iga2V5LW9yZGVyIGFzc3VtcHRpb25zLlxuICogQHBhcmFtIHt1bmtub3dufSBsZWZ0IC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIEV4cGVjdGVkIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IEV4YWN0IHJlY3Vyc2l2ZSBlcXVpdmFsZW5jZS5cbiAqL1xuZnVuY3Rpb24gZXF1YWxQbGFpbkRhdGEobGVmdCwgcmlnaHQpIHtcbiAgaWYgKGxlZnQgPT09IHJpZ2h0KSByZXR1cm4gdHJ1ZVxuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGxlZnQpICYmIEFycmF5LmlzQXJyYXkocmlnaHQpICYmIGlzRGVuc2VBcnJheShsZWZ0KSAmJiBpc0RlbnNlQXJyYXkocmlnaHQpICYmXG4gICAgICBsZWZ0Lmxlbmd0aCA9PSByaWdodC5sZW5ndGggJiYgbGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBlcXVhbFBsYWluRGF0YSh2YWx1ZSwgcmlnaHRbaW5kZXhdKSlcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3QobGVmdCkgfHwgIWlzUGxhaW5PYmplY3QocmlnaHQpKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgbGVmdEtleXMgPSBPYmplY3Qua2V5cyhsZWZ0KS5zb3J0KClcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpLnNvcnQoKVxuXG4gIHJldHVybiBsZWZ0S2V5cy5sZW5ndGggPT0gcmlnaHRLZXlzLmxlbmd0aCAmJiBsZWZ0S2V5cy5ldmVyeSgoa2V5LCBpbmRleCkgPT5cbiAgICBrZXkgPT0gcmlnaHRLZXlzW2luZGV4XSAmJiBlcXVhbFBsYWluRGF0YShsZWZ0W2tleV0sIHJpZ2h0W2tleV0pKVxufVxuXG4vKipcbiAqIFRocm93cyBvbmUgc3RhYmxlIGZhY2FkZSBhcnRpZmFjdC1ib3VuZGFyeSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRGlhZ25vc3RpYyBkZXRhaWwuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBtZXNzYWdlKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiU1RETElCX0ZBQ0FERV9ERVNDUklQVE9SX0lOVkFMSURcIiwgbGFuZ3VhZ2UsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIFRocm93cyB3aGVuIGEgZmFjYWRlIHNlbWFudGljIGJvZHkgZXhjZWVkcyBvciBvbWl0cyBpdHMgcmVnaXN0cnktZGVjbGFyZWQgYXV0aG9yaXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRGlhZ25vc3RpYyBkZXRhaWwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEZhY2FkZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRGYWNhZGVBdXRob3JpdHkobGFuZ3VhZ2UsIG1lc3NhZ2UsIGxvY2F0aW9uKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiU1RETElCX0ZBQ0FERV9BVVRIT1JJVFlfRk9SR0VEXCIsIGxhbmd1YWdlLCBsb2NhdGlvbiwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwcm9ncmFtIHN0ZGxpYiBsaW5rIGRlc2NyaXB0b3IgYWdhaW5zdCBpdHMgY2FwYWJpbGl0eSBtb2R1bGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBDYW5kaWRhdGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZVtdfSBjYXBhYmlsaXR5TW9kdWxlcyAtIE1vZHVsZXMgY2FycnlpbmcgY2FwYWJpbGl0aWVzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkNvbnRyYWN0KHByb2dyYW0sIGxhbmd1YWdlLCBjYXBhYmlsaXR5TW9kdWxlcykge1xuICBjb25zdCBjb250cmFjdCA9IFJlZmxlY3QuZ2V0KHByb2dyYW0sIFwic3RkbGliQ29udHJhY3RcIilcbiAgY29uc3QgY29udHJhY3RzID0gUmVmbGVjdC5nZXQocHJvZ3JhbSwgXCJzdGRsaWJDb250cmFjdHNcIilcblxuICBpZiAoY2FwYWJpbGl0eU1vZHVsZXMubGVuZ3RoID09IDApIHtcbiAgICBpZiAoY29udHJhY3QgIT09IHVuZGVmaW5lZCB8fCBjb250cmFjdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogXCJBIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgcmVxdWlyZXMgY2FwYWJpbGl0eSBtb2R1bGVzLlwiXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoY29udHJhY3QgIT09IHVuZGVmaW5lZCAmJiBjb250cmFjdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIG1lc3NhZ2U6IFwiQSBwcm9ncmFtIGNhbm5vdCBkZWNsYXJlIGJvdGggc2luZ3VsYXIgYW5kIHBsdXJhbCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IGRlc2NyaXB0b3JzLlwiXG4gICAgfSlcbiAgfVxuICBpZiAoY29udHJhY3QgPT09IHVuZGVmaW5lZCAmJiBjb250cmFjdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIG1vZHVsZXMgd2l0aCBjYXBhYmlsaXRpZXMgcmVxdWlyZSBhIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3RcIixcbiAgICAgIGNhcGFiaWxpdHlNb2R1bGVzWzBdLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGRlY2xhcmVkID0gY29udHJhY3RzID09PSB1bmRlZmluZWQgPyBbY29udHJhY3RdIDogY29udHJhY3RzXG5cbiAgaWYgKCFpc0RlbnNlQXJyYXkoZGVjbGFyZWQpIHx8IGRlY2xhcmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgbWVzc2FnZTogXCJUaGUgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCBkZXNjcmlwdG9yIGxpc3QgaXMgbWFsZm9ybWVkIG9yIGVtcHR5LlwiXG4gICAgfSlcbiAgfVxuICBjb25zdCBpZGVudGl0aWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIGRlY2xhcmVkKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGRlc2NyaXB0b3IpIHx8IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLnNvbWUoKGtleSkgPT4ga2V5ICE9IFwiaWRlbnRpdHlcIiAmJiBrZXkgIT0gXCJjb250cmFjdFZlcnNpb25cIikpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IFwiVGhlIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuXCJcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IGlkZW50aXR5ID0gZGVzY3JpcHRvci5pZGVudGl0eVxuXG4gICAgaWYgKHR5cGVvZiBpZGVudGl0eSAhPSBcInN0cmluZ1wiIHx8IGlkZW50aXR5Lmxlbmd0aCA9PSAwIHx8IGlkZW50aXRpZXMuaGFzKGlkZW50aXR5KSB8fFxuICAgICAgIWxpc3RTdGRsaWJNb2R1bGVzKCkuc29tZSgoe2lkZW50aXR5OiByZWdpc3RlcmVkfSkgPT4gcmVnaXN0ZXJlZCA9PSBpZGVudGl0eSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0ICcke1N0cmluZyhpZGVudGl0eSl9JyBpcyBkdXBsaWNhdGUgb3Igbm90IGEgcmVnaXN0ZXJlZCBjYW5vbmljYWwgbW9kdWxlLmBcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChkZXNjcmlwdG9yLmNvbnRyYWN0VmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHBhcnNlU3RkbGliVmVyc2lvblJhbmdlKGRlc2NyaXB0b3IuY29udHJhY3RWZXJzaW9uKSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYERlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgdmVyc2lvbiAnJHtTdHJpbmcoZGVzY3JpcHRvci5jb250cmFjdFZlcnNpb24pfScgaXMgbm90IGNhbm9uaWNhbC5gXG4gICAgICB9KVxuICAgIH1cbiAgICBpZGVudGl0aWVzLmFkZChpZGVudGl0eSlcbiAgfVxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBjYXBhYmlsaXR5TW9kdWxlcykge1xuICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FwYWJpbGl0eSkgfHwgdHlwZW9mIGNhcGFiaWxpdHkuYXV0aG9yaXR5SWQgIT0gXCJzdHJpbmdcIiB8fCAhaWRlbnRpdGllcy5oYXMoY2FwYWJpbGl0eS5hdXRob3JpdHlJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgbWVzc2FnZTogYENhcGFiaWxpdHkgYXV0aG9yaXR5ICcke1N0cmluZyhSZWZsZWN0LmdldChjYXBhYmlsaXR5LCBcImF1dGhvcml0eUlkXCIpKX0nIGRvZXMgbm90IG1hdGNoIGEgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdC5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluZHMgYSByZWNvcmQgY29uc3RydWN0aW9uIHRoYXQgY3Jvc3NlcyBhIHR5cGUtb25seSBpbXBvcnQgZWRnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBJbXBvcnRpbmcgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdHlwZU9ubHlEZWNsYXJhdGlvbklkcyAtIEltcG9ydGVkIGlkZW50aXRpZXMgdW5hdmFpbGFibGUgaW4gdmFsdWUgcG9zaXRpb25zLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZENvbnN0cnVjdGlvbiB8IHVuZGVmaW5lZH0gSW52YWxpZCBjb25zdHJ1Y3Rpb24gd2hlbiBwcmVzZW50LlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZU9ubHlWYWx1ZUNvbnN0cnVjdGlvbihtb2R1bGUsIHR5cGVPbmx5RGVjbGFyYXRpb25JZHMpIHtcbiAgaWYgKHR5cGVPbmx5RGVjbGFyYXRpb25JZHMuc2l6ZSA9PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpXG5cbiAgLyoqXG4gICAqIFZpc2l0cyBvbmUgc2VtYW50aWMgdmFsdWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZENvbnN0cnVjdGlvbiB8IHVuZGVmaW5lZH0gSW52YWxpZCBjb25zdHJ1Y3Rpb24gd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGNvbnN0IG9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcblxuICAgIGlmIChvYmplY3Qua2luZCA9PSBcIlJlY29yZENvbnN0cnVjdGlvblwiICYmIGlzUGxhaW5PYmplY3Qob2JqZWN0LnJlY29yZCkgJiZcbiAgICAgIHR5cGVvZiBvYmplY3QucmVjb3JkLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiB0eXBlT25seURlY2xhcmF0aW9uSWRzLmhhcyhvYmplY3QucmVjb3JkLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmRDb25zdHJ1Y3Rpb259ICovICh2YWx1ZSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG9iamVjdCkpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdmlzaXQoY2hpbGQpXG5cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIHZpc2l0KHtlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCwgZnVuY3Rpb25zOiBtb2R1bGUuZnVuY3Rpb25zfSlcbn1cblxuLyoqXG4gKiBQbGFucyBhbGwgcGF0aHMgYmVmb3JlIGVtaXNzaW9uIGFuZCByZWplY3RzIGV4YWN0L2Nhc2UvZmlsZS1kaXJlY3RvcnkgY29sbGlzaW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtTdGRsaWJQcm9ncmFtTGlua2luZyB8IG51bGx9IFtsaW5raW5nXSAtIFBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGxpbmsuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgc3RyaW5nPn0gUGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHBsYW5Nb2R1bGVQYXRocyhwcm9ncmFtLCBsYW5ndWFnZSwgbGlua2luZyA9IG51bGwpIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gbGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgPyBcIi5qc1wiIDogbGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgPyBcIi50c1wiIDogbGFuZ3VhZ2UgPT0gXCJydWJ5XCIgPyBcIi5yYlwiIDpcbiAgICBsYW5ndWFnZSA9PSBcInBocFwiID8gXCIucGhwXCIgOiBcIi5qYXZhXCJcbiAgY29uc3QgcGF0aHMgPSBuZXcgTWFwKClcbiAgY29uc3QgZm9sZGVkID0gbmV3IFNldCgpXG4gIGNvbnN0IHRhcmdldE1vZHVsZU5hbWVzID0gbmV3IFNldCgpXG4gIGNvbnN0IHByb3ZpZGVyUGF0aHMgPSBsaW5raW5nID8gbGlua2luZy5uZWdvdGlhdGlvbi5wcm92aWRlcnMubWFwKCh7bW9kdWxlfSkgPT5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChsaW5raW5nLnJlY29yZHMuZ2V0KG1vZHVsZSkpLmFydGlmYWN0LnBhdGgpIDogW11cbiAgY29uc3QgZm9sZGVkUHJvdmlkZXJzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBwcm92aWRlclBhdGggb2YgcHJvdmlkZXJQYXRocykge1xuICAgIGNvbnN0IGtleSA9IHByb3ZpZGVyUGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpXG5cbiAgICBpZiAoIWlzU2FmZUFydGlmYWN0UGF0aChwcm92aWRlclBhdGgpIHx8IGZvbGRlZC5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJTVERMSUJfTkFNRV9DT0xMSVNJT05cIiwgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aCAnJHtwcm92aWRlclBhdGh9JyBpcyB1bnNhZmUgb3IgY29sbGlkaW5nLmB9KVxuICAgIH1cbiAgICBmb2xkZWQuYWRkKGtleSlcbiAgICBmb2xkZWRQcm92aWRlcnMuc2V0KHByb3ZpZGVyUGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKSwgcHJvdmlkZXJQYXRoKVxuICB9XG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgbGV0IHBhdGggPSBgJHttb2R1bGUuaWQucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfSR7ZXh0ZW5zaW9ufWBcbiAgICBjb25zdCBwcm92aWRlclBhdGggPSBmb2xkZWRQcm92aWRlcnMuZ2V0KHBhdGgudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKS5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIikpXG5cbiAgICBpZiAocHJvdmlkZXJQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9OQU1FX0NPTExJU0lPTlwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYE1vZHVsZSBwYXRoICcke3BhdGh9JyBjb2xsaWRlcyB3aXRoIHRoZSBzdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgJyR7cHJvdmlkZXJQYXRofScuYFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0TW9kdWxlTmFtZSA9IG1vZHVsZUNsYXNzTmFtZShtb2R1bGUuaWQpXG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJwaHBcIiB8fCBsYW5ndWFnZSA9PSBcInJ1YnlcIikge1xuICAgICAgY29uc3Qga2V5ID0gbGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IHRhcmdldE1vZHVsZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKSA6IHRhcmdldE1vZHVsZU5hbWVcblxuICAgICAgaWYgKHRhcmdldE1vZHVsZU5hbWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBtb2R1bGUtbmFtZSBjb2xsaXNpb24gJyR7dGFyZ2V0TW9kdWxlTmFtZX0nYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgdGFyZ2V0TW9kdWxlTmFtZXMuYWRkKGtleSlcbiAgICB9XG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJwaHBcIikge1xuICAgICAgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCB0YXJnZXRNb2R1bGVOYW1lLCBcIm1vZHVsZVwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyKGxhbmd1YWdlLCB0YXJnZXRNb2R1bGVOYW1lLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSA9PSBcInJ1YnlcIikgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcihsYW5ndWFnZSwgdGFyZ2V0TW9kdWxlTmFtZSwgbW9kdWxlLmxvY2F0aW9uKVxuXG4gICAgaWYgKGxhbmd1YWdlID09IFwiamF2YVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbW9kdWxlLmlkLnNwbGl0KFwiLlwiKSkgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCBzZWdtZW50LCBcIm1vZHVsZVwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICBjb25zdCBub21pbmFsQ291bnQgPSAobW9kdWxlLnJlY29yZHM/Lmxlbmd0aCA/PyAwKSArIChtb2R1bGUuY2xhc3Nlcz8ubGVuZ3RoID8/IDApICsgKG1vZHVsZS5lcnJvcnM/Lmxlbmd0aCA/PyAwKVxuXG4gICAgICBpZiAobW9kdWxlLmlkLmluY2x1ZGVzKFwiLVwiKSB8fCBub21pbmFsQ291bnQgPiAxIHx8XG4gICAgICAgIG5vbWluYWxDb3VudCA+IDAgJiYgKG1vZHVsZS5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fCBtb2R1bGUuZW50cnlQb2ludCkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIkphdmEgbW9kdWxlIGxheW91dCByZXF1aXJpbmcgbXVsdGlwbGUgcHVibGljIGRlY2xhcmF0aW9ucyBpbiBvbmUgc2VtYW50aWMgbW9kdWxlXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IG1vZHVsZS5yZWNvcmRzPy5bMF0/Lm5hbWUgPz8gbW9kdWxlLmNsYXNzZXM/LlswXT8ubmFtZSA/PyBtb2R1bGUuZXJyb3JzPy5bMF0/Lm5hbWUgPz9cbiAgICAgICAgKG1vZHVsZS5pZCA9PSBwcm9ncmFtLmVudHJ5TW9kdWxlID8gXCJNYWluXCIgOiB0YXJnZXRNb2R1bGVOYW1lKVxuXG4gICAgICBpZiAoIS9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC91LnRlc3QoY2xhc3NOYW1lKSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGBpbnZhbGlkIEphdmEgcHVibGljIGNsYXNzIG5hbWUgJyR7Y2xhc3NOYW1lfSdgLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmlkICE9IHByb2dyYW0uZW50cnlNb2R1bGUpIHZhbGlkYXRlVGFyZ2V0VHlwZUlkZW50aWZpZXIobGFuZ3VhZ2UsIGNsYXNzTmFtZSwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgcGF0aCA9IGBzZW1hbnRpZm9sZC9nZW5lcmF0ZWQvJHttb2R1bGUuaWQucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfS8ke2NsYXNzTmFtZX0uamF2YWBcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpXG5cbiAgICBpZiAoIWlzU2FmZUFydGlmYWN0UGF0aChwYXRoKSB8fCBmb2xkZWQuaGFzKGtleSkpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHVuc2FmZSBvciBjb2xsaWRpbmcgdGFyZ2V0IHBhdGggJyR7cGF0aH0nYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIGZvbGRlZC5hZGQoa2V5KVxuICAgIHBhdGhzLnNldChtb2R1bGUuaWQsIHBhdGgpXG4gIH1cblxuICByZXR1cm4gcGF0aHNcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxvZ2ljYWwgbW9kdWxlIGlkZW50aXR5IHRvIGl0cyBjYW5vbmljYWwgdGFyZ2V0IHR5cGUgc2VnbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIExvZ2ljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IGNsYXNzIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUNsYXNzTmFtZShpZCkge1xuICByZXR1cm4gaWQuc3BsaXQoL1suXy1dKy91KS5tYXAoKHBhcnQpID0+IGAke3BhcnRbMF0udG9VcHBlckNhc2UoKX0ke3BhcnQuc2xpY2UoMSl9YCkuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJhdGlvbiBvciBiaW5kaW5nIG5hbWUgZm9yIHRhcmdldCBjb2xsaXNpb24gY2hlY2tzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbGxpc2lvbiBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldE5hbWUobGFuZ3VhZ2UsIG5hbWUpIHtcbiAgcmV0dXJuIGxhbmd1YWdlID09IFwicGhwXCIgPyBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIikgOiBuYW1lXG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIGEgY2FuZGlkYXRlIGlzIGEgZGlyZWN0IHBsYWluIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogUmFpc2VzIGEgc3RhYmxlIG1hbGZvcm1lZCBwcm9ncmFtLWdlbmVyYXRpb24gcmVxdWVzdCBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBTdGFibGUgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKG1lc3NhZ2UpIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJJTlZBTElEX1BST0dSQU1cIiwgbGFuZ3VhZ2U6IFwicHJvZ3JhbVwiLCBtZXNzYWdlfSlcbn1cbiJdfQ==
|