semantifold 0.3.0 → 0.4.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.
Files changed (297) hide show
  1. package/README.md +58 -15
  2. package/build/index.d.ts +48 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +57 -8
  5. package/build/src/artifact-path.d.ts +23 -1
  6. package/build/src/artifact-path.d.ts.map +1 -1
  7. package/build/src/artifact-path.js +45 -3
  8. package/build/src/artifacts.d.ts.map +1 -1
  9. package/build/src/artifacts.js +66 -1
  10. package/build/src/backends/c-validation.d.ts.map +1 -1
  11. package/build/src/backends/c-validation.js +7 -3
  12. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  13. package/build/src/backends/cpp-validation.js +7 -3
  14. package/build/src/backends/csharp.js +7 -1
  15. package/build/src/backends/dart-runtime.d.ts +2 -0
  16. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  17. package/build/src/backends/dart-runtime.js +41 -0
  18. package/build/src/backends/dart.d.ts +20 -0
  19. package/build/src/backends/dart.d.ts.map +1 -0
  20. package/build/src/backends/dart.js +321 -0
  21. package/build/src/backends/effects.d.ts +60 -0
  22. package/build/src/backends/effects.d.ts.map +1 -0
  23. package/build/src/backends/effects.js +746 -0
  24. package/build/src/backends/go.js +18 -4
  25. package/build/src/backends/identifiers.d.ts +36 -4
  26. package/build/src/backends/identifiers.d.ts.map +1 -1
  27. package/build/src/backends/identifiers.js +154 -10
  28. package/build/src/backends/index.d.ts.map +1 -1
  29. package/build/src/backends/index.js +27 -4
  30. package/build/src/backends/ios.d.ts +68 -0
  31. package/build/src/backends/ios.d.ts.map +1 -0
  32. package/build/src/backends/ios.js +1503 -0
  33. package/build/src/backends/java.d.ts.map +1 -1
  34. package/build/src/backends/java.js +429 -36
  35. package/build/src/backends/javascript.d.ts +6 -0
  36. package/build/src/backends/javascript.d.ts.map +1 -1
  37. package/build/src/backends/javascript.js +380 -24
  38. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  39. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  40. package/build/src/backends/kotlin-runtime.js +29 -0
  41. package/build/src/backends/kotlin.d.ts +23 -0
  42. package/build/src/backends/kotlin.d.ts.map +1 -0
  43. package/build/src/backends/kotlin.js +136 -0
  44. package/build/src/backends/native-validation.d.ts +2 -2
  45. package/build/src/backends/native-validation.d.ts.map +1 -1
  46. package/build/src/backends/native-validation.js +2 -2
  47. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  48. package/build/src/backends/ordered-expressions.js +39 -7
  49. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  50. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  51. package/build/src/backends/php-stdlib-support.js +227 -0
  52. package/build/src/backends/php.d.ts.map +1 -1
  53. package/build/src/backends/php.js +448 -33
  54. package/build/src/backends/program.d.ts +81 -0
  55. package/build/src/backends/program.d.ts.map +1 -0
  56. package/build/src/backends/program.js +1308 -0
  57. package/build/src/backends/python.js +7 -1
  58. package/build/src/backends/ruby.d.ts.map +1 -1
  59. package/build/src/backends/ruby.js +310 -24
  60. package/build/src/backends/rust-runtime.d.ts +7 -0
  61. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  62. package/build/src/backends/rust-runtime.js +32 -0
  63. package/build/src/backends/rust-validation.d.ts +9 -0
  64. package/build/src/backends/rust-validation.d.ts.map +1 -0
  65. package/build/src/backends/rust-validation.js +78 -0
  66. package/build/src/backends/rust.d.ts +24 -0
  67. package/build/src/backends/rust.d.ts.map +1 -0
  68. package/build/src/backends/rust.js +344 -0
  69. package/build/src/backends/scalars.d.ts +14 -6
  70. package/build/src/backends/scalars.d.ts.map +1 -1
  71. package/build/src/backends/scalars.js +167 -17
  72. package/build/src/backends/shared.d.ts +23 -4
  73. package/build/src/backends/shared.d.ts.map +1 -1
  74. package/build/src/backends/shared.js +2158 -62
  75. package/build/src/backends/stdlib-support.d.ts +14 -0
  76. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  77. package/build/src/backends/stdlib-support.js +237 -0
  78. package/build/src/backends/swift-runtime.d.ts +3 -0
  79. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  80. package/build/src/backends/swift-runtime.js +14 -0
  81. package/build/src/backends/swift.d.ts +8 -0
  82. package/build/src/backends/swift.d.ts.map +1 -0
  83. package/build/src/backends/swift.js +127 -0
  84. package/build/src/backends/typescript.d.ts.map +1 -1
  85. package/build/src/backends/typescript.js +344 -24
  86. package/build/src/backends/wasm.d.ts +43 -0
  87. package/build/src/backends/wasm.d.ts.map +1 -0
  88. package/build/src/backends/wasm.js +2164 -0
  89. package/build/src/backends/writer.d.ts +235 -4
  90. package/build/src/backends/writer.d.ts.map +1 -1
  91. package/build/src/backends/writer.js +468 -3
  92. package/build/src/diagnostic.d.ts +4 -3
  93. package/build/src/diagnostic.d.ts.map +1 -1
  94. package/build/src/diagnostic.js +5 -3
  95. package/build/src/frontends/c.d.ts.map +1 -1
  96. package/build/src/frontends/c.js +5 -3
  97. package/build/src/frontends/cpp.d.ts.map +1 -1
  98. package/build/src/frontends/cpp.js +5 -3
  99. package/build/src/frontends/csharp.d.ts.map +1 -1
  100. package/build/src/frontends/csharp.js +7 -3
  101. package/build/src/frontends/dart.d.ts +10 -0
  102. package/build/src/frontends/dart.d.ts.map +1 -0
  103. package/build/src/frontends/dart.js +913 -0
  104. package/build/src/frontends/index.d.ts +3 -1
  105. package/build/src/frontends/index.d.ts.map +1 -1
  106. package/build/src/frontends/index.js +15 -5
  107. package/build/src/frontends/java.d.ts +110 -1
  108. package/build/src/frontends/java.d.ts.map +1 -1
  109. package/build/src/frontends/java.js +1725 -70
  110. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  111. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  112. package/build/src/frontends/javascript-typescript.js +1825 -93
  113. package/build/src/frontends/kotlin.d.ts +10 -0
  114. package/build/src/frontends/kotlin.d.ts.map +1 -0
  115. package/build/src/frontends/kotlin.js +685 -0
  116. package/build/src/frontends/php.d.ts +118 -1
  117. package/build/src/frontends/php.d.ts.map +1 -1
  118. package/build/src/frontends/php.js +1583 -76
  119. package/build/src/frontends/program.d.ts +74 -0
  120. package/build/src/frontends/program.d.ts.map +1 -0
  121. package/build/src/frontends/program.js +989 -0
  122. package/build/src/frontends/ruby.d.ts +68 -1
  123. package/build/src/frontends/ruby.d.ts.map +1 -1
  124. package/build/src/frontends/ruby.js +1446 -101
  125. package/build/src/frontends/rust-parser.d.ts +11 -0
  126. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  127. package/build/src/frontends/rust-parser.js +15 -0
  128. package/build/src/frontends/rust.d.ts +14 -0
  129. package/build/src/frontends/rust.d.ts.map +1 -0
  130. package/build/src/frontends/rust.js +715 -0
  131. package/build/src/frontends/scalars.d.ts +10 -0
  132. package/build/src/frontends/scalars.d.ts.map +1 -1
  133. package/build/src/frontends/scalars.js +28 -2
  134. package/build/src/frontends/swift.d.ts +10 -0
  135. package/build/src/frontends/swift.d.ts.map +1 -0
  136. package/build/src/frontends/swift.js +860 -0
  137. package/build/src/frontends/types.d.ts +186 -0
  138. package/build/src/frontends/types.d.ts.map +1 -0
  139. package/build/src/frontends/types.js +634 -0
  140. package/build/src/language-registry.d.ts +46 -4
  141. package/build/src/language-registry.d.ts.map +1 -1
  142. package/build/src/language-registry.js +167 -13
  143. package/build/src/mapping.d.ts +2 -2
  144. package/build/src/mapping.d.ts.map +1 -1
  145. package/build/src/mapping.js +31 -10
  146. package/build/src/semantic/capabilities.d.ts +66 -0
  147. package/build/src/semantic/capabilities.d.ts.map +1 -0
  148. package/build/src/semantic/capabilities.js +649 -0
  149. package/build/src/semantic/effects.d.ts +26 -0
  150. package/build/src/semantic/effects.d.ts.map +1 -0
  151. package/build/src/semantic/effects.js +764 -0
  152. package/build/src/semantic/generics.d.ts +23 -0
  153. package/build/src/semantic/generics.d.ts.map +1 -0
  154. package/build/src/semantic/generics.js +61 -0
  155. package/build/src/semantic/lifetime.d.ts +37 -0
  156. package/build/src/semantic/lifetime.d.ts.map +1 -0
  157. package/build/src/semantic/lifetime.js +527 -0
  158. package/build/src/semantic/provenance.d.ts +9 -2
  159. package/build/src/semantic/provenance.d.ts.map +1 -1
  160. package/build/src/semantic/provenance.js +462 -20
  161. package/build/src/semantic/scalars.d.ts +11 -0
  162. package/build/src/semantic/scalars.d.ts.map +1 -1
  163. package/build/src/semantic/scalars.js +16 -1
  164. package/build/src/semantic/stdlib.d.ts +254 -0
  165. package/build/src/semantic/stdlib.d.ts.map +1 -0
  166. package/build/src/semantic/stdlib.js +880 -0
  167. package/build/src/semantic/types.d.ts +2952 -202
  168. package/build/src/semantic/types.d.ts.map +1 -1
  169. package/build/src/semantic/types.js +688 -15
  170. package/build/src/semantic/validate.d.ts +85 -5
  171. package/build/src/semantic/validate.d.ts.map +1 -1
  172. package/build/src/semantic/validate.js +2576 -98
  173. package/build/src/stdlib-facades.d.ts +304 -0
  174. package/build/src/stdlib-facades.d.ts.map +1 -0
  175. package/build/src/stdlib-facades.js +1167 -0
  176. package/build/src/stdlib-negotiation.d.ts +69 -0
  177. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  178. package/build/src/stdlib-negotiation.js +403 -0
  179. package/build/src/stdlib-providers.d.ts +72 -0
  180. package/build/src/stdlib-providers.d.ts.map +1 -0
  181. package/build/src/stdlib-providers.js +339 -0
  182. package/build/src/toolchains.d.ts +55 -1
  183. package/build/src/toolchains.d.ts.map +1 -1
  184. package/build/src/toolchains.js +15 -4
  185. package/docs/architecture.md +45 -13
  186. package/docs/dart.md +60 -0
  187. package/docs/goals.md +3 -3
  188. package/docs/ios.md +121 -0
  189. package/docs/kotlin.md +42 -0
  190. package/docs/language-support.md +231 -26
  191. package/docs/multi-file-modules.md +52 -0
  192. package/docs/parser-qualification.md +121 -8
  193. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  194. package/docs/rust.md +88 -0
  195. package/docs/source-maps.md +15 -7
  196. package/docs/standard-library-portability.md +39 -8
  197. package/docs/swift.md +44 -0
  198. package/docs/testing.md +366 -4
  199. package/docs/webassembly.md +52 -0
  200. package/index.js +63 -8
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  231. package/package.json +5 -2
  232. package/src/artifact-path.js +47 -2
  233. package/src/artifacts.js +67 -0
  234. package/src/backends/c-validation.js +6 -1
  235. package/src/backends/cpp-validation.js +6 -1
  236. package/src/backends/csharp.js +3 -0
  237. package/src/backends/dart-runtime.js +41 -0
  238. package/src/backends/dart.js +326 -0
  239. package/src/backends/effects.js +705 -0
  240. package/src/backends/go.js +14 -2
  241. package/src/backends/identifiers.js +160 -9
  242. package/src/backends/index.js +27 -2
  243. package/src/backends/ios.js +1612 -0
  244. package/src/backends/java.js +454 -36
  245. package/src/backends/javascript.js +389 -23
  246. package/src/backends/kotlin-runtime.js +29 -0
  247. package/src/backends/kotlin.js +141 -0
  248. package/src/backends/native-validation.js +1 -1
  249. package/src/backends/ordered-expressions.js +40 -6
  250. package/src/backends/php-stdlib-support.js +239 -0
  251. package/src/backends/php.js +469 -32
  252. package/src/backends/program.js +1407 -0
  253. package/src/backends/python.js +3 -0
  254. package/src/backends/ruby.js +326 -23
  255. package/src/backends/rust-runtime.js +34 -0
  256. package/src/backends/rust-validation.js +75 -0
  257. package/src/backends/rust.js +335 -0
  258. package/src/backends/scalars.js +141 -16
  259. package/src/backends/shared.js +2304 -124
  260. package/src/backends/stdlib-support.js +234 -0
  261. package/src/backends/swift-runtime.js +14 -0
  262. package/src/backends/swift.js +132 -0
  263. package/src/backends/typescript.js +349 -23
  264. package/src/backends/wasm.js +2208 -0
  265. package/src/backends/writer.js +520 -2
  266. package/src/diagnostic.js +4 -2
  267. package/src/frontends/c.js +4 -2
  268. package/src/frontends/cpp.js +4 -2
  269. package/src/frontends/csharp.js +4 -2
  270. package/src/frontends/dart.js +963 -0
  271. package/src/frontends/index.js +14 -4
  272. package/src/frontends/java.js +1977 -69
  273. package/src/frontends/javascript-typescript.js +2046 -102
  274. package/src/frontends/kotlin.js +713 -0
  275. package/src/frontends/php.js +1725 -79
  276. package/src/frontends/program.js +1062 -0
  277. package/src/frontends/ruby.js +1624 -98
  278. package/src/frontends/rust-parser.js +18 -0
  279. package/src/frontends/rust.js +714 -0
  280. package/src/frontends/scalars.js +31 -1
  281. package/src/frontends/swift.js +893 -0
  282. package/src/frontends/types.js +750 -0
  283. package/src/language-registry.js +172 -12
  284. package/src/mapping.js +33 -9
  285. package/src/semantic/capabilities.js +671 -0
  286. package/src/semantic/effects.js +737 -0
  287. package/src/semantic/generics.js +58 -0
  288. package/src/semantic/lifetime.js +517 -0
  289. package/src/semantic/provenance.js +412 -19
  290. package/src/semantic/scalars.js +17 -0
  291. package/src/semantic/stdlib.js +921 -0
  292. package/src/semantic/types.js +765 -14
  293. package/src/semantic/validate.js +2934 -209
  294. package/src/stdlib-facades.js +1211 -0
  295. package/src/stdlib-negotiation.js +446 -0
  296. package/src/stdlib-providers.js +377 -0
  297. package/src/toolchains.js +16 -3
@@ -1,20 +1,121 @@
1
1
  // @ts-check
2
2
  import { createGenerationIndex } from "../semantic/provenance.js";
3
+ /**
4
+ * Collects every caller-controlled binding spelling before synthetic names are chosen.
5
+ * @param {unknown} root - Semantic graph.
6
+ * @returns {Set<string>} Used source names.
7
+ */
8
+ function collectBindingNames(root) {
9
+ const names = new Set();
10
+ const pending = [root];
11
+ const seen = new Set();
12
+ while (pending.length > 0) {
13
+ const value = pending.pop();
14
+ if (!value || typeof value != "object" || seen.has(value))
15
+ continue;
16
+ seen.add(value);
17
+ if (!Array.isArray(value) && typeof Reflect.get(value, "name") == "string")
18
+ names.add(Reflect.get(value, "name"));
19
+ for (const child of Array.isArray(value) ? value : Object.values(value)) {
20
+ if (child && typeof child == "object")
21
+ pending.push(child);
22
+ }
23
+ }
24
+ return names;
25
+ }
26
+ /**
27
+ * Converts a logical module identity to its canonical target type segment.
28
+ * @param {string} id - Logical module identity.
29
+ * @returns {string} Portable target class/module name.
30
+ */
31
+ function moduleClassName(id) {
32
+ return id.split(/[._-]+/u).map((part) => `${part[0].toUpperCase()}${part.slice(1)}`).join("");
33
+ }
34
+ /**
35
+ * Looks up one declaration name in its owning program module.
36
+ * @param {Partial<import("../semantic/types.js").SemanticProgramModule>} module - Owning module.
37
+ * @param {string} declarationId - Stable declaration identity.
38
+ * @returns {string} Declaration name.
39
+ */
40
+ function declarationName(module, declarationId) {
41
+ const declaration = [...module.functions ?? [], ...module.records ?? [], ...module.classes ?? [], ...module.errors ?? []]
42
+ .find(({ id }) => id == declarationId);
43
+ if (!declaration)
44
+ throw new RangeError(`Unknown program declaration '${declarationId}'.`);
45
+ return declaration.name;
46
+ }
47
+ /**
48
+ * Chooses an unqualified target binding without treating a source-profile qualifier as semantic identity.
49
+ * @param {import("../semantic/types.js").SemanticProgram} program - Owning program.
50
+ * @param {import("../semantic/types.js").SemanticProgramModule} module - Importing module.
51
+ * @param {import("../semantic/types.js").SemanticImport} imported - Resolved import.
52
+ * @returns {string} Target-local binding spelling.
53
+ */
54
+ export function programImportName(program, module, imported) {
55
+ const source = program.sources.find(({ filename }) => filename == module.sourceFilename);
56
+ if (!source)
57
+ throw new RangeError(`Program module '${module.id}' has no registered source.`);
58
+ return source.language == "ruby" || source.language == "java" ? imported.importedName : imported.localName;
59
+ }
3
60
  /** Source-aware deterministic generated-output builder. */
4
61
  export class SourceWriter {
5
62
  /**
6
63
  * Creates a source-aware writer.
7
64
  * @param {object} options - Writer options.
8
65
  * @param {string} options.filename - Output filename.
9
- * @param {import("../semantic/types.js").SemanticLanguage} options.language - Output language.
66
+ * @param {import("../semantic/types.js").GeneratedTextLanguage} options.language - Output text language.
10
67
  * @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
68
+ * @param {import("../semantic/types.js").SemanticProgram} [options.program] - Owning multi-file program.
69
+ * @param {Map<string, string>} [options.programPaths] - Planned artifact path by module identity.
11
70
  * @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
71
+ * @param {Record<string, string>} [options.stdlibProviderEntries] - Used operation to protected native entry for a linked stdlib provider.
72
+ * @param {string} [options.stdlibProviderPath] - Planned stdlib provider artifact path.
73
+ * @param {string[]} [options.stdlibProviderPaths] - Planned stdlib provider artifact paths.
74
+ * @param {string[]} [options.stdlibProviderImports] - Ordered provider names this module must import.
75
+ * @param {string} [options.stdlibProviderOwnerModule] - Java owner module identity hosting the shared support block and shims.
76
+ * @param {string[]} [options.stdlibProviderShims] - Java owner program-wide used operations exposed as public static shims.
12
77
  */
13
- constructor({ filename, language, module, sources }) {
78
+ constructor({ filename, language, module, program, programPaths, sources, stdlibProviderEntries, stdlibProviderPath, stdlibProviderPaths, stdlibProviderImports, stdlibProviderOwnerModule, stdlibProviderShims }) {
14
79
  const index = createGenerationIndex(module, sources);
15
80
  this.filename = filename;
16
81
  this.language = language;
82
+ this.module = module;
83
+ this.program = program;
84
+ this.programPaths = programPaths;
17
85
  this.index = index;
86
+ this.stdlibProviderEntries = stdlibProviderEntries;
87
+ this.stdlibProviderPath = stdlibProviderPath;
88
+ this.stdlibProviderPaths = stdlibProviderPaths ?? (stdlibProviderPath ? [stdlibProviderPath] : undefined);
89
+ this.stdlibProviderImports = stdlibProviderImports;
90
+ this.stdlibProviderOwnerModule = stdlibProviderOwnerModule;
91
+ this.stdlibProviderShims = stdlibProviderShims;
92
+ const programRecords = program?.modules.flatMap((programModule) => programModule.records ?? []) ?? module.records ?? [];
93
+ const programClasses = program?.modules.flatMap((programModule) => programModule.classes ?? []) ?? module.classes ?? [];
94
+ const capabilityFailures = module.capabilities?.flatMap(({ failures }) => failures) ?? [];
95
+ const programErrors = program?.modules.flatMap((programModule) => [
96
+ ...(programModule.errors ?? []),
97
+ ...(programModule.capabilities?.flatMap(({ failures }) => failures) ?? [])
98
+ ]) ?? [...module.errors ?? [], ...capabilityFailures];
99
+ const programFunctions = program?.modules.flatMap((programModule) => programModule.functions) ?? module.functions;
100
+ this.records = new Map(programRecords.map((record) => [record.id, record]));
101
+ this.classes = new Map(programClasses.map((declaration) => [declaration.id, declaration]));
102
+ this.errors = new Map(programErrors.map((error) => [error.id, error]));
103
+ this.resources = new Map((module.capabilities?.flatMap(({ resources }) => resources) ?? []).map((resource) => [resource.id, resource]));
104
+ this.effectOperations = new Map((module.capabilities?.flatMap(({ operations }) => operations) ?? []).map((operation) => [operation.id, operation]));
105
+ this.effectOperationModules = new Map((module.capabilities?.flatMap((capability) => capability.operations.map((operation) => [operation.id, capability.authorityId])) ?? []));
106
+ this.fields = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, field])));
107
+ this.fieldRecords = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, record])));
108
+ this.privateFields = new Map(programClasses.flatMap((declaration) => declaration.fields.map((field) => [field.id, field])));
109
+ this.methods = new Map(programClasses.flatMap((declaration) => declaration.methods.map((method) => [method.id, method])));
110
+ this.typeParameters = new Map([...programRecords, ...programFunctions].flatMap((declaration) => (declaration.typeParameters ?? []).map((parameter) => [parameter.id, parameter])));
111
+ this.referenceClassEmissionDepth = 0;
112
+ /** @type {Map<string, import("../semantic/types.js").SemanticProgramModule>} */
113
+ this.declarationModules = new Map(program?.modules.flatMap((programModule) => [
114
+ ...(programModule.records ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
115
+ ...(programModule.classes ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
116
+ ...(programModule.errors ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
117
+ ...programModule.functions.map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule]))
118
+ ]) ?? []);
18
119
  /** @type {string[]} */
19
120
  this.parts = [];
20
121
  /** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
@@ -22,6 +123,63 @@ export class SourceWriter {
22
123
  this.offset = 0;
23
124
  this.line = 1;
24
125
  this.column = 1;
126
+ /** @type {Map<import("../semantic/types.js").Expression, string>} */
127
+ this.effectTemporaryNames = new Map();
128
+ /** @type {Map<import("../semantic/types.js").Expression, string>} */
129
+ this.effectReplacementNames = new Map();
130
+ /** @type {import("../semantic/types.js").Expression | undefined} */
131
+ this.effectDefinition = undefined;
132
+ this.usedBindingNames = collectBindingNames(module);
133
+ }
134
+ /**
135
+ * Installs the effect expressions lowered immediately before the current statement.
136
+ * @param {import("../semantic/types.js").Expression[]} expressions - Ordered expressions.
137
+ * @returns {void}
138
+ */
139
+ planEffectReplacements(expressions) {
140
+ this.effectReplacementNames = new Map(expressions.map((expression) => [expression, this.effectTemporaryName(expression)]));
141
+ }
142
+ /**
143
+ * Allocates a collision-safe name for one deterministic effect site.
144
+ * @param {import("../semantic/types.js").Expression} expression - Effectful expression.
145
+ * @returns {string} Stable temporary name.
146
+ */
147
+ effectTemporaryName(expression) {
148
+ const known = this.effectTemporaryNames.get(expression);
149
+ if (known)
150
+ return known;
151
+ const site = typeof Reflect.get(expression, "effectSiteId") == "string"
152
+ ? Reflect.get(expression, "effectSiteId").slice("effect:".length) : String(this.effectTemporaryNames.size);
153
+ let name = `__semantifold_effect_${site}`;
154
+ while (this.usedBindingNames.has(name))
155
+ name = `${name}_`;
156
+ this.usedBindingNames.add(name);
157
+ this.effectTemporaryNames.set(expression, name);
158
+ return name;
159
+ }
160
+ /**
161
+ * Returns the planned temporary replacement outside its own definition.
162
+ * @param {import("../semantic/types.js").Expression} expression - Candidate expression.
163
+ * @returns {string | undefined} Temporary name.
164
+ */
165
+ effectReplacementName(expression) {
166
+ return this.effectDefinition === expression ? undefined : this.effectReplacementNames.get(expression);
167
+ }
168
+ /**
169
+ * Emits one effect definition without recursively replacing itself.
170
+ * @param {import("../semantic/types.js").Expression} expression - Defined expression.
171
+ * @param {() => void} emit - Target expression emitter.
172
+ * @returns {void}
173
+ */
174
+ emitEffectDefinition(expression, emit) {
175
+ const previous = this.effectDefinition;
176
+ this.effectDefinition = expression;
177
+ try {
178
+ emit();
179
+ }
180
+ finally {
181
+ this.effectDefinition = previous;
182
+ }
25
183
  }
26
184
  /**
27
185
  * Returns generated content so far.
@@ -38,6 +196,313 @@ export class SourceWriter {
38
196
  occurrencePath(node) {
39
197
  return this.index.recordFor(node).path;
40
198
  }
199
+ /**
200
+ * Resolves a validated nominal declaration identity for target emission.
201
+ * @param {string} declarationId - Semantic record identity.
202
+ * @returns {import("../semantic/types.js").RecordDeclaration} Record declaration.
203
+ */
204
+ recordForId(declarationId) {
205
+ const record = this.records.get(declarationId);
206
+ if (!record)
207
+ throw new RangeError(`Unknown validated record identity '${declarationId}'.`);
208
+ return record;
209
+ }
210
+ /**
211
+ * Returns the target spelling for a nominal record identity.
212
+ * @param {string} declarationId - Stable record declaration identity.
213
+ * @param {boolean} [valuePosition] - Whether the binding must exist at runtime.
214
+ * @returns {string} Target record spelling.
215
+ */
216
+ recordNameForId(declarationId, valuePosition = false) {
217
+ const record = this.recordForId(declarationId);
218
+ const owner = this.declarationModules.get(declarationId);
219
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId && (!valuePosition || !item.typeOnly));
220
+ if (this.program && owner && owner.id != Reflect.get(this.module, "id") && this.language == "ruby") {
221
+ return `${moduleClassName(owner.id)}::${record.name}`;
222
+ }
223
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
224
+ return this.importNameFor(imported);
225
+ }
226
+ return record.name;
227
+ }
228
+ /**
229
+ * Resolves one validated reference class.
230
+ * @param {string} declarationId - Stable class identity.
231
+ * @returns {import("../semantic/types.js").ClassDeclaration} Class declaration.
232
+ */
233
+ classForId(declarationId) {
234
+ const declaration = this.classes.get(declarationId);
235
+ if (!declaration)
236
+ throw new RangeError(`Unknown validated reference class identity '${declarationId}'.`);
237
+ return declaration;
238
+ }
239
+ /**
240
+ * Returns the target spelling of one reference class.
241
+ * @param {string} declarationId - Stable class identity.
242
+ * @returns {string} Target spelling.
243
+ */
244
+ classNameForId(declarationId) {
245
+ const declaration = this.classForId(declarationId);
246
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
247
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
248
+ return this.importNameFor(imported);
249
+ }
250
+ return declaration.name;
251
+ }
252
+ /**
253
+ * Resolves one validated owned-resource declaration.
254
+ * @param {string} resourceId - Stable resource identity.
255
+ * @returns {import("../semantic/types.js").EffectResourceDeclaration} Resource declaration.
256
+ */
257
+ resourceForId(resourceId) {
258
+ const resource = this.resources.get(resourceId);
259
+ if (!resource)
260
+ throw new RangeError(`Unknown validated resource identity '${resourceId}'.`);
261
+ return resource;
262
+ }
263
+ /**
264
+ * Resolves one validated capability operation declaration.
265
+ * @param {string} operationId - Stable operation identity.
266
+ * @returns {import("../semantic/types.js").EffectOperationDeclaration} Operation declaration.
267
+ */
268
+ effectOperationForId(operationId) {
269
+ const operation = this.effectOperations.get(operationId);
270
+ if (!operation)
271
+ throw new RangeError(`Unknown validated effect operation identity '${operationId}'.`);
272
+ return operation;
273
+ }
274
+ /**
275
+ * Resolves one validated private field.
276
+ * @param {string} fieldId - Stable private-field identity.
277
+ * @returns {import("../semantic/types.js").PrivateField} Field declaration.
278
+ */
279
+ privateFieldForId(fieldId) {
280
+ const field = this.privateFields.get(fieldId);
281
+ if (!field)
282
+ throw new RangeError(`Unknown validated private field identity '${fieldId}'.`);
283
+ return field;
284
+ }
285
+ /**
286
+ * Resolves one validated receiver method.
287
+ * @param {string} methodId - Stable method identity.
288
+ * @returns {import("../semantic/types.js").MethodDeclaration} Method declaration.
289
+ */
290
+ methodForId(methodId) {
291
+ const method = this.methods.get(methodId);
292
+ if (!method)
293
+ throw new RangeError(`Unknown validated method identity '${methodId}'.`);
294
+ return method;
295
+ }
296
+ /**
297
+ * Resolves one validated declaration-scoped type parameter.
298
+ * @param {string} parameterId - Stable type-parameter identity.
299
+ * @returns {import("../semantic/types.js").TypeParameter} Type parameter.
300
+ */
301
+ typeParameterForId(parameterId) {
302
+ const parameter = this.typeParameters.get(parameterId);
303
+ if (!parameter)
304
+ throw new RangeError(`Unknown validated type parameter identity '${parameterId}'.`);
305
+ return parameter;
306
+ }
307
+ /**
308
+ * Returns the validated nominal error declaration for an identity.
309
+ * @param {string} declarationId - Stable error identity.
310
+ * @returns {import("../semantic/types.js").ErrorDeclaration | import("../semantic/types.js").EffectFailureDeclaration} Error declaration.
311
+ */
312
+ errorForId(declarationId) {
313
+ const error = this.errors.get(declarationId);
314
+ if (!error)
315
+ throw new RangeError(`Unknown validated error identity '${declarationId}'.`);
316
+ return error;
317
+ }
318
+ /**
319
+ * Returns the target-visible spelling for one nominal error identity.
320
+ * @param {string} declarationId - Stable error identity.
321
+ * @returns {string} Target-visible name.
322
+ */
323
+ errorNameForId(declarationId) {
324
+ const error = this.errorForId(declarationId);
325
+ const owner = this.declarationModules.get(declarationId);
326
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
327
+ if (this.program && owner && owner.id != Reflect.get(this.module, "id") && this.language == "ruby") {
328
+ return `${moduleClassName(owner.id)}::${error.name}`;
329
+ }
330
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
331
+ return this.importNameFor(imported);
332
+ }
333
+ return owner ? error.name : this.capabilityNominalName(error.name);
334
+ }
335
+ /**
336
+ * Returns the target spelling for a nominal name owned by a compiler-authorized capability.
337
+ * PHP program entries live in a generated namespace while stdlib provider classes remain
338
+ * global, so PHP program mode fully qualifies capability names.
339
+ * @param {string} name - Declared nominal name.
340
+ * @returns {string} Target spelling.
341
+ */
342
+ capabilityNominalName(name) {
343
+ return this.program && this.language == "php" ? `\\${name}` : name;
344
+ }
345
+ /**
346
+ * Returns the target spelling for a resolved function call.
347
+ * @param {import("../semantic/types.js").CallExpression} expression - Resolved call.
348
+ * @returns {string} Target call name.
349
+ */
350
+ callNameFor(expression) {
351
+ const declarationId = expression.resolution?.declarationId;
352
+ const owner = declarationId ? this.declarationModules.get(declarationId) : undefined;
353
+ const imported = declarationId ? this.#programModule()?.imports.find((item) => item.declarationId == declarationId) : undefined;
354
+ if (this.language == "java" && !this.program && this.referenceClassEmissionDepth > 0)
355
+ return `Main.${expression.callee}`;
356
+ if (!declarationId || !this.program || !owner || owner.id == Reflect.get(this.module, "id"))
357
+ return expression.callee;
358
+ if (this.language == "ruby" || this.language == "java")
359
+ return `${moduleClassName(owner.id)}.${declarationName(owner, declarationId)}`;
360
+ if (imported)
361
+ return this.importNameFor(imported);
362
+ return declarationName(owner, declarationId);
363
+ }
364
+ /** Marks emission as occurring inside one top-level reference class. */
365
+ beginReferenceClassEmission() {
366
+ this.referenceClassEmissionDepth += 1;
367
+ }
368
+ /** Ends one balanced top-level reference-class emission scope. */
369
+ endReferenceClassEmission() {
370
+ if (this.referenceClassEmissionDepth == 0)
371
+ throw new RangeError("Reference-class emission scope is not active.");
372
+ this.referenceClassEmissionDepth -= 1;
373
+ }
374
+ /**
375
+ * Returns the target-local binding for one resolved import.
376
+ * @param {import("../semantic/types.js").SemanticImport} imported - Resolved import.
377
+ * @returns {string} Emitted import name.
378
+ */
379
+ importNameFor(imported) {
380
+ const module = this.#programModule();
381
+ if (!this.program || !module)
382
+ throw new RangeError("Import names require a validated semantic program.");
383
+ return programImportName(this.program, module, imported);
384
+ }
385
+ /**
386
+ * Reports whether one local declaration is exported by the current program module.
387
+ * @param {string | undefined} declarationId - Declaration identity.
388
+ * @returns {boolean} Whether it has a same-name program export.
389
+ */
390
+ isDirectlyExported(declarationId) {
391
+ const module = /** @type {Partial<import("../semantic/types.js").SemanticProgramModule>} */ (this.module);
392
+ return typeof declarationId == "string" && Boolean(module.exports?.some((item) => item.declarationId == declarationId && item.exportedName == declarationName(module, declarationId)));
393
+ }
394
+ /**
395
+ * Reports whether one export edge uses its declaration's emitted name.
396
+ * @param {import("../semantic/types.js").SemanticExport} exported - Current export edge.
397
+ * @returns {boolean} Whether this edge is represented by the declaration prefix.
398
+ */
399
+ isDirectExport(exported) {
400
+ return exported.exportedName == declarationName(this.module, exported.declarationId);
401
+ }
402
+ /**
403
+ * Reports whether one local declaration has any public program export.
404
+ * @param {string | undefined} declarationId - Declaration identity.
405
+ * @returns {boolean} Whether the declaration is exported.
406
+ */
407
+ isExported(declarationId) {
408
+ const module = /** @type {Partial<import("../semantic/types.js").SemanticProgramModule>} */ (this.module);
409
+ return typeof declarationId == "string" && Boolean(module.exports?.some((item) => item.declarationId == declarationId));
410
+ }
411
+ /**
412
+ * Returns whether this is the selected program entry module.
413
+ * @returns {boolean} Whether this writer owns the selected entry.
414
+ */
415
+ isProgramEntry() {
416
+ return this.program?.entryModule == Reflect.get(this.module, "id");
417
+ }
418
+ /**
419
+ * Returns the canonical class/module segment for a logical module identity.
420
+ * @param {string} moduleId - Logical module identity.
421
+ * @returns {string} Target class/module name.
422
+ */
423
+ programModuleName(moduleId) {
424
+ if (!this.program?.modules.some(({ id }) => id == moduleId))
425
+ throw new RangeError(`Unknown program module '${moduleId}'.`);
426
+ return moduleClassName(moduleId);
427
+ }
428
+ /**
429
+ * Finds the current module in the complete program.
430
+ * @returns {import("../semantic/types.js").SemanticProgramModule | undefined} Current program module.
431
+ */
432
+ #programModule() {
433
+ if (!this.program)
434
+ return undefined;
435
+ return this.program.modules.find(({ id }) => id == Reflect.get(this.module, "id"));
436
+ }
437
+ /**
438
+ * Returns a relative ESM/require specifier for a planned dependency artifact.
439
+ * @param {string} moduleId - Dependency module identity.
440
+ * @param {string} [extension] - Optional replacement extension.
441
+ * @returns {string} Relative POSIX specifier.
442
+ */
443
+ relativeModuleSpecifier(moduleId, extension) {
444
+ const targetPath = this.programPaths?.get(moduleId);
445
+ if (!targetPath)
446
+ throw new RangeError(`Unknown planned module path '${moduleId}'.`);
447
+ const adjustedTarget = extension ? targetPath.replace(/\.[^./]+$/u, extension) : targetPath;
448
+ const from = this.filename.split("/").slice(0, -1);
449
+ const to = adjustedTarget.split("/");
450
+ let common = 0;
451
+ while (common < from.length && common < to.length && from[common] == to[common])
452
+ common++;
453
+ const relative = [...from.slice(common).map(() => ".."), ...to.slice(common)].join("/");
454
+ return relative.startsWith(".") ? relative : `./${relative}`;
455
+ }
456
+ /**
457
+ * Returns the protected native entry for one used stdlib provider operation.
458
+ * @param {import("../semantic/types.js").EffectOperationDeclaration} operation - Canonical operation declaration.
459
+ * @returns {string | undefined} Linked protected entry, or undefined when the operation stays inlined.
460
+ */
461
+ stdlibProviderEntryFor(operation) {
462
+ const module = this.effectOperationModules.get(operation.id);
463
+ return module === undefined ? undefined : this.stdlibProviderEntries?.[`${module}\u0000${operation.name}`];
464
+ }
465
+ /**
466
+ * Returns a relative specifier for the planned stdlib provider artifact.
467
+ * @param {string} [extension] - Optional replacement extension.
468
+ * @param {string} [providerPath] - One selected provider artifact path.
469
+ * @returns {string} Relative POSIX specifier.
470
+ */
471
+ stdlibProviderSpecifier(extension, providerPath) {
472
+ const targetPath = providerPath ?? this.stdlibProviderPath ?? this.stdlibProviderPaths?.[0];
473
+ if (!targetPath)
474
+ throw new RangeError("A stdlib provider specifier requires a planned provider path.");
475
+ const adjustedTarget = extension ? targetPath.replace(/\.[^./]+$/u, extension) : targetPath;
476
+ const from = this.filename.split("/").slice(0, -1);
477
+ const to = adjustedTarget.split("/");
478
+ let common = 0;
479
+ while (common < from.length && common < to.length && from[common] == to[common])
480
+ common++;
481
+ const relative = [...from.slice(common).map(() => ".."), ...to.slice(common)].join("/");
482
+ return relative.startsWith(".") ? relative : `./${relative}`;
483
+ }
484
+ /**
485
+ * Resolves a validated field identity for target emission.
486
+ * @param {string} fieldId - Semantic field identity.
487
+ * @returns {import("../semantic/types.js").RecordField} Record field.
488
+ */
489
+ fieldForId(fieldId) {
490
+ const field = this.fields.get(fieldId);
491
+ if (!field)
492
+ throw new RangeError(`Unknown validated field identity '${fieldId}'.`);
493
+ return field;
494
+ }
495
+ /**
496
+ * Resolves the record declaration that owns a validated field identity.
497
+ * @param {string} fieldId - Semantic field identity.
498
+ * @returns {import("../semantic/types.js").RecordDeclaration} Owning record.
499
+ */
500
+ recordForFieldId(fieldId) {
501
+ const record = this.fieldRecords.get(fieldId);
502
+ if (!record)
503
+ throw new RangeError(`Unknown validated field identity '${fieldId}'.`);
504
+ return record;
505
+ }
41
506
  /**
42
507
  * Reports whether an exact parser-owned role range is available.
43
508
  * @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
@@ -204,4 +669,4 @@ function relatedOriginKey(origin) {
204
669
  origin.role ?? null
205
670
  ]);
206
671
  }
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0QsMkRBQTJEO0FBQzNELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsSUFBSTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLElBQUksRUFBRSxJ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QUFTLGlCQUFpQixDQUFDLE1BQU07SUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDNUYsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFFbkQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFBO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNO0lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixNQUFNLENBQUMsUUFBUTtRQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDMUIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3JCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN2QixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRpb25JbmRleH0gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKiogU291cmNlLWF3YXJlIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkLW91dHB1dCBidWlsZGVyLiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVdyaXRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc291cmNlLWF3YXJlIHdyaXRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBXcml0ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gb3B0aW9ucy5sYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSkge1xuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgc291cmNlcylcblxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5wYXJ0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gICAgdGhpcy5zcGFucyA9IFtdXG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5saW5lID0gMVxuICAgIHRoaXMuY29sdW1uID0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2VuZXJhdGVkIGNvbnRlbnQgc28gZmFyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHZW5lcmF0ZWQgY29udGVudC5cbiAgICovXG4gIGdldCBjb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEpTT04gUG9pbnRlciBmb3Igb25lIHVuYW1iaWd1b3VzIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDdXJyZW50IG9jY3VycmVuY2UgcGF0aC5cbiAgICovXG4gIG9jY3VycmVuY2VQYXRoKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSkucGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBSTtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUTtRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2pILEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLEVBQUU7SUFDekIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9GLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxhQUFhO0lBQzVDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztTQUN0SCxJQUFJLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksYUFBYSxDQUFDLENBQUE7SUFFdEMsSUFBSSxDQUFDLFdBQVc7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLGdDQUFnQyxhQUFhLElBQUksQ0FBQyxDQUFBO0lBRXpGLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQTtBQUN6QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUTtJQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7SUFFdEYsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixNQUFNLENBQUMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFBO0lBRTVGLE9BQU8sTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUE7QUFDNUcsQ0FBQztBQUVELDJEQUEyRDtBQUMzRCxNQUFNLE9BQU8sWUFBWTtJQUN2Qjs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQ2hILG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLHlCQUF5QixFQUFFLG1CQUFtQixFQUFDO1FBQzNGLE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQixJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUE7UUFDbEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFBO1FBQzVDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3pHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTtRQUNsRCxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUE7UUFDMUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFBO1FBQzlDLE1BQU0sY0FBYyxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO1FBQ3ZILE1BQU0sY0FBYyxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO1FBQ3ZILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDdkYsTUFBTSxhQUFhLEdBQUcsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQ2hFLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUMvQixHQUFHLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDekUsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUE7UUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7UUFFakgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMxRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pKLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDakYsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3pILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FDN0YsQ0FBQyxXQUFXLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3BGLElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLENBQUE7UUFDcEMsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDNUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNySSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3JJLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDcEksR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDaEksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ1QsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBQ2Ysc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ2YscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3JDLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUN2QyxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxXQUFXO1FBQ2hDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUgsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxVQUFVO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDdkQsSUFBSSxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDdkIsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsSUFBSSxRQUFRO1lBQ3JFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVHLElBQUksSUFBSSxHQUFHLHdCQUF3QixJQUFJLEVBQUUsQ0FBQTtRQUV6QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUE7UUFDekQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMvQyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsVUFBVTtRQUM5QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN2RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSTtRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQTtRQUNsQyxJQUFJLENBQUM7WUFDSCxJQUFJLEVBQUUsQ0FBQTtRQUNSLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUE7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLElBQUk7UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsYUFBYTtRQUN2QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU5QyxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsc0NBQXNDLGFBQWEsSUFBSSxDQUFDLENBQUE7UUFFMUYsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsYUFBYSxFQUFFLGFBQWEsR0FBRyxLQUFLO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzVELElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUU1RSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbkcsT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3ZELENBQUM7UUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzRyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQTtJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxhQUFhO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRW5ELElBQUksQ0FBQyxXQUFXO1lBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQywrQ0FBK0MsYUFBYSxJQUFJLENBQUMsQ0FBQTtRQUV4RyxPQUFPLFdBQVcsQ0FBQTtJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxhQUFhO1FBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLENBQUE7UUFFbkcsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0csT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3JDLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsVUFBVTtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMvQyxJQUFJLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsd0NBQXdDLFVBQVUsSUFBSSxDQUFDLENBQUE7UUFDM0YsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxXQUFXO1FBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDeEQsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLGdEQUFnRCxXQUFXLElBQUksQ0FBQyxDQUFBO1FBQ3JHLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsT0FBTztRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUU3QyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsNkNBQTZDLE9BQU8sSUFBSSxDQUFDLENBQUE7UUFFMUYsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxRQUFRO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXpDLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxzQ0FBc0MsUUFBUSxJQUFJLENBQUMsQ0FBQTtRQUVyRixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsV0FBVztRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV0RCxJQUFJLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLFdBQVcsSUFBSSxDQUFDLENBQUE7UUFFbkcsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsYUFBYTtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU1QyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMscUNBQXFDLGFBQWEsSUFBSSxDQUFDLENBQUE7UUFFeEYsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxhQUFhO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsQ0FBQTtRQUVuRyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbkcsT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3RELENBQUM7UUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzRyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxxQkFBcUIsQ0FBQyxJQUFJO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLFVBQVU7UUFDcEIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUE7UUFDMUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDcEYsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRS9ILElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDO1lBQUUsT0FBTyxRQUFRLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUN4SCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFBRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUE7UUFDckgsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU07WUFBRSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUE7UUFDdEksSUFBSSxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWpELE9BQU8sZUFBZSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDJCQUEyQjtRQUN6QixJQUFJLENBQUMsMkJBQTJCLElBQUksQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUseUJBQXlCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLDJCQUEyQixJQUFJLENBQUM7WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLCtDQUErQyxDQUFDLENBQUE7UUFDaEgsSUFBSSxDQUFDLDJCQUEyQixJQUFJLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxRQUFRO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUVwQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLG9EQUFvRCxDQUFDLENBQUE7UUFFeEcsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLGFBQWE7UUFDOUIsTUFBTSxNQUFNLEdBQUcsNEVBQTRFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFekcsT0FBTyxPQUFPLGFBQWEsSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDL0UsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxRQUFRO1FBQ3JCLE9BQU8sUUFBUSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsYUFBYTtRQUN0QixNQUFNLE1BQU0sR0FBRyw0RUFBNEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUV6RyxPQUFPLE9BQU8sYUFBYSxJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6SCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsUUFBUTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQztZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsMkJBQTJCLFFBQVEsSUFBSSxDQUFDLENBQUE7UUFFeEgsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVuQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsU0FBUztRQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsVUFBVTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsZ0NBQWdDLFFBQVEsSUFBSSxDQUFDLENBQUE7UUFDbkYsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO1FBQzNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsRCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3BDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUVkLE9BQU8sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFBRSxNQUFNLEVBQUUsQ0FBQTtRQUN6RixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXZGLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsU0FBUztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU1RCxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxNQUFNLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsdUJBQXVCLENBQUMsU0FBUyxFQUFFLFlBQVk7UUFDN0MsTUFBTSxVQUFVLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUUzRixJQUFJLENBQUMsVUFBVTtZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsK0RBQStELENBQUMsQ0FBQTtRQUN0RyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDM0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDcEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBRWQsT0FBTyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUFFLE1BQU0sRUFBRSxDQUFBO1FBQ3pGLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFdkYsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUE7SUFDOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBTztRQUNoQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUV0QyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMscUNBQXFDLE9BQU8sSUFBSSxDQUFDLENBQUE7UUFFbEYsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLE9BQU87UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFN0MsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLHFDQUFxQyxPQUFPLElBQUksQ0FBQyxDQUFBO1FBRW5GLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTTtRQUU1QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDM0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUE7UUFDN0YsTUFBTSxTQUFTLEdBQUcsV0FBVyxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO1FBQzFGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDcEYsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUViLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2pCLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLElBQUksRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLElBQUk7WUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2pCLE1BQU07WUFDTixJQUFJO1lBQ0osUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxZQUFZLEdBQUcsRUFBRTtRQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU07UUFFNUIsMEJBQTBCO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDdEIsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFFOUQsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzFELE1BQU0sVUFBVSxHQUFHO29CQUNqQixHQUFHLE9BQU87b0JBQ1YsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEVBQUU7b0JBQ25DLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVM7aUJBQ2hDLENBQUE7Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBRXhDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTyxFQUFFLENBQUE7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBRWIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3JCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDLEVBQUMsQ0FBQyxDQUFBO0lBQ3JHLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNO1FBQ0osT0FBTztZQUNMLGdCQUFnQixFQUFFLE9BQU87WUFDekIsU0FBUyxFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUM7WUFDakYsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdkMsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdEIsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDM0MsT0FBTyxFQUFFLENBQUM7U0FDWCxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDBEQUEwRCxDQUFDLENBQUE7UUFFeEcsTUFBTSxLQUFLLEdBQUcsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFBO1FBRXpFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUNqQixDQUFDOztnQkFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDdEIsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLHVGQUF1RixDQUFDLENBQ3RHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUMxRixDQUFBO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDZCxHQUFHLE9BQU87WUFDVixTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7Z0JBQ2hFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsS0FBSzthQUNOO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRO1FBQzlCLGlDQUFpQztRQUNqQyxJQUFJLGdCQUFnQixDQUFBO1FBRXBCLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVE7WUFBRSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFBO2FBQ2pILElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNwQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQTtRQUMvRyxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFBO1FBQ3RILENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLGdCQUFnQixDQUFDO1lBQ2hHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTVGLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtJQUM1RSxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0lBQy9CLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRO1FBQUUsT0FBTyxDQUFDLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQzVGLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFBO0lBRW5ELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsTUFBTTtJQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsTUFBTSxDQUFDLFFBQVE7UUFDZixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1FBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSTtRQUNyQixNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDdkIsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJO0tBQ3BCLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVHZW5lcmF0aW9uSW5kZXh9IGZyb20gXCIuLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBjYWxsZXItY29udHJvbGxlZCBiaW5kaW5nIHNwZWxsaW5nIGJlZm9yZSBzeW50aGV0aWMgbmFtZXMgYXJlIGNob3Nlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcm9vdCAtIFNlbWFudGljIGdyYXBoLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBVc2VkIHNvdXJjZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyhyb290KSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpXG4gIGNvbnN0IHBlbmRpbmcgPSBbcm9vdF1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpID09IFwic3RyaW5nXCIpIG5hbWVzLmFkZChSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpKVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eSB0byBpdHMgY2Fub25pY2FsIHRhcmdldCB0eXBlIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFBvcnRhYmxlIHRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbW9kdWxlQ2xhc3NOYW1lKGlkKSB7XG4gIHJldHVybiBpZC5zcGxpdCgvWy5fLV0rL3UpLm1hcCgocGFydCkgPT4gYCR7cGFydFswXS50b1VwcGVyQ2FzZSgpfSR7cGFydC5zbGljZSgxKX1gKS5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogTG9va3MgdXAgb25lIGRlY2xhcmF0aW9uIG5hbWUgaW4gaXRzIG93bmluZyBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSBtb2R1bGUgLSBPd25pbmcgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWNsYXJhdGlvbiBuYW1lLlxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvbk5hbWUobW9kdWxlLCBkZWNsYXJhdGlvbklkKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gWy4uLm1vZHVsZS5mdW5jdGlvbnMgPz8gW10sIC4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXV1cbiAgICAuZmluZCgoe2lkfSkgPT4gaWQgPT0gZGVjbGFyYXRpb25JZClcblxuICBpZiAoIWRlY2xhcmF0aW9uKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uSWR9Jy5gKVxuXG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lXG59XG5cbi8qKlxuICogQ2hvb3NlcyBhbiB1bnF1YWxpZmllZCB0YXJnZXQgYmluZGluZyB3aXRob3V0IHRyZWF0aW5nIGEgc291cmNlLXByb2ZpbGUgcXVhbGlmaWVyIGFzIHNlbWFudGljIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBPd25pbmcgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBJbXBvcnRpbmcgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0ltcG9ydH0gaW1wb3J0ZWQgLSBSZXNvbHZlZCBpbXBvcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQtbG9jYWwgYmluZGluZyBzcGVsbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2dyYW1JbXBvcnROYW1lKHByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpIHtcbiAgY29uc3Qgc291cmNlID0gcHJvZ3JhbS5zb3VyY2VzLmZpbmQoKHtmaWxlbmFtZX0pID0+IGZpbGVuYW1lID09IG1vZHVsZS5zb3VyY2VGaWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFByb2dyYW0gbW9kdWxlICcke21vZHVsZS5pZH0nIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZS5gKVxuXG4gIHJldHVybiBzb3VyY2UubGFuZ3VhZ2UgPT0gXCJydWJ5XCIgfHwgc291cmNlLmxhbmd1YWdlID09IFwiamF2YVwiID8gaW1wb3J0ZWQuaW1wb3J0ZWROYW1lIDogaW1wb3J0ZWQubG9jYWxOYW1lXG59XG5cbi8qKiBTb3VyY2UtYXdhcmUgZGV0ZXJtaW5pc3RpYyBnZW5lcmF0ZWQtb3V0cHV0IGJ1aWxkZXIuICovXG5leHBvcnQgY2xhc3MgU291cmNlV3JpdGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzb3VyY2UtYXdhcmUgd3JpdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFdyaXRlciBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5maWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IG9wdGlvbnMubGFuZ3VhZ2UgLSBPdXRwdXQgdGV4dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBbb3B0aW9ucy5wcm9ncmFtXSAtIE93bmluZyBtdWx0aS1maWxlIHByb2dyYW0uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gW29wdGlvbnMucHJvZ3JhbVBhdGhzXSAtIFBsYW5uZWQgYXJ0aWZhY3QgcGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLnN0ZGxpYlByb3ZpZGVyRW50cmllc10gLSBVc2VkIG9wZXJhdGlvbiB0byBwcm90ZWN0ZWQgbmF0aXZlIGVudHJ5IGZvciBhIGxpbmtlZCBzdGRsaWIgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlclBhdGhdIC0gUGxhbm5lZCBzdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJQYXRoc10gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCBwYXRocy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJJbXBvcnRzXSAtIE9yZGVyZWQgcHJvdmlkZXIgbmFtZXMgdGhpcyBtb2R1bGUgbXVzdCBpbXBvcnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlck93bmVyTW9kdWxlXSAtIEphdmEgb3duZXIgbW9kdWxlIGlkZW50aXR5IGhvc3RpbmcgdGhlIHNoYXJlZCBzdXBwb3J0IGJsb2NrIGFuZCBzaGltcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJTaGltc10gLSBKYXZhIG93bmVyIHByb2dyYW0td2lkZSB1c2VkIG9wZXJhdGlvbnMgZXhwb3NlZCBhcyBwdWJsaWMgc3RhdGljIHNoaW1zLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBwcm9ncmFtLCBwcm9ncmFtUGF0aHMsIHNvdXJjZXMsIHN0ZGxpYlByb3ZpZGVyRW50cmllcywgc3RkbGliUHJvdmlkZXJQYXRoLFxuICAgIHN0ZGxpYlByb3ZpZGVyUGF0aHMsIHN0ZGxpYlByb3ZpZGVySW1wb3J0cywgc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSwgc3RkbGliUHJvdmlkZXJTaGltc30pIHtcbiAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUsIHNvdXJjZXMpXG5cbiAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2VcbiAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZVxuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW1cbiAgICB0aGlzLnByb2dyYW1QYXRocyA9IHByb2dyYW1QYXRoc1xuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJFbnRyaWVzID0gc3RkbGliUHJvdmlkZXJFbnRyaWVzXG4gICAgdGhpcy5zdGRsaWJQcm92aWRlclBhdGggPSBzdGRsaWJQcm92aWRlclBhdGhcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyUGF0aHMgPSBzdGRsaWJQcm92aWRlclBhdGhzID8/IChzdGRsaWJQcm92aWRlclBhdGggPyBbc3RkbGliUHJvdmlkZXJQYXRoXSA6IHVuZGVmaW5lZClcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVySW1wb3J0cyA9IHN0ZGxpYlByb3ZpZGVySW1wb3J0c1xuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSA9IHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGVcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyU2hpbXMgPSBzdGRsaWJQcm92aWRlclNoaW1zXG4gICAgY29uc3QgcHJvZ3JhbVJlY29yZHMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkgPz8gbW9kdWxlLnJlY29yZHMgPz8gW11cbiAgICBjb25zdCBwcm9ncmFtQ2xhc3NlcyA9IHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gcHJvZ3JhbU1vZHVsZS5jbGFzc2VzID8/IFtdKSA/PyBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICAgIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlcyA9IG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXVxuICAgIGNvbnN0IHByb2dyYW1FcnJvcnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IFtcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmVycm9ycyA/PyBbXSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXSlcbiAgICBdKSA/PyBbLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4uY2FwYWJpbGl0eUZhaWx1cmVzXVxuICAgIGNvbnN0IHByb2dyYW1GdW5jdGlvbnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUuZnVuY3Rpb25zKSA/PyBtb2R1bGUuZnVuY3Rpb25zXG5cbiAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbcmVjb3JkLmlkLCByZWNvcmRdKSlcbiAgICB0aGlzLmNsYXNzZXMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb25dKSlcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBNYXAocHJvZ3JhbUVycm9ycy5tYXAoKGVycm9yKSA9PiBbZXJyb3IuaWQsIGVycm9yXSkpXG4gICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKSA/PyBbXSkubWFwKChyZXNvdXJjZSkgPT4gW3Jlc291cmNlLmlkLCByZXNvdXJjZV0pKVxuICAgIHRoaXMuZWZmZWN0T3BlcmF0aW9ucyA9IG5ldyBNYXAoKG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT4gb3BlcmF0aW9ucykgPz8gW10pLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBvcGVyYXRpb25dKSlcbiAgICB0aGlzLmVmZmVjdE9wZXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKChjYXBhYmlsaXR5KSA9PlxuICAgICAgY2FwYWJpbGl0eS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBjYXBhYmlsaXR5LmF1dGhvcml0eUlkXSkpID8/IFtdKSlcbiAgICB0aGlzLmZpZWxkcyA9IG5ldyBNYXAocHJvZ3JhbVJlY29yZHMuZmxhdE1hcCgocmVjb3JkKSA9PiByZWNvcmQuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5pZCwgZmllbGRdKSkpXG4gICAgdGhpcy5maWVsZFJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbZmllbGQuaWQsIHJlY29yZF0pKSlcbiAgICB0aGlzLnByaXZhdGVGaWVsZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmlkLCBmaWVsZF0pKSlcbiAgICB0aGlzLm1ldGhvZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5tZXRob2RzLm1hcCgobWV0aG9kKSA9PiBbbWV0aG9kLmlkLCBtZXRob2RdKSkpXG4gICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoWy4uLnByb2dyYW1SZWNvcmRzLCAuLi5wcm9ncmFtRnVuY3Rpb25zXS5mbGF0TWFwKChkZWNsYXJhdGlvbikgPT5cbiAgICAgIChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIuaWQsIHBhcmFtZXRlcl0pKSlcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCA9IDBcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZT59ICovXG4gICAgdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gW1xuICAgICAgLi4uKHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgcHJvZ3JhbU1vZHVsZV0pKSxcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmNsYXNzZXMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5lcnJvcnMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi5wcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiAvKiogQHR5cGUge2NvbnN0fSAqLyAoWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBwcm9ncmFtTW9kdWxlXSkpXG4gICAgXSkgPz8gW10pXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLnBhcnRzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgICB0aGlzLnNwYW5zID0gW11cbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICB0aGlzLmxpbmUgPSAxXG4gICAgdGhpcy5jb2x1bW4gPSAxXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFJlcGxhY2VtZW50TmFtZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy51c2VkQmluZGluZ05hbWVzID0gY29sbGVjdEJpbmRpbmdOYW1lcyhtb2R1bGUpXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGVmZmVjdCBleHByZXNzaW9ucyBsb3dlcmVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3VycmVudCBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBleHByZXNzaW9ucyAtIE9yZGVyZWQgZXhwcmVzc2lvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcGxhbkVmZmVjdFJlcGxhY2VtZW50cyhleHByZXNzaW9ucykge1xuICAgIHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcyA9IG5ldyBNYXAoZXhwcmVzc2lvbnMubWFwKChleHByZXNzaW9uKSA9PiBbZXhwcmVzc2lvbiwgdGhpcy5lZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pXSkpXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIGEgY29sbGlzaW9uLXNhZmUgbmFtZSBmb3Igb25lIGRldGVybWluaXN0aWMgZWZmZWN0IHNpdGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEVmZmVjdGZ1bCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgdGVtcG9yYXJ5IG5hbWUuXG4gICAqL1xuICBlZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMuZWZmZWN0VGVtcG9yYXJ5TmFtZXMuZ2V0KGV4cHJlc3Npb24pXG4gICAgaWYgKGtub3duKSByZXR1cm4ga25vd25cbiAgICBjb25zdCBzaXRlID0gdHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCJcbiAgICAgID8gUmVmbGVjdC5nZXQoZXhwcmVzc2lvbiwgXCJlZmZlY3RTaXRlSWRcIikuc2xpY2UoXCJlZmZlY3Q6XCIubGVuZ3RoKSA6IFN0cmluZyh0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNpemUpXG4gICAgbGV0IG5hbWUgPSBgX19zZW1hbnRpZm9sZF9lZmZlY3RfJHtzaXRlfWBcblxuICAgIHdoaWxlICh0aGlzLnVzZWRCaW5kaW5nTmFtZXMuaGFzKG5hbWUpKSBuYW1lID0gYCR7bmFtZX1fYFxuICAgIHRoaXMudXNlZEJpbmRpbmdOYW1lcy5hZGQobmFtZSlcbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNldChleHByZXNzaW9uLCBuYW1lKVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGxhbm5lZCB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgb3V0c2lkZSBpdHMgb3duIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUZW1wb3JhcnkgbmFtZS5cbiAgICovXG4gIGVmZmVjdFJlcGxhY2VtZW50TmFtZShleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0RGVmaW5pdGlvbiA9PT0gZXhwcmVzc2lvbiA/IHVuZGVmaW5lZCA6IHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcy5nZXQoZXhwcmVzc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgZWZmZWN0IGRlZmluaXRpb24gd2l0aG91dCByZWN1cnNpdmVseSByZXBsYWNpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBEZWZpbmVkIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZW1pdCAtIFRhcmdldCBleHByZXNzaW9uIGVtaXR0ZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdEVmZmVjdERlZmluaXRpb24oZXhwcmVzc2lvbiwgZW1pdCkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lZmZlY3REZWZpbml0aW9uXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gZXhwcmVzc2lvblxuICAgIHRyeSB7XG4gICAgICBlbWl0KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gcHJldmlvdXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZW5lcmF0ZWQgY29udGVudCBzbyBmYXIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBjb250ZW50LlxuICAgKi9cbiAgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuam9pbihcIlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgSlNPTiBQb2ludGVyIGZvciBvbmUgdW5hbWJpZ3VvdXMgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgb2NjdXJyZW5jZSBwYXRoLlxuICAgKi9cbiAgb2NjdXJyZW5jZVBhdGgobm9kZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlKS5wYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSB2YWxpZGF0ZWQgbm9taW5hbCBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFNlbWFudGljIHJlY29yZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBSZWNvcmQgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWNvcmQgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgcmVjb3JkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlUG9zaXRpb25dIC0gV2hldGhlciB0aGUgYmluZGluZyBtdXN0IGV4aXN0IGF0IHJ1bnRpbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCByZWNvcmQgc3BlbGxpbmcuXG4gICAqL1xuICByZWNvcmROYW1lRm9ySWQoZGVjbGFyYXRpb25JZCwgdmFsdWVQb3NpdGlvbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IG93bmVyID0gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3QgaW1wb3J0ZWQgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmICghdmFsdWVQb3NpdGlvbiB8fCAhaXRlbS50eXBlT25seSkpXG5cbiAgICBpZiAodGhpcy5wcm9ncmFtICYmIG93bmVyICYmIG93bmVyLmlkICE9IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfTo6JHtyZWNvcmQubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZC5uYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGNsYXNzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBjbGFzc0ZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3Nlcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlbGxpbmcgb2Ygb25lIHJlZmVyZW5jZSBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgY2xhc3MgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBzcGVsbGluZy5cbiAgICovXG4gIGNsYXNzTmFtZUZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3NGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKGltcG9ydGVkICYmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInBocFwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcbiAgICB9XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIG93bmVkLXJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAtIFN0YWJsZSByZXNvdXJjZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb259IFJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcmVzb3VyY2VGb3JJZChyZXNvdXJjZUlkKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlcy5nZXQocmVzb3VyY2VJZClcbiAgICBpZiAoIXJlc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgcmVzb3VyY2UgaWRlbnRpdHkgJyR7cmVzb3VyY2VJZH0nLmApXG4gICAgcmV0dXJuIHJlc291cmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBjYXBhYmlsaXR5IG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbklkIC0gU3RhYmxlIG9wZXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9ufSBPcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqL1xuICBlZmZlY3RPcGVyYXRpb25Gb3JJZChvcGVyYXRpb25JZCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZWZmZWN0T3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uSWQpXG4gICAgaWYgKCFvcGVyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aXR5ICcke29wZXJhdGlvbklkfScuYClcbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFN0YWJsZSBwcml2YXRlLWZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkfSBGaWVsZCBkZWNsYXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGVGaWVsZEZvcklkKGZpZWxkSWQpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMucHJpdmF0ZUZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIGZpZWxkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWNlaXZlciBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RJZCAtIFN0YWJsZSBtZXRob2QgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NZXRob2REZWNsYXJhdGlvbn0gTWV0aG9kIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgbWV0aG9kRm9ySWQobWV0aG9kSWQpIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZHMuZ2V0KG1ldGhvZElkKVxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBtZXRob2QgaWRlbnRpdHkgJyR7bWV0aG9kSWR9Jy5gKVxuXG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyfSBUeXBlIHBhcmFtZXRlci5cbiAgICovXG4gIHR5cGVQYXJhbWV0ZXJGb3JJZChwYXJhbWV0ZXJJZCkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMudHlwZVBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlcklkKVxuXG4gICAgaWYgKCFwYXJhbWV0ZXIpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCB0eXBlIHBhcmFtZXRlciBpZGVudGl0eSAnJHtwYXJhbWV0ZXJJZH0nLmApXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGVkIG5vbWluYWwgZXJyb3IgZGVjbGFyYXRpb24gZm9yIGFuIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RGYWlsdXJlRGVjbGFyYXRpb259IEVycm9yIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgZXJyb3JGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9ycy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZXJyb3IpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlcnJvciBpZGVudGl0eSAnJHtkZWNsYXJhdGlvbklkfScuYClcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC12aXNpYmxlIHNwZWxsaW5nIGZvciBvbmUgbm9taW5hbCBlcnJvciBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldC12aXNpYmxlIG5hbWUuXG4gICAqL1xuICBlcnJvck5hbWVGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yRm9ySWQoZGVjbGFyYXRpb25JZClcbiAgICBjb25zdCBvd25lciA9IHRoaXMuZGVjbGFyYXRpb25Nb2R1bGVzLmdldChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKHRoaXMucHJvZ3JhbSAmJiBvd25lciAmJiBvd25lci5pZCAhPSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSAmJiB0aGlzLmxhbmd1YWdlID09IFwicnVieVwiKSB7XG4gICAgICByZXR1cm4gYCR7bW9kdWxlQ2xhc3NOYW1lKG93bmVyLmlkKX06OiR7ZXJyb3IubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG93bmVyID8gZXJyb3IubmFtZSA6IHRoaXMuY2FwYWJpbGl0eU5vbWluYWxOYW1lKGVycm9yLm5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgbmFtZSBvd25lZCBieSBhIGNvbXBpbGVyLWF1dGhvcml6ZWQgY2FwYWJpbGl0eS5cbiAgICogUEhQIHByb2dyYW0gZW50cmllcyBsaXZlIGluIGEgZ2VuZXJhdGVkIG5hbWVzcGFjZSB3aGlsZSBzdGRsaWIgcHJvdmlkZXIgY2xhc3NlcyByZW1haW5cbiAgICogZ2xvYmFsLCBzbyBQSFAgcHJvZ3JhbSBtb2RlIGZ1bGx5IHF1YWxpZmllcyBjYXBhYmlsaXR5IG5hbWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIG5vbWluYWwgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IHNwZWxsaW5nLlxuICAgKi9cbiAgY2FwYWJpbGl0eU5vbWluYWxOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IGBcXFxcJHtuYW1lfWAgOiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIHJlc29sdmVkIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBSZXNvbHZlZCBjYWxsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQgY2FsbCBuYW1lLlxuICAgKi9cbiAgY2FsbE5hbWVGb3IoZXhwcmVzc2lvbikge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uSWQgPSBleHByZXNzaW9uLnJlc29sdXRpb24/LmRlY2xhcmF0aW9uSWRcbiAgICBjb25zdCBvd25lciA9IGRlY2xhcmF0aW9uSWQgPyB0aGlzLmRlY2xhcmF0aW9uTW9kdWxlcy5nZXQoZGVjbGFyYXRpb25JZCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBpbXBvcnRlZCA9IGRlY2xhcmF0aW9uSWQgPyB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT4gaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIiAmJiAhdGhpcy5wcm9ncmFtICYmIHRoaXMucmVmZXJlbmNlQ2xhc3NFbWlzc2lvbkRlcHRoID4gMCkgcmV0dXJuIGBNYWluLiR7ZXhwcmVzc2lvbi5jYWxsZWV9YFxuICAgIGlmICghZGVjbGFyYXRpb25JZCB8fCAhdGhpcy5wcm9ncmFtIHx8ICFvd25lciB8fCBvd25lci5pZCA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSkgcmV0dXJuIGV4cHJlc3Npb24uY2FsbGVlXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikgcmV0dXJuIGAke21vZHVsZUNsYXNzTmFtZShvd25lci5pZCl9LiR7ZGVjbGFyYXRpb25OYW1lKG93bmVyLCBkZWNsYXJhdGlvbklkKX1gXG4gICAgaWYgKGltcG9ydGVkKSByZXR1cm4gdGhpcy5pbXBvcnROYW1lRm9yKGltcG9ydGVkKVxuXG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uTmFtZShvd25lciwgZGVjbGFyYXRpb25JZClcbiAgfVxuXG4gIC8qKiBNYXJrcyBlbWlzc2lvbiBhcyBvY2N1cnJpbmcgaW5zaWRlIG9uZSB0b3AtbGV2ZWwgcmVmZXJlbmNlIGNsYXNzLiAqL1xuICBiZWdpblJlZmVyZW5jZUNsYXNzRW1pc3Npb24oKSB7XG4gICAgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggKz0gMVxuICB9XG5cbiAgLyoqIEVuZHMgb25lIGJhbGFuY2VkIHRvcC1sZXZlbCByZWZlcmVuY2UtY2xhc3MgZW1pc3Npb24gc2NvcGUuICovXG4gIGVuZFJlZmVyZW5jZUNsYXNzRW1pc3Npb24oKSB7XG4gICAgaWYgKHRoaXMucmVmZXJlbmNlQ2xhc3NFbWlzc2lvbkRlcHRoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVmZXJlbmNlLWNsYXNzIGVtaXNzaW9uIHNjb3BlIGlzIG5vdCBhY3RpdmUuXCIpXG4gICAgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggLT0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC1sb2NhbCBiaW5kaW5nIGZvciBvbmUgcmVzb2x2ZWQgaW1wb3J0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljSW1wb3J0fSBpbXBvcnRlZCAtIFJlc29sdmVkIGltcG9ydC5cbiAgICogQHJldHVybnMge3N0cmluZ30gRW1pdHRlZCBpbXBvcnQgbmFtZS5cbiAgICovXG4gIGltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKClcblxuICAgIGlmICghdGhpcy5wcm9ncmFtIHx8ICFtb2R1bGUpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW1wb3J0IG5hbWVzIHJlcXVpcmUgYSB2YWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cIilcblxuICAgIHJldHVybiBwcm9ncmFtSW1wb3J0TmFtZSh0aGlzLnByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIG9uZSBsb2NhbCBkZWNsYXJhdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgY3VycmVudCBwcm9ncmFtIG1vZHVsZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRlY2xhcmF0aW9uSWQgLSBEZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaXQgaGFzIGEgc2FtZS1uYW1lIHByb2dyYW0gZXhwb3J0LlxuICAgKi9cbiAgaXNEaXJlY3RseUV4cG9ydGVkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSAvKiogQHR5cGUge1BhcnRpYWw8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi8gKHRoaXMubW9kdWxlKVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtb2R1bGUuZXhwb3J0cz8uc29tZSgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmIGl0ZW0uZXhwb3J0ZWROYW1lID09IGRlY2xhcmF0aW9uTmFtZShtb2R1bGUsIGRlY2xhcmF0aW9uSWQpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGV4cG9ydCBlZGdlIHVzZXMgaXRzIGRlY2xhcmF0aW9uJ3MgZW1pdHRlZCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRXhwb3J0fSBleHBvcnRlZCAtIEN1cnJlbnQgZXhwb3J0IGVkZ2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgZWRnZSBpcyByZXByZXNlbnRlZCBieSB0aGUgZGVjbGFyYXRpb24gcHJlZml4LlxuICAgKi9cbiAgaXNEaXJlY3RFeHBvcnQoZXhwb3J0ZWQpIHtcbiAgICByZXR1cm4gZXhwb3J0ZWQuZXhwb3J0ZWROYW1lID09IGRlY2xhcmF0aW9uTmFtZSh0aGlzLm1vZHVsZSwgZXhwb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGxvY2FsIGRlY2xhcmF0aW9uIGhhcyBhbnkgcHVibGljIHByb2dyYW0gZXhwb3J0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZGVjbGFyYXRpb25JZCAtIERlY2xhcmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3J0ZWQuXG4gICAqL1xuICBpc0V4cG9ydGVkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSAvKiogQHR5cGUge1BhcnRpYWw8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi8gKHRoaXMubW9kdWxlKVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtb2R1bGUuZXhwb3J0cz8uc29tZSgoaXRlbSkgPT4gaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIHRoZSBzZWxlY3RlZCBwcm9ncmFtIGVudHJ5IG1vZHVsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB3cml0ZXIgb3ducyB0aGUgc2VsZWN0ZWQgZW50cnkuXG4gICAqL1xuICBpc1Byb2dyYW1FbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtPy5lbnRyeU1vZHVsZSA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBjbGFzcy9tb2R1bGUgc2VnbWVudCBmb3IgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIC0gTG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAgICovXG4gIHByb2dyYW1Nb2R1bGVOYW1lKG1vZHVsZUlkKSB7XG4gICAgaWYgKCF0aGlzLnByb2dyYW0/Lm1vZHVsZXMuc29tZSgoe2lkfSkgPT4gaWQgPT0gbW9kdWxlSWQpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIG1vZHVsZSAnJHttb2R1bGVJZH0nLmApXG5cbiAgICByZXR1cm4gbW9kdWxlQ2xhc3NOYW1lKG1vZHVsZUlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjdXJyZW50IG1vZHVsZSBpbiB0aGUgY29tcGxldGUgcHJvZ3JhbS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IHVuZGVmaW5lZH0gQ3VycmVudCBwcm9ncmFtIG1vZHVsZS5cbiAgICovXG4gICNwcm9ncmFtTW9kdWxlKCkge1xuICAgIGlmICghdGhpcy5wcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtLm1vZHVsZXMuZmluZCgoe2lkfSkgPT4gaWQgPT0gUmVmbGVjdC5nZXQodGhpcy5tb2R1bGUsIFwiaWRcIikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlbGF0aXZlIEVTTS9yZXF1aXJlIHNwZWNpZmllciBmb3IgYSBwbGFubmVkIGRlcGVuZGVuY3kgYXJ0aWZhY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCAtIERlcGVuZGVuY3kgbW9kdWxlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dGVuc2lvbl0gLSBPcHRpb25hbCByZXBsYWNlbWVudCBleHRlbnNpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlbGF0aXZlIFBPU0lYIHNwZWNpZmllci5cbiAgICovXG4gIHJlbGF0aXZlTW9kdWxlU3BlY2lmaWVyKG1vZHVsZUlkLCBleHRlbnNpb24pIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gdGhpcy5wcm9ncmFtUGF0aHM/LmdldChtb2R1bGVJZClcblxuICAgIGlmICghdGFyZ2V0UGF0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gcGxhbm5lZCBtb2R1bGUgcGF0aCAnJHttb2R1bGVJZH0nLmApXG4gICAgY29uc3QgYWRqdXN0ZWRUYXJnZXQgPSBleHRlbnNpb24gPyB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcLlteLi9dKyQvdSwgZXh0ZW5zaW9uKSA6IHRhcmdldFBhdGhcbiAgICBjb25zdCBmcm9tID0gdGhpcy5maWxlbmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpXG4gICAgY29uc3QgdG8gPSBhZGp1c3RlZFRhcmdldC5zcGxpdChcIi9cIilcbiAgICBsZXQgY29tbW9uID0gMFxuXG4gICAgd2hpbGUgKGNvbW1vbiA8IGZyb20ubGVuZ3RoICYmIGNvbW1vbiA8IHRvLmxlbmd0aCAmJiBmcm9tW2NvbW1vbl0gPT0gdG9bY29tbW9uXSkgY29tbW9uKytcbiAgICBjb25zdCByZWxhdGl2ZSA9IFsuLi5mcm9tLnNsaWNlKGNvbW1vbikubWFwKCgpID0+IFwiLi5cIiksIC4uLnRvLnNsaWNlKGNvbW1vbildLmpvaW4oXCIvXCIpXG5cbiAgICByZXR1cm4gcmVsYXRpdmUuc3RhcnRzV2l0aChcIi5cIikgPyByZWxhdGl2ZSA6IGAuLyR7cmVsYXRpdmV9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3RlY3RlZCBuYXRpdmUgZW50cnkgZm9yIG9uZSB1c2VkIHN0ZGxpYiBwcm92aWRlciBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb259IG9wZXJhdGlvbiAtIENhbm9uaWNhbCBvcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IExpbmtlZCBwcm90ZWN0ZWQgZW50cnksIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBvcGVyYXRpb24gc3RheXMgaW5saW5lZC5cbiAgICovXG4gIHN0ZGxpYlByb3ZpZGVyRW50cnlGb3Iob3BlcmF0aW9uKSB7XG4gICAgY29uc3QgbW9kdWxlID0gdGhpcy5lZmZlY3RPcGVyYXRpb25Nb2R1bGVzLmdldChvcGVyYXRpb24uaWQpXG5cbiAgICByZXR1cm4gbW9kdWxlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnN0ZGxpYlByb3ZpZGVyRW50cmllcz8uW2Ake21vZHVsZX1cXHUwMDAwJHtvcGVyYXRpb24ubmFtZX1gXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWxhdGl2ZSBzcGVjaWZpZXIgZm9yIHRoZSBwbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHRlbnNpb25dIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVyUGF0aF0gLSBPbmUgc2VsZWN0ZWQgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVsYXRpdmUgUE9TSVggc3BlY2lmaWVyLlxuICAgKi9cbiAgc3RkbGliUHJvdmlkZXJTcGVjaWZpZXIoZXh0ZW5zaW9uLCBwcm92aWRlclBhdGgpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcHJvdmlkZXJQYXRoID8/IHRoaXMuc3RkbGliUHJvdmlkZXJQYXRoID8/IHRoaXMuc3RkbGliUHJvdmlkZXJQYXRocz8uWzBdXG5cbiAgICBpZiAoIXRhcmdldFBhdGgpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBzdGRsaWIgcHJvdmlkZXIgc3BlY2lmaWVyIHJlcXVpcmVzIGEgcGxhbm5lZCBwcm92aWRlciBwYXRoLlwiKVxuICAgIGNvbnN0IGFkanVzdGVkVGFyZ2V0ID0gZXh0ZW5zaW9uID8gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC5bXi4vXSskL3UsIGV4dGVuc2lvbikgOiB0YXJnZXRQYXRoXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuZmlsZW5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKVxuICAgIGNvbnN0IHRvID0gYWRqdXN0ZWRUYXJnZXQuc3BsaXQoXCIvXCIpXG4gICAgbGV0IGNvbW1vbiA9IDBcblxuICAgIHdoaWxlIChjb21tb24gPCBmcm9tLmxlbmd0aCAmJiBjb21tb24gPCB0by5sZW5ndGggJiYgZnJvbVtjb21tb25dID09IHRvW2NvbW1vbl0pIGNvbW1vbisrXG4gICAgY29uc3QgcmVsYXRpdmUgPSBbLi4uZnJvbS5zbGljZShjb21tb24pLm1hcCgoKSA9PiBcIi4uXCIpLCAuLi50by5zbGljZShjb21tb24pXS5qb2luKFwiL1wiKVxuXG4gICAgcmV0dXJuIHJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuXCIpID8gcmVsYXRpdmUgOiBgLi8ke3JlbGF0aXZlfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFNlbWFudGljIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRmllbGR9IFJlY29yZCBmaWVsZC5cbiAgICovXG4gIGZpZWxkRm9ySWQoZmllbGRJZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZ2V0KGZpZWxkSWQpXG5cbiAgICBpZiAoIWZpZWxkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgZmllbGQgaWRlbnRpdHkgJyR7ZmllbGRJZH0nLmApXG5cbiAgICByZXR1cm4gZmllbGRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVjb3JkIGRlY2xhcmF0aW9uIHRoYXQgb3ducyBhIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkSWQgLSBTZW1hbnRpYyBmaWVsZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBPd25pbmcgcmVjb3JkLlxuICAgKi9cbiAgcmVjb3JkRm9yRmllbGRJZChmaWVsZElkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5maWVsZFJlY29yZHMuZ2V0KGZpZWxkSWQpXG5cbiAgICBpZiAoIXJlY29yZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIHJlY29yZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=