semantifold 0.5.0 → 0.6.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 +10 -7
- package/build/src/backends/android.js +7 -3
- package/build/src/backends/identifiers.d.ts +6 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +24 -1
- package/build/src/backends/ios.js +2 -2
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.js +4 -4
- package/build/src/backends/zig-runtime.d.ts +5 -0
- package/build/src/backends/zig-runtime.d.ts.map +1 -0
- package/build/src/backends/zig-runtime.js +92 -0
- package/build/src/backends/zig-validation.d.ts +9 -0
- package/build/src/backends/zig-validation.d.ts.map +1 -0
- package/build/src/backends/zig-validation.js +73 -0
- package/build/src/backends/zig.d.ts +42 -0
- package/build/src/backends/zig.d.ts.map +1 -0
- package/build/src/backends/zig.js +584 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +2 -1
- package/build/src/frontends/zig-parser.d.ts +31 -0
- package/build/src/frontends/zig-parser.d.ts.map +1 -0
- package/build/src/frontends/zig-parser.js +17 -0
- package/build/src/frontends/zig.d.ts +14 -0
- package/build/src/frontends/zig.d.ts.map +1 -0
- package/build/src/frontends/zig.js +970 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +30 -1
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +2 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +2 -2
- package/build/src/semantic/validate.js +2 -2
- package/build/src/toolchains.d.ts +6 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +2 -1
- package/build/src/zig-bindings.d.ts +10 -0
- package/build/src/zig-bindings.d.ts.map +1 -0
- package/build/src/zig-bindings.js +54 -0
- package/docs/android.md +2 -2
- package/docs/architecture.md +11 -5
- package/docs/goals.md +1 -1
- package/docs/language-support.md +8 -4
- package/docs/parser-qualification.md +31 -1
- package/docs/source-maps.md +5 -3
- package/docs/testing.md +26 -4
- package/docs/zig.md +33 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/README.md +5 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/README.md +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/grammar.js +900 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/package.json +57 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/folds.scm +23 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/highlights.scm +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/indents.scm +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/injections.scm +10 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/grammar.json +6570 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/node-types.json +3178 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/parser.c +169829 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter-zig.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter.json +38 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/binding.gyp +80 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/index.js +916 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.cc +306 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.cc +397 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1318 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +223 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +297 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +435 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +920 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2165 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +206 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4187 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +130 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1066 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +712 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +83 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1302 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1859 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/package.json +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/src/zig.js +134 -0
- package/package.json +11 -6
- package/src/backends/android.js +6 -2
- package/src/backends/identifiers.js +24 -0
- package/src/backends/ios.js +1 -1
- package/src/backends/native-validation.js +1 -1
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +3 -3
- package/src/backends/zig-runtime.js +93 -0
- package/src/backends/zig-validation.js +68 -0
- package/src/backends/zig.js +579 -0
- package/src/frontends/scalars.js +1 -0
- package/src/frontends/zig-parser.js +20 -0
- package/src/frontends/zig.js +994 -0
- package/src/language-registry.js +30 -0
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +1 -1
- package/src/semantic/validate.js +1 -1
- package/src/toolchains.js +1 -0
- package/src/zig-bindings.js +46 -0
package/build/src/mapping.js
CHANGED
|
@@ -994,7 +994,7 @@ function validPoint(value) {
|
|
|
994
994
|
*/
|
|
995
995
|
function isSemanticLanguage(value) {
|
|
996
996
|
return value == "php" || value == "ruby" || value == "javascript" || value == "typescript" || value == "java" ||
|
|
997
|
-
value == "kotlin" || value == "python" || value == "csharp" || value == "go" || value == "c" || value == "cpp" || value == "rust" || value == "swift" || value == "dart";
|
|
997
|
+
value == "kotlin" || value == "python" || value == "csharp" || value == "go" || value == "c" || value == "cpp" || value == "rust" || value == "swift" || value == "dart" || value == "zig";
|
|
998
998
|
}
|
|
999
999
|
/**
|
|
1000
1000
|
* Tests a supported generated text language value.
|
|
@@ -1139,4 +1139,4 @@ function sortJson(value) {
|
|
|
1139
1139
|
function definedProperties(value) {
|
|
1140
1140
|
return /** @type {Value} */ (Object.fromEntries(Object.entries(value).filter(([, child]) => child !== undefined)));
|
|
1141
1141
|
}
|
|
1142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXBwaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0csT0FBTyxFQUNMLFdBQVcsRUFDWCxtQkFBbUIsSUFBSSx3QkFBd0IsRUFDL0MsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxNQUFNLDJCQUEyQixDQUFBO0FBQ2xDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDbEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBRXhELG1FQUFtRTtBQUNuRSxzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVwQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFPO0lBQ25DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFFcEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTztRQUFFLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVsRyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUE7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUU5QyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxFQUFFLENBQUM7WUFDakQsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDeEMsU0FBUTtRQUNWLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUVyRixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0ksQ0FBQzthQUFNLENBQUM7WUFDTixVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDeEksQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNoQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVE7SUFDbkQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25DLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbkUsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUVwRCxJQUFJLENBQUMsSUFBSTtRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsa0NBQWtDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFFNUUsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDNUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxRQUFRO0lBQ3BELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNuQyxNQUFNLE1BQU0sR0FBRyxVQUFVLElBQUksUUFBUTtRQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUMxQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRWhGLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDdEIsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3REFBd0QsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUVELElBQUksTUFBTSxDQUFBO0lBRVYsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQywwQkFBMEIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDbEksQ0FBQzs7WUFBTSxjQUFjLENBQUMsdURBQXVELENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4SSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQTtJQUMxQixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sR0FBRyxlQUFlLENBQUMsdURBQXVELENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN2SCxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzNELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUNYLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7SUFFekIsT0FBTyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUUzQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTTtZQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFBOztZQUNoRCxJQUFJLEdBQUcsTUFBTSxDQUFBO0lBQ3BCLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV6QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVwRyxLQUFLLElBQUksU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsU0FBUyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDO1FBQ25HLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNO1lBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7QUFDMUgsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTTtJQUMxQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsMEJBQTBCLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFFMUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBTyxFQUFFLFFBQVE7SUFDOUMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLDRCQUE0QixRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRWxHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFPO0lBQ3RDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVyQixPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDMUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFVBQVU7SUFDckMsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFFL0QsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDakMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSztJQUMxQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFdEMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRW5CLCtEQUErRDtJQUMvRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzdELGtDQUFrQztJQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ2hDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQTtJQUV2QixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxJQUFJLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsU0FBUTtRQUNoRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDekMsZ0VBQWdFO1FBQ2hFLElBQUksS0FBSyxDQUFBO1FBRVQsS0FBSyxNQUFNLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxLQUFLLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbkMsSUFBSSxLQUFLLEVBQUUsTUFBTTtnQkFBRSxNQUFLO1FBQzFCLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQTtRQUN4QyxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQTtRQUM1QyxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsTUFBTSxDQUFBO1FBRTVCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLEtBQUssTUFBTSxPQUFPLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUVoRCxJQUFJLFlBQVksSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7b0JBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZGLENBQUM7WUFDRCxNQUFNLFlBQVksR0FBRyxFQUFDLEdBQUcsSUFBSSxFQUFDLENBQUE7WUFFOUIsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFBO1lBQzFCLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQTtZQUU1QixPQUFPLENBQUMsRUFBQyxHQUFHLFlBQVksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUE7UUFDdkYsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLEtBQUssRUFBRSxPQUFPLENBQUE7UUFFdEMsSUFBSSxDQUFDLGVBQWU7WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUE7UUFFekcsSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPO1lBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6RyxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDdEYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDaEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFlBQVksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQTtnQkFDekYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQTtnQkFDckYsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUE7Z0JBRTdILE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQ3RELEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUN4QixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFDdkIsY0FBYyxFQUNkLFlBQVksQ0FDYixFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNqRCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUNyRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNyRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBRWxHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0QsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBRXhGLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLEVBQUMsR0FBRyxRQUFRLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFOzRCQUMxRSxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQ3RDLE9BQU87eUJBQ1IsRUFBQyxDQUFDLENBQUE7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuQixDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sZUFBZSxDQUFDO1FBQ3JCLGdCQUFnQixFQUFFLE9BQU87UUFDekIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLEVBQUUsb0JBQW9CO1FBQzVCLE9BQU87UUFDUCxLQUFLO1FBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLE9BQU8sRUFBRSxDQUFDO0tBQ1gsQ0FBQyxDQUFBO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0gsU0FBUyxZQUFZLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixHQUFHLEtBQUs7UUFDekgsSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNqRixPQUFPLGlCQUFpQixDQUFDO2dCQUN2QixTQUFTO2dCQUNULFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQztnQkFDL0MsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2dCQUNwQixNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUMsV0FBVyxDQUFDO29CQUN4QyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUMvQixjQUFjLEVBQUUscUJBQXFCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQztpQkFDMUg7Z0JBQ0QsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2FBQ3JCLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7WUFDL0QsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUscUJBQXFCLENBQUM7WUFDcEcsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUNiLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUztZQUN0RyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXO2dCQUMzRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU07Z0JBQ2xCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSw0REFBNEQsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEVBQUM7WUFDNUksQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQztnQkFDeEMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFDL0IsY0FBYyxFQUFFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUscUJBQXFCLENBQUM7YUFDMUgsQ0FBQTtRQUVMLE9BQU8saUJBQWlCLENBQUM7WUFDdkIsR0FBRyxTQUFTO1lBQ1osU0FBUztZQUNULFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN0RixTQUFTLENBQUMsV0FBVyxJQUFJLE9BQU8sSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJLE9BQU8sSUFBSSxvQkFBb0I7b0JBQzFGLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3JDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJO1lBQ3RDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixNQUFNO1lBQ04sSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1NBQzdCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBTztRQUNqQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFM0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFDcEYsTUFBTSxXQUFXLEdBQUcseUJBQXlCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFdEgsT0FBTztZQUNMLFdBQVc7WUFDWCxPQUFPO1lBQ1AsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUN2RixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxTQUFTLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLHFCQUFxQjtRQUNqRyxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN4QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFM0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO1lBQzlELENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN6QyxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsSUFBSSxPQUFPLEtBQUssZUFBZTtnQkFDdEUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUNoQixDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNO29CQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVc7b0JBQ25CLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBRXpDLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztvQkFBRSxNQUFNLElBQUksVUFBVSxDQUFDLHdDQUF3QyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUE7Z0JBQzlILGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFFbkMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO1lBQzlELENBQUM7WUFFRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2xILEdBQUcsYUFBYTtnQkFDaEIsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLE1BQU07Z0JBQ2pELElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLGFBQWEsQ0FBQyxJQUFJO2dCQUN4QyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUTthQUN4RCxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ1IsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsaUJBQWlCLENBQUMsUUFBUTtRQUNqQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTTtRQUN4QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsaUNBQWlDLFFBQVEsSUFBSSxDQUFDLENBQUE7UUFDaEYsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFFekYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLGVBQWUsRUFBRSxDQUFDO2dCQUFFLGVBQWUsRUFBRSxDQUFBO1lBQ3BFLGNBQWMsR0FBRyxFQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsRUFBRSxVQUFVLGVBQWUsRUFBRSxFQUFDLENBQUE7WUFDN0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM5QixDQUFDO1FBQ0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsbUJBQW1CLENBQUMsT0FBTztRQUNsQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQ3BFLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUE7SUFDakUsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxJQUFJO0lBQ2pDLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzdDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxNQUFNO0lBQ3JDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRO1FBQUUsT0FBTyxDQUFDLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQzVGLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFBO0lBRW5ELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTO0lBQ2xELE9BQU8sTUFBTSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU87UUFDakYsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLElBQUksRUFBRSxLQUFLO0lBQ3ZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUE7QUFDNUcsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3RELE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFDMUQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ04sTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQzlGLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUVwSCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQTtRQUUzRCxJQUFJLE1BQU0sSUFBSSxJQUFJO1lBQUUsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUE7SUFDbEcsQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQTtRQUUzRCxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDakQsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUE7UUFDOUUsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3RixlQUFlLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUM3RSxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFBO1FBQy9GLE1BQU0sTUFBTSxHQUFHLGNBQWM7WUFDM0IsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFDLENBQUM7WUFDbEcsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUMsQ0FBQTtRQUU1RyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDN0UsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdEgsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFBO1FBRXhDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3hJLENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDeEksQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBQztJQUNuRyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNyQyxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNELCtEQUErRDtJQUMvRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFDbEIsMEhBQTBIO0lBQzFILE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV4QyxLQUFLLE1BQU0sUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFN0MsT0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ3BGLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSztnQkFBRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3RFLFNBQVE7UUFDVixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDckQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUU3QyxPQUFPLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNoSCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksVUFBVSxDQUFDLGlEQUFpRCxRQUFRLENBQUMsUUFBUSw2QkFBNkIsQ0FBQyxDQUFBO1FBQ3ZILENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbkgsQ0FBQztJQUNELDBFQUEwRTtJQUMxRSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFbEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdEMsSUFBSSxNQUFNLElBQUksSUFBSTtZQUFFLE9BQU07UUFFMUIsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUE7UUFDN0QsTUFBTSxjQUFjLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hELE1BQU0sVUFBVSxHQUFHO1lBQ2pCLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJO1lBQ3pFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxJQUFJLGNBQWM7WUFDcEQsRUFBRSxFQUFFLFVBQVUsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM5QixRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVEsSUFBSSxJQUFJO1NBQzNDLENBQUE7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUM3RixDQUFDLENBQUMsQ0FBQTtJQUNGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUM7U0FDakYsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUscUJBQXFCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUUvRixvR0FBb0c7SUFDcEcsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBRWpCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtJQUNwSSxDQUFDLENBQUMsQ0FBQTtJQUVGLHFFQUFxRTtJQUNyRSxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUE7SUFFdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ25ELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWE7WUFDOUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3RCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBRTNDLElBQUksR0FBRyxJQUFJLGVBQWU7WUFBRSxPQUFNO1FBRWxDLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3RixXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxHQUFHLENBQUM7Z0JBQ3ZFLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSw2QkFBNkIsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFDO2FBQ3ZGLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBO1FBQ25HLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksVUFBVSxDQUFDLDhEQUE4RCxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQTtRQUN6RyxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsZUFBZTtRQUNwQyx1REFBdUQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDMUYsT0FBTyxDQUFDLFlBQVksRUFDcEIsT0FBTyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQzNCLENBQUE7UUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN2RSxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFFMUcsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNqQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsR0FBRyxDQUFDO1lBQ3ZFLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVM7WUFDL0IsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUM7U0FDMUUsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDLENBQUMsQ0FBQTtJQUVGLHFFQUFxRTtJQUNyRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUE7SUFDaEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBRWQsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNO1lBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDdkcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsR0FBRyxJQUFJO2dCQUNQLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDckYsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDVCxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFBO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU07UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFFN0UsT0FBTyxlQUFlLENBQUM7UUFDckIsZ0JBQWdCLEVBQUUsT0FBTztRQUN6QixTQUFTLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUN4QyxLQUFLLEVBQUUsRUFBRTtRQUNULE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsT0FBTztRQUNQLEtBQUs7UUFDTCxPQUFPLEVBQUUsRUFBRTtRQUNYLE9BQU8sRUFBRSxDQUFDO0tBQ1gsQ0FBQyxDQUFBO0lBRUY7Ozs7O09BS0c7SUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRztRQUM5QixPQUFPO1lBQ0wsU0FBUyxFQUFFLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUM3RCxXQUFXLEVBQUUsV0FBVztZQUN4QixNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFDO1NBQ3JGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTztJQUM3QyxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxzQkFBc0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRTlILE9BQU8sbUJBQW1CLENBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFVBQVUsRUFBRSxPQUFPO0lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtRQUFFLE9BQU8sVUFBVSxDQUFBO0lBRTNDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRTVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUTtRQUFFLE9BQU8sVUFBVSxDQUFBO0lBRXpDLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQztRQUMvQixLQUFLLEVBQUUsVUFBVTtRQUNqQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLFFBQVE7UUFDdEMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1FBQzdCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU07S0FDM0IsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQUs7SUFDbkMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksb0JBQW9CO1FBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzFGLE1BQU0sSUFBSSxTQUFTLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM5RCxNQUFNLFNBQVMsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM1RSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO0lBRTNCLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxTQUFTLElBQUksUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksUUFBUTtRQUNyRyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hILENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1RixNQUFNLElBQUksU0FBUyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pELE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGdFQUFnRSxDQUFDLENBQUE7SUFFakgsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUUzQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxJQUFJLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLElBQUksUUFBUSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0gsT0FBTyxNQUFNLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxJQUFJLFFBQVE7WUFDakksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuRSxNQUFNLElBQUksU0FBUyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7UUFDMUUsQ0FBQztRQUNELFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzFCLENBQUM7SUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztTQUN6RixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9GLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pGLDRFQUE0RTtJQUM1RSxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFbkMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFN0QsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNyQixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBQ0QsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUUzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFM0IsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9HLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUTtZQUN2RyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7UUFDM0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDcEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFM0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sSUFBSSxRQUFRLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNILE9BQU8sTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztZQUN6RCxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDaE4sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzNFLE1BQU0sQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLE1BQU0sQ0FBQyxxQkFBcUIsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUNqRyxNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsSUFBSSwyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUMzRyxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUN2RyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUNyRyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUNyRyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxnRUFBZ0UsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUM3SCxNQUFNLENBQUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxvREFBb0QsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUN2SCxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxzREFBc0QsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUNwSCxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxrRUFBa0UsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUN2SSxNQUFNLENBQUMsSUFBSSxJQUFJLFlBQVksSUFBSSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUM1RyxNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsSUFBSSwyREFBMkQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUMzSCxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSwwREFBMEQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO2dCQUN6SCxNQUFNLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSw0REFBNEQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQzlILENBQUMsRUFBRSxDQUFDO1lBQ0wsTUFBTSxJQUFJLFNBQVMsQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO1FBQ3pFLENBQUM7UUFDRCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUMvRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUE7WUFDakcsMEJBQTBCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZHLE1BQU0sSUFBSSxTQUFTLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtRQUNqRixLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sU0FBUyxJQUFJLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDOUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEcsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1lBQzdELENBQUM7WUFDRCwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFDdEYsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUE7SUFFbkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDbEgsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRywyREFBMkQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFFN0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLFdBQVc7WUFDM0csUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU07WUFDcEYsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2RixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RixNQUFNLElBQUksU0FBUyxDQUFDLGtGQUFrRixDQUFDLENBQUE7UUFDekcsQ0FBQztRQUNELGNBQWM7UUFDWiwyREFBMkQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQ3pGLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsT0FBTyxFQUNQLFNBQVMsQ0FDVixDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDMUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFOUMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxNQUFNLElBQUksUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMENBQTBDLENBQUMsQ0FBQTtRQUNoSixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLFFBQVEsSUFBSSxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO1FBQzFKLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksUUFBUTtZQUN6RixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMxRixNQUFNLElBQUksU0FBUyxDQUFDLCtDQUErQyxDQUFDLENBQUE7UUFDdEUsQ0FBQztRQUNELFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUNuQyxDQUFDO0lBRUQsSUFBSSxXQUFXLElBQUksT0FBTyxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDREQUE0RCxDQUFDLENBQUE7QUFDdEgsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQUs7SUFDbkMsb0dBQW9HO0lBQ3BHLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUV0QyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25CLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFFdkQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUFPO0lBQzNCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFMUMsSUFBSSxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUE7SUFFekIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRXhCLE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQU87SUFDaEMsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzdFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1NBQ3pGLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxxRUFBcUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzdJLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUscUVBQXFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNySix5SUFBeUk7SUFDekksTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsRiwrRkFBK0Y7SUFDL0YsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFL0YsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzdELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUVuRSxLQUFLLE1BQU0sT0FBTyxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksT0FBTyxDQUFDLE1BQU07Z0JBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDbkQsSUFBSSxPQUFPLENBQUMsUUFBUTtnQkFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6RCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDM0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBRW5FLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUN0RCxTQUFRO1lBQ1YsQ0FBQztZQUNELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUMzQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTTtnQkFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3RDLElBQUk7Z0JBQ0osS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDckMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELEtBQUssTUFBTSxNQUFNLElBQUksV0FBVztZQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ25FLEtBQUssTUFBTSxRQUFRLElBQUksYUFBYTtZQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzdFLENBQUM7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvSCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUE7UUFFakIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFDLENBQUE7QUFDakksQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTTtJQUNyQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDWCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO0lBRXZCLE9BQU8sR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFFM0MsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksTUFBTTtZQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFBOztZQUMvRCxJQUFJLEdBQUcsTUFBTSxDQUFBO0lBQ3BCLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBRWhDLE9BQU8sU0FBUyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRztJQUNsRCxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNqQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFakQsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQ1gsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtJQUV2QixPQUFPLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBRTNDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUs7WUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQTs7WUFDNUQsSUFBSSxHQUFHLE1BQU0sQ0FBQTtJQUNwQixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO0lBRXRCLEtBQUssSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNqRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQTtBQUNwQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFO0lBQ2hELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTTtJQUVwRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3BFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVM7SUFDMUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sSUFBSSxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO0lBRWxILElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM1QixlQUFlLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3JILE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1FBQzdILE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDM0csT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO1FBQ3JJLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDbEgsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLElBQUksU0FBUyxDQUFDLDBCQUEwQixDQUFDLENBQUE7QUFDakQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFaEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVE7UUFDOUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxJQUFJLFFBQVE7UUFDakUsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxJQUFJLFFBQVE7UUFDckUsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDNUgsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDdEksSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3BGLE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBQ0QseUJBQXlCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNqRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVztJQUN2RSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDM0YsTUFBTSxRQUFRLEdBQUcsMkRBQTJELENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwRixNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoSSxNQUFNLElBQUksU0FBUyxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDakQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVztJQUMzRCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDLHFCQUFxQjtJQUM5RCwyREFBMkQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQ3pGO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVztJQUMxRCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRztRQUN2RixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXZILElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFdkMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxXQUFXLEtBQUssU0FBUztRQUM5RSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDN0UsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFLO0lBQ3ZCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3BELE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDckcscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDckksQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQUs7SUFDL0IsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLFlBQVksSUFBSSxLQUFLLElBQUksWUFBWSxJQUFJLEtBQUssSUFBSSxNQUFNO1FBQzNHLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksTUFBTSxDQUFBO0FBQzVLLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQUk7SUFDekIsT0FBTztRQUNMLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ2pDLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7UUFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtLQUN4QixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVE7SUFDM0MsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsY0FBYyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFNUMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFBO0lBQ3hCLENBQUM7SUFFRCxPQUFPLGVBQWUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDckUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU07SUFDcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFN0MsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtBQUNqRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSztJQUM1QixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO0FBQzlGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVztJQUM3RCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDNUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTlFLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyw4QkFBOEIsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUE7SUFFckYsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBTTtJQUMvQixJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQTtJQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUE7SUFFaEUsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQTtBQUMzQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTO0lBQzdDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvQyxJQUFJLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsb0NBQW9DLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQTtRQUVyRyxPQUFPLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUE7SUFFaEosT0FBTztRQUNMLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN2RyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsU0FBUztJQUNwRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUVoRCxJQUFJLENBQUMsUUFBUTtRQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsb0NBQW9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQTtJQUV0RyxNQUFNLFlBQVksR0FBRyxFQUFDLEdBQUcsT0FBTyxFQUFDLENBQUE7SUFFakMsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFBO0lBQzFCLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQTtJQUU1QixPQUFPLEVBQUMsR0FBRyxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxLQUFLO0lBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDcEQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7UUFDdEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEgsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQUs7SUFDOUIsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDcEgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2FkZFNlZ21lbnQsIEdlbk1hcHBpbmcsIG1heWJlQWRkU2VnbWVudCwgc2V0U291cmNlQ29udGVudCwgdG9FbmNvZGVkTWFwfSBmcm9tIFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIlxuaW1wb3J0IHtcbiAgZWFjaE1hcHBpbmcsXG4gIG9yaWdpbmFsUG9zaXRpb25Gb3IgYXMgdHJhY2VPcmlnaW5hbFBvc2l0aW9uRm9yLFxuICBzb3VyY2VDb250ZW50Rm9yLFxuICBUcmFjZU1hcFxufSBmcm9tIFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2NyZWF0ZUNvb3JkaW5hdGVJbmRleCwgaW5kZXhlZE9mZnNldEF0LCBpbmRleGVkUG9pbnRBdCwgbG9jYXRpb25Gcm9tT2Zmc2V0c30gZnJvbSBcIi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHtwcmltYXJ5TG9jYXRpb259IGZyb20gXCIuL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGJ1aWxkTWFwcGluZ0luZGV4Pn0gTWFwcGluZ0luZGV4ICovXG4vKiogQHR5cGUge1dlYWtNYXA8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmcsIE1hcHBpbmdJbmRleD59ICovXG5jb25zdCBtYXBwaW5nSW5kZXhlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBQcm9qZWN0cyBhbiBhdXRob3JpdGF0aXZlIFNlbWFudGlmb2xkIG1hcHBpbmcgdG8gU291cmNlIE1hcCB2My5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gU291cmNlIE1hcCB2My5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU291cmNlTWFwVjMobWFwcGluZykge1xuICBjb25zdCBpbmRleCA9IG1hcHBpbmdJbmRleChtYXBwaW5nKVxuXG4gIGNvbnN0IGdlbmVyYXRlZCA9IG5ldyBHZW5NYXBwaW5nKHtmaWxlOiBtYXBwaW5nLmdlbmVyYXRlZC5maWxlbmFtZX0pXG5cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2YgbWFwcGluZy5zb3VyY2VzKSBzZXRTb3VyY2VDb250ZW50KGdlbmVyYXRlZCwgc291cmNlLmZpbGVuYW1lLCBzb3VyY2UuY29udGVudClcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgbWFwcGluZy5zcGFucykge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gcHJpbWFyeUxvY2F0aW9uKHNwYW4ub3JpZ2luKVxuICAgIGNvbnN0IGxpbmUgPSBzcGFuLmdlbmVyYXRlZC5zdGFydC5saW5lIC0gMVxuICAgIGNvbnN0IGNvbHVtbiA9IHNwYW4uZ2VuZXJhdGVkLnN0YXJ0LmNvbHVtbiAtIDFcblxuICAgIGlmICghbG9jYXRpb24gfHwgc3Bhbi5tYXBwaW5nS2luZCA9PSBcInN5bnRoZXRpY1wiKSB7XG4gICAgICBtYXliZUFkZFNlZ21lbnQoZ2VuZXJhdGVkLCBsaW5lLCBjb2x1bW4pXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBzb3VyY2VGb3JPcmlnaW4obWFwcGluZywgc3Bhbi5vcmlnaW4sIGxvY2F0aW9uLCBpbmRleC5zb3VyY2VzQnlJZClcblxuICAgIGlmIChzcGFuLm5hbWUpIHtcbiAgICAgIGFkZFNlZ21lbnQoZ2VuZXJhdGVkLCBsaW5lLCBjb2x1bW4sIHJlZ2lzdGVyZWQuZmlsZW5hbWUsIGxvY2F0aW9uLnN0YXJ0LmxpbmUgLSAxLCBsb2NhdGlvbi5zdGFydC5jb2x1bW4gLSAxLCBzcGFuLm5hbWUsIHJlZ2lzdGVyZWQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkU2VnbWVudChnZW5lcmF0ZWQsIGxpbmUsIGNvbHVtbiwgcmVnaXN0ZXJlZC5maWxlbmFtZSwgbG9jYXRpb24uc3RhcnQubGluZSAtIDEsIGxvY2F0aW9uLnN0YXJ0LmNvbHVtbiAtIDEsIG51bGwsIHJlZ2lzdGVyZWQuY29udGVudClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG9FbmNvZGVkTWFwKGdlbmVyYXRlZClcbn1cblxuLyoqXG4gKiBMb29rcyB1cCBvcmlnaW5hbCBwcm92ZW5hbmNlIGZvciBvbmUgZ2VuZXJhdGVkIFVURi0xNiBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0ge3tvZmZzZXQ6IG51bWJlcn0gfCB7bGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcn19IHBvc2l0aW9uIC0gR2VuZXJhdGVkIHBvc2l0aW9uLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRMb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQsIG1hcHBpbmdLaW5kOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLk1hcHBpbmdLaW5kLCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5vZGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN5bWJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWR9fSBMb29rdXAgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3JpZ2luYWxQb3NpdGlvbkZvcihtYXBwaW5nLCBwb3NpdGlvbikge1xuICBjb25zdCBpbmRleCA9IG1hcHBpbmdJbmRleChtYXBwaW5nKVxuICBjb25zdCBvZmZzZXQgPSBwb3NpdGlvbk9mZnNldChpbmRleC5nZW5lcmF0ZWRDb29yZGluYXRlcywgcG9zaXRpb24pXG4gIGNvbnN0IHNwYW4gPSBzcGFuRm9yR2VuZXJhdGVkKG1hcHBpbmcuc3BhbnMsIG9mZnNldClcblxuICBpZiAoIXNwYW4pIHRocm93IG5ldyBSYW5nZUVycm9yKGBObyBnZW5lcmF0ZWQgbWFwcGluZyBhdCBvZmZzZXQgJHtvZmZzZXR9LmApXG5cbiAgcmV0dXJuIG1hcHBpbmdSZXN1bHQoc3Bhbilcbn1cblxuLyoqXG4gKiBMb29rcyB1cCBldmVyeSBnZW5lcmF0ZWQgc3BhbiBjb250YWluaW5nIG9uZSBvcmlnaW5hbCBVVEYtMTYgcG9zaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHsoe2ZpbGVuYW1lOiBzdHJpbmd9IHwge3NvdXJjZUlkOiBzdHJpbmd9KSAmICh7b2Zmc2V0OiBudW1iZXJ9IHwge2xpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9KX0gcG9zaXRpb24gLSBPcmlnaW5hbCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHt7Z2VuZXJhdGVkTG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkLCBtYXBwaW5nS2luZDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NYXBwaW5nS2luZCwgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBub2RlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcm9sZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzeW1ib2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkfVtdfSBHZW5lcmF0ZWQgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uRm9yKG1hcHBpbmcsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IGluZGV4ID0gbWFwcGluZ0luZGV4KG1hcHBpbmcpXG4gIGNvbnN0IHNvdXJjZSA9IFwic291cmNlSWRcIiBpbiBwb3NpdGlvblxuICAgID8gaW5kZXguc291cmNlc0J5SWQuZ2V0KHBvc2l0aW9uLnNvdXJjZUlkKVxuICAgIDogbWFwcGluZy5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmZpbGVuYW1lID09IHBvc2l0aW9uLmZpbGVuYW1lKVxuXG4gIGlmICghc291cmNlKSByZXR1cm4gW11cbiAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwgJiYgIShcIm9mZnNldFwiIGluIHBvc2l0aW9uKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNvdXJjZSBjb250ZW50IGlzIHJlcXVpcmVkIGZvciBsaW5lL2NvbHVtbiBsb29rdXAgb2YgJHtzb3VyY2UuZmlsZW5hbWV9LmApXG4gIH1cblxuICBsZXQgb2Zmc2V0XG5cbiAgaWYgKFwib2Zmc2V0XCIgaW4gcG9zaXRpb24pIHtcbiAgICBpZiAoc291cmNlLmNvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvc2l0aW9uLm9mZnNldCkgfHwgcG9zaXRpb24ub2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc291cmNlIG9mZnNldDogJHtwb3NpdGlvbi5vZmZzZXR9YClcbiAgICB9IGVsc2UgaW5kZXhlZFBvaW50QXQoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+fSAqLyAoaW5kZXguc291cmNlQ29vcmRpbmF0ZXMuZ2V0KHNvdXJjZS5pZCkpLCBwb3NpdGlvbi5vZmZzZXQpXG4gICAgb2Zmc2V0ID0gcG9zaXRpb24ub2Zmc2V0XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gaW5kZXhlZE9mZnNldEF0KC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pn0gKi8gKGluZGV4LnNvdXJjZUNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSxcbiAgICAgIHBvc2l0aW9uLmxpbmUsIHBvc2l0aW9uLmNvbHVtbilcbiAgfVxuICBjb25zdCBlbnRyaWVzID0gaW5kZXgub3JpZ2luYWxCeVNvdXJjZS5nZXQoc291cmNlLmlkKSA/PyBbXVxuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IGVudHJpZXMubGVuZ3RoXG5cbiAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG5cbiAgICBpZiAoZW50cmllc1ttaWRkbGVdLnN0YXJ0IDw9IG9mZnNldCkgbG93ID0gbWlkZGxlICsgMVxuICAgIGVsc2UgaGlnaCA9IG1pZGRsZVxuICB9XG5cbiAgLyoqIEB0eXBlIHtTZXQ8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuPn0gKi9cbiAgY29uc3QgbWF0Y2hlcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc3BhbiBvZiBpbmRleC5vcmlnaW5hbFBvaW50c0J5U291cmNlLmdldChzb3VyY2UuaWQpPy5nZXQob2Zmc2V0KSA/PyBbXSkgbWF0Y2hlcy5hZGQoc3BhbilcblxuICBmb3IgKGxldCBjYW5kaWRhdGUgPSBsb3cgLSAxOyBjYW5kaWRhdGUgPj0gMCAmJiBlbnRyaWVzW2NhbmRpZGF0ZV0ucHJlZml4RW5kID4gb2Zmc2V0OyBjYW5kaWRhdGUtLSkge1xuICAgIGlmIChlbnRyaWVzW2NhbmRpZGF0ZV0uZW5kID4gb2Zmc2V0KSBtYXRjaGVzLmFkZChlbnRyaWVzW2NhbmRpZGF0ZV0uc3BhbilcbiAgfVxuXG4gIHJldHVybiBbLi4ubWF0Y2hlc10uc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCAtIHJpZ2h0LmdlbmVyYXRlZC5zdGFydC5vZmZzZXQpLm1hcChtYXBwaW5nUmVzdWx0KVxufVxuXG4vKipcbiAqIFJldHVybnMgZXZlcnkgZ2VuZXJhdGVkIHNwYW4gYXNzb2NpYXRlZCB3aXRoIG9uZSBjYW5vbmljYWwgc2VtYW50aWMgbm9kZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIC0gQ2Fub25pY2FsIG5vZGUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IE1hdGNoaW5nIHNwYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhbnNGb3JOb2RlKG1hcHBpbmcsIG5vZGVJZCkge1xuICBjb25zdCBpbmRleCA9IG1hcHBpbmdJbmRleChtYXBwaW5nKVxuICBpZiAoIWluZGV4Lm5vZGVTcGFucy5oYXMobm9kZUlkKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gc2VtYW50aWMgbm9kZTogJHtub2RlSWR9YClcblxuICByZXR1cm4gWy4uLihpbmRleC5ub2RlU3BhbnMuZ2V0KG5vZGVJZCkgPz8gW10pXVxufVxuXG4vKipcbiAqIFJldHVybnMgZXZlcnkgZ2VuZXJhdGVkIHNwYW4gYXNzb2NpYXRlZCB3aXRoIG9uZSBjYW5vbmljYWwgc2VtYW50aWMgc3ltYm9sLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzeW1ib2xJZCAtIENhbm9uaWNhbCBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IE1hdGNoaW5nIHNwYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhbnNGb3JTeW1ib2wobWFwcGluZywgc3ltYm9sSWQpIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcbiAgaWYgKCFpbmRleC5zeW1ib2xTcGFucy5oYXMoc3ltYm9sSWQpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBzZW1hbnRpYyBzeW1ib2w6ICR7c3ltYm9sSWR9YClcblxuICByZXR1cm4gWy4uLihpbmRleC5zeW1ib2xTcGFucy5nZXQoc3ltYm9sSWQpID8/IFtdKV1cbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIGEgdmFsaWRhdGVkIHJpY2ggbWFwcGluZyBkZXRlcm1pbmlzdGljYWxseS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDYW5vbmljYWwgcHJldHR5IEpTT04gd2l0aCBvbmUgdHJhaWxpbmcgTEYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlNYXBwaW5nKG1hcHBpbmcpIHtcbiAgbWFwcGluZ0luZGV4KG1hcHBpbmcpXG5cbiAgcmV0dXJuIGAke0pTT04uc3RyaW5naWZ5KHNvcnRKc29uKG1hcHBpbmcpLCBudWxsLCAyKX1cXG5gXG59XG5cbi8qKlxuICogUGFyc2VzIGFuZCB2YWxpZGF0ZXMgYSByaWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VyaWFsaXplZCAtIE1hcHBpbmcgSlNPTi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gUGFyc2VkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1hcHBpbmcoc2VyaWFsaXplZCkge1xuICBjb25zdCBtYXBwaW5nID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoSlNPTi5wYXJzZShzZXJpYWxpemVkKSlcblxuICByZXR1cm4gZmluYWxpemVNYXBwaW5nKG1hcHBpbmcpXG59XG5cbi8qKlxuICogQ29tcG9zZXMgYW4gb3V0ZXIgcmljaCBtYXAgdGhyb3VnaCBhbiBpbm5lciByaWNoIG1hcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG91dGVyIC0gRmluYWwgb3V0cHV0IHRvIGludGVybWVkaWF0ZSBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBpbm5lciAtIEludGVybWVkaWF0ZSB0byBvcmlnaW5hbCBtYXAuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IENvbXBvc2VkIHJpY2ggbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZU1hcHBpbmdzKG91dGVyLCBpbm5lcikge1xuICBjb25zdCBvdXRlckluZGV4ID0gbWFwcGluZ0luZGV4KG91dGVyKVxuXG4gIG1hcHBpbmdJbmRleChpbm5lcilcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSAqL1xuICBjb25zdCBzb3VyY2VzID0gaW5uZXIuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gKHsuLi5zb3VyY2V9KSlcbiAgY29uc3Qgc291cmNlSWRzID0gbmV3IFNldChzb3VyY2VzLm1hcCgoc291cmNlKSA9PiBzb3VyY2UuaWQpKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG91dGVyU291cmNlSWRzID0gbmV3IE1hcCgpXG4gIGxldCBuZXh0U291cmNlSW5kZXggPSAwXG5cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygb3V0ZXIuc291cmNlcykge1xuICAgIGlmIChzb3VyY2VSZXByZXNlbnRzR2VuZXJhdGVkKHNvdXJjZSwgaW5uZXIuZ2VuZXJhdGVkKSkgY29udGludWVcbiAgICByZXRhaW5PdXRlclNvdXJjZShzb3VyY2UuaWQpXG4gIH1cblxuICBjb25zdCBzcGFucyA9IG91dGVyLnNwYW5zLmZsYXRNYXAoKHNwYW4pID0+IHtcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHRyYWNlUmVsYXRlZE9yaWdpbj4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHRyYWNlXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4oc3Bhbi5vcmlnaW4pKSB7XG4gICAgICB0cmFjZSA9IHRyYWNlUmVsYXRlZE9yaWdpbihyZWxhdGVkKVxuICAgICAgaWYgKHRyYWNlPy50cmFjZWQpIGJyZWFrXG4gICAgfVxuICAgIGNvbnN0IGxvY2F0aW9uID0gdHJhY2U/LnJlbGF0ZWQubG9jYXRpb25cbiAgICBjb25zdCBvdmVybGFwcGluZyA9IHRyYWNlPy5vdmVybGFwcGluZyA/PyBbXVxuICAgIGNvbnN0IHRyYWNlZCA9IHRyYWNlPy50cmFjZWRcblxuICAgIGlmICghdHJhY2VkKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4oc3Bhbi5vcmlnaW4pKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0ZWRUcmFjZSA9IHRyYWNlUmVsYXRlZE9yaWdpbihyZWxhdGVkKVxuXG4gICAgICAgIGlmIChyZWxhdGVkVHJhY2UgJiYgaXNHZW5lcmF0ZWRFb2ZQb2ludChyZWxhdGVkKSkgcmV0YWluT3V0ZXJTb3VyY2UocmVsYXRlZC5zb3VyY2VJZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuaWRlbnRpZmllZCA9IHsuLi5zcGFufVxuXG4gICAgICBkZWxldGUgdW5pZGVudGlmaWVkLm5vZGVJZFxuICAgICAgZGVsZXRlIHVuaWRlbnRpZmllZC5zeW1ib2xJZFxuXG4gICAgICByZXR1cm4gW3suLi51bmlkZW50aWZpZWQsIG9yaWdpbjogcmVtYXBPcmlnaW5Tb3VyY2VJZHMoc3Bhbi5vcmlnaW4sIG91dGVyU291cmNlSWRzKX1dXG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkUmVsYXRlZCA9IHRyYWNlPy5yZWxhdGVkXG5cbiAgICBpZiAoIXNlbGVjdGVkUmVsYXRlZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnRlcm1lZGlhdGUgdHJhY2Ugc2VsZWN0aW9uIGlzIG1pc3NpbmcgaXRzIHJlbGF0ZWQgb3JpZ2luLlwiKVxuXG4gICAgaWYgKGxvY2F0aW9uICYmIG92ZXJsYXBwaW5nLmxlbmd0aCA+IDEgJiYgc3Bhbi5tYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiZcbiAgICAgIHNwYW4uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgLSBzcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgPT0gbG9jYXRpb24uZW5kLm9mZnNldCAtIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCkge1xuICAgICAgcmV0dXJuIG92ZXJsYXBwaW5nLm1hcCgoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXBTdGFydCA9IE1hdGgubWF4KGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCwgY2FuZGlkYXRlLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQpXG4gICAgICAgIGNvbnN0IG92ZXJsYXBFbmQgPSBNYXRoLm1pbihsb2NhdGlvbi5lbmQub2Zmc2V0LCBjYW5kaWRhdGUuZ2VuZXJhdGVkLmVuZC5vZmZzZXQpXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZFN0YXJ0ID0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ICsgb3ZlcmxhcFN0YXJ0IC0gbG9jYXRpb24uc3RhcnQub2Zmc2V0XG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZEVuZCA9IHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCArIG92ZXJsYXBFbmQgLSBsb2NhdGlvbi5zdGFydC5vZmZzZXRcbiAgICAgICAgY29uc3QgcHJlc2VydmVzV2hvbGVPcmlnaW4gPSBvdmVybGFwU3RhcnQgPT0gY2FuZGlkYXRlLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgJiYgb3ZlcmxhcEVuZCA9PSBjYW5kaWRhdGUuZ2VuZXJhdGVkLmVuZC5vZmZzZXRcblxuICAgICAgICByZXR1cm4gY29tcG9zZWRTcGFuKHNwYW4sIGNhbmRpZGF0ZSwgbG9jYXRpb25Gcm9tT2Zmc2V0cyhcbiAgICAgICAgICBvdXRlci5nZW5lcmF0ZWQuZmlsZW5hbWUsXG4gICAgICAgICAgb3V0ZXIuZ2VuZXJhdGVkLmNvbnRlbnQsXG4gICAgICAgICAgZ2VuZXJhdGVkU3RhcnQsXG4gICAgICAgICAgZ2VuZXJhdGVkRW5kXG4gICAgICAgICksIHByZXNlcnZlc1dob2xlT3JpZ2luLCBzZWxlY3RlZFJlbGF0ZWQsIHRydWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHByZXNlcnZlc1dob2xlT3JpZ2luID0gQm9vbGVhbihsb2NhdGlvbiAmJiBsb2NhdGlvbi5zdGFydC5vZmZzZXQgPT0gdHJhY2VkLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgJiZcbiAgICAgIGxvY2F0aW9uLmVuZC5vZmZzZXQgPT0gdHJhY2VkLmdlbmVyYXRlZC5lbmQub2Zmc2V0KVxuICAgIGNvbnN0IGNvbXBvc2VkID0gY29tcG9zZWRTcGFuKHNwYW4sIHRyYWNlZCwgc3Bhbi5nZW5lcmF0ZWQsIHByZXNlcnZlc1dob2xlT3JpZ2luLCBzZWxlY3RlZFJlbGF0ZWQpXG5cbiAgICBpZiAoc3Bhbi5vcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiICYmIG92ZXJsYXBwaW5nLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG9yaWdpbnMgPSBjb21wb3NlUmVsYXRlZE9yaWdpbnMoW3NlbGVjdGVkUmVsYXRlZF0sIHNlbGVjdGVkUmVsYXRlZCwgdHJhY2VkLCBmYWxzZSlcblxuICAgICAgaWYgKG9yaWdpbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gW3suLi5jb21wb3NlZCwgbWFwcGluZ0tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImFuY2hvclwiKSwgb3JpZ2luOiB7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZGVyaXZlZFwiKSxcbiAgICAgICAgICBvcmlnaW5zXG4gICAgICAgIH19XVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbY29tcG9zZWRdXG4gIH0pXG5cbiAgcmV0dXJuIGZpbmFsaXplTWFwcGluZyh7XG4gICAgY29vcmRpbmF0ZVN5c3RlbTogXCJ1dGYxNlwiLFxuICAgIGdlbmVyYXRlZDogb3V0ZXIuZ2VuZXJhdGVkLFxuICAgIG5vZGVzOiBpbm5lci5ub2RlcyxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgc291cmNlcyxcbiAgICBzcGFucyxcbiAgICBzeW1ib2xzOiBpbm5lci5zeW1ib2xzLFxuICAgIHZlcnNpb246IDFcbiAgfSlcblxuICAvKipcbiAgICogQ29tcG9zZXMgb25lIG91dGVyIGdlbmVyYXRlZCByYW5nZSB3aXRoIGFuIGlubmVyIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gb3V0ZXJTcGFuIC0gT3V0ZXIgc3Bhbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IGlubmVyU3BhbiAtIElubmVyIHNwYW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gZ2VuZXJhdGVkIC0gRmluYWwgZ2VuZXJhdGVkIHN1YnJhbmdlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByZXNlcnZlc1dob2xlT3JpZ2luIC0gV2hldGhlciBhZG9wdGluZyB0aGUgaW5uZXIgb3JpZ2luIHJldGFpbnMgaXRzIGNvbXBsZXRlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gc2VsZWN0ZWRSZWxhdGVkIC0gT3V0ZXIgb3JpZ2luIHRyYWNlZCB0aHJvdWdoIHRoaXMgaW5uZXIgc3Bhbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVzdHJpY3RTZWxlY3RlZFRyYWNlXSAtIFdoZXRoZXIgYW4gZXhhY3Qgc3BsaXQgc2VsZWN0cyBvbmx5IHRoaXMgaW5uZXIgc3Bhbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gQ29tcG9zZWQgc3Bhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBvc2VkU3BhbihvdXRlclNwYW4sIGlubmVyU3BhbiwgZ2VuZXJhdGVkLCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiwgc2VsZWN0ZWRSZWxhdGVkLCByZXN0cmljdFNlbGVjdGVkVHJhY2UgPSBmYWxzZSkge1xuICAgIGlmIChvdXRlclNwYW4ubWFwcGluZ0tpbmQgPT0gXCJzeW50aGV0aWNcIiAmJiBvdXRlclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgICAgcmV0dXJuIGRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgICAgZ2VuZXJhdGVkLFxuICAgICAgICBtYXBwaW5nS2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgICBuYW1lOiBvdXRlclNwYW4ubmFtZSxcbiAgICAgICAgb3JpZ2luOiB7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgICAgIHJlYXNvbjogb3V0ZXJTcGFuLm9yaWdpbi5yZWFzb24sXG4gICAgICAgICAgcmVsYXRlZE9yaWdpbnM6IGNvbXBvc2VSZWxhdGVkT3JpZ2lucyhvdXRlclNwYW4ub3JpZ2luLnJlbGF0ZWRPcmlnaW5zLCBzZWxlY3RlZFJlbGF0ZWQsIGlubmVyU3BhbiwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlKVxuICAgICAgICB9LFxuICAgICAgICByb2xlOiBvdXRlclNwYW4ucm9sZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb3NlZERlcml2ZWRPcmlnaW5zID0gb3V0ZXJTcGFuLm9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiXG4gICAgICA/IGNvbXBvc2VSZWxhdGVkT3JpZ2lucyhvdXRlclNwYW4ub3JpZ2luLm9yaWdpbnMsIHNlbGVjdGVkUmVsYXRlZCwgaW5uZXJTcGFuLCByZXN0cmljdFNlbGVjdGVkVHJhY2UpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG9yaWdpbiA9IG91dGVyU3Bhbi5vcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiID8gaW5uZXJTcGFuLm9yaWdpbiA6IG91dGVyU3Bhbi5vcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIlxuICAgICAgPyBjb21wb3NlZERlcml2ZWRPcmlnaW5zPy5sZW5ndGggPT0gMCAmJiBpbm5lclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJzeW50aGV0aWNcIlxuICAgICAgICA/IGlubmVyU3Bhbi5vcmlnaW5cbiAgICAgICAgOiB7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZGVyaXZlZFwiKSwgb3JpZ2luczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gKi8gKGNvbXBvc2VkRGVyaXZlZE9yaWdpbnMpfVxuICAgICAgOiB7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLFxuICAgICAgICAgIHJlYXNvbjogb3V0ZXJTcGFuLm9yaWdpbi5yZWFzb24sXG4gICAgICAgICAgcmVsYXRlZE9yaWdpbnM6IGNvbXBvc2VSZWxhdGVkT3JpZ2lucyhvdXRlclNwYW4ub3JpZ2luLnJlbGF0ZWRPcmlnaW5zLCBzZWxlY3RlZFJlbGF0ZWQsIGlubmVyU3BhbiwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlKVxuICAgICAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lZFByb3BlcnRpZXMoe1xuICAgICAgLi4ub3V0ZXJTcGFuLFxuICAgICAgZ2VuZXJhdGVkLFxuICAgICAgbWFwcGluZ0tpbmQ6IGlubmVyU3Bhbi5tYXBwaW5nS2luZCA9PSBcInN5bnRoZXRpY1wiID8gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpIDpcbiAgICAgICAgb3V0ZXJTcGFuLm1hcHBpbmdLaW5kID09IFwiZXhhY3RcIiAmJiBpbm5lclNwYW4ubWFwcGluZ0tpbmQgPT0gXCJleGFjdFwiICYmIHByZXNlcnZlc1dob2xlT3JpZ2luXG4gICAgICAgICAgPyAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJleGFjdFwiKVxuICAgICAgICAgIDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiYW5jaG9yXCIpLFxuICAgICAgbmFtZTogb3V0ZXJTcGFuLm5hbWUgPz8gaW5uZXJTcGFuLm5hbWUsXG4gICAgICBub2RlSWQ6IGlubmVyU3Bhbi5ub2RlSWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlOiBpbm5lclNwYW4ucm9sZSA/PyBvdXRlclNwYW4ucm9sZSxcbiAgICAgIHN5bWJvbElkOiBpbm5lclNwYW4uc3ltYm9sSWRcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBpbm5lciBzcGFuIHNlbGVjdGVkIGJ5IG9uZSByZWxhdGVkIGludGVybWVkaWF0ZSBvcmlnaW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSByZWxhdGVkIC0gT3V0ZXIgcmVsYXRlZCBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHt7XG4gICAqICAgb3ZlcmxhcHBpbmc6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdLFxuICAgKiAgIHJlbGF0ZWQ6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbixcbiAgICogICB0cmFjZWQ6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiB8IHVuZGVmaW5lZFxuICAgKiB9IHwgdW5kZWZpbmVkfSBUcmFjZSBzZWxlY3Rpb24gd2hlbiB0aGUgcmVsYXRlZCBzb3VyY2UgaXMgdGhlIGludGVybWVkaWF0ZSBhcnRpZmFjdC5cbiAgICovXG4gIGZ1bmN0aW9uIHRyYWNlUmVsYXRlZE9yaWdpbihyZWxhdGVkKSB7XG4gICAgY29uc3Qgc291cmNlID0gb3V0ZXJJbmRleC5zb3VyY2VzQnlJZC5nZXQocmVsYXRlZC5zb3VyY2VJZClcblxuICAgIGlmICghc291cmNlIHx8ICFzb3VyY2VSZXByZXNlbnRzR2VuZXJhdGVkKHNvdXJjZSwgaW5uZXIuZ2VuZXJhdGVkKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IG92ZXJsYXBwaW5nID0gc3BhbnNPdmVybGFwcGluZ0dlbmVyYXRlZChpbm5lci5zcGFucywgcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQsIHJlbGF0ZWQubG9jYXRpb24uZW5kLm9mZnNldClcblxuICAgIHJldHVybiB7XG4gICAgICBvdmVybGFwcGluZyxcbiAgICAgIHJlbGF0ZWQsXG4gICAgICB0cmFjZWQ6IG92ZXJsYXBwaW5nWzBdID8/IHNwYW5Gb3JHZW5lcmF0ZWQoaW5uZXIuc3BhbnMsIHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjZXMgaW50ZXJtZWRpYXRlIHJlbGF0ZWQgb3JpZ2lucyBhbmQgcmVtYXBzIHVucmVsYXRlZCBzb3VyY2UgaWRlbnRpdGllcyBpbiBvcmRlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBPdXRlciByZWxhdGVkIG9yaWdpbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBzZWxlY3RlZFJlbGF0ZWQgLSBPcmlnaW4gdXNpbmcgdGhlIHNlbGVjdGVkIGlubmVyIHNwYW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBzZWxlY3RlZFNwYW4gLSBTZWxlY3RlZCBpbm5lciBzcGFuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSAtIFdoZXRoZXIgYW4gZXhhY3Qgc3BsaXQgc2VsZWN0cyBvbmx5IHRoZSBzdXBwbGllZCBzcGFuLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IENvbXBvc2VkIHJlbGF0ZWQgb3JpZ2lucy5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBvc2VSZWxhdGVkT3JpZ2lucyhyZWxhdGVkT3JpZ2lucywgc2VsZWN0ZWRSZWxhdGVkLCBzZWxlY3RlZFNwYW4sIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSkge1xuICAgIHJldHVybiByZWxhdGVkT3JpZ2lucy5mbGF0TWFwKChyZWxhdGVkKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBvdXRlckluZGV4LnNvdXJjZXNCeUlkLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuXG4gICAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGlubmVyLmdlbmVyYXRlZCkpIHtcbiAgICAgICAgcmV0dXJuIFtyZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBvdXRlclNvdXJjZUlkcyldXG4gICAgICB9XG4gICAgICBjb25zdCB0cmFjZSA9IHRyYWNlUmVsYXRlZE9yaWdpbihyZWxhdGVkKVxuICAgICAgY29uc3QgdHJhY2VkU3BhbnMgPSByZXN0cmljdFNlbGVjdGVkVHJhY2UgJiYgcmVsYXRlZCA9PT0gc2VsZWN0ZWRSZWxhdGVkXG4gICAgICAgID8gW3NlbGVjdGVkU3Bhbl1cbiAgICAgICAgOiB0cmFjZT8ub3ZlcmxhcHBpbmcubGVuZ3RoXG4gICAgICAgICAgPyB0cmFjZS5vdmVybGFwcGluZ1xuICAgICAgICAgIDogdHJhY2U/LnRyYWNlZCA/IFt0cmFjZS50cmFjZWRdIDogW11cblxuICAgICAgaWYgKHRyYWNlZFNwYW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGlmICghaXNHZW5lcmF0ZWRFb2ZQb2ludChyZWxhdGVkKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVuYWJsZSB0byB0cmFjZSBpbnRlcm1lZGlhdGUgb3JpZ2luICcke3JlbGF0ZWQubG9jYXRpb24uZmlsZW5hbWV9Jy5gKVxuICAgICAgICByZXRhaW5PdXRlclNvdXJjZShyZWxhdGVkLnNvdXJjZUlkKVxuXG4gICAgICAgIHJldHVybiBbcmVtYXBSZWxhdGVkT3JpZ2luU291cmNlSWQocmVsYXRlZCwgb3V0ZXJTb3VyY2VJZHMpXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhY2VkU3BhbnMuZmxhdE1hcCgodHJhY2VkU3BhbikgPT4gcmVsYXRlZE9yaWdpbnNGb3JTcGFuKHRyYWNlZFNwYW4pLm1hcCgodHJhY2VkUmVsYXRlZCkgPT4gZGVmaW5lZFByb3BlcnRpZXMoe1xuICAgICAgICAgIC4uLnRyYWNlZFJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiB0cmFjZWRSZWxhdGVkLm5vZGVJZCA/PyB0cmFjZWRTcGFuLm5vZGVJZCxcbiAgICAgICAgICByb2xlOiByZWxhdGVkLnJvbGUgPz8gdHJhY2VkUmVsYXRlZC5yb2xlLFxuICAgICAgICAgIHN5bWJvbElkOiB0cmFjZWRSZWxhdGVkLnN5bWJvbElkID8/IHRyYWNlZFNwYW4uc3ltYm9sSWRcbiAgICAgICAgfSkpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0YWlucyBvbmUgb3V0ZXIgc291cmNlIHRoYXQgc3Vydml2ZXMgY29tcG9zaXRpb24gYW5kIGFzc2lnbnMgaXRzIGNvbXBvc2VkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlSWQgLSBPdXRlciBzb3VyY2UgcmVnaXN0cnkgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmV0YWluT3V0ZXJTb3VyY2Uoc291cmNlSWQpIHtcbiAgICBpZiAob3V0ZXJTb3VyY2VJZHMuaGFzKHNvdXJjZUlkKSkgcmV0dXJuXG4gICAgY29uc3Qgc291cmNlID0gb3V0ZXJJbmRleC5zb3VyY2VzQnlJZC5nZXQoc291cmNlSWQpXG5cbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gb3V0ZXIgbWFwcGluZyBzb3VyY2UgJyR7c291cmNlSWR9Jy5gKVxuICAgIGxldCBjb21wb3NlZFNvdXJjZSA9IHNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBzYW1lUmVnaXN0ZXJlZFNvdXJjZShjYW5kaWRhdGUsIHNvdXJjZSkpXG5cbiAgICBpZiAoIWNvbXBvc2VkU291cmNlKSB7XG4gICAgICB3aGlsZSAoc291cmNlSWRzLmhhcyhgc291cmNlOiR7bmV4dFNvdXJjZUluZGV4fWApKSBuZXh0U291cmNlSW5kZXgrK1xuICAgICAgY29tcG9zZWRTb3VyY2UgPSB7Li4uc291cmNlLCBpZDogYHNvdXJjZToke25leHRTb3VyY2VJbmRleH1gfVxuICAgICAgc291cmNlSWRzLmFkZChjb21wb3NlZFNvdXJjZS5pZClcbiAgICAgIHNvdXJjZXMucHVzaChjb21wb3NlZFNvdXJjZSlcbiAgICB9XG4gICAgb3V0ZXJTb3VyY2VJZHMuc2V0KHNvdXJjZS5pZCwgY29tcG9zZWRTb3VyY2UuaWQpXG4gIH1cblxuICAvKipcbiAgICogVGVzdHMgd2hldGhlciBvbmUgaW50ZXJtZWRpYXRlIG9yaWdpbiBpcyB0aGUgZXhhY3QgcG9pbnQgYWZ0ZXIgYWxsIGdlbmVyYXRlZCBjb2RlIHVuaXRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIENhbmRpZGF0ZSBpbnRlcm1lZGlhdGUgb3JpZ2luLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIGFuIEVPRiBwb2ludCByYXRoZXIgdGhhbiBhIGdlbmVyYXRlZCBoYWxmLW9wZW4gcmFuZ2UuXG4gICAqL1xuICBmdW5jdGlvbiBpc0dlbmVyYXRlZEVvZlBvaW50KHJlbGF0ZWQpIHtcbiAgICByZXR1cm4gcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQgPT0gaW5uZXIuZ2VuZXJhdGVkLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQgPT0gaW5uZXIuZ2VuZXJhdGVkLmNvbnRlbnQubGVuZ3RoXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgbWFwcGVkIHNwYW4ncyBjbG9zZWQgb3JpZ2luIGludG8gcmVsYXRlZCBwcm92ZW5hbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IHNwYW4gLSBUcmFjZWQgaW5uZXIgc3Bhbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gUmVsYXRlZCBvcmlnaW5hbCByYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5zRm9yU3BhbihzcGFuKSB7XG4gIHJldHVybiByZWxhdGVkT3JpZ2luc0Zvck9yaWdpbihzcGFuLm9yaWdpbilcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV2ZXJ5IHJlbGF0ZWQgcmFuZ2UgaW4gb25lIGNsb3NlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzIGluIHNlbWFudGljIG9yZGVyLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0Zvck9yaWdpbihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZWdpc3RlcmVkIHNvdXJjZSBpcyB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0IGNvbnN1bWVkIGJ5IGFuIGlubmVyIG1hcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBPdXRlciBzb3VyY2UgcmVnaXN0cnkgZW50cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBJbm5lciBnZW5lcmF0ZWQgYXJ0aWZhY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpZGVudGl0eS1zZWxlY3RlZCBwcm92ZW5hbmNlIG1heSBiZSB0cmFjZWQgdGhyb3VnaCB0aGUgaW5uZXIgbWFwLlxuICovXG5mdW5jdGlvbiBzb3VyY2VSZXByZXNlbnRzR2VuZXJhdGVkKHNvdXJjZSwgZ2VuZXJhdGVkKSB7XG4gIHJldHVybiBzb3VyY2UuZmlsZW5hbWUgPT0gZ2VuZXJhdGVkLmZpbGVuYW1lICYmIHNvdXJjZS5jb250ZW50ID09IGdlbmVyYXRlZC5jb250ZW50ICYmXG4gICAgKHNvdXJjZS5sYW5ndWFnZSA9PSBudWxsIHx8IHNvdXJjZS5sYW5ndWFnZSA9PSBnZW5lcmF0ZWQubGFuZ3VhZ2UpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgY29tcGxldGUgcmVnaXN0ZXJlZC1zb3VyY2UgaWRlbnRpdHkgZmllbGRzIG90aGVyIHRoYW4gcmVnaXN0cnktbG9jYWwgSUQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gbGVmdCAtIEZpcnN0IHJlZ2lzdGVyZWQgc291cmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IHJpZ2h0IC0gU2Vjb25kIHJlZ2lzdGVyZWQgc291cmNlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYm90aCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgc2FtZSBzb3VyY2UgYXJ0aWZhY3QuXG4gKi9cbmZ1bmN0aW9uIHNhbWVSZWdpc3RlcmVkU291cmNlKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBsZWZ0LmZpbGVuYW1lID09IHJpZ2h0LmZpbGVuYW1lICYmIGxlZnQuY29udGVudCA9PSByaWdodC5jb250ZW50ICYmIGxlZnQubGFuZ3VhZ2UgPT0gcmlnaHQubGFuZ3VhZ2Vcbn1cblxuLyoqXG4gKiBDb21wb3NlcyBTb3VyY2UgTWFwIHYzIG1hcHMgd2l0aCBtYWludGFpbmVkIHRyYWNpbmcgbWFjaGluZXJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcElucHV0fSBvdXRlciAtIEZpbmFsIG91dHB1dCB0byBpbnRlcm1lZGlhdGUgbWFwLlxuICogQHBhcmFtIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcElucHV0fSBpbm5lciAtIEludGVybWVkaWF0ZSB0byBvcmlnaW5hbCBtYXAuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gQ29tcG9zZWQgdjMgbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVNvdXJjZU1hcHMob3V0ZXIsIGlubmVyKSB7XG4gIGNvbnN0IG91dGVyTWFwID0gbmV3IFRyYWNlTWFwKG91dGVyKVxuICBjb25zdCBpbm5lck1hcCA9IG5ldyBUcmFjZU1hcChpbm5lcilcbiAgY29uc3QgY29tcG9zZWQgPSBuZXcgR2VuTWFwcGluZyh7ZmlsZTogb3V0ZXJNYXAuZmlsZX0pXG4gIGNvbnN0IGludGVybWVkaWF0ZUluZGV4ZXMgPSB0eXBlb2YgaW5uZXJNYXAuZmlsZSA9PSBcInN0cmluZ1wiXG4gICAgPyBvdXRlck1hcC5yZXNvbHZlZFNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4gc291cmNlID09IGlubmVyTWFwLmZpbGUgPyBbaW5kZXhdIDogW10pXG4gICAgOiBbXVxuICBjb25zdCBpbnRlcm1lZGlhdGVJbmRleCA9IGludGVybWVkaWF0ZUluZGV4ZXMubGVuZ3RoID09IDEgPyBpbnRlcm1lZGlhdGVJbmRleGVzWzBdIDogdW5kZWZpbmVkXG4gIGNvbnN0IGludGVybWVkaWF0ZVNvdXJjZSA9IGludGVybWVkaWF0ZUluZGV4ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlck1hcC5yZXNvbHZlZFNvdXJjZXNbaW50ZXJtZWRpYXRlSW5kZXhdXG5cbiAgaW5uZXJNYXAuc291cmNlcy5mb3JFYWNoKChyYXdTb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gaW5uZXJNYXAucmVzb2x2ZWRTb3VyY2VzW2luZGV4XSA/PyByYXdTb3VyY2VcblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgc2V0U291cmNlQ29udGVudChjb21wb3NlZCwgc291cmNlLCBpbm5lck1hcC5zb3VyY2VzQ29udGVudD8uW2luZGV4XSA/PyBudWxsKVxuICB9KVxuICBvdXRlck1hcC5zb3VyY2VzLmZvckVhY2goKHJhd1NvdXJjZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBvdXRlck1hcC5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdID8/IHJhd1NvdXJjZVxuXG4gICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIGluZGV4ICE9IGludGVybWVkaWF0ZUluZGV4KSB7XG4gICAgICBzZXRTb3VyY2VDb250ZW50KGNvbXBvc2VkLCBzb3VyY2UsIG91dGVyTWFwLnNvdXJjZXNDb250ZW50Py5baW5kZXhdID8/IG51bGwpXG4gICAgfVxuICB9KVxuXG4gIGVhY2hNYXBwaW5nKG91dGVyTWFwLCAobWFwcGluZykgPT4ge1xuICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PSBudWxsIHx8IG1hcHBpbmcub3JpZ2luYWxMaW5lID09IG51bGwgfHwgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBudWxsKSB7XG4gICAgICBtYXliZUFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNJbnRlcm1lZGlhdGUgPSBpbnRlcm1lZGlhdGVTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBtYXBwaW5nLnNvdXJjZSA9PSBpbnRlcm1lZGlhdGVTb3VyY2VcbiAgICBjb25zdCB0cmFjZWQgPSBpc0ludGVybWVkaWF0ZVxuICAgICAgPyB0cmFjZU9yaWdpbmFsUG9zaXRpb25Gb3IoaW5uZXJNYXAsIHtjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lfSlcbiAgICAgIDoge2NvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbiwgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsIG5hbWU6IG1hcHBpbmcubmFtZSwgc291cmNlOiBtYXBwaW5nLnNvdXJjZX1cblxuICAgIGlmICh0cmFjZWQuc291cmNlID09IG51bGwgfHwgdHJhY2VkLmxpbmUgPT0gbnVsbCB8fCB0cmFjZWQuY29sdW1uID09IG51bGwpIHtcbiAgICAgIG1heWJlQWRkU2VnbWVudChjb21wb3NlZCwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lIC0gMSwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gaXNJbnRlcm1lZGlhdGUgPyBzb3VyY2VDb250ZW50Rm9yKGlubmVyTWFwLCB0cmFjZWQuc291cmNlKSA6IHNvdXJjZUNvbnRlbnRGb3Iob3V0ZXJNYXAsIHRyYWNlZC5zb3VyY2UpXG4gICAgY29uc3QgbmFtZSA9IHRyYWNlZC5uYW1lID8/IG1hcHBpbmcubmFtZVxuXG4gICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgYWRkU2VnbWVudChjb21wb3NlZCwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lIC0gMSwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sIHRyYWNlZC5zb3VyY2UsIHRyYWNlZC5saW5lIC0gMSwgdHJhY2VkLmNvbHVtbiwgbnVsbCwgY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkU2VnbWVudChjb21wb3NlZCwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lIC0gMSwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sIHRyYWNlZC5zb3VyY2UsIHRyYWNlZC5saW5lIC0gMSwgdHJhY2VkLmNvbHVtbiwgbmFtZSwgY29udGVudClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHRvRW5jb2RlZE1hcChjb21wb3NlZClcbn1cblxuLyoqXG4gKiBJbXBvcnRzIGEgcG9pbnQtYmFzZWQgU291cmNlIE1hcCB2MyBhcyBhIHJhbmdlLWJhc2VkIFNlbWFudGlmb2xkIG1hcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBJbnB1dH0gc291cmNlTWFwIC0gU291cmNlIE1hcCB2My5cbiAqIEBwYXJhbSB7b2JqZWN0fSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBnZW5lcmF0ZWQuY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBjb250ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGdlbmVyYXRlZC5maWxlbmFtZSAtIEdlbmVyYXRlZCBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IGdlbmVyYXRlZC5sYW5ndWFnZSAtIEdlbmVyYXRlZCB0ZXh0IGxhbmd1YWdlLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX0gW2dlbmVyYXRlZC5zb3VyY2VzXSAtIEV4YWN0IHNvdXJjZSBjb250ZW50IG92ZXJyaWRlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gSW1wb3J0ZWQgcmljaCBtYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBwaW5nRnJvbVNvdXJjZU1hcChzb3VyY2VNYXAsIHtjb250ZW50LCBmaWxlbmFtZSwgbGFuZ3VhZ2UsIHNvdXJjZXM6IHByb3ZpZGVkID0gW119KSB7XG4gIGNvbnN0IHRyYWNlID0gbmV3IFRyYWNlTWFwKHNvdXJjZU1hcClcbiAgY29uc3QgZ2VuZXJhdGVkQ29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoY29udGVudClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IFtdXG4gIC8qKiBAdHlwZSB7TWFwPG51bWJlciwge2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9Pn0gKi9cbiAgY29uc3Qgb3ZlcnJpZGVzQnlTb3VyY2VJbmRleCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgcHJvdmlkZWQpIHtcbiAgICBjb25zdCBleGFjdCA9IHRyYWNlLnNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdXG5cbiAgICAgIHJldHVybiBzb3VyY2UgPT0gb3ZlcnJpZGUuZmlsZW5hbWUgfHwgcmVzb2x2ZWQgPT0gb3ZlcnJpZGUuZmlsZW5hbWUgPyBbaW5kZXhdIDogW11cbiAgICB9KVxuXG4gICAgaWYgKGV4YWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgZXhhY3QpIG92ZXJyaWRlc0J5U291cmNlSW5kZXguc2V0KGluZGV4LCBvdmVycmlkZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeCA9IHRyYWNlLnNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdXG5cbiAgICAgIHJldHVybiBzb3VyY2U/LmVuZHNXaXRoKGAvJHtvdmVycmlkZS5maWxlbmFtZX1gKSB8fCByZXNvbHZlZD8uZW5kc1dpdGgoYC8ke292ZXJyaWRlLmZpbGVuYW1lfWApID8gW2luZGV4XSA6IFtdXG4gICAgfSlcblxuICAgIGlmIChzdWZmaXgubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEFtYmlndW91cyBTb3VyY2UgTWFwIHNvdXJjZSBjb250ZW50IG92ZXJyaWRlICcke292ZXJyaWRlLmZpbGVuYW1lfScgbWF0Y2hlcyBtdWx0aXBsZSBzb3VyY2VzLmApXG4gICAgfVxuICAgIGlmIChzdWZmaXgubGVuZ3RoID09IDEgJiYgIW92ZXJyaWRlc0J5U291cmNlSW5kZXguaGFzKHN1ZmZpeFswXSkpIG92ZXJyaWRlc0J5U291cmNlSW5kZXguc2V0KHN1ZmZpeFswXSwgb3ZlcnJpZGUpXG4gIH1cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSAqL1xuICBjb25zdCBzb3VyY2VzQnlNYXBOYW1lID0gbmV3IE1hcCgpXG5cbiAgdHJhY2Uuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IHJlc29sdmVkU291cmNlID0gdHJhY2UucmVzb2x2ZWRTb3VyY2VzW2luZGV4XSA/PyBzb3VyY2VcbiAgICBjb25zdCBwcm92aWRlZFNvdXJjZSA9IG92ZXJyaWRlc0J5U291cmNlSW5kZXguZ2V0KGluZGV4KVxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSB7XG4gICAgICBjb250ZW50OiBwcm92aWRlZFNvdXJjZT8uY29udGVudCA/PyB0cmFjZS5zb3VyY2VzQ29udGVudD8uW2luZGV4XSA/PyBudWxsLFxuICAgICAgZmlsZW5hbWU6IHByb3ZpZGVkU291cmNlPy5maWxlbmFtZSA/PyByZXNvbHZlZFNvdXJjZSxcbiAgICAgIGlkOiBgc291cmNlOiR7c291cmNlcy5sZW5ndGh9YCxcbiAgICAgIGxhbmd1YWdlOiBwcm92aWRlZFNvdXJjZT8ubGFuZ3VhZ2UgPz8gbnVsbFxuICAgIH1cblxuICAgIHNvdXJjZXMucHVzaChyZWdpc3RlcmVkKVxuICAgIGlmICghc291cmNlc0J5TWFwTmFtZS5oYXMocmVzb2x2ZWRTb3VyY2UpKSBzb3VyY2VzQnlNYXBOYW1lLnNldChyZXNvbHZlZFNvdXJjZSwgcmVnaXN0ZXJlZClcbiAgfSlcbiAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBuZXcgTWFwKHNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG4gICAgLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXSkpXG5cbiAgLyoqIEB0eXBlIHt7Z2VuZXJhdGVkT2Zmc2V0OiBudW1iZXIsIG1hcHBpbmc6IGltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRWFjaE1hcHBpbmd9W119ICovXG4gIGNvbnN0IHBvaW50cyA9IFtdXG5cbiAgZWFjaE1hcHBpbmcodHJhY2UsIChtYXBwaW5nKSA9PiB7XG4gICAgcG9pbnRzLnB1c2goe2dlbmVyYXRlZE9mZnNldDogaW5kZXhlZE9mZnNldEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uICsgMSksIG1hcHBpbmd9KVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gIGNvbnN0IG1hcHBlZFNwYW5zID0gW11cblxuICBwb2ludHMuZm9yRWFjaCgoe2dlbmVyYXRlZE9mZnNldCwgbWFwcGluZ30sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHBvaW50c1tpbmRleCArIDFdXG4gICAgY29uc3QgZW5kID0gbmV4dD8ubWFwcGluZy5nZW5lcmF0ZWRMaW5lID09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgPyBuZXh0LmdlbmVyYXRlZE9mZnNldFxuICAgICAgOiBsaW5lRW5kT2Zmc2V0KGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldClcblxuICAgIGlmIChlbmQgPD0gZ2VuZXJhdGVkT2Zmc2V0KSByZXR1cm5cblxuICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PSBudWxsIHx8IG1hcHBpbmcub3JpZ2luYWxMaW5lID09IG51bGwgfHwgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBudWxsKSB7XG4gICAgICBtYXBwZWRTcGFucy5wdXNoKHtcbiAgICAgICAgZ2VuZXJhdGVkOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBjb250ZW50LCBnZW5lcmF0ZWRPZmZzZXQsIGVuZCksXG4gICAgICAgIG1hcHBpbmdLaW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgICBvcmlnaW46IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwidW5tYXBwZWQgU291cmNlIE1hcCBzZWdtZW50XCIsIHJlbGF0ZWRPcmlnaW5zOiBbXX1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzQnlNYXBOYW1lLmdldChtYXBwaW5nLnNvdXJjZSlcblxuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU291cmNlIE1hcCByZWZlcmVuY2VzIHVucmVnaXN0ZXJlZCBzb3VyY2UgJyR7bWFwcGluZy5zb3VyY2V9Jy5gKVxuICAgIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU291cmNlIGNvbnRlbnQgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IG1hcHBlZCBwb3NpdGlvbnMgZm9yICcke3NvdXJjZS5maWxlbmFtZX0nLmApXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxPZmZzZXQgPSBpbmRleGVkT2Zmc2V0QXQoXG4gICAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59ICovIChzb3VyY2VDb29yZGluYXRlcy5nZXQoc291cmNlLmlkKSksXG4gICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gKyAxXG4gICAgKVxuICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gTWF0aC5taW4oc291cmNlLmNvbnRlbnQubGVuZ3RoLCBvcmlnaW5hbE9mZnNldCArIDEpXG4gICAgY29uc3Qgb3JpZ2luYWxMb2NhdGlvbiA9IGxvY2F0aW9uRnJvbU9mZnNldHMoc291cmNlLmZpbGVuYW1lLCBzb3VyY2UuY29udGVudCwgb3JpZ2luYWxPZmZzZXQsIG9yaWdpbmFsRW5kKVxuXG4gICAgbWFwcGVkU3BhbnMucHVzaChkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldCwgZW5kKSxcbiAgICAgIG1hcHBpbmdLaW5kOiBcImFuY2hvclwiLFxuICAgICAgbmFtZTogbWFwcGluZy5uYW1lID8/IHVuZGVmaW5lZCxcbiAgICAgIG9yaWdpbjoge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uOiBvcmlnaW5hbExvY2F0aW9uLCBzb3VyY2VJZDogc291cmNlLmlkfVxuICAgIH0pKVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gIGNvbnN0IHNwYW5zID0gW11cbiAgbGV0IGN1cnNvciA9IDBcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgbWFwcGVkU3BhbnMpIHtcbiAgICBpZiAoc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ID4gY3Vyc29yKSBzcGFucy5wdXNoKHVubWFwcGVkU3BhbihjdXJzb3IsIHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCkpXG4gICAgaWYgKHNwYW4uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPiBjdXJzb3IpIHtcbiAgICAgIHNwYW5zLnB1c2goc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDwgY3Vyc29yID8ge1xuICAgICAgICAuLi5zcGFuLFxuICAgICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGN1cnNvciwgc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldClcbiAgICAgIH0gOiBzcGFuKVxuICAgICAgY3Vyc29yID0gc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldFxuICAgIH1cbiAgfVxuICBpZiAoY3Vyc29yIDwgY29udGVudC5sZW5ndGgpIHNwYW5zLnB1c2godW5tYXBwZWRTcGFuKGN1cnNvciwgY29udGVudC5sZW5ndGgpKVxuXG4gIHJldHVybiBmaW5hbGl6ZU1hcHBpbmcoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBnZW5lcmF0ZWQ6IHtjb250ZW50LCBmaWxlbmFtZSwgbGFuZ3VhZ2V9LFxuICAgIG5vZGVzOiBbXSxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgc291cmNlcyxcbiAgICBzcGFucyxcbiAgICBzeW1ib2xzOiBbXSxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb25lIGV4cGxpY2l0IHVubWFwcGVkIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBHZW5lcmF0ZWQgc3RhcnQgb2Zmc2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gR2VuZXJhdGVkIGVuZCBvZmZzZXQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IFN5bnRoZXRpYyBzcGFuLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5tYXBwZWRTcGFuKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBjb250ZW50LCBzdGFydCwgZW5kKSxcbiAgICAgIG1hcHBpbmdLaW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgb3JpZ2luOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uOiBcInVubWFwcGVkIFNvdXJjZSBNYXAgcmFuZ2VcIiwgcmVsYXRlZE9yaWdpbnM6IFtdfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbWFwcyBhIGdlbmVyYXRlZCBsb2NhdGlvbiB3aGlsZSByZXRhaW5pbmcgdGhlIGdlbmVyYXRlZCByYW5nZSBpbiB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEdlbmVyYXRlZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2Ygb3JpZ2luYWxQb3NpdGlvbkZvcj59IFJlbWFwcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwTG9jYXRpb24obG9jYXRpb24sIG1hcHBpbmcpIHtcbiAgaWYgKGxvY2F0aW9uLmZpbGVuYW1lICE9IG1hcHBpbmcuZ2VuZXJhdGVkLmZpbGVuYW1lKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTG9jYXRpb24gaXMgbm90IGluICR7bWFwcGluZy5nZW5lcmF0ZWQuZmlsZW5hbWV9LmApXG5cbiAgcmV0dXJuIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwcGluZywge29mZnNldDogbG9jYXRpb24uc3RhcnQub2Zmc2V0fSlcbn1cblxuLyoqXG4gKiBSZW1hcHMgYSBTZW1hbnRpZm9sZCBkaWFnbm9zdGljIGFuZCBwcmVzZXJ2ZXMgaXRzIGdlbmVyYXRlZCBsb2NhdGlvbiBhbmQgY2F1c2UuXG4gKiBAcGFyYW0ge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZGlhZ25vc3RpYyAtIEdlbmVyYXRlZC1wcm9ncmFtIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gUmVtYXBwZWQgZGlhZ25vc3RpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwRGlhZ25vc3RpYyhkaWFnbm9zdGljLCBtYXBwaW5nKSB7XG4gIGlmICghZGlhZ25vc3RpYy5sb2NhdGlvbikgcmV0dXJuIGRpYWdub3N0aWNcblxuICBjb25zdCByZW1hcHBlZCA9IHJlbWFwTG9jYXRpb24oZGlhZ25vc3RpYy5sb2NhdGlvbiwgbWFwcGluZylcblxuICBpZiAoIXJlbWFwcGVkLmxvY2F0aW9uKSByZXR1cm4gZGlhZ25vc3RpY1xuXG4gIHJldHVybiBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZGlhZ25vc3RpYyxcbiAgICBjb2RlOiBkaWFnbm9zdGljLmNvZGUsXG4gICAgZ2VuZXJhdGVkTG9jYXRpb246IGRpYWdub3N0aWMubG9jYXRpb24sXG4gICAgbGFuZ3VhZ2U6IGRpYWdub3N0aWMubGFuZ3VhZ2UsXG4gICAgbG9jYXRpb246IHJlbWFwcGVkLmxvY2F0aW9uLFxuICAgIG1lc3NhZ2U6IGRpYWdub3N0aWMuZGV0YWlsXG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwdWJsaWMgbWFwcGluZyBlbnZlbG9wZSBhbmQgb3JkZXJlZCBoYWxmLW9wZW4gZ2VuZXJhdGVkIHJhbmdlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbWFwcGluZy5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBOb3RoaW5nIHdoZW4gdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hcHBpbmcodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJzY2hlbWFcIikgIT0gXCJTZW1hbnRpZm9sZE1hcHBpbmdcIiB8fFxuICAgIFJlZmxlY3QuZ2V0KHZhbHVlLCBcInZlcnNpb25cIikgIT0gMSB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJjb29yZGluYXRlU3lzdGVtXCIpICE9IFwidXRmMTZcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIFNlbWFudGlmb2xkTWFwcGluZyB2MSB2YWx1ZS5cIilcbiAgfVxuXG4gIGNvbnN0IG1hcHBpbmcgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG4gIGNvbnN0IGdlbmVyYXRlZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChtYXBwaW5nLmdlbmVyYXRlZClcbiAgY29uc3Qgc3BhbnMgPSBtYXBwaW5nLnNwYW5zXG5cbiAgaWYgKCFnZW5lcmF0ZWQgfHwgdHlwZW9mIGdlbmVyYXRlZCAhPSBcIm9iamVjdFwiIHx8IHR5cGVvZiBSZWZsZWN0LmdldChnZW5lcmF0ZWQsIFwiZmlsZW5hbWVcIikgIT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiBSZWZsZWN0LmdldChnZW5lcmF0ZWQsIFwiY29udGVudFwiKSAhPSBcInN0cmluZ1wiIHx8ICFpc0dlbmVyYXRlZExhbmd1YWdlKFJlZmxlY3QuZ2V0KGdlbmVyYXRlZCwgXCJsYW5ndWFnZVwiKSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShtYXBwaW5nLnNvdXJjZXMpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkobWFwcGluZy5ub2RlcykgfHwgIUFycmF5LmlzQXJyYXkobWFwcGluZy5zeW1ib2xzKSB8fCAhQXJyYXkuaXNBcnJheShzcGFucykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIFNlbWFudGlmb2xkTWFwcGluZyB2MSBlbnZlbG9wZS5cIilcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGdlbmVyYXRlZC5jb250ZW50KVxuICBjb25zdCBmaWxlbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZ2VuZXJhdGVkLmZpbGVuYW1lKVxuXG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwiXFxyXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWZvbGRNYXBwaW5nIGdlbmVyYXRlZCBjb250ZW50IG11c3QgdXNlIExGIGxpbmUgZW5kaW5ncy5cIilcblxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBtYXBwaW5nLnNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIHNvdXJjZS5pZCAhPSBcInN0cmluZ1wiIHx8IHNvdXJjZS5pZC5sZW5ndGggPT0gMCB8fCBzb3VyY2VJZHMuaGFzKHNvdXJjZS5pZCkgfHxcbiAgICAgIHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UuZmlsZW5hbWUubGVuZ3RoID09IDAgfHwgc291cmNlLmNvbnRlbnQgIT09IG51bGwgJiYgdHlwZW9mIHNvdXJjZS5jb250ZW50ICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIHNvdXJjZS5sYW5ndWFnZSAhPT0gbnVsbCAmJiAhaXNTZW1hbnRpY0xhbmd1YWdlKHNvdXJjZS5sYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIFNlbWFudGlmb2xkTWFwcGluZyBzb3VyY2UuXCIpXG4gICAgfVxuICAgIHNvdXJjZUlkcy5hZGQoc291cmNlLmlkKVxuICB9XG4gIGNvbnN0IHNvdXJjZUNvb3JkaW5hdGVzID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG4gICAgLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXSkpXG4gIGNvbnN0IHNvdXJjZXNCeUlkID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIHNvdXJjZV0pKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdPn0gKi9cbiAgY29uc3Qgc291cmNlc0J5RmlsZW5hbWUgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBtYXBwaW5nLnNvdXJjZXMpIHtcbiAgICBjb25zdCBzYW1lTmFtZSA9IHNvdXJjZXNCeUZpbGVuYW1lLmdldChzb3VyY2UuZmlsZW5hbWUpID8/IFtdXG5cbiAgICBzYW1lTmFtZS5wdXNoKHNvdXJjZSlcbiAgICBzb3VyY2VzQnlGaWxlbmFtZS5zZXQoc291cmNlLmZpbGVuYW1lLCBzYW1lTmFtZSlcbiAgfVxuICBjb25zdCBnZW5lcmF0ZWRDb29yZGluYXRlcyA9IGNyZWF0ZUNvb3JkaW5hdGVJbmRleChjb250ZW50KVxuXG4gIGNvbnN0IG5vZGVJZHMgPSBuZXcgU2V0KClcbiAgY29uc3Qgbm9kZVBhdGhzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG1hcHBpbmcubm9kZXMpIHtcbiAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygbm9kZS5pZCAhPSBcInN0cmluZ1wiIHx8IG5vZGUuaWQubGVuZ3RoID09IDAgfHwgbm9kZUlkcy5oYXMobm9kZS5pZCkgfHxcbiAgICAgIHR5cGVvZiBub2RlLnBhdGggIT0gXCJzdHJpbmdcIiB8fCBub2RlUGF0aHMuaGFzKG5vZGUucGF0aCkgfHxcbiAgICAgIHR5cGVvZiBub2RlLmtpbmQgIT0gXCJzdHJpbmdcIiB8fCBub2RlLmtpbmQubGVuZ3RoID09IDAgfHwgIW5vZGUub3JpZ2luIHx8IHR5cGVvZiBub2RlLnJhbmdlcyAhPSBcIm9iamVjdFwiIHx8XG4gICAgICBub2RlLnJhbmdlcyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG5vZGUucmFuZ2VzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hbGZvcm1lZCBvciBkdXBsaWNhdGUgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cIilcbiAgICBub2RlSWRzLmFkZChub2RlLmlkKVxuICAgIG5vZGVQYXRocy5hZGQobm9kZS5wYXRoKVxuICB9XG5cbiAgY29uc3Qgc3ltYm9sSWRzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBzeW1ib2wgb2YgbWFwcGluZy5zeW1ib2xzKSB7XG4gICAgaWYgKCFzeW1ib2wgfHwgdHlwZW9mIHN5bWJvbCAhPSBcIm9iamVjdFwiIHx8IHR5cGVvZiBzeW1ib2wuaWQgIT0gXCJzdHJpbmdcIiB8fCBzeW1ib2wuaWQubGVuZ3RoID09IDAgfHwgc3ltYm9sSWRzLmhhcyhzeW1ib2wuaWQpIHx8XG4gICAgICB0eXBlb2Ygc3ltYm9sLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBzeW1ib2wubmFtZS5sZW5ndGggPT0gMCB8fFxuICAgICAgIVtcImNhcGFiaWxpdHlcIiwgXCJyZXNvdXJjZVwiLCBcImZhaWx1cmVcIiwgXCJvcGVyYXRpb25cIiwgXCJyZWNvcmRcIiwgXCJjbGFzc1wiLCBcImVycm9yXCIsIFwiZmllbGRcIiwgXCJjb25zdHJ1Y3RvclwiLCBcIm1ldGhvZFwiLCBcImZ1bmN0aW9uXCIsIFwidHlwZVBhcmFtZXRlclwiLCBcInBhcmFtZXRlclwiLCBcImxvY2FsXCIsIFwiaXRlcmF0aW9uXCIsIFwiY2F0Y2hcIl0uaW5jbHVkZXMoc3ltYm9sLmtpbmQpIHx8XG4gICAgICAhbm9kZUlkcy5oYXMoc3ltYm9sLmRlY2xhcmF0aW9uTm9kZUlkKSB8fCAhQXJyYXkuaXNBcnJheShzeW1ib2wucmVmZXJlbmNlcykgfHxcbiAgICAgIHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhKFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcImZ1bmN0aW9uXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2Z1bmN0aW9uOlswLTldKyQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpIHx8XG4gICAgICAgIHN5bWJvbC5raW5kID09IFwicmVjb3JkXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP3JlY29yZDpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcImNsYXNzXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2NsYXNzOlswLTldKyQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpIHx8XG4gICAgICAgIHN5bWJvbC5raW5kID09IFwiZXJyb3JcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/ZXJyb3I6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJmaWVsZFwiICYmIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT8oPzpyZWNvcmR8Y2xhc3MpOlswLTldKzpmaWVsZDpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcImNvbnN0cnVjdG9yXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2NsYXNzOlswLTldKzpjb25zdHJ1Y3RvciQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpIHx8XG4gICAgICAgIHN5bWJvbC5raW5kID09IFwibWV0aG9kXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2NsYXNzOlswLTldKzptZXRob2Q6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJ0eXBlUGFyYW1ldGVyXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpPyg/OmZ1bmN0aW9ufHJlY29yZCk6WzAtOV0rOnR5cGU6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJjYXBhYmlsaXR5XCIgJiYgL14oPzptb2R1bGU6WzAtOV0rXFwvKT9jYXBhYmlsaXR5OlswLTldKyQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpIHx8XG4gICAgICAgIHN5bWJvbC5raW5kID09IFwicmVzb3VyY2VcIiAmJiAvXig/Om1vZHVsZTpbMC05XStcXC8pP2NhcGFiaWxpdHk6WzAtOV0rXFwvcmVzb3VyY2U6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJmYWlsdXJlXCIgJiYgL14oPzptb2R1bGU6WzAtOV0rXFwvKT9jYXBhYmlsaXR5OlswLTldK1xcL2ZhaWx1cmU6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJvcGVyYXRpb25cIiAmJiAvXig/Om1vZHVsZTpbMC05XStcXC8pP2NhcGFiaWxpdHk6WzAtOV0rXFwvb3BlcmF0aW9uOlswLTldKyQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpXG4gICAgICApKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hbGZvcm1lZCBvciBkdXBsaWNhdGUgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlwiKVxuICAgIH1cbiAgICBzeW1ib2xJZHMuYWRkKHN5bWJvbC5pZClcbiAgfVxuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXBwaW5nLm5vZGVzKSB7XG4gICAgdmFsaWRhdGVPcmlnaW4obm9kZS5vcmlnaW4sIHNvdXJjZXNCeUlkLCBzb3VyY2VDb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKVxuICAgIGZvciAoY29uc3QgW3JvbGUsIGxvY2F0aW9uXSBvZiBPYmplY3QuZW50cmllcyhub2RlLnJhbmdlcykpIHtcbiAgICAgIGlmIChyb2xlLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWMgbm9kZSByYW5nZSByb2xlcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLlwiKVxuICAgICAgdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZXMobG9jYXRpb24sIHNvdXJjZXNCeUZpbGVuYW1lLCBzb3VyY2VDb29yZGluYXRlcylcbiAgICB9XG4gICAgaWYgKG5vZGUuc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG5vZGUuc3ltYm9sSWQgIT0gXCJzdHJpbmdcIiB8fCAhc3ltYm9sSWRzLmhhcyhub2RlLnN5bWJvbElkKSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZW1hbnRpYyBub2RlIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzeW1ib2wuXCIpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBzeW1ib2wgb2YgbWFwcGluZy5zeW1ib2xzKSB7XG4gICAgdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZXMoc3ltYm9sLmxvY2F0aW9uLCBzb3VyY2VzQnlGaWxlbmFtZSwgc291cmNlQ29vcmRpbmF0ZXMpXG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2Ygc3ltYm9sLnJlZmVyZW5jZXMpIHtcbiAgICAgIGlmICghcmVmZXJlbmNlIHx8IHR5cGVvZiByZWZlcmVuY2UgIT0gXCJvYmplY3RcIiB8fCAhbm9kZUlkcy5oYXMocmVmZXJlbmNlLm5vZGVJZCkgfHxcbiAgICAgICAgIVtcImRlY2xhcmF0aW9uXCIsIFwidHlwZVwiLCBcImNvbnN0cnVjdFwiLCBcIm1lbWJlclwiLCBcInJlYWRcIiwgXCJ3cml0ZVwiLCBcImNhbGxcIl0uaW5jbHVkZXMocmVmZXJlbmNlLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc2VtYW50aWMgc3ltYm9sIHJlZmVyZW5jZS5cIilcbiAgICAgIH1cbiAgICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKHJlZmVyZW5jZS5sb2NhdGlvbiwgc291cmNlc0J5RmlsZW5hbWUsIHNvdXJjZUNvb3JkaW5hdGVzKVxuICAgIH1cbiAgfVxuXG4gIGxldCBwcmV2aW91c0VuZCA9IDBcblxuICBmb3IgKGNvbnN0IHNwYW4gb2Ygc3BhbnMpIHtcbiAgICBpZiAoIXNwYW4gfHwgdHlwZW9mIHNwYW4gIT0gXCJvYmplY3RcIiB8fCAhW1wiZXhhY3RcIiwgXCJhbmNob3JcIiwgXCJzeW50aGV0aWNcIl0uaW5jbHVkZXMoUmVmbGVjdC5nZXQoc3BhbiwgXCJtYXBwaW5nS2luZFwiKSkgfHxcbiAgICAgICFSZWZsZWN0LmdldChzcGFuLCBcImdlbmVyYXRlZFwiKSB8fCAhUmVmbGVjdC5nZXQoc3BhbiwgXCJvcmlnaW5cIikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgU2VtYW50aWZvbGRNYXBwaW5nIHNwYW4uXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbG9jYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259ICovIChSZWZsZWN0LmdldChzcGFuLCBcImdlbmVyYXRlZFwiKSlcblxuICAgIGlmICghbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fCBsb2NhdGlvbi5maWxlbmFtZSAhPSBmaWxlbmFtZSB8fCBsb2NhdGlvbi5zdGFydC5vZmZzZXQgIT0gcHJldmlvdXNFbmQgfHxcbiAgICAgIGxvY2F0aW9uLmVuZC5vZmZzZXQgPD0gbG9jYXRpb24uc3RhcnQub2Zmc2V0IHx8IGxvY2F0aW9uLmVuZC5vZmZzZXQgPiBjb250ZW50Lmxlbmd0aCB8fFxuICAgICAgIXNhbWVQb2ludChpbmRleGVkUG9pbnRBdChnZW5lcmF0ZWRDb29yZGluYXRlcywgbG9jYXRpb24uc3RhcnQub2Zmc2V0KSwgbG9jYXRpb24uc3RhcnQpIHx8XG4gICAgICAhc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBsb2NhdGlvbi5lbmQub2Zmc2V0KSwgbG9jYXRpb24uZW5kKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGlmb2xkTWFwcGluZyBzcGFucyBtdXN0IGV4YWN0bHkgY292ZXIgb3JkZXJlZCBub3JtYWxpemVkIGdlbmVyYXRlZCByYW5nZXMuXCIpXG4gICAgfVxuICAgIHZhbGlkYXRlT3JpZ2luKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSAqLyAoUmVmbGVjdC5nZXQoc3BhbiwgXCJvcmlnaW5cIikpLFxuICAgICAgc291cmNlc0J5SWQsXG4gICAgICBzb3VyY2VDb29yZGluYXRlcyxcbiAgICAgIG5vZGVJZHMsXG4gICAgICBzeW1ib2xJZHNcbiAgICApXG4gICAgY29uc3Qgbm9kZUlkID0gUmVmbGVjdC5nZXQoc3BhbiwgXCJub2RlSWRcIilcbiAgICBjb25zdCBzeW1ib2xJZCA9IFJlZmxlY3QuZ2V0KHNwYW4sIFwic3ltYm9sSWRcIilcblxuICAgIGlmIChub2RlSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG5vZGVJZCAhPSBcInN0cmluZ1wiIHx8ICFub2RlSWRzLmhhcyhub2RlSWQpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByZWZlcmVuY2VzIGFuIHVua25vd24gbm9kZS5cIilcbiAgICBpZiAoc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHN5bWJvbElkICE9IFwic3RyaW5nXCIgfHwgIXN5bWJvbElkcy5oYXMoc3ltYm9sSWQpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sLlwiKVxuICAgIGlmIChSZWZsZWN0LmdldChzcGFuLCBcInJvbGVcIikgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgUmVmbGVjdC5nZXQoc3BhbiwgXCJyb2xlXCIpICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KHNwYW4sIFwibmFtZVwiKSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBSZWZsZWN0LmdldChzcGFuLCBcIm5hbWVcIikgIT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByb2xlcyBhbmQgbmFtZXMgbXVzdCBiZSBzdHJpbmdzLlwiKVxuICAgIH1cbiAgICBwcmV2aW91c0VuZCA9IGxvY2F0aW9uLmVuZC5vZmZzZXRcbiAgfVxuXG4gIGlmIChwcmV2aW91c0VuZCAhPSBjb250ZW50Lmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGlmb2xkTWFwcGluZyBzcGFucyBtdXN0IGNvdmVyIGFsbCBnZW5lcmF0ZWQgY29udGVudC5cIilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMsIGZyZWV6ZXMsIGFuZCBpbmRleGVzIG9uZSBtYXBwaW5nIHByb2R1Y2VkIGF0IGEgdHJ1c3QgYm91bmRhcnkuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IEltbXV0YWJsZSBpbmRleGVkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU1hcHBpbmcodmFsdWUpIHtcbiAgLy8gUHJvZHVjZXJzIG1heSByZXRhaW4gcmVmZXJlbmNlcyB0byBtdXRhYmxlIHNlbWFudGljIGxvY2F0aW9uczsgbWFwcGluZ3Mgb3duIHRoZWlyIGltbXV0YWJsZSBjb3B5LlxuICBjb25zdCBtYXBwaW5nID0gc3RydWN0dXJlZENsb25lKHZhbHVlKVxuXG4gIHZhbGlkYXRlTWFwcGluZyhtYXBwaW5nKVxuICBmcmVlemVKc29uKG1hcHBpbmcpXG4gIG1hcHBpbmdJbmRleGVzLnNldChtYXBwaW5nLCBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKSlcblxuICByZXR1cm4gbWFwcGluZ1xufVxuXG4vKipcbiAqIEdldHMgYW4gaW5kZXgsIHZhbGlkYXRpbmcgbXV0YWJsZSBjYWxsZXIgbWFwcGluZ3Mgb24gZXZlcnkgdHJ1c3QtYm91bmRhcnkgdXNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIE1hcHBpbmcuXG4gKiBAcmV0dXJucyB7TWFwcGluZ0luZGV4fSBMb29rdXAgaW5kZXguXG4gKi9cbmZ1bmN0aW9uIG1hcHBpbmdJbmRleChtYXBwaW5nKSB7XG4gIGNvbnN0IGNhY2hlZCA9IG1hcHBpbmdJbmRleGVzLmdldChtYXBwaW5nKVxuXG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcblxuICB2YWxpZGF0ZU1hcHBpbmcobWFwcGluZylcblxuICByZXR1cm4gYnVpbGRNYXBwaW5nSW5kZXgobWFwcGluZylcbn1cblxuLyoqXG4gKiBCdWlsZHMgZ2VuZXJhdGVkLCBvcmlnaW5hbCwgbm9kZSwgYW5kIHN5bWJvbCBpbmRleGVzIGluIG9uZSBwYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFZhbGlkYXRlZCBtYXBwaW5nLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRDb29yZGluYXRlczogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Piwgbm9kZVNwYW5zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXT4sIG9yaWdpbmFsQnlTb3VyY2U6IE1hcDxzdHJpbmcsIHtlbmQ6IG51bWJlciwgcHJlZml4RW5kOiBudW1iZXIsIHNwYW46IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbiwgc3RhcnQ6IG51bWJlcn1bXT4sIG9yaWdpbmFsUG9pbnRzQnlTb3VyY2U6IE1hcDxzdHJpbmcsIE1hcDxudW1iZXIsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPj4sIHNvdXJjZUNvb3JkaW5hdGVzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+Piwgc291cmNlc0J5SWQ6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT4sIHN5bWJvbFNwYW5zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXT59fSBNYXBwaW5nIGluZGV4LlxuICovXG5mdW5jdGlvbiBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKSB7XG4gIGNvbnN0IGdlbmVyYXRlZENvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQpXG4gIGNvbnN0IHNvdXJjZXNCeUlkID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIHNvdXJjZV0pKVxuICBjb25zdCBzb3VyY2VDb29yZGluYXRlcyA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuY29udGVudCAhPSBudWxsKVxuICAgIC5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgY3JlYXRlQ29vcmRpbmF0ZUluZGV4KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKV0pKVxuICBjb25zdCBub2RlU3BhbnMgPSBuZXcgTWFwKG1hcHBpbmcubm9kZXMubWFwKChub2RlKSA9PiBbbm9kZS5pZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi8gKFtdKV0pKVxuICBjb25zdCBzeW1ib2xTcGFucyA9IG5ldyBNYXAobWFwcGluZy5zeW1ib2xzLm1hcCgoc3ltYm9sKSA9PiBbc3ltYm9sLmlkLCAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSAqLyAoW10pXSkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2VuZDogbnVtYmVyLCBwcmVmaXhFbmQ6IG51bWJlciwgc3BhbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBzdGFydDogbnVtYmVyfVtdPn0gKi9cbiAgY29uc3Qgb3JpZ2luYWxCeVNvdXJjZSA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBbXV0pKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIE1hcDxudW1iZXIsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPj59ICovXG4gIGNvbnN0IG9yaWdpbmFsUG9pbnRzQnlTb3VyY2UgPSBuZXcgTWFwKG1hcHBpbmcuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgbmV3IE1hcCgpXSkpXG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIG1hcHBpbmcuc3BhbnMpIHtcbiAgICBjb25zdCBzcGFuTm9kZUlkcyA9IG5ldyBTZXQoc3Bhbi5ub2RlSWQgPyBbc3Bhbi5ub2RlSWRdIDogW10pXG4gICAgY29uc3Qgc3BhblN5bWJvbElkcyA9IG5ldyBTZXQoc3Bhbi5zeW1ib2xJZCA/IFtzcGFuLnN5bWJvbElkXSA6IFtdKVxuXG4gICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgaWYgKHJlbGF0ZWQubm9kZUlkKSBzcGFuTm9kZUlkcy5hZGQocmVsYXRlZC5ub2RlSWQpXG4gICAgICBpZiAocmVsYXRlZC5zeW1ib2xJZCkgc3BhblN5bWJvbElkcy5hZGQocmVsYXRlZC5zeW1ib2xJZClcbiAgICAgIGlmIChyZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQgPT0gcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gb3JpZ2luYWxQb2ludHNCeVNvdXJjZS5nZXQocmVsYXRlZC5zb3VyY2VJZClcbiAgICAgICAgY29uc3QgcG9pbnRTcGFucyA9IHBvaW50cz8uZ2V0KHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0KSA/PyBbXVxuXG4gICAgICAgIHBvaW50U3BhbnMucHVzaChzcGFuKVxuICAgICAgICBwb2ludHM/LnNldChyZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCwgcG9pbnRTcGFucylcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsQnlTb3VyY2UuZ2V0KHJlbGF0ZWQuc291cmNlSWQpPy5wdXNoKHtcbiAgICAgICAgZW5kOiByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgIHByZWZpeEVuZDogcmVsYXRlZC5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgICAgICBzcGFuLFxuICAgICAgICBzdGFydDogcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIHNwYW5Ob2RlSWRzKSBub2RlU3BhbnMuZ2V0KG5vZGVJZCk/LnB1c2goc3BhbilcbiAgICBmb3IgKGNvbnN0IHN5bWJvbElkIG9mIHNwYW5TeW1ib2xJZHMpIHN5bWJvbFNwYW5zLmdldChzeW1ib2xJZCk/LnB1c2goc3BhbilcbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cmllcyBvZiBvcmlnaW5hbEJ5U291cmNlLnZhbHVlcygpKSB7XG4gICAgZW50cmllcy5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zdGFydCAtIHJpZ2h0LnN0YXJ0IHx8IGxlZnQuc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IC0gcmlnaHQuc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KVxuICAgIGxldCBwcmVmaXhFbmQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIHByZWZpeEVuZCA9IE1hdGgubWF4KHByZWZpeEVuZCwgZW50cnkuZW5kKVxuICAgICAgZW50cnkucHJlZml4RW5kID0gcHJlZml4RW5kXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtnZW5lcmF0ZWRDb29yZGluYXRlcywgbm9kZVNwYW5zLCBvcmlnaW5hbEJ5U291cmNlLCBvcmlnaW5hbFBvaW50c0J5U291cmNlLCBzb3VyY2VDb29yZGluYXRlcywgc291cmNlc0J5SWQsIHN5bWJvbFNwYW5zfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBnZW5lcmF0ZWQgc3BhbiBjb250YWluaW5nIGFuIG9mZnNldCBieSBiaW5hcnkgc2VhcmNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIHNwYW5zLlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIEdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuIHwgdW5kZWZpbmVkfSBDb250YWluaW5nIHNwYW4uXG4gKi9cbmZ1bmN0aW9uIHNwYW5Gb3JHZW5lcmF0ZWQoc3BhbnMsIG9mZnNldCkge1xuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IHNwYW5zLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKHNwYW5zW21pZGRsZV0uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSBzcGFuc1tsb3cgLSAxXVxuXG4gIHJldHVybiBjYW5kaWRhdGUgJiYgb2Zmc2V0IDwgY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0ID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRmluZHMgb3JkZXJlZCBnZW5lcmF0ZWQgc3BhbnMgaW50ZXJzZWN0aW5nIGEgaGFsZi1vcGVuIHJhbmdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIHNwYW5zLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5jbHVzaXZlIGdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gRXhjbHVzaXZlIGdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IE92ZXJsYXBwaW5nIHNwYW5zLlxuICovXG5mdW5jdGlvbiBzcGFuc092ZXJsYXBwaW5nR2VuZXJhdGVkKHNwYW5zLCBzdGFydCwgZW5kKSB7XG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICBjb25zdCBjb250YWluaW5nID0gc3BhbkZvckdlbmVyYXRlZChzcGFucywgc3RhcnQpXG5cbiAgICByZXR1cm4gY29udGFpbmluZyA/IFtjb250YWluaW5nXSA6IFtdXG4gIH1cblxuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IHNwYW5zLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKHNwYW5zW21pZGRsZV0uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPD0gc3RhcnQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBvdmVybGFwcGluZyA9IFtdXG5cbiAgZm9yIChsZXQgaW5kZXggPSBsb3c7IGluZGV4IDwgc3BhbnMubGVuZ3RoICYmIHNwYW5zW2luZGV4XS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDwgZW5kOyBpbmRleCsrKSB7XG4gICAgb3ZlcmxhcHBpbmcucHVzaChzcGFuc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gb3ZlcmxhcHBpbmdcbn1cblxuLyoqXG4gKiBEZWVwLWZyZWV6ZXMgYSBKU09OIHRyZWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSlNPTiB2YWx1ZS5cbiAqIEBwYXJhbSB7V2Vha1NldDxvYmplY3Q+fSBbdmlzaXRlZF0gLSBDeWNsZSBwcm90ZWN0aW9uIGZvciByZWplY3RlZCBjYWxsZXIgZXh0cmFzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGZyZWV6ZUpzb24odmFsdWUsIHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmlzaXRlZC5oYXModmFsdWUpKSByZXR1cm5cblxuICB2aXNpdGVkLmFkZCh2YWx1ZSlcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZnJlZXplSnNvbihjaGlsZCwgdmlzaXRlZClcbiAgaWYgKCFPYmplY3QuaXNGcm96ZW4odmFsdWUpKSBPYmplY3QuZnJlZXplKHZhbHVlKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgY2xvc2VkIG1hcHBpbmcgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHNvdXJjZXNCeUlkIC0gU291cmNlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGUgaW5kZXhlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+fSBbbm9kZUlkc10gLSBLbm93biBzZW1hbnRpYyBub2Rlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+fSBbc3ltYm9sSWRzXSAtIEtub3duIHNlbWFudGljIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPcmlnaW4ob3JpZ2luLCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcykge1xuICBpZiAoIW9yaWdpbiB8fCB0eXBlb2Ygb3JpZ2luICE9IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYXBwaW5nIG9yaWdpbiBtdXN0IGJlIGEgY2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXCIpXG5cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHtcbiAgICB2YWxpZGF0ZVJlbGF0ZWQoe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9LCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcylcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JpZ2luLm9yaWdpbnMpIHx8IG9yaWdpbi5vcmlnaW5zLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBwcm92ZW5hbmNlIHJlcXVpcmVzIG9yaWdpbnMuXCIpXG4gICAgb3JpZ2luLm9yaWdpbnMuZm9yRWFjaCgocmVsYXRlZCkgPT4gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luLnJlYXNvbiAhPSBcInN0cmluZ1wiIHx8ICFBcnJheS5pc0FycmF5KG9yaWdpbi5yZWxhdGVkT3JpZ2lucykpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc3ludGhldGljIHByb3ZlbmFuY2UuXCIpXG4gICAgb3JpZ2luLnJlbGF0ZWRPcmlnaW5zLmZvckVhY2goKHJlbGF0ZWQpID0+IHZhbGlkYXRlUmVsYXRlZChyZWxhdGVkLCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcykpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBwcm92ZW5hbmNlIGtpbmQuXCIpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzb3VyY2UtcmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIFJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBzb3VyY2VzQnlJZCAtIFNvdXJjZXMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4ZXMuXG4gKiBAcGFyYW0ge1NldDx1bmtub3duPiB8IHVuZGVmaW5lZH0gbm9kZUlkcyAtIEtub3duIHNlbWFudGljIG5vZGVzLlxuICogQHBhcmFtIHtTZXQ8dW5rbm93bj4gfCB1bmRlZmluZWR9IHN5bWJvbElkcyAtIEtub3duIHNlbWFudGljIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNCeUlkLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuXG4gIGlmICghc291cmNlIHx8ICFyZWxhdGVkLmxvY2F0aW9uIHx8IHJlbGF0ZWQubG9jYXRpb24uZmlsZW5hbWUgIT0gc291cmNlLmZpbGVuYW1lIHx8XG4gICAgcmVsYXRlZC5ub2RlSWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5ub2RlSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgIHJlbGF0ZWQuc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5zeW1ib2xJZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgcmVsYXRlZC5yb2xlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlbGF0ZWQucm9sZSAhPSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzb3VyY2UuXCIpXG4gIGlmIChub2RlSWRzICYmIHJlbGF0ZWQubm9kZUlkICE9PSB1bmRlZmluZWQgJiYgIW5vZGVJZHMuaGFzKHJlbGF0ZWQubm9kZUlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9yaWdpbiByZWZlcmVuY2VzIGFuIHVua25vd24gbm9kZS5cIilcbiAgaWYgKHN5bWJvbElkcyAmJiByZWxhdGVkLnN5bWJvbElkICE9PSB1bmRlZmluZWQgJiYgIXN5bWJvbElkcy5oYXMocmVsYXRlZC5zeW1ib2xJZCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzeW1ib2wuXCIpXG4gIH1cbiAgdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZShyZWxhdGVkLmxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGxvY2F0aW9uIGFnYWluc3QgYXQgbGVhc3Qgb25lIHNhbWUtZmlsZW5hbWUgc291cmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW10+fSBzb3VyY2VzQnlGaWxlbmFtZSAtIFNvdXJjZXMgYnkgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZXModmFsdWUsIHNvdXJjZXNCeUZpbGVuYW1lLCBjb29yZGluYXRlcykge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yaWdpbmFsIGxvY2F0aW9uLlwiKVxuICBjb25zdCBsb2NhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKHZhbHVlKVxuICBjb25zdCBjYW5kaWRhdGVzID0gc291cmNlc0J5RmlsZW5hbWUuZ2V0KGxvY2F0aW9uLmZpbGVuYW1lKSA/PyBbXVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PSAwIHx8ICFjYW5kaWRhdGVzLnNvbWUoKHNvdXJjZSkgPT4gbG9jYXRpb25NYXRjaGVzU291cmNlKGxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhbGUgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBsb2NhdGlvbiBhZ2FpbnN0IGl0cyBpZGVudGlmaWVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+IHwgdW5kZWZpbmVkfSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlcyB3aGVuIGNvbnRlbnQgZXhpc3RzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2UodmFsdWUsIHNvdXJjZSwgY29vcmRpbmF0ZXMpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCAhbG9jYXRpb25NYXRjaGVzU291cmNlKFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKHZhbHVlKSwgc291cmNlLCBjb29yZGluYXRlc1xuICApKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhbGUgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG59XG5cbi8qKlxuICogVGVzdHMgYSBsb2NhdGlvbiBhZ2FpbnN0IG9uZSBzb3VyY2UgZW50cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+IHwgdW5kZWZpbmVkfSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlcyB3aGVuIGNvbnRlbnQgZXhpc3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJhbmdlIGlzIG5vcm1hbGl6ZWQgZm9yIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0aW9uTWF0Y2hlc1NvdXJjZShsb2NhdGlvbiwgc291cmNlLCBjb29yZGluYXRlcykge1xuICBpZiAoIWxvY2F0aW9uIHx8IGxvY2F0aW9uLmZpbGVuYW1lICE9IHNvdXJjZS5maWxlbmFtZSB8fCAhbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fFxuICAgICF2YWxpZFBvaW50KGxvY2F0aW9uLnN0YXJ0KSB8fCAhdmFsaWRQb2ludChsb2NhdGlvbi5lbmQpIHx8IGxvY2F0aW9uLmVuZC5vZmZzZXQgPCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpIHJldHVybiBmYWxzZVxuXG4gIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBsb2NhdGlvbi5lbmQub2Zmc2V0IDw9IHNvdXJjZS5jb250ZW50Lmxlbmd0aCAmJiBjb29yZGluYXRlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpLCBsb2NhdGlvbi5zdGFydCkgJiZcbiAgICBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLmVuZC5vZmZzZXQpLCBsb2NhdGlvbi5lbmQpXG59XG5cbi8qKlxuICogVGVzdHMgdGhlIHN0cnVjdHVyYWwgdmFsaWRpdHkgb2Ygb25lIHNvdXJjZSBwb2ludC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gV2hldGhlciBpdCBpcyBhIHBvaW50LlxuICovXG5mdW5jdGlvbiB2YWxpZFBvaW50KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuICBjb25zdCBwb2ludCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcblxuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwb2ludC5vZmZzZXQpICYmIE51bWJlci5pc0ludGVnZXIocG9pbnQubGluZSkgJiYgTnVtYmVyLmlzSW50ZWdlcihwb2ludC5jb2x1bW4pICYmXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5vZmZzZXQpID49IDAgJiYgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5saW5lKSA+PSAxICYmIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocG9pbnQuY29sdW1uKSA+PSAxXG59XG5cbi8qKlxuICogVGVzdHMgYSBzdXBwb3J0ZWQgc2VtYW50aWMgc291cmNlLWxhbmd1YWdlIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBsYW5ndWFnZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IFdoZXRoZXIgc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBpc1NlbWFudGljTGFuZ3VhZ2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IFwicGhwXCIgfHwgdmFsdWUgPT0gXCJydWJ5XCIgfHwgdmFsdWUgPT0gXCJqYXZhc2NyaXB0XCIgfHwgdmFsdWUgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdmFsdWUgPT0gXCJqYXZhXCIgfHxcbiAgICB2YWx1ZSA9PSBcImtvdGxpblwiIHx8IHZhbHVlID09IFwicHl0aG9uXCIgfHwgdmFsdWUgPT0gXCJjc2hhcnBcIiB8fCB2YWx1ZSA9PSBcImdvXCIgfHwgdmFsdWUgPT0gXCJjXCIgfHwgdmFsdWUgPT0gXCJjcHBcIiB8fCB2YWx1ZSA9PSBcInJ1c3RcIiB8fCB2YWx1ZSA9PSBcInN3aWZ0XCIgfHwgdmFsdWUgPT0gXCJkYXJ0XCJcbn1cblxuLyoqXG4gKiBUZXN0cyBhIHN1cHBvcnRlZCBnZW5lcmF0ZWQgdGV4dCBsYW5ndWFnZSB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbGFuZ3VhZ2UuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IFdoZXRoZXIgc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZExhbmd1YWdlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBcImh0bWxcIiB8fCBpc1NlbWFudGljTGFuZ3VhZ2UodmFsdWUpXG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBzdGFibGUgbG9va3VwIHJlc3VsdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBzcGFuIC0gTWFwcGluZyBzcGFuLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRMb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQsIG1hcHBpbmdLaW5kOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLk1hcHBpbmdLaW5kLCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5vZGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN5bWJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWR9fSBMb29rdXAgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBtYXBwaW5nUmVzdWx0KHNwYW4pIHtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRMb2NhdGlvbjogc3Bhbi5nZW5lcmF0ZWQsXG4gICAgbG9jYXRpb246IHByaW1hcnlMb2NhdGlvbihzcGFuLm9yaWdpbiksXG4gICAgbWFwcGluZ0tpbmQ6IHNwYW4ubWFwcGluZ0tpbmQsXG4gICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgIG5vZGVJZDogc3Bhbi5ub2RlSWQsXG4gICAgcm9sZTogc3Bhbi5yb2xlLFxuICAgIHN5bWJvbElkOiBzcGFuLnN5bWJvbElkXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbiBvZmZzZXQtZm9ybSBvciBsaW5lL2NvbHVtbi1mb3JtIHBvc2l0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4LlxuICogQHBhcmFtIHt7b2Zmc2V0OiBudW1iZXJ9IHwge2xpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fSBwb3NpdGlvbiAtIFBvc2l0aW9uLlxuICogQHJldHVybnMge251bWJlcn0gVVRGLTE2IG9mZnNldC5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpb25PZmZzZXQoY29vcmRpbmF0ZXMsIHBvc2l0aW9uKSB7XG4gIGlmIChcIm9mZnNldFwiIGluIHBvc2l0aW9uKSB7XG4gICAgaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIHBvc2l0aW9uLm9mZnNldClcblxuICAgIHJldHVybiBwb3NpdGlvbi5vZmZzZXRcbiAgfVxuXG4gIHJldHVybiBpbmRleGVkT2Zmc2V0QXQoY29vcmRpbmF0ZXMsIHBvc2l0aW9uLmxpbmUsIHBvc2l0aW9uLmNvbHVtbilcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZXhjbHVzaXZlIGNvbnRlbnQgb2Zmc2V0IGJlZm9yZSB0aGUgbmV4dCBnZW5lcmF0ZWQgbGluZSBicmVhay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gR2VuZXJhdGVkIGNvbnRlbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gT2Zmc2V0IG9uIHRoZSBjdXJyZW50IGxpbmUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBFbmQgb2YgdGhlIGN1cnJlbnQgbGluZSBvciBjb250ZW50LlxuICovXG5mdW5jdGlvbiBsaW5lRW5kT2Zmc2V0KGNvbnRlbnQsIG9mZnNldCkge1xuICBjb25zdCBuZXdsaW5lID0gY29udGVudC5pbmRleE9mKFwiXFxuXCIsIG9mZnNldClcblxuICByZXR1cm4gbmV3bGluZSA9PSAtMSA/IGNvbnRlbnQubGVuZ3RoIDogbmV3bGluZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIGNvbXBsZXRlIG5vcm1hbGl6ZWQgcG9pbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBsZWZ0IC0gTGVmdCBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gcmlnaHQgLSBSaWdodCBwb2ludC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGNvb3JkaW5hdGVzIG1hdGNoLlxuICovXG5mdW5jdGlvbiBzYW1lUG9pbnQobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIGxlZnQub2Zmc2V0ID09IHJpZ2h0Lm9mZnNldCAmJiBsZWZ0LmxpbmUgPT0gcmlnaHQubGluZSAmJiBsZWZ0LmNvbHVtbiA9PSByaWdodC5jb2x1bW5cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHNvdXJjZSByZWdpc3RyeSBlbnRyeSBmb3IgYW4gb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIE1hcHBpbmcuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIE9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBQcmltYXJ5IGxvY2F0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBzb3VyY2VzQnlJZCAtIEluZGV4ZWQgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IFJlZ2lzdGVyZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBzb3VyY2VGb3JPcmlnaW4obWFwcGluZywgb3JpZ2luLCBsb2NhdGlvbiwgc291cmNlc0J5SWQpIHtcbiAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VJZEZvck9yaWdpbihvcmlnaW4pXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNCeUlkLmdldChzb3VyY2VJZCA/PyBcIlwiKSA/P1xuICAgIG1hcHBpbmcuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gbWFwcGluZyBzb3VyY2UgZm9yICR7bG9jYXRpb24uZmlsZW5hbWV9LmApXG5cbiAgcmV0dXJuIHNvdXJjZVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSByZWdpc3RyeSBpZGVudGl0eSBvZiBhbiBvcmlnaW4ncyBwcmltYXJ5IGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTb3VyY2UgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZUlkRm9yT3JpZ2luKG9yaWdpbikge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikgcmV0dXJuIG9yaWdpbi5zb3VyY2VJZFxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1swXT8uc291cmNlSWRcblxuICByZXR1cm4gb3JpZ2luLnJlbGF0ZWRPcmlnaW5zWzBdPy5zb3VyY2VJZFxufVxuXG4vKipcbiAqIFJld3JpdGVzIGNsb3NlZC1vcmlnaW4gc291cmNlIGlkZW50aXRpZXMgYWdhaW5zdCBhIGNvbXBvc2VkIHJlZ2lzdHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHNvdXJjZUlkcyAtIE9yaWdpbmFsLXRvLWNvbXBvc2VkIHNvdXJjZSBpZGVudGl0aWVzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IFJld3JpdHRlbiBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIHJlbWFwT3JpZ2luU291cmNlSWRzKG9yaWdpbiwgc291cmNlSWRzKSB7XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiKSB7XG4gICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VJZHMuZ2V0KG9yaWdpbi5zb3VyY2VJZClcblxuICAgIGlmICghc291cmNlSWQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBDb21wb3NlZCBtYXBwaW5nIG9taXR0ZWQgc291cmNlICcke29yaWdpbi5sb2NhdGlvbi5maWxlbmFtZX0nLmApXG5cbiAgICByZXR1cm4ge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkfVxuICB9XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikgcmV0dXJuIHtraW5kOiBcImRlcml2ZWRcIiwgb3JpZ2luczogb3JpZ2luLm9yaWdpbnMubWFwKChyZWxhdGVkKSA9PiByZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBzb3VyY2VJZHMpKX1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6IFwic3ludGhldGljXCIsXG4gICAgcmVhc29uOiBvcmlnaW4ucmVhc29uLFxuICAgIHJlbGF0ZWRPcmlnaW5zOiBvcmlnaW4ucmVsYXRlZE9yaWdpbnMubWFwKChyZWxhdGVkKSA9PiByZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBzb3VyY2VJZHMpKVxuICB9XG59XG5cbi8qKlxuICogUmV3cml0ZXMgb25lIHJlbGF0ZWQgc291cmNlIGlkZW50aXR5IHdoaWxlIGRyb3BwaW5nIGlkZW50aXRpZXMgZnJvbSBhIGRpc2NhcmRlZCBub2RlIHJlZ2lzdHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHJlbGF0ZWQgLSBSZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gc291cmNlSWRzIC0gT3JpZ2luYWwtdG8tY29tcG9zZWQgc291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBSZXdyaXR0ZW4gcmVsYXRlZCBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIHJlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIHNvdXJjZUlkcykge1xuICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZUlkcy5nZXQocmVsYXRlZC5zb3VyY2VJZClcblxuICBpZiAoIXNvdXJjZUlkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29tcG9zZWQgbWFwcGluZyBvbWl0dGVkIHNvdXJjZSAnJHtyZWxhdGVkLmxvY2F0aW9uLmZpbGVuYW1lfScuYClcblxuICBjb25zdCB1bmlkZW50aWZpZWQgPSB7Li4ucmVsYXRlZH1cblxuICBkZWxldGUgdW5pZGVudGlmaWVkLm5vZGVJZFxuICBkZWxldGUgdW5pZGVudGlmaWVkLnN5bWJvbElkXG5cbiAgcmV0dXJuIHsuLi51bmlkZW50aWZpZWQsIHNvdXJjZUlkfVxufVxuXG4vKipcbiAqIFNvcnRzIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IHdoaWxlIHByZXNlcnZpbmcgc2VtYW50aWMgYXJyYXkgb3JkZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSlNPTiB2YWx1ZS5cbiAqIEByZXR1cm5zIHt1bmtub3dufSBEZXRlcm1pbmlzdGljYWxseSBrZXllZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc29ydEpzb24odmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKHNvcnRKc29uKVxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5zb3J0KChbbGVmdF0sIFtyaWdodF0pID0+IGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDApXG4gICAgICAubWFwKChba2V5LCBjaGlsZF0pID0+IFtrZXksIHNvcnRKc29uKGNoaWxkKV0pKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogUmVtb3ZlcyB1bmRlZmluZWQgb3B0aW9uYWwgcHJvcGVydGllcyBmcm9tIGEgcHVibGljIEpTT04gdmFsdWUuXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBWYWx1ZVxuICogQHBhcmFtIHtWYWx1ZX0gdmFsdWUgLSBDYW5kaWRhdGUgb2JqZWN0LlxuICogQHJldHVybnMge1ZhbHVlfSBDb21wYWN0IEpTT04tc2FmZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZWRQcm9wZXJ0aWVzKHZhbHVlKSB7XG4gIHJldHVybiAvKiogQHR5cGUge1ZhbHVlfSAqLyAoT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5maWx0ZXIoKFssIGNoaWxkXSkgPT4gY2hpbGQgIT09IHVuZGVmaW5lZCkpKVxufVxuIl19
|
|
1142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXBwaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0csT0FBTyxFQUNMLFdBQVcsRUFDWCxtQkFBbUIsSUFBSSx3QkFBd0IsRUFDL0MsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxNQUFNLDJCQUEyQixDQUFBO0FBQ2xDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDbEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBRXhELG1FQUFtRTtBQUNuRSxzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVwQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFPO0lBQ25DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFFcEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTztRQUFFLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVsRyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMs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QUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoSCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBSztJQUM5QixPQUFPLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNwSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7YWRkU2VnbWVudCwgR2VuTWFwcGluZywgbWF5YmVBZGRTZWdtZW50LCBzZXRTb3VyY2VDb250ZW50LCB0b0VuY29kZWRNYXB9IGZyb20gXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiXG5pbXBvcnQge1xuICBlYWNoTWFwcGluZyxcbiAgb3JpZ2luYWxQb3NpdGlvbkZvciBhcyB0cmFjZU9yaWdpbmFsUG9zaXRpb25Gb3IsXG4gIHNvdXJjZUNvbnRlbnRGb3IsXG4gIFRyYWNlTWFwXG59IGZyb20gXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7Y3JlYXRlQ29vcmRpbmF0ZUluZGV4LCBpbmRleGVkT2Zmc2V0QXQsIGluZGV4ZWRQb2ludEF0LCBsb2NhdGlvbkZyb21PZmZzZXRzfSBmcm9tIFwiLi9zZW1hbnRpYy9sb2NhdGlvbi5qc1wiXG5pbXBvcnQge3ByaW1hcnlMb2NhdGlvbn0gZnJvbSBcIi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRNYXBwaW5nSW5kZXg+fSBNYXBwaW5nSW5kZXggKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZywgTWFwcGluZ0luZGV4Pn0gKi9cbmNvbnN0IG1hcHBpbmdJbmRleGVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFByb2plY3RzIGFuIGF1dGhvcml0YXRpdmUgU2VtYW50aWZvbGQgbWFwcGluZyB0byBTb3VyY2UgTWFwIHYzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBTb3VyY2UgTWFwIHYzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Tb3VyY2VNYXBWMyhtYXBwaW5nKSB7XG4gIGNvbnN0IGluZGV4ID0gbWFwcGluZ0luZGV4KG1hcHBpbmcpXG5cbiAgY29uc3QgZ2VuZXJhdGVkID0gbmV3IEdlbk1hcHBpbmcoe2ZpbGU6IG1hcHBpbmcuZ2VuZXJhdGVkLmZpbGVuYW1lfSlcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBtYXBwaW5nLnNvdXJjZXMpIHNldFNvdXJjZUNvbnRlbnQoZ2VuZXJhdGVkLCBzb3VyY2UuZmlsZW5hbWUsIHNvdXJjZS5jb250ZW50KVxuXG4gIGZvciAoY29uc3Qgc3BhbiBvZiBtYXBwaW5nLnNwYW5zKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBwcmltYXJ5TG9jYXRpb24oc3Bhbi5vcmlnaW4pXG4gICAgY29uc3QgbGluZSA9IHNwYW4uZ2VuZXJhdGVkLnN0YXJ0LmxpbmUgLSAxXG4gICAgY29uc3QgY29sdW1uID0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQuY29sdW1uIC0gMVxuXG4gICAgaWYgKCFsb2NhdGlvbiB8fCBzcGFuLm1hcHBpbmdLaW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIG1heWJlQWRkU2VnbWVudChnZW5lcmF0ZWQsIGxpbmUsIGNvbHVtbilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IHNvdXJjZUZvck9yaWdpbihtYXBwaW5nLCBzcGFuLm9yaWdpbiwgbG9jYXRpb24sIGluZGV4LnNvdXJjZXNCeUlkKVxuXG4gICAgaWYgKHNwYW4ubmFtZSkge1xuICAgICAgYWRkU2VnbWVudChnZW5lcmF0ZWQsIGxpbmUsIGNvbHVtbiwgcmVnaXN0ZXJlZC5maWxlbmFtZSwgbG9jYXRpb24uc3RhcnQubGluZSAtIDEsIGxvY2F0aW9uLnN0YXJ0LmNvbHVtbiAtIDEsIHNwYW4ubmFtZSwgcmVnaXN0ZXJlZC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRTZWdtZW50KGdlbmVyYXRlZCwgbGluZSwgY29sdW1uLCByZWdpc3RlcmVkLmZpbGVuYW1lLCBsb2NhdGlvbi5zdGFydC5saW5lIC0gMSwgbG9jYXRpb24uc3RhcnQuY29sdW1uIC0gMSwgbnVsbCwgcmVnaXN0ZXJlZC5jb250ZW50KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b0VuY29kZWRNYXAoZ2VuZXJhdGVkKVxufVxuXG4vKipcbiAqIExvb2tzIHVwIG9yaWdpbmFsIHByb3ZlbmFuY2UgZm9yIG9uZSBnZW5lcmF0ZWQgVVRGLTE2IHBvc2l0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEBwYXJhbSB7e29mZnNldDogbnVtYmVyfSB8IHtsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyfX0gcG9zaXRpb24gLSBHZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRlZExvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBsb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCwgbWFwcGluZ0tpbmQ6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTWFwcGluZ0tpbmQsIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgbm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ltYm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZH19IExvb2t1cCByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmlnaW5hbFBvc2l0aW9uRm9yKG1hcHBpbmcsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IGluZGV4ID0gbWFwcGluZ0luZGV4KG1hcHBpbmcpXG4gIGNvbnN0IG9mZnNldCA9IHBvc2l0aW9uT2Zmc2V0KGluZGV4LmdlbmVyYXRlZENvb3JkaW5hdGVzLCBwb3NpdGlvbilcbiAgY29uc3Qgc3BhbiA9IHNwYW5Gb3JHZW5lcmF0ZWQobWFwcGluZy5zcGFucywgb2Zmc2V0KVxuXG4gIGlmICghc3BhbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGdlbmVyYXRlZCBtYXBwaW5nIGF0IG9mZnNldCAke29mZnNldH0uYClcblxuICByZXR1cm4gbWFwcGluZ1Jlc3VsdChzcGFuKVxufVxuXG4vKipcbiAqIExvb2tzIHVwIGV2ZXJ5IGdlbmVyYXRlZCBzcGFuIGNvbnRhaW5pbmcgb25lIG9yaWdpbmFsIFVURi0xNiBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0geyh7ZmlsZW5hbWU6IHN0cmluZ30gfCB7c291cmNlSWQ6IHN0cmluZ30pICYgKHtvZmZzZXQ6IG51bWJlcn0gfCB7bGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcn0pfSBwb3NpdGlvbiAtIE9yaWdpbmFsIHBvc2l0aW9uLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRMb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQsIG1hcHBpbmdLaW5kOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLk1hcHBpbmdLaW5kLCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5vZGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN5bWJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWR9W119IEdlbmVyYXRlZCByZXN1bHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVkUG9zaXRpb25Gb3IobWFwcGluZywgcG9zaXRpb24pIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcbiAgY29uc3Qgc291cmNlID0gXCJzb3VyY2VJZFwiIGluIHBvc2l0aW9uXG4gICAgPyBpbmRleC5zb3VyY2VzQnlJZC5nZXQocG9zaXRpb24uc291cmNlSWQpXG4gICAgOiBtYXBwaW5nLnNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZmlsZW5hbWUgPT0gcG9zaXRpb24uZmlsZW5hbWUpXG5cbiAgaWYgKCFzb3VyY2UpIHJldHVybiBbXVxuICBpZiAoc291cmNlLmNvbnRlbnQgPT0gbnVsbCAmJiAhKFwib2Zmc2V0XCIgaW4gcG9zaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU291cmNlIGNvbnRlbnQgaXMgcmVxdWlyZWQgZm9yIGxpbmUvY29sdW1uIGxvb2t1cCBvZiAke3NvdXJjZS5maWxlbmFtZX0uYClcbiAgfVxuXG4gIGxldCBvZmZzZXRcblxuICBpZiAoXCJvZmZzZXRcIiBpbiBwb3NpdGlvbikge1xuICAgIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9zaXRpb24ub2Zmc2V0KSB8fCBwb3NpdGlvbi5vZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBzb3VyY2Ugb2Zmc2V0OiAke3Bvc2l0aW9uLm9mZnNldH1gKVxuICAgIH0gZWxzZSBpbmRleGVkUG9pbnRBdCgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59ICovIChpbmRleC5zb3VyY2VDb29yZGluYXRlcy5nZXQoc291cmNlLmlkKSksIHBvc2l0aW9uLm9mZnNldClcbiAgICBvZmZzZXQgPSBwb3NpdGlvbi5vZmZzZXRcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXQgPSBpbmRleGVkT2Zmc2V0QXQoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+fSAqLyAoaW5kZXguc291cmNlQ29vcmRpbmF0ZXMuZ2V0KHNvdXJjZS5pZCkpLFxuICAgICAgcG9zaXRpb24ubGluZSwgcG9zaXRpb24uY29sdW1uKVxuICB9XG4gIGNvbnN0IGVudHJpZXMgPSBpbmRleC5vcmlnaW5hbEJ5U291cmNlLmdldChzb3VyY2UuaWQpID8/IFtdXG4gIGxldCBsb3cgPSAwXG4gIGxldCBoaWdoID0gZW50cmllcy5sZW5ndGhcblxuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIGNvbnN0IG1pZGRsZSA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMilcblxuICAgIGlmIChlbnRyaWVzW21pZGRsZV0uc3RhcnQgPD0gb2Zmc2V0KSBsb3cgPSBtaWRkbGUgKyAxXG4gICAgZWxzZSBoaWdoID0gbWlkZGxlXG4gIH1cblxuICAvKiogQHR5cGUge1NldDxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW4+fSAqL1xuICBjb25zdCBtYXRjaGVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIGluZGV4Lm9yaWdpbmFsUG9pbnRzQnlTb3VyY2UuZ2V0KHNvdXJjZS5pZCk/LmdldChvZmZzZXQpID8/IFtdKSBtYXRjaGVzLmFkZChzcGFuKVxuXG4gIGZvciAobGV0IGNhbmRpZGF0ZSA9IGxvdyAtIDE7IGNhbmRpZGF0ZSA+PSAwICYmIGVudHJpZXNbY2FuZGlkYXRlXS5wcmVmaXhFbmQgPiBvZmZzZXQ7IGNhbmRpZGF0ZS0tKSB7XG4gICAgaWYgKGVudHJpZXNbY2FuZGlkYXRlXS5lbmQgPiBvZmZzZXQpIG1hdGNoZXMuYWRkKGVudHJpZXNbY2FuZGlkYXRlXS5zcGFuKVxuICB9XG5cbiAgcmV0dXJuIFsuLi5tYXRjaGVzXS5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IC0gcmlnaHQuZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCkubWFwKG1hcHBpbmdSZXN1bHQpXG59XG5cbi8qKlxuICogUmV0dXJucyBldmVyeSBnZW5lcmF0ZWQgc3BhbiBhc3NvY2lhdGVkIHdpdGggb25lIGNhbm9uaWNhbCBzZW1hbnRpYyBub2RlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBub2RlSWQgLSBDYW5vbmljYWwgbm9kZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gTWF0Y2hpbmcgc3BhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFuc0Zvck5vZGUobWFwcGluZywgbm9kZUlkKSB7XG4gIGNvbnN0IGluZGV4ID0gbWFwcGluZ0luZGV4KG1hcHBpbmcpXG4gIGlmICghaW5kZXgubm9kZVNwYW5zLmhhcyhub2RlSWQpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBzZW1hbnRpYyBub2RlOiAke25vZGVJZH1gKVxuXG4gIHJldHVybiBbLi4uKGluZGV4Lm5vZGVTcGFucy5nZXQobm9kZUlkKSA/PyBbXSldXG59XG5cbi8qKlxuICogUmV0dXJucyBldmVyeSBnZW5lcmF0ZWQgc3BhbiBhc3NvY2lhdGVkIHdpdGggb25lIGNhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHN5bWJvbElkIC0gQ2Fub25pY2FsIHN5bWJvbCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gTWF0Y2hpbmcgc3BhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFuc0ZvclN5bWJvbChtYXBwaW5nLCBzeW1ib2xJZCkge1xuICBjb25zdCBpbmRleCA9IG1hcHBpbmdJbmRleChtYXBwaW5nKVxuICBpZiAoIWluZGV4LnN5bWJvbFNwYW5zLmhhcyhzeW1ib2xJZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHNlbWFudGljIHN5bWJvbDogJHtzeW1ib2xJZH1gKVxuXG4gIHJldHVybiBbLi4uKGluZGV4LnN5bWJvbFNwYW5zLmdldChzeW1ib2xJZCkgPz8gW10pXVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYSB2YWxpZGF0ZWQgcmljaCBtYXBwaW5nIGRldGVybWluaXN0aWNhbGx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENhbm9uaWNhbCBwcmV0dHkgSlNPTiB3aXRoIG9uZSB0cmFpbGluZyBMRi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeU1hcHBpbmcobWFwcGluZykge1xuICBtYXBwaW5nSW5kZXgobWFwcGluZylcblxuICByZXR1cm4gYCR7SlNPTi5zdHJpbmdpZnkoc29ydEpzb24obWFwcGluZyksIG51bGwsIDIpfVxcbmBcbn1cblxuLyoqXG4gKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBhIHJpY2ggbWFwcGluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXJpYWxpemVkIC0gTWFwcGluZyBKU09OLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBQYXJzZWQgbWFwcGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWFwcGluZyhzZXJpYWxpemVkKSB7XG4gIGNvbnN0IG1hcHBpbmcgPSAvKiogQHR5cGUge3Vua25vd259ICovIChKU09OLnBhcnNlKHNlcmlhbGl6ZWQpKVxuXG4gIHJldHVybiBmaW5hbGl6ZU1hcHBpbmcobWFwcGluZylcbn1cblxuLyoqXG4gKiBDb21wb3NlcyBhbiBvdXRlciByaWNoIG1hcCB0aHJvdWdoIGFuIGlubmVyIHJpY2ggbWFwLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gb3V0ZXIgLSBGaW5hbCBvdXRwdXQgdG8gaW50ZXJtZWRpYXRlIG1hcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IGlubmVyIC0gSW50ZXJtZWRpYXRlIHRvIG9yaWdpbmFsIG1hcC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gQ29tcG9zZWQgcmljaCBtYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlTWFwcGluZ3Mob3V0ZXIsIGlubmVyKSB7XG4gIGNvbnN0IG91dGVySW5kZXggPSBtYXBwaW5nSW5kZXgob3V0ZXIpXG5cbiAgbWFwcGluZ0luZGV4KGlubmVyKVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119ICovXG4gIGNvbnN0IHNvdXJjZXMgPSBpbm5lci5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiAoey4uLnNvdXJjZX0pKVxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KHNvdXJjZXMubWFwKChzb3VyY2UpID0+IHNvdXJjZS5pZCkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3Qgb3V0ZXJTb3VyY2VJZHMgPSBuZXcgTWFwKClcbiAgbGV0IG5leHRTb3VyY2VJbmRleCA9IDBcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBvdXRlci5zb3VyY2VzKSB7XG4gICAgaWYgKHNvdXJjZVJlcHJlc2VudHNHZW5lcmF0ZWQoc291cmNlLCBpbm5lci5nZW5lcmF0ZWQpKSBjb250aW51ZVxuICAgIHJldGFpbk91dGVyU291cmNlKHNvdXJjZS5pZClcbiAgfVxuXG4gIGNvbnN0IHNwYW5zID0gb3V0ZXIuc3BhbnMuZmxhdE1hcCgoc3BhbikgPT4ge1xuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgdHJhY2VSZWxhdGVkT3JpZ2luPiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgdHJhY2VcblxuICAgIGZvciAoY29uc3QgcmVsYXRlZCBvZiByZWxhdGVkT3JpZ2luc0Zvck9yaWdpbihzcGFuLm9yaWdpbikpIHtcbiAgICAgIHRyYWNlID0gdHJhY2VSZWxhdGVkT3JpZ2luKHJlbGF0ZWQpXG4gICAgICBpZiAodHJhY2U/LnRyYWNlZCkgYnJlYWtcbiAgICB9XG4gICAgY29uc3QgbG9jYXRpb24gPSB0cmFjZT8ucmVsYXRlZC5sb2NhdGlvblxuICAgIGNvbnN0IG92ZXJsYXBwaW5nID0gdHJhY2U/Lm92ZXJsYXBwaW5nID8/IFtdXG4gICAgY29uc3QgdHJhY2VkID0gdHJhY2U/LnRyYWNlZFxuXG4gICAgaWYgKCF0cmFjZWQpIHtcbiAgICAgIGZvciAoY29uc3QgcmVsYXRlZCBvZiByZWxhdGVkT3JpZ2luc0Zvck9yaWdpbihzcGFuLm9yaWdpbikpIHtcbiAgICAgICAgY29uc3QgcmVsYXRlZFRyYWNlID0gdHJhY2VSZWxhdGVkT3JpZ2luKHJlbGF0ZWQpXG5cbiAgICAgICAgaWYgKHJlbGF0ZWRUcmFjZSAmJiBpc0dlbmVyYXRlZEVvZlBvaW50KHJlbGF0ZWQpKSByZXRhaW5PdXRlclNvdXJjZShyZWxhdGVkLnNvdXJjZUlkKVxuICAgICAgfVxuICAgICAgY29uc3QgdW5pZGVudGlmaWVkID0gey4uLnNwYW59XG5cbiAgICAgIGRlbGV0ZSB1bmlkZW50aWZpZWQubm9kZUlkXG4gICAgICBkZWxldGUgdW5pZGVudGlmaWVkLnN5bWJvbElkXG5cbiAgICAgIHJldHVybiBbey4uLnVuaWRlbnRpZmllZCwgb3JpZ2luOiByZW1hcE9yaWdpblNvdXJjZUlkcyhzcGFuLm9yaWdpbiwgb3V0ZXJTb3VyY2VJZHMpfV1cbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRSZWxhdGVkID0gdHJhY2U/LnJlbGF0ZWRcblxuICAgIGlmICghc2VsZWN0ZWRSZWxhdGVkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludGVybWVkaWF0ZSB0cmFjZSBzZWxlY3Rpb24gaXMgbWlzc2luZyBpdHMgcmVsYXRlZCBvcmlnaW4uXCIpXG5cbiAgICBpZiAobG9jYXRpb24gJiYgb3ZlcmxhcHBpbmcubGVuZ3RoID4gMSAmJiBzcGFuLm1hcHBpbmdLaW5kID09IFwiZXhhY3RcIiAmJlxuICAgICAgc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldCAtIHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCA9PSBsb2NhdGlvbi5lbmQub2Zmc2V0IC0gbG9jYXRpb24uc3RhcnQub2Zmc2V0KSB7XG4gICAgICByZXR1cm4gb3ZlcmxhcHBpbmcubWFwKChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgb3ZlcmxhcFN0YXJ0ID0gTWF0aC5tYXgobG9jYXRpb24uc3RhcnQub2Zmc2V0LCBjYW5kaWRhdGUuZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldClcbiAgICAgICAgY29uc3Qgb3ZlcmxhcEVuZCA9IE1hdGgubWluKGxvY2F0aW9uLmVuZC5vZmZzZXQsIGNhbmRpZGF0ZS5nZW5lcmF0ZWQuZW5kLm9mZnNldClcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkU3RhcnQgPSBzcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgKyBvdmVybGFwU3RhcnQgLSBsb2NhdGlvbi5zdGFydC5vZmZzZXRcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkRW5kID0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ICsgb3ZlcmxhcEVuZCAtIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldFxuICAgICAgICBjb25zdCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiA9IG92ZXJsYXBTdGFydCA9PSBjYW5kaWRhdGUuZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCAmJiBvdmVybGFwRW5kID09IGNhbmRpZGF0ZS5nZW5lcmF0ZWQuZW5kLm9mZnNldFxuXG4gICAgICAgIHJldHVybiBjb21wb3NlZFNwYW4oc3BhbiwgY2FuZGlkYXRlLCBsb2NhdGlvbkZyb21PZmZzZXRzKFxuICAgICAgICAgIG91dGVyLmdlbmVyYXRlZC5maWxlbmFtZSxcbiAgICAgICAgICBvdXRlci5nZW5lcmF0ZWQuY29udGVudCxcbiAgICAgICAgICBnZW5lcmF0ZWRTdGFydCxcbiAgICAgICAgICBnZW5lcmF0ZWRFbmRcbiAgICAgICAgKSwgcHJlc2VydmVzV2hvbGVPcmlnaW4sIHNlbGVjdGVkUmVsYXRlZCwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2VydmVzV2hvbGVPcmlnaW4gPSBCb29sZWFuKGxvY2F0aW9uICYmIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCA9PSB0cmFjZWQuZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCAmJlxuICAgICAgbG9jYXRpb24uZW5kLm9mZnNldCA9PSB0cmFjZWQuZ2VuZXJhdGVkLmVuZC5vZmZzZXQpXG4gICAgY29uc3QgY29tcG9zZWQgPSBjb21wb3NlZFNwYW4oc3BhbiwgdHJhY2VkLCBzcGFuLmdlbmVyYXRlZCwgcHJlc2VydmVzV2hvbGVPcmlnaW4sIHNlbGVjdGVkUmVsYXRlZClcblxuICAgIGlmIChzcGFuLm9yaWdpbi5raW5kID09IFwic291cmNlXCIgJiYgb3ZlcmxhcHBpbmcubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgb3JpZ2lucyA9IGNvbXBvc2VSZWxhdGVkT3JpZ2lucyhbc2VsZWN0ZWRSZWxhdGVkXSwgc2VsZWN0ZWRSZWxhdGVkLCB0cmFjZWQsIGZhbHNlKVxuXG4gICAgICBpZiAob3JpZ2lucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBbey4uLmNvbXBvc2VkLCBtYXBwaW5nS2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiYW5jaG9yXCIpLCBvcmlnaW46IHtcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJkZXJpdmVkXCIpLFxuICAgICAgICAgIG9yaWdpbnNcbiAgICAgICAgfX1dXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtjb21wb3NlZF1cbiAgfSlcblxuICByZXR1cm4gZmluYWxpemVNYXBwaW5nKHtcbiAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgZ2VuZXJhdGVkOiBvdXRlci5nZW5lcmF0ZWQsXG4gICAgbm9kZXM6IGlubmVyLm5vZGVzLFxuICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZE1hcHBpbmdcIixcbiAgICBzb3VyY2VzLFxuICAgIHNwYW5zLFxuICAgIHN5bWJvbHM6IGlubmVyLnN5bWJvbHMsXG4gICAgdmVyc2lvbjogMVxuICB9KVxuXG4gIC8qKlxuICAgKiBDb21wb3NlcyBvbmUgb3V0ZXIgZ2VuZXJhdGVkIHJhbmdlIHdpdGggYW4gaW5uZXIgcmFuZ2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBvdXRlclNwYW4gLSBPdXRlciBzcGFuLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gaW5uZXJTcGFuIC0gSW5uZXIgc3Bhbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBnZW5lcmF0ZWQgLSBGaW5hbCBnZW5lcmF0ZWQgc3VicmFuZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJlc2VydmVzV2hvbGVPcmlnaW4gLSBXaGV0aGVyIGFkb3B0aW5nIHRoZSBpbm5lciBvcmlnaW4gcmV0YWlucyBpdHMgY29tcGxldGUgcmFuZ2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBzZWxlY3RlZFJlbGF0ZWQgLSBPdXRlciBvcmlnaW4gdHJhY2VkIHRocm91Z2ggdGhpcyBpbm5lciBzcGFuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXN0cmljdFNlbGVjdGVkVHJhY2VdIC0gV2hldGhlciBhbiBleGFjdCBzcGxpdCBzZWxlY3RzIG9ubHkgdGhpcyBpbm5lciBzcGFuLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBDb21wb3NlZCBzcGFuLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcG9zZWRTcGFuKG91dGVyU3BhbiwgaW5uZXJTcGFuLCBnZW5lcmF0ZWQsIHByZXNlcnZlc1dob2xlT3JpZ2luLCBzZWxlY3RlZFJlbGF0ZWQsIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSA9IGZhbHNlKSB7XG4gICAgaWYgKG91dGVyU3Bhbi5tYXBwaW5nS2luZCA9PSBcInN5bnRoZXRpY1wiICYmIG91dGVyU3Bhbi5vcmlnaW4ua2luZCA9PSBcInN5bnRoZXRpY1wiKSB7XG4gICAgICByZXR1cm4gZGVmaW5lZFByb3BlcnRpZXMoe1xuICAgICAgICBnZW5lcmF0ZWQsXG4gICAgICAgIG1hcHBpbmdLaW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIiksXG4gICAgICAgIG5hbWU6IG91dGVyU3Bhbi5uYW1lLFxuICAgICAgICBvcmlnaW46IHtcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIiksXG4gICAgICAgICAgcmVhc29uOiBvdXRlclNwYW4ub3JpZ2luLnJlYXNvbixcbiAgICAgICAgICByZWxhdGVkT3JpZ2luczogY29tcG9zZVJlbGF0ZWRPcmlnaW5zKG91dGVyU3Bhbi5vcmlnaW4ucmVsYXRlZE9yaWdpbnMsIHNlbGVjdGVkUmVsYXRlZCwgaW5uZXJTcGFuLCByZXN0cmljdFNlbGVjdGVkVHJhY2UpXG4gICAgICAgIH0sXG4gICAgICAgIHJvbGU6IG91dGVyU3Bhbi5yb2xlXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvc2VkRGVyaXZlZE9yaWdpbnMgPSBvdXRlclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCJcbiAgICAgID8gY29tcG9zZVJlbGF0ZWRPcmlnaW5zKG91dGVyU3Bhbi5vcmlnaW4ub3JpZ2lucywgc2VsZWN0ZWRSZWxhdGVkLCBpbm5lclNwYW4sIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSlcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3Qgb3JpZ2luID0gb3V0ZXJTcGFuLm9yaWdpbi5raW5kID09IFwic291cmNlXCIgPyBpbm5lclNwYW4ub3JpZ2luIDogb3V0ZXJTcGFuLm9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiXG4gICAgICA/IGNvbXBvc2VkRGVyaXZlZE9yaWdpbnM/Lmxlbmd0aCA9PSAwICYmIGlubmVyU3Bhbi5vcmlnaW4ua2luZCA9PSBcInN5bnRoZXRpY1wiXG4gICAgICAgID8gaW5uZXJTcGFuLm9yaWdpblxuICAgICAgICA6IHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJkZXJpdmVkXCIpLCBvcmlnaW5zOiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSAqLyAoY29tcG9zZWREZXJpdmVkT3JpZ2lucyl9XG4gICAgICA6IHtcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIiksXG4gICAgICAgICAgcmVhc29uOiBvdXRlclNwYW4ub3JpZ2luLnJlYXNvbixcbiAgICAgICAgICByZWxhdGVkT3JpZ2luczogY29tcG9zZVJlbGF0ZWRPcmlnaW5zKG91dGVyU3Bhbi5vcmlnaW4ucmVsYXRlZE9yaWdpbnMsIHNlbGVjdGVkUmVsYXRlZCwgaW5uZXJTcGFuLCByZXN0cmljdFNlbGVjdGVkVHJhY2UpXG4gICAgICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICAuLi5vdXRlclNwYW4sXG4gICAgICBnZW5lcmF0ZWQsXG4gICAgICBtYXBwaW5nS2luZDogaW5uZXJTcGFuLm1hcHBpbmdLaW5kID09IFwic3ludGhldGljXCIgPyAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIikgOlxuICAgICAgICBvdXRlclNwYW4ubWFwcGluZ0tpbmQgPT0gXCJleGFjdFwiICYmIGlubmVyU3Bhbi5tYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcHJlc2VydmVzV2hvbGVPcmlnaW5cbiAgICAgICAgICA/IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImV4YWN0XCIpXG4gICAgICAgICAgOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJhbmNob3JcIiksXG4gICAgICBuYW1lOiBvdXRlclNwYW4ubmFtZSA/PyBpbm5lclNwYW4ubmFtZSxcbiAgICAgIG5vZGVJZDogaW5uZXJTcGFuLm5vZGVJZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHJvbGU6IGlubmVyU3Bhbi5yb2xlID8/IG91dGVyU3Bhbi5yb2xlLFxuICAgICAgc3ltYm9sSWQ6IGlubmVyU3Bhbi5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGlubmVyIHNwYW4gc2VsZWN0ZWQgYnkgb25lIHJlbGF0ZWQgaW50ZXJtZWRpYXRlIG9yaWdpbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHJlbGF0ZWQgLSBPdXRlciByZWxhdGVkIG9yaWdpbi5cbiAgICogQHJldHVybnMge3tcbiAgICogICBvdmVybGFwcGluZzogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW10sXG4gICAqICAgcmVsYXRlZDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luLFxuICAgKiAgIHRyYWNlZDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuIHwgdW5kZWZpbmVkXG4gICAqIH0gfCB1bmRlZmluZWR9IFRyYWNlIHNlbGVjdGlvbiB3aGVuIHRoZSByZWxhdGVkIHNvdXJjZSBpcyB0aGUgaW50ZXJtZWRpYXRlIGFydGlmYWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gdHJhY2VSZWxhdGVkT3JpZ2luKHJlbGF0ZWQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBvdXRlckluZGV4LnNvdXJjZXNCeUlkLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuXG4gICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZVJlcHJlc2VudHNHZW5lcmF0ZWQoc291cmNlLCBpbm5lci5nZW5lcmF0ZWQpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY29uc3Qgb3ZlcmxhcHBpbmcgPSBzcGFuc092ZXJsYXBwaW5nR2VuZXJhdGVkKGlubmVyLnNwYW5zLCByZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCwgcmVsYXRlZC5sb2NhdGlvbi5lbmQub2Zmc2V0KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG92ZXJsYXBwaW5nLFxuICAgICAgcmVsYXRlZCxcbiAgICAgIHRyYWNlZDogb3ZlcmxhcHBpbmdbMF0gPz8gc3BhbkZvckdlbmVyYXRlZChpbm5lci5zcGFucywgcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNlcyBpbnRlcm1lZGlhdGUgcmVsYXRlZCBvcmlnaW5zIGFuZCByZW1hcHMgdW5yZWxhdGVkIHNvdXJjZSBpZGVudGl0aWVzIGluIG9yZGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIE91dGVyIHJlbGF0ZWQgb3JpZ2lucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHNlbGVjdGVkUmVsYXRlZCAtIE9yaWdpbiB1c2luZyB0aGUgc2VsZWN0ZWQgaW5uZXIgc3Bhbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IHNlbGVjdGVkU3BhbiAtIFNlbGVjdGVkIGlubmVyIHNwYW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzdHJpY3RTZWxlY3RlZFRyYWNlIC0gV2hldGhlciBhbiBleGFjdCBzcGxpdCBzZWxlY3RzIG9ubHkgdGhlIHN1cHBsaWVkIHNwYW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gQ29tcG9zZWQgcmVsYXRlZCBvcmlnaW5zLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcG9zZVJlbGF0ZWRPcmlnaW5zKHJlbGF0ZWRPcmlnaW5zLCBzZWxlY3RlZFJlbGF0ZWQsIHNlbGVjdGVkU3BhbiwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlKSB7XG4gICAgcmV0dXJuIHJlbGF0ZWRPcmlnaW5zLmZsYXRNYXAoKHJlbGF0ZWQpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IG91dGVySW5kZXguc291cmNlc0J5SWQuZ2V0KHJlbGF0ZWQuc291cmNlSWQpXG5cbiAgICAgIGlmICghc291cmNlIHx8ICFzb3VyY2VSZXByZXNlbnRzR2VuZXJhdGVkKHNvdXJjZSwgaW5uZXIuZ2VuZXJhdGVkKSkge1xuICAgICAgICByZXR1cm4gW3JlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIG91dGVyU291cmNlSWRzKV1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VSZWxhdGVkT3JpZ2luKHJlbGF0ZWQpXG4gICAgICBjb25zdCB0cmFjZWRTcGFucyA9IHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSAmJiByZWxhdGVkID09PSBzZWxlY3RlZFJlbGF0ZWRcbiAgICAgICAgPyBbc2VsZWN0ZWRTcGFuXVxuICAgICAgICA6IHRyYWNlPy5vdmVybGFwcGluZy5sZW5ndGhcbiAgICAgICAgICA/IHRyYWNlLm92ZXJsYXBwaW5nXG4gICAgICAgICAgOiB0cmFjZT8udHJhY2VkID8gW3RyYWNlLnRyYWNlZF0gOiBbXVxuXG4gICAgICBpZiAodHJhY2VkU3BhbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgaWYgKCFpc0dlbmVyYXRlZEVvZlBvaW50KHJlbGF0ZWQpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5hYmxlIHRvIHRyYWNlIGludGVybWVkaWF0ZSBvcmlnaW4gJyR7cmVsYXRlZC5sb2NhdGlvbi5maWxlbmFtZX0nLmApXG4gICAgICAgIHJldGFpbk91dGVyU291cmNlKHJlbGF0ZWQuc291cmNlSWQpXG5cbiAgICAgICAgcmV0dXJuIFtyZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBvdXRlclNvdXJjZUlkcyldXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFjZWRTcGFucy5mbGF0TWFwKCh0cmFjZWRTcGFuKSA9PiByZWxhdGVkT3JpZ2luc0ZvclNwYW4odHJhY2VkU3BhbikubWFwKCh0cmFjZWRSZWxhdGVkKSA9PiBkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICAgICAgLi4udHJhY2VkUmVsYXRlZCxcbiAgICAgICAgICBub2RlSWQ6IHRyYWNlZFJlbGF0ZWQubm9kZUlkID8/IHRyYWNlZFNwYW4ubm9kZUlkLFxuICAgICAgICAgIHJvbGU6IHJlbGF0ZWQucm9sZSA/PyB0cmFjZWRSZWxhdGVkLnJvbGUsXG4gICAgICAgICAgc3ltYm9sSWQ6IHRyYWNlZFJlbGF0ZWQuc3ltYm9sSWQgPz8gdHJhY2VkU3Bhbi5zeW1ib2xJZFxuICAgICAgICB9KSkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW5zIG9uZSBvdXRlciBzb3VyY2UgdGhhdCBzdXJ2aXZlcyBjb21wb3NpdGlvbiBhbmQgYXNzaWducyBpdHMgY29tcG9zZWQgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VJZCAtIE91dGVyIHNvdXJjZSByZWdpc3RyeSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiByZXRhaW5PdXRlclNvdXJjZShzb3VyY2VJZCkge1xuICAgIGlmIChvdXRlclNvdXJjZUlkcy5oYXMoc291cmNlSWQpKSByZXR1cm5cbiAgICBjb25zdCBzb3VyY2UgPSBvdXRlckluZGV4LnNvdXJjZXNCeUlkLmdldChzb3VyY2VJZClcblxuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBvdXRlciBtYXBwaW5nIHNvdXJjZSAnJHtzb3VyY2VJZH0nLmApXG4gICAgbGV0IGNvbXBvc2VkU291cmNlID0gc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IHNhbWVSZWdpc3RlcmVkU291cmNlKGNhbmRpZGF0ZSwgc291cmNlKSlcblxuICAgIGlmICghY29tcG9zZWRTb3VyY2UpIHtcbiAgICAgIHdoaWxlIChzb3VyY2VJZHMuaGFzKGBzb3VyY2U6JHtuZXh0U291cmNlSW5kZXh9YCkpIG5leHRTb3VyY2VJbmRleCsrXG4gICAgICBjb21wb3NlZFNvdXJjZSA9IHsuLi5zb3VyY2UsIGlkOiBgc291cmNlOiR7bmV4dFNvdXJjZUluZGV4fWB9XG4gICAgICBzb3VyY2VJZHMuYWRkKGNvbXBvc2VkU291cmNlLmlkKVxuICAgICAgc291cmNlcy5wdXNoKGNvbXBvc2VkU291cmNlKVxuICAgIH1cbiAgICBvdXRlclNvdXJjZUlkcy5zZXQoc291cmNlLmlkLCBjb21wb3NlZFNvdXJjZS5pZClcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB3aGV0aGVyIG9uZSBpbnRlcm1lZGlhdGUgb3JpZ2luIGlzIHRoZSBleGFjdCBwb2ludCBhZnRlciBhbGwgZ2VuZXJhdGVkIGNvZGUgdW5pdHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSByZWxhdGVkIC0gQ2FuZGlkYXRlIGludGVybWVkaWF0ZSBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgaXMgYW4gRU9GIHBvaW50IHJhdGhlciB0aGFuIGEgZ2VuZXJhdGVkIGhhbGYtb3BlbiByYW5nZS5cbiAgICovXG4gIGZ1bmN0aW9uIGlzR2VuZXJhdGVkRW9mUG9pbnQocmVsYXRlZCkge1xuICAgIHJldHVybiByZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCA9PSBpbm5lci5nZW5lcmF0ZWQuY29udGVudC5sZW5ndGggJiZcbiAgICAgIHJlbGF0ZWQubG9jYXRpb24uZW5kLm9mZnNldCA9PSBpbm5lci5nZW5lcmF0ZWQuY29udGVudC5sZW5ndGhcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBtYXBwZWQgc3BhbidzIGNsb3NlZCBvcmlnaW4gaW50byByZWxhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gc3BhbiAtIFRyYWNlZCBpbm5lciBzcGFuLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSBSZWxhdGVkIG9yaWdpbmFsIHJhbmdlcy5cbiAqL1xuZnVuY3Rpb24gcmVsYXRlZE9yaWdpbnNGb3JTcGFuKHNwYW4pIHtcbiAgcmV0dXJuIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKVxufVxuXG4vKipcbiAqIFJldHVybnMgZXZlcnkgcmVsYXRlZCByYW5nZSBpbiBvbmUgY2xvc2VkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIG9yaWdpbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gUmVsYXRlZCByYW5nZXMgaW4gc2VtYW50aWMgb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKG9yaWdpbikge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikgcmV0dXJuIFt7bG9jYXRpb246IG9yaWdpbi5sb2NhdGlvbiwgc291cmNlSWQ6IG9yaWdpbi5zb3VyY2VJZH1dXG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikgcmV0dXJuIG9yaWdpbi5vcmlnaW5zXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlZ2lzdGVyZWQgc291cmNlIGlzIHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3QgY29uc3VtZWQgYnkgYW4gaW5uZXIgbWFwLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IHNvdXJjZSAtIE91dGVyIHNvdXJjZSByZWdpc3RyeSBlbnRyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTb3VyY2V9IGdlbmVyYXRlZCAtIElubmVyIGdlbmVyYXRlZCBhcnRpZmFjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGlkZW50aXR5LXNlbGVjdGVkIHByb3ZlbmFuY2UgbWF5IGJlIHRyYWNlZCB0aHJvdWdoIHRoZSBpbm5lciBtYXAuXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZVJlcHJlc2VudHNHZW5lcmF0ZWQoc291cmNlLCBnZW5lcmF0ZWQpIHtcbiAgcmV0dXJuIHNvdXJjZS5maWxlbmFtZSA9PSBnZW5lcmF0ZWQuZmlsZW5hbWUgJiYgc291cmNlLmNvbnRlbnQgPT0gZ2VuZXJhdGVkLmNvbnRlbnQgJiZcbiAgICAoc291cmNlLmxhbmd1YWdlID09IG51bGwgfHwgc291cmNlLmxhbmd1YWdlID09IGdlbmVyYXRlZC5sYW5ndWFnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBjb21wbGV0ZSByZWdpc3RlcmVkLXNvdXJjZSBpZGVudGl0eSBmaWVsZHMgb3RoZXIgdGhhbiByZWdpc3RyeS1sb2NhbCBJRC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBsZWZ0IC0gRmlyc3QgcmVnaXN0ZXJlZCBzb3VyY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gcmlnaHQgLSBTZWNvbmQgcmVnaXN0ZXJlZCBzb3VyY2UuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBib3RoIGVudHJpZXMgcmVwcmVzZW50IHRoZSBzYW1lIHNvdXJjZSBhcnRpZmFjdC5cbiAqL1xuZnVuY3Rpb24gc2FtZVJlZ2lzdGVyZWRTb3VyY2UobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIGxlZnQuZmlsZW5hbWUgPT0gcmlnaHQuZmlsZW5hbWUgJiYgbGVmdC5jb250ZW50ID09IHJpZ2h0LmNvbnRlbnQgJiYgbGVmdC5sYW5ndWFnZSA9PSByaWdodC5sYW5ndWFnZVxufVxuXG4vKipcbiAqIENvbXBvc2VzIFNvdXJjZSBNYXAgdjMgbWFwcyB3aXRoIG1haW50YWluZWQgdHJhY2luZyBtYWNoaW5lcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuU291cmNlTWFwSW5wdXR9IG91dGVyIC0gRmluYWwgb3V0cHV0IHRvIGludGVybWVkaWF0ZSBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuU291cmNlTWFwSW5wdXR9IGlubmVyIC0gSW50ZXJtZWRpYXRlIHRvIG9yaWdpbmFsIG1hcC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBDb21wb3NlZCB2MyBtYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlU291cmNlTWFwcyhvdXRlciwgaW5uZXIpIHtcbiAgY29uc3Qgb3V0ZXJNYXAgPSBuZXcgVHJhY2VNYXAob3V0ZXIpXG4gIGNvbnN0IGlubmVyTWFwID0gbmV3IFRyYWNlTWFwKGlubmVyKVxuICBjb25zdCBjb21wb3NlZCA9IG5ldyBHZW5NYXBwaW5nKHtmaWxlOiBvdXRlck1hcC5maWxlfSlcbiAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXhlcyA9IHR5cGVvZiBpbm5lck1hcC5maWxlID09IFwic3RyaW5nXCJcbiAgICA/IG91dGVyTWFwLnJlc29sdmVkU291cmNlcy5mbGF0TWFwKChzb3VyY2UsIGluZGV4KSA9PiBzb3VyY2UgPT0gaW5uZXJNYXAuZmlsZSA/IFtpbmRleF0gOiBbXSlcbiAgICA6IFtdXG4gIGNvbnN0IGludGVybWVkaWF0ZUluZGV4ID0gaW50ZXJtZWRpYXRlSW5kZXhlcy5sZW5ndGggPT0gMSA/IGludGVybWVkaWF0ZUluZGV4ZXNbMF0gOiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJtZWRpYXRlU291cmNlID0gaW50ZXJtZWRpYXRlSW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG91dGVyTWFwLnJlc29sdmVkU291cmNlc1tpbnRlcm1lZGlhdGVJbmRleF1cblxuICBpbm5lck1hcC5zb3VyY2VzLmZvckVhY2goKHJhd1NvdXJjZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBpbm5lck1hcC5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdID8/IHJhd1NvdXJjZVxuXG4gICAgaWYgKHNvdXJjZSAhPSBudWxsKSBzZXRTb3VyY2VDb250ZW50KGNvbXBvc2VkLCBzb3VyY2UsIGlubmVyTWFwLnNvdXJjZXNDb250ZW50Py5baW5kZXhdID8/IG51bGwpXG4gIH0pXG4gIG91dGVyTWFwLnNvdXJjZXMuZm9yRWFjaCgocmF3U291cmNlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IG91dGVyTWFwLnJlc29sdmVkU291cmNlc1tpbmRleF0gPz8gcmF3U291cmNlXG5cbiAgICBpZiAoc291cmNlICE9IG51bGwgJiYgaW5kZXggIT0gaW50ZXJtZWRpYXRlSW5kZXgpIHtcbiAgICAgIHNldFNvdXJjZUNvbnRlbnQoY29tcG9zZWQsIHNvdXJjZSwgb3V0ZXJNYXAuc291cmNlc0NvbnRlbnQ/LltpbmRleF0gPz8gbnVsbClcbiAgICB9XG4gIH0pXG5cbiAgZWFjaE1hcHBpbmcob3V0ZXJNYXAsIChtYXBwaW5nKSA9PiB7XG4gICAgaWYgKG1hcHBpbmcuc291cmNlID09IG51bGwgfHwgbWFwcGluZy5vcmlnaW5hbExpbmUgPT0gbnVsbCB8fCBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG51bGwpIHtcbiAgICAgIG1heWJlQWRkU2VnbWVudChjb21wb3NlZCwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lIC0gMSwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpc0ludGVybWVkaWF0ZSA9IGludGVybWVkaWF0ZVNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIG1hcHBpbmcuc291cmNlID09IGludGVybWVkaWF0ZVNvdXJjZVxuICAgIGNvbnN0IHRyYWNlZCA9IGlzSW50ZXJtZWRpYXRlXG4gICAgICA/IHRyYWNlT3JpZ2luYWxQb3NpdGlvbkZvcihpbm5lck1hcCwge2NvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbiwgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmV9KVxuICAgICAgOiB7Y29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLCBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSwgbmFtZTogbWFwcGluZy5uYW1lLCBzb3VyY2U6IG1hcHBpbmcuc291cmNlfVxuXG4gICAgaWYgKHRyYWNlZC5zb3VyY2UgPT0gbnVsbCB8fCB0cmFjZWQubGluZSA9PSBudWxsIHx8IHRyYWNlZC5jb2x1bW4gPT0gbnVsbCkge1xuICAgICAgbWF5YmVBZGRTZWdtZW50KGNvbXBvc2VkLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUgLSAxLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBpc0ludGVybWVkaWF0ZSA/IHNvdXJjZUNvbnRlbnRGb3IoaW5uZXJNYXAsIHRyYWNlZC5zb3VyY2UpIDogc291cmNlQ29udGVudEZvcihvdXRlck1hcCwgdHJhY2VkLnNvdXJjZSlcbiAgICBjb25zdCBuYW1lID0gdHJhY2VkLm5hbWUgPz8gbWFwcGluZy5uYW1lXG5cbiAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICBhZGRTZWdtZW50KGNvbXBvc2VkLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUgLSAxLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiwgdHJhY2VkLnNvdXJjZSwgdHJhY2VkLmxpbmUgLSAxLCB0cmFjZWQuY29sdW1uLCBudWxsLCBjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRTZWdtZW50KGNvbXBvc2VkLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUgLSAxLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiwgdHJhY2VkLnNvdXJjZSwgdHJhY2VkLmxpbmUgLSAxLCB0cmFjZWQuY29sdW1uLCBuYW1lLCBjb250ZW50KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gdG9FbmNvZGVkTWFwKGNvbXBvc2VkKVxufVxuXG4vKipcbiAqIEltcG9ydHMgYSBwb2ludC1iYXNlZCBTb3VyY2UgTWFwIHYzIGFzIGEgcmFuZ2UtYmFzZWQgU2VtYW50aWZvbGQgbWFwLlxuICogQHBhcmFtIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcElucHV0fSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzLlxuICogQHBhcmFtIHtvYmplY3R9IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBwcm9ncmFtLlxuICogQHBhcmFtIHtzdHJpbmd9IGdlbmVyYXRlZC5jb250ZW50IC0gRXhhY3QgZ2VuZXJhdGVkIGNvbnRlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZ2VuZXJhdGVkLmZpbGVuYW1lIC0gR2VuZXJhdGVkIGZpbGVuYW1lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFRleHRMYW5ndWFnZX0gZ2VuZXJhdGVkLmxhbmd1YWdlIC0gR2VuZXJhdGVkIHRleHQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbZ2VuZXJhdGVkLnNvdXJjZXNdIC0gRXhhY3Qgc291cmNlIGNvbnRlbnQgb3ZlcnJpZGVzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBJbXBvcnRlZCByaWNoIG1hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcHBpbmdGcm9tU291cmNlTWFwKHNvdXJjZU1hcCwge2NvbnRlbnQsIGZpbGVuYW1lLCBsYW5ndWFnZSwgc291cmNlczogcHJvdmlkZWQgPSBbXX0pIHtcbiAgY29uc3QgdHJhY2UgPSBuZXcgVHJhY2VNYXAoc291cmNlTWFwKVxuICBjb25zdCBnZW5lcmF0ZWRDb29yZGluYXRlcyA9IGNyZWF0ZUNvb3JkaW5hdGVJbmRleChjb250ZW50KVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSAqL1xuICBjb25zdCBzb3VyY2VzID0gW11cbiAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCB7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0+fSAqL1xuICBjb25zdCBvdmVycmlkZXNCeVNvdXJjZUluZGV4ID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBvdmVycmlkZSBvZiBwcm92aWRlZCkge1xuICAgIGNvbnN0IGV4YWN0ID0gdHJhY2Uuc291cmNlcy5mbGF0TWFwKChzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHRyYWNlLnJlc29sdmVkU291cmNlc1tpbmRleF1cblxuICAgICAgcmV0dXJuIHNvdXJjZSA9PSBvdmVycmlkZS5maWxlbmFtZSB8fCByZXNvbHZlZCA9PSBvdmVycmlkZS5maWxlbmFtZSA/IFtpbmRleF0gOiBbXVxuICAgIH0pXG5cbiAgICBpZiAoZXhhY3QubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBleGFjdCkgb3ZlcnJpZGVzQnlTb3VyY2VJbmRleC5zZXQoaW5kZXgsIG92ZXJyaWRlKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgc3VmZml4ID0gdHJhY2Uuc291cmNlcy5mbGF0TWFwKChzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHRyYWNlLnJlc29sdmVkU291cmNlc1tpbmRleF1cblxuICAgICAgcmV0dXJuIHNvdXJjZT8uZW5kc1dpdGgoYC8ke292ZXJyaWRlLmZpbGVuYW1lfWApIHx8IHJlc29sdmVkPy5lbmRzV2l0aChgLyR7b3ZlcnJpZGUuZmlsZW5hbWV9YCkgPyBbaW5kZXhdIDogW11cbiAgICB9KVxuXG4gICAgaWYgKHN1ZmZpeC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQW1iaWd1b3VzIFNvdXJjZSBNYXAgc291cmNlIGNvbnRlbnQgb3ZlcnJpZGUgJyR7b3ZlcnJpZGUuZmlsZW5hbWV9JyBtYXRjaGVzIG11bHRpcGxlIHNvdXJjZXMuYClcbiAgICB9XG4gICAgaWYgKHN1ZmZpeC5sZW5ndGggPT0gMSAmJiAhb3ZlcnJpZGVzQnlTb3VyY2VJbmRleC5oYXMoc3VmZml4WzBdKSkgb3ZlcnJpZGVzQnlTb3VyY2VJbmRleC5zZXQoc3VmZml4WzBdLCBvdmVycmlkZSlcbiAgfVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59ICovXG4gIGNvbnN0IHNvdXJjZXNCeU1hcE5hbWUgPSBuZXcgTWFwKClcblxuICB0cmFjZS5zb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaW5kZXgpID0+IHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVyblxuXG4gICAgY29uc3QgcmVzb2x2ZWRTb3VyY2UgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdID8/IHNvdXJjZVxuICAgIGNvbnN0IHByb3ZpZGVkU291cmNlID0gb3ZlcnJpZGVzQnlTb3VyY2VJbmRleC5nZXQoaW5kZXgpXG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IHtcbiAgICAgIGNvbnRlbnQ6IHByb3ZpZGVkU291cmNlPy5jb250ZW50ID8/IHRyYWNlLnNvdXJjZXNDb250ZW50Py5baW5kZXhdID8/IG51bGwsXG4gICAgICBmaWxlbmFtZTogcHJvdmlkZWRTb3VyY2U/LmZpbGVuYW1lID8/IHJlc29sdmVkU291cmNlLFxuICAgICAgaWQ6IGBzb3VyY2U6JHtzb3VyY2VzLmxlbmd0aH1gLFxuICAgICAgbGFuZ3VhZ2U6IHByb3ZpZGVkU291cmNlPy5sYW5ndWFnZSA/PyBudWxsXG4gICAgfVxuXG4gICAgc291cmNlcy5wdXNoKHJlZ2lzdGVyZWQpXG4gICAgaWYgKCFzb3VyY2VzQnlNYXBOYW1lLmhhcyhyZXNvbHZlZFNvdXJjZSkpIHNvdXJjZXNCeU1hcE5hbWUuc2V0KHJlc29sdmVkU291cmNlLCByZWdpc3RlcmVkKVxuICB9KVxuICBjb25zdCBzb3VyY2VDb29yZGluYXRlcyA9IG5ldyBNYXAoc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLmNvbnRlbnQgIT0gbnVsbClcbiAgICAubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIGNyZWF0ZUNvb3JkaW5hdGVJbmRleCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHNvdXJjZS5jb250ZW50KSldKSlcblxuICAvKiogQHR5cGUge3tnZW5lcmF0ZWRPZmZzZXQ6IG51bWJlciwgbWFwcGluZzogaW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5FYWNoTWFwcGluZ31bXX0gKi9cbiAgY29uc3QgcG9pbnRzID0gW11cblxuICBlYWNoTWFwcGluZyh0cmFjZSwgKG1hcHBpbmcpID0+IHtcbiAgICBwb2ludHMucHVzaCh7Z2VuZXJhdGVkT2Zmc2V0OiBpbmRleGVkT2Zmc2V0QXQoZ2VuZXJhdGVkQ29vcmRpbmF0ZXMsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gKyAxKSwgbWFwcGluZ30pXG4gIH0pXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgY29uc3QgbWFwcGVkU3BhbnMgPSBbXVxuXG4gIHBvaW50cy5mb3JFYWNoKCh7Z2VuZXJhdGVkT2Zmc2V0LCBtYXBwaW5nfSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gcG9pbnRzW2luZGV4ICsgMV1cbiAgICBjb25zdCBlbmQgPSBuZXh0Py5tYXBwaW5nLmdlbmVyYXRlZExpbmUgPT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICA/IG5leHQuZ2VuZXJhdGVkT2Zmc2V0XG4gICAgICA6IGxpbmVFbmRPZmZzZXQoY29udGVudCwgZ2VuZXJhdGVkT2Zmc2V0KVxuXG4gICAgaWYgKGVuZCA8PSBnZW5lcmF0ZWRPZmZzZXQpIHJldHVyblxuXG4gICAgaWYgKG1hcHBpbmcuc291cmNlID09IG51bGwgfHwgbWFwcGluZy5vcmlnaW5hbExpbmUgPT0gbnVsbCB8fCBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG51bGwpIHtcbiAgICAgIG1hcHBlZFNwYW5zLnB1c2goe1xuICAgICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldCwgZW5kKSxcbiAgICAgICAgbWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsXG4gICAgICAgIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbjogXCJ1bm1hcHBlZCBTb3VyY2UgTWFwIHNlZ21lbnRcIiwgcmVsYXRlZE9yaWdpbnM6IFtdfVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNCeU1hcE5hbWUuZ2V0KG1hcHBpbmcuc291cmNlKVxuXG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBSYW5nZUVycm9yKGBTb3VyY2UgTWFwIHJlZmVyZW5jZXMgdW5yZWdpc3RlcmVkIHNvdXJjZSAnJHttYXBwaW5nLnNvdXJjZX0nLmApXG4gICAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBTb3VyY2UgY29udGVudCBpcyByZXF1aXJlZCB0byBpbXBvcnQgbWFwcGVkIHBvc2l0aW9ucyBmb3IgJyR7c291cmNlLmZpbGVuYW1lfScuYClcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE9mZnNldCA9IGluZGV4ZWRPZmZzZXRBdChcbiAgICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pn0gKi8gKHNvdXJjZUNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSxcbiAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiArIDFcbiAgICApXG4gICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBNYXRoLm1pbihzb3VyY2UuY29udGVudC5sZW5ndGgsIG9yaWdpbmFsT2Zmc2V0ICsgMSlcbiAgICBjb25zdCBvcmlnaW5hbExvY2F0aW9uID0gbG9jYXRpb25Gcm9tT2Zmc2V0cyhzb3VyY2UuZmlsZW5hbWUsIHNvdXJjZS5jb250ZW50LCBvcmlnaW5hbE9mZnNldCwgb3JpZ2luYWxFbmQpXG5cbiAgICBtYXBwZWRTcGFucy5wdXNoKGRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgIGdlbmVyYXRlZDogbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgY29udGVudCwgZ2VuZXJhdGVkT2Zmc2V0LCBlbmQpLFxuICAgICAgbWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsXG4gICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPz8gdW5kZWZpbmVkLFxuICAgICAgb3JpZ2luOiB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb246IG9yaWdpbmFsTG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9XG4gICAgfSkpXG4gIH0pXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgY29uc3Qgc3BhbnMgPSBbXVxuICBsZXQgY3Vyc29yID0gMFxuXG4gIGZvciAoY29uc3Qgc3BhbiBvZiBtYXBwZWRTcGFucykge1xuICAgIGlmIChzcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgPiBjdXJzb3IpIHNwYW5zLnB1c2godW5tYXBwZWRTcGFuKGN1cnNvciwgc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KSlcbiAgICBpZiAoc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldCA+IGN1cnNvcikge1xuICAgICAgc3BhbnMucHVzaChzcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgPCBjdXJzb3IgPyB7XG4gICAgICAgIC4uLnNwYW4sXG4gICAgICAgIGdlbmVyYXRlZDogbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgY29udGVudCwgY3Vyc29yLCBzcGFuLmdlbmVyYXRlZC5lbmQub2Zmc2V0KVxuICAgICAgfSA6IHNwYW4pXG4gICAgICBjdXJzb3IgPSBzcGFuLmdlbmVyYXRlZC5lbmQub2Zmc2V0XG4gICAgfVxuICB9XG4gIGlmIChjdXJzb3IgPCBjb250ZW50Lmxlbmd0aCkgc3BhbnMucHVzaCh1bm1hcHBlZFNwYW4oY3Vyc29yLCBjb250ZW50Lmxlbmd0aCkpXG5cbiAgcmV0dXJuIGZpbmFsaXplTWFwcGluZyh7XG4gICAgY29vcmRpbmF0ZVN5c3RlbTogXCJ1dGYxNlwiLFxuICAgIGdlbmVyYXRlZDoge2NvbnRlbnQsIGZpbGVuYW1lLCBsYW5ndWFnZX0sXG4gICAgbm9kZXM6IFtdLFxuICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZE1hcHBpbmdcIixcbiAgICBzb3VyY2VzLFxuICAgIHNwYW5zLFxuICAgIHN5bWJvbHM6IFtdLFxuICAgIHZlcnNpb246IDFcbiAgfSlcblxuICAvKipcbiAgICogQ3JlYXRlcyBvbmUgZXhwbGljaXQgdW5tYXBwZWQgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIEdlbmVyYXRlZCBzdGFydCBvZmZzZXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgLSBHZW5lcmF0ZWQgZW5kIG9mZnNldC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gU3ludGhldGljIHNwYW4uXG4gICAqL1xuICBmdW5jdGlvbiB1bm1hcHBlZFNwYW4oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIHN0YXJ0LCBlbmQpLFxuICAgICAgbWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsXG4gICAgICBvcmlnaW46IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwidW5tYXBwZWQgU291cmNlIE1hcCByYW5nZVwiLCByZWxhdGVkT3JpZ2luczogW119XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVtYXBzIGEgZ2VuZXJhdGVkIGxvY2F0aW9uIHdoaWxlIHJldGFpbmluZyB0aGUgZ2VuZXJhdGVkIHJhbmdlIGluIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gR2VuZXJhdGVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBvcmlnaW5hbFBvc2l0aW9uRm9yPn0gUmVtYXBwZWQgbG9va3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBMb2NhdGlvbihsb2NhdGlvbiwgbWFwcGluZykge1xuICBpZiAobG9jYXRpb24uZmlsZW5hbWUgIT0gbWFwcGluZy5nZW5lcmF0ZWQuZmlsZW5hbWUpIHRocm93IG5ldyBSYW5nZUVycm9yKGBMb2NhdGlvbiBpcyBub3QgaW4gJHttYXBwaW5nLmdlbmVyYXRlZC5maWxlbmFtZX0uYClcblxuICByZXR1cm4gb3JpZ2luYWxQb3NpdGlvbkZvcihtYXBwaW5nLCB7b2Zmc2V0OiBsb2NhdGlvbi5zdGFydC5vZmZzZXR9KVxufVxuXG4vKipcbiAqIFJlbWFwcyBhIFNlbWFudGlmb2xkIGRpYWdub3N0aWMgYW5kIHByZXNlcnZlcyBpdHMgZ2VuZXJhdGVkIGxvY2F0aW9uIGFuZCBjYXVzZS5cbiAqIEBwYXJhbSB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBkaWFnbm9zdGljIC0gR2VuZXJhdGVkLXByb2dyYW0gZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBSZW1hcHBlZCBkaWFnbm9zdGljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBEaWFnbm9zdGljKGRpYWdub3N0aWMsIG1hcHBpbmcpIHtcbiAgaWYgKCFkaWFnbm9zdGljLmxvY2F0aW9uKSByZXR1cm4gZGlhZ25vc3RpY1xuXG4gIGNvbnN0IHJlbWFwcGVkID0gcmVtYXBMb2NhdGlvbihkaWFnbm9zdGljLmxvY2F0aW9uLCBtYXBwaW5nKVxuXG4gIGlmICghcmVtYXBwZWQubG9jYXRpb24pIHJldHVybiBkaWFnbm9zdGljXG5cbiAgcmV0dXJuIG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlOiBkaWFnbm9zdGljLFxuICAgIGNvZGU6IGRpYWdub3N0aWMuY29kZSxcbiAgICBnZW5lcmF0ZWRMb2NhdGlvbjogZGlhZ25vc3RpYy5sb2NhdGlvbixcbiAgICBsYW5ndWFnZTogZGlhZ25vc3RpYy5sYW5ndWFnZSxcbiAgICBsb2NhdGlvbjogcmVtYXBwZWQubG9jYXRpb24sXG4gICAgbWVzc2FnZTogZGlhZ25vc3RpYy5kZXRhaWxcbiAgfSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHB1YmxpYyBtYXBwaW5nIGVudmVsb3BlIGFuZCBvcmRlcmVkIGhhbGYtb3BlbiBnZW5lcmF0ZWQgcmFuZ2VzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBtYXBwaW5nLlxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IE5vdGhpbmcgd2hlbiB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFwcGluZyh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IFJlZmxlY3QuZ2V0KHZhbHVlLCBcInNjaGVtYVwiKSAhPSBcIlNlbWFudGlmb2xkTWFwcGluZ1wiIHx8XG4gICAgUmVmbGVjdC5nZXQodmFsdWUsIFwidmVyc2lvblwiKSAhPSAxIHx8IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImNvb3JkaW5hdGVTeXN0ZW1cIikgIT0gXCJ1dGYxNlwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGEgU2VtYW50aWZvbGRNYXBwaW5nIHYxIHZhbHVlLlwiKVxuICB9XG5cbiAgY29uc3QgbWFwcGluZyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcbiAgY29uc3QgZ2VuZXJhdGVkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKG1hcHBpbmcuZ2VuZXJhdGVkKVxuICBjb25zdCBzcGFucyA9IG1hcHBpbmcuc3BhbnNcblxuICBpZiAoIWdlbmVyYXRlZCB8fCB0eXBlb2YgZ2VuZXJhdGVkICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIFJlZmxlY3QuZ2V0KGdlbmVyYXRlZCwgXCJmaWxlbmFtZVwiKSAhPSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIFJlZmxlY3QuZ2V0KGdlbmVyYXRlZCwgXCJjb250ZW50XCIpICE9IFwic3RyaW5nXCIgfHwgIWlzR2VuZXJhdGVkTGFuZ3VhZ2UoUmVmbGVjdC5nZXQoZ2VuZXJhdGVkLCBcImxhbmd1YWdlXCIpKSB8fFxuICAgICFBcnJheS5pc0FycmF5KG1hcHBpbmcuc291cmNlcykgfHxcbiAgICAhQXJyYXkuaXNBcnJheShtYXBwaW5nLm5vZGVzKSB8fCAhQXJyYXkuaXNBcnJheShtYXBwaW5nLnN5bWJvbHMpIHx8ICFBcnJheS5pc0FycmF5KHNwYW5zKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgU2VtYW50aWZvbGRNYXBwaW5nIHYxIGVudmVsb3BlLlwiKVxuICB9XG5cbiAgY29uc3QgY29udGVudCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZ2VuZXJhdGVkLmNvbnRlbnQpXG4gIGNvbnN0IGZpbGVuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChnZW5lcmF0ZWQuZmlsZW5hbWUpXG5cbiAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZW1hbnRpZm9sZE1hcHBpbmcgZ2VuZXJhdGVkIGNvbnRlbnQgbXVzdCB1c2UgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gIGNvbnN0IHNvdXJjZUlkcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIG1hcHBpbmcuc291cmNlcykge1xuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygc291cmNlLmlkICE9IFwic3RyaW5nXCIgfHwgc291cmNlLmlkLmxlbmd0aCA9PSAwIHx8IHNvdXJjZUlkcy5oYXMoc291cmNlLmlkKSB8fFxuICAgICAgdHlwZW9mIHNvdXJjZS5maWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8IHNvdXJjZS5maWxlbmFtZS5sZW5ndGggPT0gMCB8fCBzb3VyY2UuY29udGVudCAhPT0gbnVsbCAmJiB0eXBlb2Ygc291cmNlLmNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgc291cmNlLmxhbmd1YWdlICE9PSBudWxsICYmICFpc1NlbWFudGljTGFuZ3VhZ2Uoc291cmNlLmxhbmd1YWdlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hbGZvcm1lZCBvciBkdXBsaWNhdGUgU2VtYW50aWZvbGRNYXBwaW5nIHNvdXJjZS5cIilcbiAgICB9XG4gICAgc291cmNlSWRzLmFkZChzb3VyY2UuaWQpXG4gIH1cbiAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBuZXcgTWFwKG1hcHBpbmcuc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLmNvbnRlbnQgIT0gbnVsbClcbiAgICAubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIGNyZWF0ZUNvb3JkaW5hdGVJbmRleCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHNvdXJjZS5jb250ZW50KSldKSlcbiAgY29uc3Qgc291cmNlc0J5SWQgPSBuZXcgTWFwKG1hcHBpbmcuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgc291cmNlXSkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW10+fSAqL1xuICBjb25zdCBzb3VyY2VzQnlGaWxlbmFtZSA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIG1hcHBpbmcuc291cmNlcykge1xuICAgIGNvbnN0IHNhbWVOYW1lID0gc291cmNlc0J5RmlsZW5hbWUuZ2V0KHNvdXJjZS5maWxlbmFtZSkgPz8gW11cblxuICAgIHNhbWVOYW1lLnB1c2goc291cmNlKVxuICAgIHNvdXJjZXNCeUZpbGVuYW1lLnNldChzb3VyY2UuZmlsZW5hbWUsIHNhbWVOYW1lKVxuICB9XG4gIGNvbnN0IGdlbmVyYXRlZENvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KGNvbnRlbnQpXG5cbiAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQoKVxuICBjb25zdCBub2RlUGF0aHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFwcGluZy5ub2Rlcykge1xuICAgIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPSBcIm9iamVjdFwiIHx8IHR5cGVvZiBub2RlLmlkICE9IFwic3RyaW5nXCIgfHwgbm9kZS5pZC5sZW5ndGggPT0gMCB8fCBub2RlSWRzLmhhcyhub2RlLmlkKSB8fFxuICAgICAgdHlwZW9mIG5vZGUucGF0aCAhPSBcInN0cmluZ1wiIHx8IG5vZGVQYXRocy5oYXMobm9kZS5wYXRoKSB8fFxuICAgICAgdHlwZW9mIG5vZGUua2luZCAhPSBcInN0cmluZ1wiIHx8IG5vZGUua2luZC5sZW5ndGggPT0gMCB8fCAhbm9kZS5vcmlnaW4gfHwgdHlwZW9mIG5vZGUucmFuZ2VzICE9IFwib2JqZWN0XCIgfHxcbiAgICAgIG5vZGUucmFuZ2VzID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkobm9kZS5yYW5nZXMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlwiKVxuICAgIG5vZGVJZHMuYWRkKG5vZGUuaWQpXG4gICAgbm9kZVBhdGhzLmFkZChub2RlLnBhdGgpXG4gIH1cblxuICBjb25zdCBzeW1ib2xJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN5bWJvbCBvZiBtYXBwaW5nLnN5bWJvbHMpIHtcbiAgICBpZiAoIXN5bWJvbCB8fCB0eXBlb2Ygc3ltYm9sICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIHN5bWJvbC5pZCAhPSBcInN0cmluZ1wiIHx8IHN5bWJvbC5pZC5sZW5ndGggPT0gMCB8fCBzeW1ib2xJZHMuaGFzKHN5bWJvbC5pZCkgfHxcbiAgICAgIHR5cGVvZiBzeW1ib2wubmFtZSAhPSBcInN0cmluZ1wiIHx8IHN5bWJvbC5uYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgICAhW1wiY2FwYWJpbGl0eVwiLCBcInJlc291cmNlXCIsIFwiZmFpbHVyZVwiLCBcIm9wZXJhdGlvblwiLCBcInJlY29yZFwiLCBcImNsYXNzXCIsIFwiZXJyb3JcIiwgXCJmaWVsZFwiLCBcImNvbnN0cnVjdG9yXCIsIFwibWV0aG9kXCIsIFwiZnVuY3Rpb25cIiwgXCJ0eXBlUGFyYW1ldGVyXCIsIFwicGFyYW1ldGVyXCIsIFwibG9jYWxcIiwgXCJpdGVyYXRpb25cIiwgXCJjYXRjaFwiXS5pbmNsdWRlcyhzeW1ib2wua2luZCkgfHxcbiAgICAgICFub2RlSWRzLmhhcyhzeW1ib2wuZGVjbGFyYXRpb25Ob2RlSWQpIHx8ICFBcnJheS5pc0FycmF5KHN5bWJvbC5yZWZlcmVuY2VzKSB8fFxuICAgICAgc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICEoXG4gICAgICAgIHN5bWJvbC5raW5kID09IFwiZnVuY3Rpb25cIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/ZnVuY3Rpb246WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJyZWNvcmRcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/cmVjb3JkOlswLTldKyQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpIHx8XG4gICAgICAgIHN5bWJvbC5raW5kID09IFwiY2xhc3NcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJlcnJvclwiICYmIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9lcnJvcjpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcImZpZWxkXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpPyg/OnJlY29yZHxjbGFzcyk6WzAtOV0rOmZpZWxkOlswLTldKyQvdS50ZXN0KHN5bWJvbC5zZW1hbnRpY0RlY2xhcmF0aW9uSWQpIHx8XG4gICAgICAgIHN5bWJvbC5raW5kID09IFwiY29uc3RydWN0b3JcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rOmNvbnN0cnVjdG9yJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJtZXRob2RcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rOm1ldGhvZDpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcInR5cGVQYXJhbWV0ZXJcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/KD86ZnVuY3Rpb258cmVjb3JkKTpbMC05XSs6dHlwZTpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcImNhcGFiaWxpdHlcIiAmJiAvXig/Om1vZHVsZTpbMC05XStcXC8pP2NhcGFiaWxpdHk6WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZCkgfHxcbiAgICAgICAgc3ltYm9sLmtpbmQgPT0gXCJyZXNvdXJjZVwiICYmIC9eKD86bW9kdWxlOlswLTldK1xcLyk/Y2FwYWJpbGl0eTpbMC05XStcXC9yZXNvdXJjZTpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcImZhaWx1cmVcIiAmJiAvXig/Om1vZHVsZTpbMC05XStcXC8pP2NhcGFiaWxpdHk6WzAtOV0rXFwvZmFpbHVyZTpbMC05XSskL3UudGVzdChzeW1ib2wuc2VtYW50aWNEZWNsYXJhdGlvbklkKSB8fFxuICAgICAgICBzeW1ib2wua2luZCA9PSBcIm9wZXJhdGlvblwiICYmIC9eKD86bW9kdWxlOlswLTldK1xcLyk/Y2FwYWJpbGl0eTpbMC05XStcXC9vcGVyYXRpb246WzAtOV0rJC91LnRlc3Qoc3ltYm9sLnNlbWFudGljRGVjbGFyYXRpb25JZClcbiAgICAgICkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXCIpXG4gICAgfVxuICAgIHN5bWJvbElkcy5hZGQoc3ltYm9sLmlkKVxuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG1hcHBpbmcubm9kZXMpIHtcbiAgICB2YWxpZGF0ZU9yaWdpbihub2RlLm9yaWdpbiwgc291cmNlc0J5SWQsIHNvdXJjZUNvb3JkaW5hdGVzLCBub2RlSWRzLCBzeW1ib2xJZHMpXG4gICAgZm9yIChjb25zdCBbcm9sZSwgbG9jYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUucmFuZ2VzKSkge1xuICAgICAgaWYgKHJvbGUubGVuZ3RoID09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZW1hbnRpYyBub2RlIHJhbmdlIHJvbGVzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3MuXCIpXG4gICAgICB2YWxpZGF0ZUxvY2F0aW9uRm9yU291cmNlcyhsb2NhdGlvbiwgc291cmNlc0J5RmlsZW5hbWUsIHNvdXJjZUNvb3JkaW5hdGVzKVxuICAgIH1cbiAgICBpZiAobm9kZS5zeW1ib2xJZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygbm9kZS5zeW1ib2xJZCAhPSBcInN0cmluZ1wiIHx8ICFzeW1ib2xJZHMuaGFzKG5vZGUuc3ltYm9sSWQpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGljIG5vZGUgcmVmZXJlbmNlcyBhbiB1bmtub3duIHN5bWJvbC5cIilcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHN5bWJvbCBvZiBtYXBwaW5nLnN5bWJvbHMpIHtcbiAgICB2YWxpZGF0ZUxvY2F0aW9uRm9yU291cmNlcyhzeW1ib2wubG9jYXRpb24sIHNvdXJjZXNCeUZpbGVuYW1lLCBzb3VyY2VDb29yZGluYXRlcylcbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiBzeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgaWYgKCFyZWZlcmVuY2UgfHwgdHlwZW9mIHJlZmVyZW5jZSAhPSBcIm9iamVjdFwiIHx8ICFub2RlSWRzLmhhcyhyZWZlcmVuY2Uubm9kZUlkKSB8fFxuICAgICAgICAhW1wiZGVjbGFyYXRpb25cIiwgXCJ0eXBlXCIsIFwiY29uc3RydWN0XCIsIFwibWVtYmVyXCIsIFwicmVhZFwiLCBcIndyaXRlXCIsIFwiY2FsbFwiXS5pbmNsdWRlcyhyZWZlcmVuY2Uucm9sZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hbGZvcm1lZCBzZW1hbnRpYyBzeW1ib2wgcmVmZXJlbmNlLlwiKVxuICAgICAgfVxuICAgICAgdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZXMocmVmZXJlbmNlLmxvY2F0aW9uLCBzb3VyY2VzQnlGaWxlbmFtZSwgc291cmNlQ29vcmRpbmF0ZXMpXG4gICAgfVxuICB9XG5cbiAgbGV0IHByZXZpb3VzRW5kID0gMFxuXG4gIGZvciAoY29uc3Qgc3BhbiBvZiBzcGFucykge1xuICAgIGlmICghc3BhbiB8fCB0eXBlb2Ygc3BhbiAhPSBcIm9iamVjdFwiIHx8ICFbXCJleGFjdFwiLCBcImFuY2hvclwiLCBcInN5bnRoZXRpY1wiXS5pbmNsdWRlcyhSZWZsZWN0LmdldChzcGFuLCBcIm1hcHBpbmdLaW5kXCIpKSB8fFxuICAgICAgIVJlZmxlY3QuZ2V0KHNwYW4sIFwiZ2VuZXJhdGVkXCIpIHx8ICFSZWZsZWN0LmdldChzcGFuLCBcIm9yaWdpblwiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hbGZvcm1lZCBTZW1hbnRpZm9sZE1hcHBpbmcgc3Bhbi5cIilcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKFJlZmxlY3QuZ2V0KHNwYW4sIFwiZ2VuZXJhdGVkXCIpKVxuXG4gICAgaWYgKCFsb2NhdGlvbi5zdGFydCB8fCAhbG9jYXRpb24uZW5kIHx8IGxvY2F0aW9uLmZpbGVuYW1lICE9IGZpbGVuYW1lIHx8IGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCAhPSBwcmV2aW91c0VuZCB8fFxuICAgICAgbG9jYXRpb24uZW5kLm9mZnNldCA8PSBsb2NhdGlvbi5zdGFydC5vZmZzZXQgfHwgbG9jYXRpb24uZW5kLm9mZnNldCA+IGNvbnRlbnQubGVuZ3RoIHx8XG4gICAgICAhc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpLCBsb2NhdGlvbi5zdGFydCkgfHxcbiAgICAgICFzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoZ2VuZXJhdGVkQ29vcmRpbmF0ZXMsIGxvY2F0aW9uLmVuZC5vZmZzZXQpLCBsb2NhdGlvbi5lbmQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWZvbGRNYXBwaW5nIHNwYW5zIG11c3QgZXhhY3RseSBjb3ZlciBvcmRlcmVkIG5vcm1hbGl6ZWQgZ2VuZXJhdGVkIHJhbmdlcy5cIilcbiAgICB9XG4gICAgdmFsaWRhdGVPcmlnaW4oXG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59ICovIChSZWZsZWN0LmdldChzcGFuLCBcIm9yaWdpblwiKSksXG4gICAgICBzb3VyY2VzQnlJZCxcbiAgICAgIHNvdXJjZUNvb3JkaW5hdGVzLFxuICAgICAgbm9kZUlkcyxcbiAgICAgIHN5bWJvbElkc1xuICAgIClcbiAgICBjb25zdCBub2RlSWQgPSBSZWZsZWN0LmdldChzcGFuLCBcIm5vZGVJZFwiKVxuICAgIGNvbnN0IHN5bWJvbElkID0gUmVmbGVjdC5nZXQoc3BhbiwgXCJzeW1ib2xJZFwiKVxuXG4gICAgaWYgKG5vZGVJZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygbm9kZUlkICE9IFwic3RyaW5nXCIgfHwgIW5vZGVJZHMuaGFzKG5vZGVJZCkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFwcGluZyBzcGFuIHJlZmVyZW5jZXMgYW4gdW5rbm93biBub2RlLlwiKVxuICAgIGlmIChzeW1ib2xJZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygc3ltYm9sSWQgIT0gXCJzdHJpbmdcIiB8fCAhc3ltYm9sSWRzLmhhcyhzeW1ib2xJZCkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFwcGluZyBzcGFuIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzeW1ib2wuXCIpXG4gICAgaWYgKFJlZmxlY3QuZ2V0KHNwYW4sIFwicm9sZVwiKSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBSZWZsZWN0LmdldChzcGFuLCBcInJvbGVcIikgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgUmVmbGVjdC5nZXQoc3BhbiwgXCJuYW1lXCIpICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHNwYW4sIFwibmFtZVwiKSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFwcGluZyBzcGFuIHJvbGVzIGFuZCBuYW1lcyBtdXN0IGJlIHN0cmluZ3MuXCIpXG4gICAgfVxuICAgIHByZXZpb3VzRW5kID0gbG9jYXRpb24uZW5kLm9mZnNldFxuICB9XG5cbiAgaWYgKHByZXZpb3VzRW5kICE9IGNvbnRlbnQubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWZvbGRNYXBwaW5nIHNwYW5zIG11c3QgY292ZXIgYWxsIGdlbmVyYXRlZCBjb250ZW50LlwiKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcywgZnJlZXplcywgYW5kIGluZGV4ZXMgb25lIG1hcHBpbmcgcHJvZHVjZWQgYXQgYSB0cnVzdCBib3VuZGFyeS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbWFwcGluZy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gSW1tdXRhYmxlIGluZGV4ZWQgbWFwcGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplTWFwcGluZyh2YWx1ZSkge1xuICAvLyBQcm9kdWNlcnMgbWF5IHJldGFpbiByZWZlcmVuY2VzIHRvIG11dGFibGUgc2VtYW50aWMgbG9jYXRpb25zOyBtYXBwaW5ncyBvd24gdGhlaXIgaW1tdXRhYmxlIGNvcHkuXG4gIGNvbnN0IG1hcHBpbmcgPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpXG5cbiAgdmFsaWRhdGVNYXBwaW5nKG1hcHBpbmcpXG4gIGZyZWV6ZUpzb24obWFwcGluZylcbiAgbWFwcGluZ0luZGV4ZXMuc2V0KG1hcHBpbmcsIGJ1aWxkTWFwcGluZ0luZGV4KG1hcHBpbmcpKVxuXG4gIHJldHVybiBtYXBwaW5nXG59XG5cbi8qKlxuICogR2V0cyBhbiBpbmRleCwgdmFsaWRhdGluZyBtdXRhYmxlIGNhbGxlciBtYXBwaW5ncyBvbiBldmVyeSB0cnVzdC1ib3VuZGFyeSB1c2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gTWFwcGluZy5cbiAqIEByZXR1cm5zIHtNYXBwaW5nSW5kZXh9IExvb2t1cCBpbmRleC5cbiAqL1xuZnVuY3Rpb24gbWFwcGluZ0luZGV4KG1hcHBpbmcpIHtcbiAgY29uc3QgY2FjaGVkID0gbWFwcGluZ0luZGV4ZXMuZ2V0KG1hcHBpbmcpXG5cbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZFxuXG4gIHZhbGlkYXRlTWFwcGluZyhtYXBwaW5nKVxuXG4gIHJldHVybiBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBnZW5lcmF0ZWQsIG9yaWdpbmFsLCBub2RlLCBhbmQgc3ltYm9sIGluZGV4ZXMgaW4gb25lIHBhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gVmFsaWRhdGVkIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRlZENvb3JkaW5hdGVzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+LCBub2RlU3BhbnM6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPiwgb3JpZ2luYWxCeVNvdXJjZTogTWFwPHN0cmluZywge2VuZDogbnVtYmVyLCBwcmVmaXhFbmQ6IG51bWJlciwgc3BhbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBzdGFydDogbnVtYmVyfVtdPiwgb3JpZ2luYWxQb2ludHNCeVNvdXJjZTogTWFwPHN0cmluZywgTWFwPG51bWJlciwgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW10+Piwgc291cmNlQ29vcmRpbmF0ZXM6IE1hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+LCBzb3VyY2VzQnlJZDogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPiwgc3ltYm9sU3BhbnM6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPn19IE1hcHBpbmcgaW5kZXguXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTWFwcGluZ0luZGV4KG1hcHBpbmcpIHtcbiAgY29uc3QgZ2VuZXJhdGVkQ29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgobWFwcGluZy5nZW5lcmF0ZWQuY29udGVudClcbiAgY29uc3Qgc291cmNlc0J5SWQgPSBuZXcgTWFwKG1hcHBpbmcuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgc291cmNlXSkpXG4gIGNvbnN0IHNvdXJjZUNvb3JkaW5hdGVzID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG4gICAgLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXSkpXG4gIGNvbnN0IG5vZGVTcGFucyA9IG5ldyBNYXAobWFwcGluZy5ub2Rlcy5tYXAoKG5vZGUpID0+IFtub2RlLmlkLCAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSAqLyAoW10pXSkpXG4gIGNvbnN0IHN5bWJvbFNwYW5zID0gbmV3IE1hcChtYXBwaW5nLnN5bWJvbHMubWFwKChzeW1ib2wpID0+IFtzeW1ib2wuaWQsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovIChbXSldKSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7ZW5kOiBudW1iZXIsIHByZWZpeEVuZDogbnVtYmVyLCBzcGFuOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW4sIHN0YXJ0OiBudW1iZXJ9W10+fSAqL1xuICBjb25zdCBvcmlnaW5hbEJ5U291cmNlID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIFtdXSkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPG51bWJlciwgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW10+Pn0gKi9cbiAgY29uc3Qgb3JpZ2luYWxQb2ludHNCeVNvdXJjZSA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBuZXcgTWFwKCldKSlcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgbWFwcGluZy5zcGFucykge1xuICAgIGNvbnN0IHNwYW5Ob2RlSWRzID0gbmV3IFNldChzcGFuLm5vZGVJZCA/IFtzcGFuLm5vZGVJZF0gOiBbXSlcbiAgICBjb25zdCBzcGFuU3ltYm9sSWRzID0gbmV3IFNldChzcGFuLnN5bWJvbElkID8gW3NwYW4uc3ltYm9sSWRdIDogW10pXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4oc3Bhbi5vcmlnaW4pKSB7XG4gICAgICBpZiAocmVsYXRlZC5ub2RlSWQpIHNwYW5Ob2RlSWRzLmFkZChyZWxhdGVkLm5vZGVJZClcbiAgICAgIGlmIChyZWxhdGVkLnN5bWJvbElkKSBzcGFuU3ltYm9sSWRzLmFkZChyZWxhdGVkLnN5bWJvbElkKVxuICAgICAgaWYgKHJlbGF0ZWQubG9jYXRpb24uZW5kLm9mZnNldCA9PSByZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBvcmlnaW5hbFBvaW50c0J5U291cmNlLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuICAgICAgICBjb25zdCBwb2ludFNwYW5zID0gcG9pbnRzPy5nZXQocmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQpID8/IFtdXG5cbiAgICAgICAgcG9pbnRTcGFucy5wdXNoKHNwYW4pXG4gICAgICAgIHBvaW50cz8uc2V0KHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0LCBwb2ludFNwYW5zKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgb3JpZ2luYWxCeVNvdXJjZS5nZXQocmVsYXRlZC5zb3VyY2VJZCk/LnB1c2goe1xuICAgICAgICBlbmQ6IHJlbGF0ZWQubG9jYXRpb24uZW5kLm9mZnNldCxcbiAgICAgICAgcHJlZml4RW5kOiByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgIHNwYW4sXG4gICAgICAgIHN0YXJ0OiByZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldFxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBub2RlSWQgb2Ygc3Bhbk5vZGVJZHMpIG5vZGVTcGFucy5nZXQobm9kZUlkKT8ucHVzaChzcGFuKVxuICAgIGZvciAoY29uc3Qgc3ltYm9sSWQgb2Ygc3BhblN5bWJvbElkcykgc3ltYm9sU3BhbnMuZ2V0KHN5bWJvbElkKT8ucHVzaChzcGFuKVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyaWVzIG9mIG9yaWdpbmFsQnlTb3VyY2UudmFsdWVzKCkpIHtcbiAgICBlbnRyaWVzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnN0YXJ0IC0gcmlnaHQuc3RhcnQgfHwgbGVmdC5zcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgLSByaWdodC5zcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQpXG4gICAgbGV0IHByZWZpeEVuZCA9IDBcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgcHJlZml4RW5kID0gTWF0aC5tYXgocHJlZml4RW5kLCBlbnRyeS5lbmQpXG4gICAgICBlbnRyeS5wcmVmaXhFbmQgPSBwcmVmaXhFbmRcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2dlbmVyYXRlZENvb3JkaW5hdGVzLCBub2RlU3BhbnMsIG9yaWdpbmFsQnlTb3VyY2UsIG9yaWdpbmFsUG9pbnRzQnlTb3VyY2UsIHNvdXJjZUNvb3JkaW5hdGVzLCBzb3VyY2VzQnlJZCwgc3ltYm9sU3BhbnN9XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGdlbmVyYXRlZCBzcGFuIGNvbnRhaW5pbmcgYW4gb2Zmc2V0IGJ5IGJpbmFyeSBzZWFyY2guXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgc3BhbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gR2VuZXJhdGVkIG9mZnNldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW4gfCB1bmRlZmluZWR9IENvbnRhaW5pbmcgc3Bhbi5cbiAqL1xuZnVuY3Rpb24gc3BhbkZvckdlbmVyYXRlZChzcGFucywgb2Zmc2V0KSB7XG4gIGxldCBsb3cgPSAwXG4gIGxldCBoaWdoID0gc3BhbnMubGVuZ3RoXG5cbiAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG5cbiAgICBpZiAoc3BhbnNbbWlkZGxlXS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDw9IG9mZnNldCkgbG93ID0gbWlkZGxlICsgMVxuICAgIGVsc2UgaGlnaCA9IG1pZGRsZVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHNwYW5zW2xvdyAtIDFdXG5cbiAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBvZmZzZXQgPCBjYW5kaWRhdGUuZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBGaW5kcyBvcmRlcmVkIGdlbmVyYXRlZCBzcGFucyBpbnRlcnNlY3RpbmcgYSBoYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgc3BhbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBJbmNsdXNpdmUgZ2VuZXJhdGVkIG9mZnNldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgLSBFeGNsdXNpdmUgZ2VuZXJhdGVkIG9mZnNldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gT3ZlcmxhcHBpbmcgc3BhbnMuXG4gKi9cbmZ1bmN0aW9uIHNwYW5zT3ZlcmxhcHBpbmdHZW5lcmF0ZWQoc3BhbnMsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIGNvbnN0IGNvbnRhaW5pbmcgPSBzcGFuRm9yR2VuZXJhdGVkKHNwYW5zLCBzdGFydClcblxuICAgIHJldHVybiBjb250YWluaW5nID8gW2NvbnRhaW5pbmddIDogW11cbiAgfVxuXG4gIGxldCBsb3cgPSAwXG4gIGxldCBoaWdoID0gc3BhbnMubGVuZ3RoXG5cbiAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG5cbiAgICBpZiAoc3BhbnNbbWlkZGxlXS5nZW5lcmF0ZWQuZW5kLm9mZnNldCA8PSBzdGFydCkgbG93ID0gbWlkZGxlICsgMVxuICAgIGVsc2UgaGlnaCA9IG1pZGRsZVxuICB9XG4gIGNvbnN0IG92ZXJsYXBwaW5nID0gW11cblxuICBmb3IgKGxldCBpbmRleCA9IGxvdzsgaW5kZXggPCBzcGFucy5sZW5ndGggJiYgc3BhbnNbaW5kZXhdLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgPCBlbmQ7IGluZGV4KyspIHtcbiAgICBvdmVybGFwcGluZy5wdXNoKHNwYW5zW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBvdmVybGFwcGluZ1xufVxuXG4vKipcbiAqIERlZXAtZnJlZXplcyBhIEpTT04gdHJlZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBKU09OIHZhbHVlLlxuICogQHBhcmFtIHtXZWFrU2V0PG9iamVjdD59IFt2aXNpdGVkXSAtIEN5Y2xlIHByb3RlY3Rpb24gZm9yIHJlamVjdGVkIGNhbGxlciBleHRyYXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZnJlZXplSnNvbih2YWx1ZSwgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCkpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCB2aXNpdGVkLmhhcyh2YWx1ZSkpIHJldHVyblxuXG4gIHZpc2l0ZWQuYWRkKHZhbHVlKVxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBmcmVlemVKc29uKGNoaWxkLCB2aXNpdGVkKVxuICBpZiAoIU9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBjbG9zZWQgbWFwcGluZyBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIE9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gc291cmNlc0J5SWQgLSBTb3VyY2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+Pn0gY29vcmRpbmF0ZXMgLSBTb3VyY2UgY29vcmRpbmF0ZSBpbmRleGVzLlxuICogQHBhcmFtIHtTZXQ8dW5rbm93bj59IFtub2RlSWRzXSAtIEtub3duIHNlbWFudGljIG5vZGVzLlxuICogQHBhcmFtIHtTZXQ8dW5rbm93bj59IFtzeW1ib2xJZHNdIC0gS25vd24gc2VtYW50aWMgc3ltYm9scy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU9yaWdpbihvcmlnaW4sIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSB7XG4gIGlmICghb3JpZ2luIHx8IHR5cGVvZiBvcmlnaW4gIT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgb3JpZ2luIG11c3QgYmUgYSBjbG9zZWQgcHJvdmVuYW5jZSB2YWx1ZS5cIilcblxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikge1xuICAgIHZhbGlkYXRlUmVsYXRlZCh7bG9jYXRpb246IG9yaWdpbi5sb2NhdGlvbiwgc291cmNlSWQ6IG9yaWdpbi5zb3VyY2VJZH0sIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvcmlnaW4ub3JpZ2lucykgfHwgb3JpZ2luLm9yaWdpbnMubGVuZ3RoID09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIHByb3ZlbmFuY2UgcmVxdWlyZXMgb3JpZ2lucy5cIilcbiAgICBvcmlnaW4ub3JpZ2lucy5mb3JFYWNoKChyZWxhdGVkKSA9PiB2YWxpZGF0ZVJlbGF0ZWQocmVsYXRlZCwgc291cmNlc0J5SWQsIGNvb3JkaW5hdGVzLCBub2RlSWRzLCBzeW1ib2xJZHMpKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInN5bnRoZXRpY1wiKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW4ucmVhc29uICE9IFwic3RyaW5nXCIgfHwgIUFycmF5LmlzQXJyYXkob3JpZ2luLnJlbGF0ZWRPcmlnaW5zKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hbGZvcm1lZCBzeW50aGV0aWMgcHJvdmVuYW5jZS5cIilcbiAgICBvcmlnaW4ucmVsYXRlZE9yaWdpbnMuZm9yRWFjaCgocmVsYXRlZCkgPT4gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIHByb3ZlbmFuY2Uga2luZC5cIilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHNvdXJjZS1yZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSByZWxhdGVkIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHNvdXJjZXNCeUlkIC0gU291cmNlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGUgaW5kZXhlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+IHwgdW5kZWZpbmVkfSBub2RlSWRzIC0gS25vd24gc2VtYW50aWMgbm9kZXMuXG4gKiBAcGFyYW0ge1NldDx1bmtub3duPiB8IHVuZGVmaW5lZH0gc3ltYm9sSWRzIC0gS25vd24gc2VtYW50aWMgc3ltYm9scy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlbGF0ZWQocmVsYXRlZCwgc291cmNlc0J5SWQsIGNvb3JkaW5hdGVzLCBub2RlSWRzLCBzeW1ib2xJZHMpIHtcbiAgY29uc3Qgc291cmNlID0gc291cmNlc0J5SWQuZ2V0KHJlbGF0ZWQuc291cmNlSWQpXG5cbiAgaWYgKCFzb3VyY2UgfHwgIXJlbGF0ZWQubG9jYXRpb24gfHwgcmVsYXRlZC5sb2NhdGlvbi5maWxlbmFtZSAhPSBzb3VyY2UuZmlsZW5hbWUgfHxcbiAgICByZWxhdGVkLm5vZGVJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZWxhdGVkLm5vZGVJZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgcmVsYXRlZC5zeW1ib2xJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZWxhdGVkLnN5bWJvbElkICE9IFwic3RyaW5nXCIgfHxcbiAgICByZWxhdGVkLnJvbGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5yb2xlICE9IFwic3RyaW5nXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPcmlnaW4gcmVmZXJlbmNlcyBhbiB1bmtub3duIHNvdXJjZS5cIilcbiAgaWYgKG5vZGVJZHMgJiYgcmVsYXRlZC5ub2RlSWQgIT09IHVuZGVmaW5lZCAmJiAhbm9kZUlkcy5oYXMocmVsYXRlZC5ub2RlSWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBub2RlLlwiKVxuICBpZiAoc3ltYm9sSWRzICYmIHJlbGF0ZWQuc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiAhc3ltYm9sSWRzLmhhcyhyZWxhdGVkLnN5bWJvbElkKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPcmlnaW4gcmVmZXJlbmNlcyBhbiB1bmtub3duIHN5bWJvbC5cIilcbiAgfVxuICB2YWxpZGF0ZUxvY2F0aW9uRm9yU291cmNlKHJlbGF0ZWQubG9jYXRpb24sIHNvdXJjZSwgY29vcmRpbmF0ZXMuZ2V0KHNvdXJjZS5pZCkpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgbG9jYXRpb24gYWdhaW5zdCBhdCBsZWFzdCBvbmUgc2FtZS1maWxlbmFtZSBzb3VyY2UuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXT59IHNvdXJjZXNCeUZpbGVuYW1lIC0gU291cmNlcyBieSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGUgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUxvY2F0aW9uRm9yU291cmNlcyh2YWx1ZSwgc291cmNlc0J5RmlsZW5hbWUsIGNvb3JkaW5hdGVzKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG4gIGNvbnN0IGxvY2F0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSAqLyAodmFsdWUpXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBzb3VyY2VzQnlGaWxlbmFtZS5nZXQobG9jYXRpb24uZmlsZW5hbWUpID8/IFtdXG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09IDAgfHwgIWNhbmRpZGF0ZXMuc29tZSgoc291cmNlKSA9PiBsb2NhdGlvbk1hdGNoZXNTb3VyY2UobG9jYXRpb24sIHNvdXJjZSwgY29vcmRpbmF0ZXMuZ2V0KHNvdXJjZS5pZCkpKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFsZSBvcmlnaW5hbCBsb2NhdGlvbi5cIilcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGxvY2F0aW9uIGFnYWluc3QgaXRzIGlkZW50aWZpZWQgc291cmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBTb3VyY2UuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4gfCB1bmRlZmluZWR9IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGVzIHdoZW4gY29udGVudCBleGlzdHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZSh2YWx1ZSwgc291cmNlLCBjb29yZGluYXRlcykge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8ICFsb2NhdGlvbk1hdGNoZXNTb3VyY2UoXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSAqLyAodmFsdWUpLCBzb3VyY2UsIGNvb3JkaW5hdGVzXG4gICkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFsZSBvcmlnaW5hbCBsb2NhdGlvbi5cIilcbn1cblxuLyoqXG4gKiBUZXN0cyBhIGxvY2F0aW9uIGFnYWluc3Qgb25lIHNvdXJjZSBlbnRyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBMb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBTb3VyY2UuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4gfCB1bmRlZmluZWR9IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGVzIHdoZW4gY29udGVudCBleGlzdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcmFuZ2UgaXMgbm9ybWFsaXplZCBmb3IgdGhlIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gbG9jYXRpb25NYXRjaGVzU291cmNlKGxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzKSB7XG4gIGlmICghbG9jYXRpb24gfHwgbG9jYXRpb24uZmlsZW5hbWUgIT0gc291cmNlLmZpbGVuYW1lIHx8ICFsb2NhdGlvbi5zdGFydCB8fCAhbG9jYXRpb24uZW5kIHx8XG4gICAgIXZhbGlkUG9pbnQobG9jYXRpb24uc3RhcnQpIHx8ICF2YWxpZFBvaW50KGxvY2F0aW9uLmVuZCkgfHwgbG9jYXRpb24uZW5kLm9mZnNldCA8IGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGxvY2F0aW9uLmVuZC5vZmZzZXQgPD0gc291cmNlLmNvbnRlbnQubGVuZ3RoICYmIGNvb3JkaW5hdGVzICE9PSB1bmRlZmluZWQgJiZcbiAgICBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCksIGxvY2F0aW9uLnN0YXJ0KSAmJlxuICAgIHNhbWVQb2ludChpbmRleGVkUG9pbnRBdChjb29yZGluYXRlcywgbG9jYXRpb24uZW5kLm9mZnNldCksIGxvY2F0aW9uLmVuZClcbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgc3RydWN0dXJhbCB2YWxpZGl0eSBvZiBvbmUgc291cmNlIHBvaW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBwb2ludC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBXaGV0aGVyIGl0IGlzIGEgcG9pbnQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkUG9pbnQodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHBvaW50ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuXG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBvaW50Lm9mZnNldCkgJiYgTnVtYmVyLmlzSW50ZWdlcihwb2ludC5saW5lKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBvaW50LmNvbHVtbikgJiZcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi8gKHBvaW50Lm9mZnNldCkgPj0gMCAmJiAvKiogQHR5cGUge251bWJlcn0gKi8gKHBvaW50LmxpbmUpID49IDEgJiYgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5jb2x1bW4pID49IDFcbn1cblxuLyoqXG4gKiBUZXN0cyBhIHN1cHBvcnRlZCBzZW1hbnRpYyBzb3VyY2UtbGFuZ3VhZ2UgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGxhbmd1YWdlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gV2hldGhlciBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzU2VtYW50aWNMYW5ndWFnZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gXCJwaHBcIiB8fCB2YWx1ZSA9PSBcInJ1YnlcIiB8fCB2YWx1ZSA9PSBcImphdmFzY3JpcHRcIiB8fCB2YWx1ZSA9PSBcInR5cGVzY3JpcHRcIiB8fCB2YWx1ZSA9PSBcImphdmFcIiB8fFxuICAgIHZhbHVlID09IFwia290bGluXCIgfHwgdmFsdWUgPT0gXCJweXRob25cIiB8fCB2YWx1ZSA9PSBcImNzaGFycFwiIHx8IHZhbHVlID09IFwiZ29cIiB8fCB2YWx1ZSA9PSBcImNcIiB8fCB2YWx1ZSA9PSBcImNwcFwiIHx8IHZhbHVlID09IFwicnVzdFwiIHx8IHZhbHVlID09IFwic3dpZnRcIiB8fCB2YWx1ZSA9PSBcImRhcnRcIiB8fCB2YWx1ZSA9PSBcInppZ1wiXG59XG5cbi8qKlxuICogVGVzdHMgYSBzdXBwb3J0ZWQgZ2VuZXJhdGVkIHRleHQgbGFuZ3VhZ2UgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGxhbmd1YWdlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkVGV4dExhbmd1YWdlfSBXaGV0aGVyIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRMYW5ndWFnZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gXCJodG1sXCIgfHwgaXNTZW1hbnRpY0xhbmd1YWdlKHZhbHVlKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgc3RhYmxlIGxvb2t1cCByZXN1bHQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gc3BhbiAtIE1hcHBpbmcgc3Bhbi5cbiAqIEByZXR1cm5zIHt7Z2VuZXJhdGVkTG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkLCBtYXBwaW5nS2luZDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NYXBwaW5nS2luZCwgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBub2RlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcm9sZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzeW1ib2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkfX0gTG9va3VwIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gbWFwcGluZ1Jlc3VsdChzcGFuKSB7XG4gIHJldHVybiB7XG4gICAgZ2VuZXJhdGVkTG9jYXRpb246IHNwYW4uZ2VuZXJhdGVkLFxuICAgIGxvY2F0aW9uOiBwcmltYXJ5TG9jYXRpb24oc3Bhbi5vcmlnaW4pLFxuICAgIG1hcHBpbmdLaW5kOiBzcGFuLm1hcHBpbmdLaW5kLFxuICAgIG5hbWU6IHNwYW4ubmFtZSxcbiAgICBub2RlSWQ6IHNwYW4ubm9kZUlkLFxuICAgIHJvbGU6IHNwYW4ucm9sZSxcbiAgICBzeW1ib2xJZDogc3Bhbi5zeW1ib2xJZFxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW4gb2Zmc2V0LWZvcm0gb3IgbGluZS9jb2x1bW4tZm9ybSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pn0gY29vcmRpbmF0ZXMgLSBTb3VyY2UgY29vcmRpbmF0ZSBpbmRleC5cbiAqIEBwYXJhbSB7e29mZnNldDogbnVtYmVyfSB8IHtsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyfX0gcG9zaXRpb24gLSBQb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVURi0xNiBvZmZzZXQuXG4gKi9cbmZ1bmN0aW9uIHBvc2l0aW9uT2Zmc2V0KGNvb3JkaW5hdGVzLCBwb3NpdGlvbikge1xuICBpZiAoXCJvZmZzZXRcIiBpbiBwb3NpdGlvbikge1xuICAgIGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBwb3NpdGlvbi5vZmZzZXQpXG5cbiAgICByZXR1cm4gcG9zaXRpb24ub2Zmc2V0XG4gIH1cblxuICByZXR1cm4gaW5kZXhlZE9mZnNldEF0KGNvb3JkaW5hdGVzLCBwb3NpdGlvbi5saW5lLCBwb3NpdGlvbi5jb2x1bW4pXG59XG5cbi8qKlxuICogRmluZHMgdGhlIGV4Y2x1c2l2ZSBjb250ZW50IG9mZnNldCBiZWZvcmUgdGhlIG5leHQgZ2VuZXJhdGVkIGxpbmUgYnJlYWsuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIEdlbmVyYXRlZCBjb250ZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIE9mZnNldCBvbiB0aGUgY3VycmVudCBsaW5lLlxuICogQHJldHVybnMge251bWJlcn0gRW5kIG9mIHRoZSBjdXJyZW50IGxpbmUgb3IgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gbGluZUVuZE9mZnNldChjb250ZW50LCBvZmZzZXQpIHtcbiAgY29uc3QgbmV3bGluZSA9IGNvbnRlbnQuaW5kZXhPZihcIlxcblwiLCBvZmZzZXQpXG5cbiAgcmV0dXJuIG5ld2xpbmUgPT0gLTEgPyBjb250ZW50Lmxlbmd0aCA6IG5ld2xpbmVcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBjb21wbGV0ZSBub3JtYWxpemVkIHBvaW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gbGVmdCAtIExlZnQgcG9pbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlUG9pbnR9IHJpZ2h0IC0gUmlnaHQgcG9pbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBjb29yZGluYXRlcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gc2FtZVBvaW50KGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBsZWZ0Lm9mZnNldCA9PSByaWdodC5vZmZzZXQgJiYgbGVmdC5saW5lID09IHJpZ2h0LmxpbmUgJiYgbGVmdC5jb2x1bW4gPT0gcmlnaHQuY29sdW1uXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzb3VyY2UgcmVnaXN0cnkgZW50cnkgZm9yIGFuIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBNYXBwaW5nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUHJpbWFyeSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gc291cmNlc0J5SWQgLSBJbmRleGVkIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBSZWdpc3RlcmVkIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gc291cmNlRm9yT3JpZ2luKG1hcHBpbmcsIG9yaWdpbiwgbG9jYXRpb24sIHNvdXJjZXNCeUlkKSB7XG4gIGNvbnN0IHNvdXJjZUlkID0gc291cmNlSWRGb3JPcmlnaW4ob3JpZ2luKVxuICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzQnlJZC5nZXQoc291cmNlSWQgPz8gXCJcIikgPz9cbiAgICBtYXBwaW5nLnNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZmlsZW5hbWUgPT0gbG9jYXRpb24uZmlsZW5hbWUpXG5cbiAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIG1hcHBpbmcgc291cmNlIGZvciAke2xvY2F0aW9uLmZpbGVuYW1lfS5gKVxuXG4gIHJldHVybiBzb3VyY2Vcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcmVnaXN0cnkgaWRlbnRpdHkgb2YgYW4gb3JpZ2luJ3MgcHJpbWFyeSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gT3JpZ2luLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gU291cmNlIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBzb3VyY2VJZEZvck9yaWdpbihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBvcmlnaW4uc291cmNlSWRcbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4gb3JpZ2luLm9yaWdpbnNbMF0/LnNvdXJjZUlkXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1swXT8uc291cmNlSWRcbn1cblxuLyoqXG4gKiBSZXdyaXRlcyBjbG9zZWQtb3JpZ2luIHNvdXJjZSBpZGVudGl0aWVzIGFnYWluc3QgYSBjb21wb3NlZCByZWdpc3RyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gT3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBzb3VyY2VJZHMgLSBPcmlnaW5hbC10by1jb21wb3NlZCBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBSZXdyaXR0ZW4gb3JpZ2luLlxuICovXG5mdW5jdGlvbiByZW1hcE9yaWdpblNvdXJjZUlkcyhvcmlnaW4sIHNvdXJjZUlkcykge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikge1xuICAgIGNvbnN0IHNvdXJjZUlkID0gc291cmNlSWRzLmdldChvcmlnaW4uc291cmNlSWQpXG5cbiAgICBpZiAoIXNvdXJjZUlkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29tcG9zZWQgbWFwcGluZyBvbWl0dGVkIHNvdXJjZSAnJHtvcmlnaW4ubG9jYXRpb24uZmlsZW5hbWV9Jy5gKVxuXG4gICAgcmV0dXJuIHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbjogb3JpZ2luLmxvY2F0aW9uLCBzb3VyY2VJZH1cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiB7a2luZDogXCJkZXJpdmVkXCIsIG9yaWdpbnM6IG9yaWdpbi5vcmlnaW5zLm1hcCgocmVsYXRlZCkgPT4gcmVtYXBSZWxhdGVkT3JpZ2luU291cmNlSWQocmVsYXRlZCwgc291cmNlSWRzKSl9XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kOiBcInN5bnRoZXRpY1wiLFxuICAgIHJlYXNvbjogb3JpZ2luLnJlYXNvbixcbiAgICByZWxhdGVkT3JpZ2luczogb3JpZ2luLnJlbGF0ZWRPcmlnaW5zLm1hcCgocmVsYXRlZCkgPT4gcmVtYXBSZWxhdGVkT3JpZ2luU291cmNlSWQocmVsYXRlZCwgc291cmNlSWRzKSlcbiAgfVxufVxuXG4vKipcbiAqIFJld3JpdGVzIG9uZSByZWxhdGVkIHNvdXJjZSBpZGVudGl0eSB3aGlsZSBkcm9wcGluZyBpZGVudGl0aWVzIGZyb20gYSBkaXNjYXJkZWQgbm9kZSByZWdpc3RyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSByZWxhdGVkIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHNvdXJjZUlkcyAtIE9yaWdpbmFsLXRvLWNvbXBvc2VkIHNvdXJjZSBpZGVudGl0aWVzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gUmV3cml0dGVuIHJlbGF0ZWQgb3JpZ2luLlxuICovXG5mdW5jdGlvbiByZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBzb3VyY2VJZHMpIHtcbiAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VJZHMuZ2V0KHJlbGF0ZWQuc291cmNlSWQpXG5cbiAgaWYgKCFzb3VyY2VJZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbXBvc2VkIG1hcHBpbmcgb21pdHRlZCBzb3VyY2UgJyR7cmVsYXRlZC5sb2NhdGlvbi5maWxlbmFtZX0nLmApXG5cbiAgY29uc3QgdW5pZGVudGlmaWVkID0gey4uLnJlbGF0ZWR9XG5cbiAgZGVsZXRlIHVuaWRlbnRpZmllZC5ub2RlSWRcbiAgZGVsZXRlIHVuaWRlbnRpZmllZC5zeW1ib2xJZFxuXG4gIHJldHVybiB7Li4udW5pZGVudGlmaWVkLCBzb3VyY2VJZH1cbn1cblxuLyoqXG4gKiBTb3J0cyBvYmplY3Qga2V5cyByZWN1cnNpdmVseSB3aGlsZSBwcmVzZXJ2aW5nIHNlbWFudGljIGFycmF5IG9yZGVyLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIEpTT04gdmFsdWUuXG4gKiBAcmV0dXJucyB7dW5rbm93bn0gRGV0ZXJtaW5pc3RpY2FsbHkga2V5ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNvcnRKc29uKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcChzb3J0SnNvbilcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh2YWx1ZSkuc29ydCgoW2xlZnRdLCBbcmlnaHRdKSA9PiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwKVxuICAgICAgLm1hcCgoW2tleSwgY2hpbGRdKSA9PiBba2V5LCBzb3J0SnNvbihjaGlsZCldKSlcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFJlbW92ZXMgdW5kZWZpbmVkIG9wdGlvbmFsIHByb3BlcnRpZXMgZnJvbSBhIHB1YmxpYyBKU09OIHZhbHVlLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVmFsdWVcbiAqIEBwYXJhbSB7VmFsdWV9IHZhbHVlIC0gQ2FuZGlkYXRlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtWYWx1ZX0gQ29tcGFjdCBKU09OLXNhZmUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBkZWZpbmVkUHJvcGVydGllcyh2YWx1ZSkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtWYWx1ZX0gKi8gKE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh2YWx1ZSkuZmlsdGVyKChbLCBjaGlsZF0pID0+IGNoaWxkICE9PSB1bmRlZmluZWQpKSlcbn1cbiJdfQ==
|