semantifold 0.3.0 → 0.5.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 (303) hide show
  1. package/README.md +61 -15
  2. package/build/index.d.ts +52 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +60 -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/android.d.ts +49 -0
  11. package/build/src/backends/android.d.ts.map +1 -0
  12. package/build/src/backends/android.js +1274 -0
  13. package/build/src/backends/c-validation.d.ts.map +1 -1
  14. package/build/src/backends/c-validation.js +7 -3
  15. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  16. package/build/src/backends/cpp-validation.js +7 -3
  17. package/build/src/backends/csharp.js +7 -1
  18. package/build/src/backends/dart-runtime.d.ts +2 -0
  19. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  20. package/build/src/backends/dart-runtime.js +41 -0
  21. package/build/src/backends/dart.d.ts +20 -0
  22. package/build/src/backends/dart.d.ts.map +1 -0
  23. package/build/src/backends/dart.js +321 -0
  24. package/build/src/backends/effects.d.ts +60 -0
  25. package/build/src/backends/effects.d.ts.map +1 -0
  26. package/build/src/backends/effects.js +746 -0
  27. package/build/src/backends/go.js +18 -4
  28. package/build/src/backends/identifiers.d.ts +36 -4
  29. package/build/src/backends/identifiers.d.ts.map +1 -1
  30. package/build/src/backends/identifiers.js +160 -10
  31. package/build/src/backends/index.d.ts.map +1 -1
  32. package/build/src/backends/index.js +27 -4
  33. package/build/src/backends/ios.d.ts +68 -0
  34. package/build/src/backends/ios.d.ts.map +1 -0
  35. package/build/src/backends/ios.js +1503 -0
  36. package/build/src/backends/java.d.ts.map +1 -1
  37. package/build/src/backends/java.js +429 -36
  38. package/build/src/backends/javascript.d.ts +6 -0
  39. package/build/src/backends/javascript.d.ts.map +1 -1
  40. package/build/src/backends/javascript.js +380 -24
  41. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  42. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  43. package/build/src/backends/kotlin-runtime.js +29 -0
  44. package/build/src/backends/kotlin.d.ts +33 -0
  45. package/build/src/backends/kotlin.d.ts.map +1 -0
  46. package/build/src/backends/kotlin.js +138 -0
  47. package/build/src/backends/native-validation.d.ts +2 -2
  48. package/build/src/backends/native-validation.d.ts.map +1 -1
  49. package/build/src/backends/native-validation.js +2 -2
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  51. package/build/src/backends/ordered-expressions.js +39 -7
  52. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  53. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  54. package/build/src/backends/php-stdlib-support.js +227 -0
  55. package/build/src/backends/php.d.ts.map +1 -1
  56. package/build/src/backends/php.js +448 -33
  57. package/build/src/backends/program.d.ts +83 -0
  58. package/build/src/backends/program.d.ts.map +1 -0
  59. package/build/src/backends/program.js +1309 -0
  60. package/build/src/backends/python.js +7 -1
  61. package/build/src/backends/ruby.d.ts.map +1 -1
  62. package/build/src/backends/ruby.js +310 -24
  63. package/build/src/backends/rust-runtime.d.ts +7 -0
  64. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  65. package/build/src/backends/rust-runtime.js +32 -0
  66. package/build/src/backends/rust-validation.d.ts +9 -0
  67. package/build/src/backends/rust-validation.d.ts.map +1 -0
  68. package/build/src/backends/rust-validation.js +78 -0
  69. package/build/src/backends/rust.d.ts +24 -0
  70. package/build/src/backends/rust.d.ts.map +1 -0
  71. package/build/src/backends/rust.js +344 -0
  72. package/build/src/backends/scalars.d.ts +14 -6
  73. package/build/src/backends/scalars.d.ts.map +1 -1
  74. package/build/src/backends/scalars.js +167 -17
  75. package/build/src/backends/shared.d.ts +23 -4
  76. package/build/src/backends/shared.d.ts.map +1 -1
  77. package/build/src/backends/shared.js +2174 -62
  78. package/build/src/backends/stdlib-support.d.ts +14 -0
  79. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  80. package/build/src/backends/stdlib-support.js +237 -0
  81. package/build/src/backends/swift-runtime.d.ts +3 -0
  82. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  83. package/build/src/backends/swift-runtime.js +14 -0
  84. package/build/src/backends/swift.d.ts +8 -0
  85. package/build/src/backends/swift.d.ts.map +1 -0
  86. package/build/src/backends/swift.js +127 -0
  87. package/build/src/backends/typescript.d.ts.map +1 -1
  88. package/build/src/backends/typescript.js +344 -24
  89. package/build/src/backends/wasm.d.ts +43 -0
  90. package/build/src/backends/wasm.d.ts.map +1 -0
  91. package/build/src/backends/wasm.js +2164 -0
  92. package/build/src/backends/writer.d.ts +255 -4
  93. package/build/src/backends/writer.d.ts.map +1 -1
  94. package/build/src/backends/writer.js +491 -3
  95. package/build/src/diagnostic.d.ts +4 -3
  96. package/build/src/diagnostic.d.ts.map +1 -1
  97. package/build/src/diagnostic.js +5 -3
  98. package/build/src/frontends/c.d.ts.map +1 -1
  99. package/build/src/frontends/c.js +5 -3
  100. package/build/src/frontends/cpp.d.ts.map +1 -1
  101. package/build/src/frontends/cpp.js +5 -3
  102. package/build/src/frontends/csharp.d.ts.map +1 -1
  103. package/build/src/frontends/csharp.js +7 -3
  104. package/build/src/frontends/dart.d.ts +10 -0
  105. package/build/src/frontends/dart.d.ts.map +1 -0
  106. package/build/src/frontends/dart.js +913 -0
  107. package/build/src/frontends/index.d.ts +3 -1
  108. package/build/src/frontends/index.d.ts.map +1 -1
  109. package/build/src/frontends/index.js +15 -5
  110. package/build/src/frontends/java.d.ts +110 -1
  111. package/build/src/frontends/java.d.ts.map +1 -1
  112. package/build/src/frontends/java.js +1725 -70
  113. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  114. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  115. package/build/src/frontends/javascript-typescript.js +1825 -93
  116. package/build/src/frontends/kotlin.d.ts +10 -0
  117. package/build/src/frontends/kotlin.d.ts.map +1 -0
  118. package/build/src/frontends/kotlin.js +685 -0
  119. package/build/src/frontends/php.d.ts +118 -1
  120. package/build/src/frontends/php.d.ts.map +1 -1
  121. package/build/src/frontends/php.js +1583 -76
  122. package/build/src/frontends/program.d.ts +74 -0
  123. package/build/src/frontends/program.d.ts.map +1 -0
  124. package/build/src/frontends/program.js +989 -0
  125. package/build/src/frontends/ruby.d.ts +68 -1
  126. package/build/src/frontends/ruby.d.ts.map +1 -1
  127. package/build/src/frontends/ruby.js +1446 -101
  128. package/build/src/frontends/rust-parser.d.ts +11 -0
  129. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  130. package/build/src/frontends/rust-parser.js +15 -0
  131. package/build/src/frontends/rust.d.ts +14 -0
  132. package/build/src/frontends/rust.d.ts.map +1 -0
  133. package/build/src/frontends/rust.js +715 -0
  134. package/build/src/frontends/scalars.d.ts +10 -0
  135. package/build/src/frontends/scalars.d.ts.map +1 -1
  136. package/build/src/frontends/scalars.js +28 -2
  137. package/build/src/frontends/swift.d.ts +10 -0
  138. package/build/src/frontends/swift.d.ts.map +1 -0
  139. package/build/src/frontends/swift.js +860 -0
  140. package/build/src/frontends/types.d.ts +186 -0
  141. package/build/src/frontends/types.d.ts.map +1 -0
  142. package/build/src/frontends/types.js +634 -0
  143. package/build/src/language-registry.d.ts +46 -4
  144. package/build/src/language-registry.d.ts.map +1 -1
  145. package/build/src/language-registry.js +177 -13
  146. package/build/src/mapping.d.ts +2 -2
  147. package/build/src/mapping.d.ts.map +1 -1
  148. package/build/src/mapping.js +31 -10
  149. package/build/src/semantic/capabilities.d.ts +66 -0
  150. package/build/src/semantic/capabilities.d.ts.map +1 -0
  151. package/build/src/semantic/capabilities.js +649 -0
  152. package/build/src/semantic/effects.d.ts +26 -0
  153. package/build/src/semantic/effects.d.ts.map +1 -0
  154. package/build/src/semantic/effects.js +764 -0
  155. package/build/src/semantic/generics.d.ts +23 -0
  156. package/build/src/semantic/generics.d.ts.map +1 -0
  157. package/build/src/semantic/generics.js +61 -0
  158. package/build/src/semantic/lifetime.d.ts +37 -0
  159. package/build/src/semantic/lifetime.d.ts.map +1 -0
  160. package/build/src/semantic/lifetime.js +527 -0
  161. package/build/src/semantic/provenance.d.ts +9 -2
  162. package/build/src/semantic/provenance.d.ts.map +1 -1
  163. package/build/src/semantic/provenance.js +462 -20
  164. package/build/src/semantic/scalars.d.ts +11 -0
  165. package/build/src/semantic/scalars.d.ts.map +1 -1
  166. package/build/src/semantic/scalars.js +16 -1
  167. package/build/src/semantic/stdlib.d.ts +254 -0
  168. package/build/src/semantic/stdlib.d.ts.map +1 -0
  169. package/build/src/semantic/stdlib.js +880 -0
  170. package/build/src/semantic/types.d.ts +3108 -178
  171. package/build/src/semantic/types.d.ts.map +1 -1
  172. package/build/src/semantic/types.js +730 -15
  173. package/build/src/semantic/validate.d.ts +85 -5
  174. package/build/src/semantic/validate.d.ts.map +1 -1
  175. package/build/src/semantic/validate.js +2576 -98
  176. package/build/src/stdlib-facades.d.ts +304 -0
  177. package/build/src/stdlib-facades.d.ts.map +1 -0
  178. package/build/src/stdlib-facades.js +1167 -0
  179. package/build/src/stdlib-negotiation.d.ts +69 -0
  180. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  181. package/build/src/stdlib-negotiation.js +403 -0
  182. package/build/src/stdlib-providers.d.ts +72 -0
  183. package/build/src/stdlib-providers.d.ts.map +1 -0
  184. package/build/src/stdlib-providers.js +339 -0
  185. package/build/src/toolchains.d.ts +55 -1
  186. package/build/src/toolchains.d.ts.map +1 -1
  187. package/build/src/toolchains.js +15 -4
  188. package/docs/android.md +79 -0
  189. package/docs/architecture.md +47 -13
  190. package/docs/dart.md +60 -0
  191. package/docs/goals.md +3 -3
  192. package/docs/ios.md +121 -0
  193. package/docs/kotlin.md +42 -0
  194. package/docs/language-support.md +238 -26
  195. package/docs/multi-file-modules.md +52 -0
  196. package/docs/parser-qualification.md +121 -8
  197. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  198. package/docs/rust.md +88 -0
  199. package/docs/source-maps.md +17 -7
  200. package/docs/specification.md +5 -0
  201. package/docs/standard-library-portability.md +39 -8
  202. package/docs/swift.md +44 -0
  203. package/docs/testing.md +381 -4
  204. package/docs/webassembly.md +52 -0
  205. package/index.js +66 -8
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  236. package/package.json +5 -2
  237. package/src/artifact-path.js +47 -2
  238. package/src/artifacts.js +67 -0
  239. package/src/backends/android.js +1370 -0
  240. package/src/backends/c-validation.js +6 -1
  241. package/src/backends/cpp-validation.js +6 -1
  242. package/src/backends/csharp.js +3 -0
  243. package/src/backends/dart-runtime.js +41 -0
  244. package/src/backends/dart.js +326 -0
  245. package/src/backends/effects.js +705 -0
  246. package/src/backends/go.js +14 -2
  247. package/src/backends/identifiers.js +166 -9
  248. package/src/backends/index.js +27 -2
  249. package/src/backends/ios.js +1612 -0
  250. package/src/backends/java.js +454 -36
  251. package/src/backends/javascript.js +389 -23
  252. package/src/backends/kotlin-runtime.js +29 -0
  253. package/src/backends/kotlin.js +144 -0
  254. package/src/backends/native-validation.js +1 -1
  255. package/src/backends/ordered-expressions.js +40 -6
  256. package/src/backends/php-stdlib-support.js +239 -0
  257. package/src/backends/php.js +469 -32
  258. package/src/backends/program.js +1408 -0
  259. package/src/backends/python.js +3 -0
  260. package/src/backends/ruby.js +326 -23
  261. package/src/backends/rust-runtime.js +34 -0
  262. package/src/backends/rust-validation.js +75 -0
  263. package/src/backends/rust.js +335 -0
  264. package/src/backends/scalars.js +141 -16
  265. package/src/backends/shared.js +2314 -115
  266. package/src/backends/stdlib-support.js +234 -0
  267. package/src/backends/swift-runtime.js +14 -0
  268. package/src/backends/swift.js +132 -0
  269. package/src/backends/typescript.js +349 -23
  270. package/src/backends/wasm.js +2208 -0
  271. package/src/backends/writer.js +545 -2
  272. package/src/diagnostic.js +4 -2
  273. package/src/frontends/c.js +4 -2
  274. package/src/frontends/cpp.js +4 -2
  275. package/src/frontends/csharp.js +4 -2
  276. package/src/frontends/dart.js +963 -0
  277. package/src/frontends/index.js +14 -4
  278. package/src/frontends/java.js +1977 -69
  279. package/src/frontends/javascript-typescript.js +2046 -102
  280. package/src/frontends/kotlin.js +713 -0
  281. package/src/frontends/php.js +1725 -79
  282. package/src/frontends/program.js +1062 -0
  283. package/src/frontends/ruby.js +1624 -98
  284. package/src/frontends/rust-parser.js +18 -0
  285. package/src/frontends/rust.js +714 -0
  286. package/src/frontends/scalars.js +31 -1
  287. package/src/frontends/swift.js +893 -0
  288. package/src/frontends/types.js +750 -0
  289. package/src/language-registry.js +182 -12
  290. package/src/mapping.js +33 -9
  291. package/src/semantic/capabilities.js +671 -0
  292. package/src/semantic/effects.js +737 -0
  293. package/src/semantic/generics.js +58 -0
  294. package/src/semantic/lifetime.js +517 -0
  295. package/src/semantic/provenance.js +412 -19
  296. package/src/semantic/scalars.js +17 -0
  297. package/src/semantic/stdlib.js +921 -0
  298. package/src/semantic/types.js +810 -14
  299. package/src/semantic/validate.js +2934 -209
  300. package/src/stdlib-facades.js +1211 -0
  301. package/src/stdlib-negotiation.js +446 -0
  302. package/src/stdlib-providers.js +377 -0
  303. package/src/toolchains.js +16 -3
@@ -2,16 +2,27 @@
2
2
  import { isDenseArray } from "./array.js";
3
3
  import { SemantifoldDiagnostic, unsupportedRole } from "./diagnostic.js";
4
4
  import { generateJava } from "./backends/java.js";
5
+ import { generateKotlin } from "./backends/kotlin.js";
5
6
  import { generateCSharpProject } from "./backends/csharp.js";
6
7
  import { generateGoModule } from "./backends/go.js";
8
+ import { generateRustProject } from "./backends/rust.js";
9
+ import { generateSwift } from "./backends/swift.js";
10
+ import { generateDartPackage } from "./backends/dart.js";
7
11
  import { generateJavaScript } from "./backends/javascript.js";
8
12
  import { generatePhp } from "./backends/php.js";
9
13
  import { generatePython } from "./backends/python.js";
10
14
  import { generateRuby } from "./backends/ruby.js";
11
15
  import { generateTypeScript } from "./backends/typescript.js";
16
+ import { generateBrowserWasm } from "./backends/wasm.js";
17
+ import { generateIosApplication } from "./backends/ios.js";
18
+ import { generateAndroidApplication } from "./backends/android.js";
12
19
  import { parseJava } from "./frontends/java.js";
20
+ import { parseKotlin } from "./frontends/kotlin.js";
13
21
  import { parseCSharp } from "./frontends/csharp.js";
14
22
  import { parseGo } from "./frontends/go.js";
23
+ import { parseRust } from "./frontends/rust.js";
24
+ import { parseSwift } from "./frontends/swift.js";
25
+ import { parseDart } from "./frontends/dart.js";
15
26
  import { parseCpp } from "./frontends/cpp.js";
16
27
  import { generateCpp } from "./backends/cpp.js";
17
28
  import { parseC } from "./frontends/c.js";
@@ -25,20 +36,33 @@ const acceptanceStageOrder = ["parse", "generate", "restore", "compile", "link",
25
36
  const acceptanceStages = new Map(acceptanceStageOrder.map((stage, index) => [stage, index]));
26
37
  const registryKeys = new Set([
27
38
  "acceptance", "applicationBackend", "artifactMultiplicity", "binaryBackend", "defaultFilename", "frontend", "id",
28
- "interoperability", "mapping", "mediaType", "roundTrip", "textBackend"
39
+ "features", "interoperability", "mapping", "mediaType", "provider", "roundTrip", "textBackend"
29
40
  ]);
30
41
  /** @typedef {"frontend" | "textBackend" | "binaryBackend" | "applicationBackend" | "interoperability"} RegistryRole */
31
- /** @typedef {(input: {filename: string, source: string}) => import("./semantic/types.js").SemanticModule} Frontend */
32
42
  /** @typedef {(...values: unknown[]) => unknown} RegistryImplementation */
43
+ /**
44
+ * @typedef FrontendInput
45
+ * @property {readonly import("./semantic/types.js").EffectCapabilityDeclaration[]} [capabilities] - Compiler-authorized declarations.
46
+ * @property {string} filename - Source filename.
47
+ * @property {string} source - Source text.
48
+ * @property {{isEntry: boolean, functions: Map<string, import("./semantic/types.js").FunctionDeclaration>, records: Map<string, import("./semantic/types.js").RecordDeclaration>, errors?: Map<string, import("./semantic/types.js").ErrorDeclaration>, valueRecords?: Map<string, import("./semantic/types.js").RecordDeclaration>}} [program] - Program conversion context.
49
+ */
50
+ /**
51
+ * @callback Frontend
52
+ * @param {FrontendInput} input - Frontend request.
53
+ * @returns {import("./semantic/types.js").SemanticModule} Semantic module.
54
+ */
33
55
  /**
34
56
  * @typedef LanguageRegistryRecord
35
57
  * @property {string} id - Stable identity.
36
58
  * @property {{stages: import("./semantic/types.js").AcceptanceStage[], toolchains: string[]}} acceptance - Acceptance declaration.
37
59
  * @property {"single" | "multiple"} artifactMultiplicity - Artifact multiplicity.
60
+ * @property {import("./semantic/types.js").LanguageFeatureCapabilities} features - Semantic feature capabilities.
38
61
  * @property {import("./semantic/types.js").LanguageMappingCapabilities} mapping - Mapping capabilities.
39
62
  * @property {boolean} roundTrip - Round-trip declaration.
40
63
  * @property {string} [defaultFilename] - Default backend filename.
41
64
  * @property {string} [mediaType] - Default backend media type.
65
+ * @property {boolean} [provider] - Target host stdlib provider/native-binding role.
42
66
  * @property {RegistryImplementation} [frontend] - Frontend adapter.
43
67
  * @property {RegistryImplementation} [textBackend] - Text backend.
44
68
  * @property {RegistryImplementation} [binaryBackend] - Binary backend.
@@ -76,6 +100,9 @@ export function createLanguageRegistry(candidateRecords) {
76
100
  invalidRegistry(`Duplicate registry ID '${id}'.`, id);
77
101
  if (Object.keys(candidate).some((key) => !registryKeys.has(key)))
78
102
  invalidRegistry(`Registry record '${id}' has unknown fields.`, id);
103
+ if (candidate.provider !== undefined && typeof candidate.provider != "boolean") {
104
+ invalidRegistry(`Registry record '${id}' declares an invalid provider role.`, id);
105
+ }
79
106
  for (const role of registryRoles) {
80
107
  if (candidate[role] !== undefined && typeof candidate[role] != "function") {
81
108
  invalidRegistry(`Registry role '${role}' for '${id}' must be a function when present.`, id);
@@ -87,6 +114,47 @@ export function createLanguageRegistry(candidateRecords) {
87
114
  }
88
115
  if (typeof candidate.roundTrip != "boolean")
89
116
  invalidRegistry(`Registry record '${id}' requires a Boolean round-trip declaration.`, id);
117
+ const featuresCandidate = candidate.features ?? {
118
+ closedRecords: false,
119
+ conditionControlledLoops: false,
120
+ effectfulCapabilitiesAndResources: false,
121
+ generalFunctionsAndCalls: false,
122
+ immutableCollections: false,
123
+ optionalValues: false,
124
+ orderedListIteration: false,
125
+ orderedMapIteration: false,
126
+ referenceClasses: false,
127
+ typedErrors: false,
128
+ typeParametersAndGenerics: false
129
+ };
130
+ if (!isPlainObject(featuresCandidate) ||
131
+ Object.keys(featuresCandidate).sort().join(",") != "closedRecords,conditionControlledLoops,effectfulCapabilitiesAndResources,generalFunctionsAndCalls,immutableCollections,optionalValues,orderedListIteration,orderedMapIteration,referenceClasses,typeParametersAndGenerics,typedErrors" ||
132
+ typeof featuresCandidate.closedRecords != "boolean" ||
133
+ typeof featuresCandidate.conditionControlledLoops != "boolean" ||
134
+ typeof featuresCandidate.effectfulCapabilitiesAndResources != "boolean" ||
135
+ typeof featuresCandidate.generalFunctionsAndCalls != "boolean" ||
136
+ typeof featuresCandidate.immutableCollections != "boolean" ||
137
+ typeof featuresCandidate.optionalValues != "boolean" ||
138
+ typeof featuresCandidate.orderedListIteration != "boolean" ||
139
+ typeof featuresCandidate.orderedMapIteration != "boolean" ||
140
+ typeof featuresCandidate.referenceClasses != "boolean" ||
141
+ typeof featuresCandidate.typedErrors != "boolean" ||
142
+ typeof featuresCandidate.typeParametersAndGenerics != "boolean") {
143
+ invalidRegistry(`Registry record '${id}' has an invalid feature declaration.`, id);
144
+ }
145
+ const features = deepFreeze(/** @type {import("./semantic/types.js").LanguageFeatureCapabilities} */ ({
146
+ closedRecords: featuresCandidate.closedRecords,
147
+ conditionControlledLoops: featuresCandidate.conditionControlledLoops,
148
+ effectfulCapabilitiesAndResources: featuresCandidate.effectfulCapabilitiesAndResources,
149
+ generalFunctionsAndCalls: featuresCandidate.generalFunctionsAndCalls,
150
+ immutableCollections: featuresCandidate.immutableCollections,
151
+ optionalValues: featuresCandidate.optionalValues,
152
+ orderedListIteration: featuresCandidate.orderedListIteration,
153
+ orderedMapIteration: featuresCandidate.orderedMapIteration,
154
+ referenceClasses: featuresCandidate.referenceClasses,
155
+ typedErrors: featuresCandidate.typedErrors,
156
+ typeParametersAndGenerics: featuresCandidate.typeParametersAndGenerics
157
+ }));
90
158
  const mappingCandidate = candidate.mapping;
91
159
  if (!isPlainObject(mappingCandidate))
92
160
  invalidRegistry(`Registry record '${id}' has an invalid mapping declaration.`, id);
@@ -138,7 +206,7 @@ export function createLanguageRegistry(candidateRecords) {
138
206
  const hasBinaryBackend = typeof candidate.binaryBackend == "function";
139
207
  const hasApplicationBackend = typeof candidate.applicationBackend == "function";
140
208
  const hasBackend = hasTextBackend || hasBinaryBackend || hasApplicationBackend;
141
- if ((mapping.richText || mapping.sourceMapV3) && !hasTextBackend ||
209
+ if ((mapping.richText || mapping.sourceMapV3 || mapping.binaryRanges) && !hasBackend ||
142
210
  mapping.sourceMapV3 && !mapping.richText ||
143
211
  mapping.binaryRanges && !hasBinaryBackend && !hasApplicationBackend) {
144
212
  invalidRegistry(`Registry record '${id}' declares mapping support without its required backend role.`, id);
@@ -149,11 +217,12 @@ export function createLanguageRegistry(candidateRecords) {
149
217
  if (stages.includes("parse") && !hasFrontend || stages.includes("generate") && !hasBackend) {
150
218
  invalidRegistry(`Registry record '${id}' declares an acceptance stage without its required role.`, id);
151
219
  }
152
- if ((hasBackend || candidate.defaultFilename !== undefined) &&
220
+ const hasDefaultedBackend = hasTextBackend || hasBinaryBackend;
221
+ if ((hasDefaultedBackend || candidate.defaultFilename !== undefined) &&
153
222
  (typeof candidate.defaultFilename != "string" || candidate.defaultFilename.length == 0)) {
154
223
  invalidRegistry(`Registry backend '${id}' requires a default filename.`, id);
155
224
  }
156
- if ((hasBackend || candidate.mediaType !== undefined) &&
225
+ if ((hasDefaultedBackend || candidate.mediaType !== undefined) &&
157
226
  (typeof candidate.mediaType != "string" || candidate.mediaType.length == 0)) {
158
227
  invalidRegistry(`Registry backend '${id}' requires a media type.`, id);
159
228
  }
@@ -164,11 +233,13 @@ export function createLanguageRegistry(candidateRecords) {
164
233
  const record = deepFreeze(/** @type {LanguageRegistryRecord} */ ({
165
234
  acceptance,
166
235
  artifactMultiplicity,
236
+ features,
167
237
  id,
168
238
  mapping,
169
239
  roundTrip: candidate.roundTrip,
170
240
  ...(typeof candidate.defaultFilename == "string" ? { defaultFilename: candidate.defaultFilename } : {}),
171
241
  ...(typeof candidate.mediaType == "string" ? { mediaType: candidate.mediaType } : {}),
242
+ ...(typeof candidate.provider == "boolean" ? { provider: candidate.provider } : {}),
172
243
  ...(typeof candidate.frontend == "function" ? { frontend: candidate.frontend } : {}),
173
244
  ...(typeof candidate.textBackend == "function" ? { textBackend: candidate.textBackend } : {}),
174
245
  ...(typeof candidate.binaryBackend == "function" ? { binaryBackend: candidate.binaryBackend } : {}),
@@ -178,6 +249,7 @@ export function createLanguageRegistry(candidateRecords) {
178
249
  const descriptor = deepFreeze(/** @type {import("./semantic/types.js").LanguageCapabilities} */ ({
179
250
  acceptance,
180
251
  artifactMultiplicity,
252
+ features,
181
253
  id,
182
254
  mapping,
183
255
  roles: {
@@ -185,6 +257,7 @@ export function createLanguageRegistry(candidateRecords) {
185
257
  binaryBackend: typeof candidate.binaryBackend == "function",
186
258
  frontend: typeof candidate.frontend == "function",
187
259
  interoperability: typeof candidate.interoperability == "function",
260
+ provider: candidate.provider === true,
188
261
  textBackend: typeof candidate.textBackend == "function"
189
262
  },
190
263
  roundTrip: candidate.roundTrip
@@ -220,27 +293,32 @@ export function createLanguageRegistry(candidateRecords) {
220
293
  * PHP registry frontend wrapper.
221
294
  * @type {Frontend}
222
295
  */
223
- const phpFrontend = ({ filename, source }) => parsePhp({ filename, source });
296
+ const phpFrontend = ({ capabilities, filename, program, source }) => parsePhp({ capabilities, filename, program, source });
224
297
  /**
225
298
  * Ruby registry frontend wrapper.
226
299
  * @type {Frontend}
227
300
  */
228
- const rubyFrontend = ({ filename, source }) => parseRuby({ filename, source });
301
+ const rubyFrontend = ({ capabilities, filename, program, source }) => parseRuby({ capabilities, filename, program, source });
229
302
  /**
230
303
  * JavaScript registry frontend wrapper.
231
304
  * @type {Frontend}
232
305
  */
233
- const javaScriptFrontend = ({ filename, source }) => parseJavaScriptTypeScript({ filename, language: "javascript", source });
306
+ const javaScriptFrontend = ({ capabilities, filename, program, source }) => parseJavaScriptTypeScript({ capabilities, filename, language: "javascript", program, source });
234
307
  /**
235
308
  * TypeScript registry frontend wrapper.
236
309
  * @type {Frontend}
237
310
  */
238
- const typeScriptFrontend = ({ filename, source }) => parseJavaScriptTypeScript({ filename, language: "typescript", source });
311
+ const typeScriptFrontend = ({ capabilities, filename, program, source }) => parseJavaScriptTypeScript({ capabilities, filename, language: "typescript", program, source });
239
312
  /**
240
313
  * Java registry frontend wrapper.
241
314
  * @type {Frontend}
242
315
  */
243
- const javaFrontend = ({ filename, source }) => parseJava({ filename, source });
316
+ const javaFrontend = ({ capabilities, filename, program, source }) => parseJava({ capabilities, filename, program, source });
317
+ /**
318
+ * Kotlin registry frontend wrapper.
319
+ * @type {Frontend}
320
+ */
321
+ const kotlinFrontend = ({ filename, source }) => parseKotlin({ filename, source });
244
322
  /**
245
323
  * Python registry frontend wrapper.
246
324
  * @type {Frontend}
@@ -256,9 +334,14 @@ const csharpFrontend = ({ filename, source }) => parseCSharp({ filename, source
256
334
  * @type {Frontend}
257
335
  */
258
336
  const goFrontend = ({ filename, source }) => parseGo({ filename, source });
337
+ /**
338
+ * Dart registry frontend wrapper.
339
+ * @type {Frontend}
340
+ */
341
+ const dartFrontend = ({ filename, source }) => parseDart({ filename, source });
259
342
  const records = [
260
343
  language({
261
- acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["php"] },
344
+ acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["php82"] },
262
345
  defaultFilename: "program.php",
263
346
  frontend: phpFrontend,
264
347
  id: "php",
@@ -297,6 +380,14 @@ const records = [
297
380
  mediaType: "text/x-java-source",
298
381
  textBackend: generateJava
299
382
  }),
383
+ language({
384
+ acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["kotlinc", "java25"] },
385
+ defaultFilename: "Program.kt",
386
+ frontend: kotlinFrontend,
387
+ id: "kotlin",
388
+ mediaType: "text/x-kotlin",
389
+ textBackend: generateKotlin
390
+ }),
300
391
  language({
301
392
  acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["python"] },
302
393
  defaultFilename: "program.py",
@@ -335,7 +426,66 @@ const records = [
335
426
  language({
336
427
  acceptance: { stages: ["parse", "generate", "compile", "link", "execute"], toolchains: ["clangpp"] },
337
428
  defaultFilename: "program.cpp", frontend: parseCpp, id: "cpp", mediaType: "text/x-c++src", textBackend: generateCpp
338
- })
429
+ }),
430
+ language({
431
+ acceptance: { stages: ["parse", "generate", "compile", "validate", "execute"], toolchains: ["rustc", "cargo"] },
432
+ artifactMultiplicity: "multiple",
433
+ defaultFilename: "src/main.rs", frontend: parseRust, id: "rust", mediaType: "text/x-rust", textBackend: generateRustProject
434
+ }),
435
+ language({ acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["swiftc"] },
436
+ defaultFilename: "program.swift", frontend: parseSwift, id: "swift", mediaType: "text/x-swift", textBackend: generateSwift }),
437
+ language({
438
+ acceptance: { stages: ["parse", "generate", "restore", "compile", "validate", "execute"], toolchains: ["dart"] },
439
+ artifactMultiplicity: "multiple",
440
+ defaultFilename: "bin/program.dart",
441
+ features: {
442
+ closedRecords: false,
443
+ conditionControlledLoops: false,
444
+ effectfulCapabilitiesAndResources: false,
445
+ generalFunctionsAndCalls: true,
446
+ immutableCollections: false,
447
+ optionalValues: false,
448
+ orderedListIteration: false,
449
+ orderedMapIteration: false,
450
+ referenceClasses: false,
451
+ typedErrors: false,
452
+ typeParametersAndGenerics: false
453
+ },
454
+ frontend: dartFrontend,
455
+ id: "dart",
456
+ mediaType: "text/x-dart",
457
+ textBackend: generateDartPackage
458
+ }),
459
+ {
460
+ acceptance: { stages: ["generate", "validate", "instantiate", "execute"], toolchains: ["wasm-validate", "node", "chromium"] },
461
+ applicationBackend: generateBrowserWasm,
462
+ artifactMultiplicity: "multiple",
463
+ binaryBackend: generateBrowserWasm,
464
+ defaultFilename: "program.wasm",
465
+ features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
466
+ id: "wasm",
467
+ mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
468
+ mediaType: "application/wasm",
469
+ roundTrip: false
470
+ },
471
+ {
472
+ acceptance: { stages: ["generate", "compile", "validate", "instantiate", "execute"], toolchains: ["android"] },
473
+ applicationBackend: generateAndroidApplication,
474
+ artifactMultiplicity: "multiple",
475
+ features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
476
+ id: "android",
477
+ mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
478
+ roundTrip: false
479
+ },
480
+ {
481
+ acceptance: { stages: ["generate"], toolchains: [] },
482
+ applicationBackend: generateIosApplication,
483
+ artifactMultiplicity: "multiple",
484
+ features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
485
+ id: "ios",
486
+ mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
487
+ roundTrip: false
488
+ }
339
489
  ];
340
490
  export const languageRegistry = createLanguageRegistry(records);
341
491
  export const languageCapabilities = languageRegistry.descriptors;
@@ -351,7 +501,21 @@ export const supportedLanguages = Object.freeze(languageCapabilities
351
501
  function language(values) {
352
502
  return {
353
503
  artifactMultiplicity: "single",
504
+ features: {
505
+ closedRecords: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
506
+ conditionControlledLoops: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
507
+ effectfulCapabilitiesAndResources: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
508
+ generalFunctionsAndCalls: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
509
+ immutableCollections: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
510
+ optionalValues: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
511
+ orderedListIteration: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
512
+ orderedMapIteration: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
513
+ referenceClasses: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
514
+ typedErrors: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
515
+ typeParametersAndGenerics: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id))
516
+ },
354
517
  mapping: { binaryRanges: false, richText: true, sourceMapV3: true },
518
+ provider: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
355
519
  roundTrip: true,
356
520
  ...values
357
521
  };
@@ -418,4 +582,4 @@ function deepFreeze(value) {
418
582
  deepFreeze(nested);
419
583
  return Object.freeze(value);
420
584
  }
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDN0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFBO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNoRCxPQUFPLEVB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dGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljLCB1bnN1cHBvcnRlZFJvbGV9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUphdmF9IGZyb20gXCIuL2JhY2tlbmRzL2phdmEuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUNTaGFycFByb2plY3R9IGZyb20gXCIuL2JhY2tlbmRzL2NzaGFycC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlR29Nb2R1bGV9IGZyb20gXCIuL2JhY2tlbmRzL2dvLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVKYXZhU2NyaXB0fSBmcm9tIFwiLi9iYWNrZW5kcy9qYXZhc2NyaXB0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVQaHB9IGZyb20gXCIuL2JhY2tlbmRzL3BocC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUHl0aG9ufSBmcm9tIFwiLi9iYWNrZW5kcy9weXRob24uanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVJ1Ynl9IGZyb20gXCIuL2JhY2tlbmRzL3J1YnkuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVR5cGVTY3JpcHR9IGZyb20gXCIuL2JhY2tlbmRzL3R5cGVzY3JpcHQuanNcIlxuaW1wb3J0IHtwYXJzZUphdmF9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhLmpzXCJcbmltcG9ydCB7cGFyc2VDU2hhcnB9IGZyb20gXCIuL2Zyb250ZW5kcy9jc2hhcnAuanNcIlxuaW1wb3J0IHtwYXJzZUdvfSBmcm9tIFwiLi9mcm9udGVuZHMvZ28uanNcIlxuaW1wb3J0IHtwYXJzZUNwcH0gZnJvbSBcIi4vZnJvbnRlbmRzL2NwcC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ3BwfSBmcm9tIFwiLi9iYWNrZW5kcy9jcHAuanNcIlxuaW1wb3J0IHtwYXJzZUN9IGZyb20gXCIuL2Zyb250ZW5kcy9jLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVDUHJvZ3JhbX0gZnJvbSBcIi4vYmFja2VuZHMvYy5qc1wiXG5pbXBvcnQge3BhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHR9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhc2NyaXB0LXR5cGVzY3JpcHQuanNcIlxuaW1wb3J0IHtwYXJzZVBocH0gZnJvbSBcIi4vZnJvbnRlbmRzL3BocC5qc1wiXG5pbXBvcnQge3BhcnNlUHl0aG9ufSBmcm9tIFwiLi9mcm9udGVuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7cGFyc2VSdWJ5fSBmcm9tIFwiLi9mcm9udGVuZHMvcnVieS5qc1wiXG5cbmNvbnN0IHJlZ2lzdHJ5Um9sZXMgPSBPYmplY3QuZnJlZXplKFtcImZyb250ZW5kXCIsIFwidGV4dEJhY2tlbmRcIiwgXCJiaW5hcnlCYWNrZW5kXCIsIFwiYXBwbGljYXRpb25CYWNrZW5kXCIsIFwiaW50ZXJvcGVyYWJpbGl0eVwiXSlcbmNvbnN0IGFjY2VwdGFuY2VTdGFnZU9yZGVyID0gW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcInJlc3RvcmVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdXG5jb25zdCBhY2NlcHRhbmNlU3RhZ2VzID0gbmV3IE1hcChhY2NlcHRhbmNlU3RhZ2VPcmRlci5tYXAoKHN0YWdlLCBpbmRleCkgPT4gW3N0YWdlLCBpbmRleF0pKVxuY29uc3QgcmVnaXN0cnlLZXlzID0gbmV3IFNldChbXG4gIFwiYWNjZXB0YW5jZVwiLCBcImFwcGxpY2F0aW9uQmFja2VuZFwiLCBcImFydGlmYWN0TXVsdGlwbGljaXR5XCIsIFwiYmluYXJ5QmFja2VuZFwiLCBcImRlZmF1bHRGaWxlbmFtZVwiLCBcImZyb250ZW5kXCIsIFwiaWRcIixcbiAgXCJpbnRlcm9wZXJhYmlsaXR5XCIsIFwibWFwcGluZ1wiLCBcIm1lZGlhVHlwZVwiLCBcInJvdW5kVHJpcFwiLCBcInRleHRCYWNrZW5kXCJcbl0pXG5cbi8qKiBAdHlwZWRlZiB7XCJmcm9udGVuZFwiIHwgXCJ0ZXh0QmFja2VuZFwiIHwgXCJiaW5hcnlCYWNrZW5kXCIgfCBcImFwcGxpY2F0aW9uQmFja2VuZFwiIHwgXCJpbnRlcm9wZXJhYmlsaXR5XCJ9IFJlZ2lzdHJ5Um9sZSAqL1xuLyoqIEB0eXBlZGVmIHsoaW5wdXQ6IHtmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ30pID0+IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IEZyb250ZW5kICovXG4vKiogQHR5cGVkZWYgeyguLi52YWx1ZXM6IHVua25vd25bXSkgPT4gdW5rbm93bn0gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUmVnaXN0cnlSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7e3N0YWdlczogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VbXSwgdG9vbGNoYWluczogc3RyaW5nW119fSBhY2NlcHRhbmNlIC0gQWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7XCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIn0gYXJ0aWZhY3RNdWx0aXBsaWNpdHkgLSBBcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzfSBtYXBwaW5nIC0gTWFwcGluZyBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFJvdW5kLXRyaXAgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RlZmF1bHRGaWxlbmFtZV0gLSBEZWZhdWx0IGJhY2tlbmQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lZGlhVHlwZV0gLSBEZWZhdWx0IGJhY2tlbmQgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2Zyb250ZW5kXSAtIEZyb250ZW5kIGFkYXB0ZXIuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFt0ZXh0QmFja2VuZF0gLSBUZXh0IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtiaW5hcnlCYWNrZW5kXSAtIEJpbmFyeSBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbYXBwbGljYXRpb25CYWNrZW5kXSAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtpbnRlcm9wZXJhYmlsaXR5XSAtIEludGVyb3BlcmFiaWxpdHkgYnJpZGdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSZWdpc3RyeVxuICogQHByb3BlcnR5IHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQ2FwYWJpbGl0aWVzW119IGRlc2NyaXB0b3JzIC0gUHVibGljIGRlc2NyaXB0b3JzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gaWRzIC0gUmVnaXN0ZXJlZCBJRHMgaW4gc3RhYmxlIG9yZGVyLlxuICogQHByb3BlcnR5IHsoaWQ6IHN0cmluZykgPT4gUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD59IHJlY29yZCAtIEV4YWN0IHJlY29yZCBsb29rdXAuXG4gKiBAcHJvcGVydHkgeyhpZDogc3RyaW5nLCByb2xlOiBSZWdpc3RyeVJvbGUsIGxvY2F0aW9uPzogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gcmVzb2x2ZSAtIFJvbGUgbG9va3VwLlxuICovXG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBpbW11dGFibGUgcm9sZSByZWdpc3RyeSBmcm9tIG9yZGVyZWQgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlUmVjb3JkcyAtIE9yZGVyZWQgbGFuZ3VhZ2UgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxMYW5ndWFnZVJlZ2lzdHJ5Pn0gUmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVJlZ2lzdHJ5KGNhbmRpZGF0ZVJlY29yZHMpIHtcbiAgaWYgKCFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlUmVjb3JkcykpIGludmFsaWRSZWdpc3RyeShcIlJlZ2lzdHJ5IHJlY29yZHMgbXVzdCBiZSBhbiBvcmRlcmVkIGRlbnNlIGFycmF5LlwiKVxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD4+fSAqL1xuICBjb25zdCByZWNvcmRzQnlJZCA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXNbXX0gKi9cbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBbXVxuXG4gIGZvciAobGV0IHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCBjYW5kaWRhdGVSZWNvcmRzLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZVJlY29yZHNbcmVjb3JkSW5kZXhdXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlKSkgaW52YWxpZFJlZ2lzdHJ5KFwiRXZlcnkgcmVnaXN0cnkgcmVjb3JkIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gICAgY29uc3QgaWQgPSBjYW5kaWRhdGUuaWRcblxuICAgIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCB8fCAhL15bYS16XVthLXowLTktXSokL3UudGVzdChpZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShcIkV2ZXJ5IHJlZ2lzdHJ5IHJlY29yZCByZXF1aXJlcyBhIHN0YWJsZSBsb3dlcmNhc2UgSUQuXCIsIHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiID8gaWQgOiB1bmRlZmluZWQpXG4gICAgfVxuICAgIGlmIChyZWNvcmRzQnlJZC5oYXMoaWQpKSBpbnZhbGlkUmVnaXN0cnkoYER1cGxpY2F0ZSByZWdpc3RyeSBJRCAnJHtpZH0nLmAsIGlkKVxuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvbWUoKGtleSkgPT4gIXJlZ2lzdHJ5S2V5cy5oYXMoa2V5KSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVua25vd24gZmllbGRzLmAsIGlkKVxuXG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJlZ2lzdHJ5Um9sZXMpIHtcbiAgICAgIGlmIChjYW5kaWRhdGVbcm9sZV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2FuZGlkYXRlW3JvbGVdICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJvbGUgJyR7cm9sZX0nIGZvciAnJHtpZH0nIG11c3QgYmUgYSBmdW5jdGlvbiB3aGVuIHByZXNlbnQuYCwgaWQpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFydGlmYWN0TXVsdGlwbGljaXR5ID0gY2FuZGlkYXRlLmFydGlmYWN0TXVsdGlwbGljaXR5XG5cbiAgICBpZiAoYXJ0aWZhY3RNdWx0aXBsaWNpdHkgIT0gXCJzaW5nbGVcIiAmJiBhcnRpZmFjdE11bHRpcGxpY2l0eSAhPSBcIm11bHRpcGxlXCIpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYXJ0aWZhY3QgbXVsdGlwbGljaXR5LmAsIGlkKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZS5yb3VuZFRyaXAgIT0gXCJib29sZWFuXCIpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgcmVxdWlyZXMgYSBCb29sZWFuIHJvdW5kLXRyaXAgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgY29uc3QgbWFwcGluZ0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5tYXBwaW5nXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgbWFwcGluZyBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICBjb25zdCBtYXBwaW5nU25hcHNob3QgPSB7XG4gICAgICBiaW5hcnlSYW5nZXM6IG1hcHBpbmdDYW5kaWRhdGUuYmluYXJ5UmFuZ2VzLFxuICAgICAgcmljaFRleHQ6IG1hcHBpbmdDYW5kaWRhdGUucmljaFRleHQsXG4gICAgICBzb3VyY2VNYXBWMzogbWFwcGluZ0NhbmRpZGF0ZS5zb3VyY2VNYXBWM1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWFwcGluZ1NuYXBzaG90LnJpY2hUZXh0ICE9IFwiYm9vbGVhblwiIHx8IHR5cGVvZiBtYXBwaW5nU25hcHNob3Quc291cmNlTWFwVjMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBtYXBwaW5nU25hcHNob3QuYmluYXJ5UmFuZ2VzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIG1hcHBpbmcgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXN9ICovIChtYXBwaW5nU25hcHNob3QpKVxuICAgIGNvbnN0IGFjY2VwdGFuY2VDYW5kaWRhdGUgPSBjYW5kaWRhdGUuYWNjZXB0YW5jZVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjY2VwdGFuY2VDYW5kaWRhdGUpIHx8ICFpc0RlbnNlQXJyYXkoYWNjZXB0YW5jZUNhbmRpZGF0ZS5zdGFnZXMpIHx8XG4gICAgICAhaXNEZW5zZUFycmF5KGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucykpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3Qgc3RhZ2VTbmFwc2hvdCA9IFtdXG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3QgdG9vbGNoYWluU25hcHNob3QgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RhZ2VTbmFwc2hvdC5wdXNoKGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzW2luZGV4XSlcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHRvb2xjaGFpblNuYXBzaG90LnB1c2goYWNjZXB0YW5jZUNhbmRpZGF0ZS50b29sY2hhaW5zW2luZGV4XSlcbiAgICB9XG4gICAgaWYgKCFzdGFnZVNuYXBzaG90LmV2ZXJ5KChzdGFnZSkgPT4gdHlwZW9mIHN0YWdlID09IFwic3RyaW5nXCIgJiYgYWNjZXB0YW5jZVN0YWdlcy5oYXMoc3RhZ2UpKSB8fFxuICAgICAgIXRvb2xjaGFpblNuYXBzaG90LmV2ZXJ5KCh0b29sY2hhaW4pID0+IHR5cGVvZiB0b29sY2hhaW4gPT0gXCJzdHJpbmdcIiAmJiB0b29sY2hhaW4ubGVuZ3RoID4gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgY29uc3Qgc3RhZ2VzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZVtdfSAqLyAoc3RhZ2VTbmFwc2hvdClcbiAgICBjb25zdCB0b29sY2hhaW5zID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKHRvb2xjaGFpblNuYXBzaG90KVxuICAgIGxldCBwcmV2aW91c1N0YWdlID0gLTFcbiAgICBjb25zdCBkZWNsYXJlZFN0YWdlcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMpIHtcbiAgICAgIGNvbnN0IHN0YWdlSW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGFjY2VwdGFuY2VTdGFnZXMuZ2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3RhZ2UpKSlcblxuICAgICAgaWYgKGRlY2xhcmVkU3RhZ2VzLmhhcyhzdGFnZSkgfHwgc3RhZ2VJbmRleCA8IHByZXZpb3VzU3RhZ2UpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVub3JkZXJlZCBvciBkdXBsaWNhdGUgYWNjZXB0YW5jZSBzdGFnZXMuYCwgaWQpXG4gICAgICBkZWNsYXJlZFN0YWdlcy5hZGQoc3RhZ2UpXG4gICAgICBwcmV2aW91c1N0YWdlID0gc3RhZ2VJbmRleFxuICAgIH1cbiAgICBpZiAobmV3IFNldCh0b29sY2hhaW5zKS5zaXplICE9IHRvb2xjaGFpbnMubGVuZ3RoKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBkdXBsaWNhdGUgYWNjZXB0YW5jZSB0b29sY2hhaW5zLmAsIGlkKVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0Zyb250ZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNUZXh0QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUudGV4dEJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzQmluYXJ5QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNBcHBsaWNhdGlvbkJhY2tlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNCYWNrZW5kID0gaGFzVGV4dEJhY2tlbmQgfHwgaGFzQmluYXJ5QmFja2VuZCB8fCBoYXNBcHBsaWNhdGlvbkJhY2tlbmRcblxuICAgIGlmICgobWFwcGluZy5yaWNoVGV4dCB8fCBtYXBwaW5nLnNvdXJjZU1hcFYzKSAmJiAhaGFzVGV4dEJhY2tlbmQgfHxcbiAgICAgIG1hcHBpbmcuc291cmNlTWFwVjMgJiYgIW1hcHBpbmcucmljaFRleHQgfHxcbiAgICAgIG1hcHBpbmcuYmluYXJ5UmFuZ2VzICYmICFoYXNCaW5hcnlCYWNrZW5kICYmICFoYXNBcHBsaWNhdGlvbkJhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgbWFwcGluZyBzdXBwb3J0IHdpdGhvdXQgaXRzIHJlcXVpcmVkIGJhY2tlbmQgcm9sZS5gLCBpZClcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS5yb3VuZFRyaXAgJiYgKCFoYXNGcm9udGVuZCB8fCAhaGFzQmFja2VuZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgcm91bmQtdHJpcCBzdXBwb3J0IHdpdGhvdXQgZnJvbnRlbmQgYW5kIGJhY2tlbmQgcm9sZXMuYCwgaWQpXG4gICAgfVxuICAgIGlmIChzdGFnZXMuaW5jbHVkZXMoXCJwYXJzZVwiKSAmJiAhaGFzRnJvbnRlbmQgfHwgc3RhZ2VzLmluY2x1ZGVzKFwiZ2VuZXJhdGVcIikgJiYgIWhhc0JhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgYW4gYWNjZXB0YW5jZSBzdGFnZSB3aXRob3V0IGl0cyByZXF1aXJlZCByb2xlLmAsIGlkKVxuICAgIH1cblxuICAgIGlmICgoaGFzQmFja2VuZCB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAodHlwZW9mIGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lLmxlbmd0aCA9PSAwKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSBiYWNrZW5kICcke2lkfScgcmVxdWlyZXMgYSBkZWZhdWx0IGZpbGVuYW1lLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoKGhhc0JhY2tlbmQgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKHR5cGVvZiBjYW5kaWRhdGUubWVkaWFUeXBlICE9IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgYmFja2VuZCAnJHtpZH0nIHJlcXVpcmVzIGEgbWVkaWEgdHlwZS5gLCBpZClcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRhbmNlID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgc3RhZ2VzLFxuICAgICAgdG9vbGNoYWluc1xuICAgIH0pKVxuICAgIGNvbnN0IHJlY29yZCA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkfSAqLyAoe1xuICAgICAgYWNjZXB0YW5jZSxcbiAgICAgIGFydGlmYWN0TXVsdGlwbGljaXR5LFxuICAgICAgaWQsXG4gICAgICBtYXBwaW5nLFxuICAgICAgcm91bmRUcmlwOiBjYW5kaWRhdGUucm91bmRUcmlwLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lID09IFwic3RyaW5nXCIgPyB7ZGVmYXVsdEZpbGVuYW1lOiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLm1lZGlhVHlwZSA9PSBcInN0cmluZ1wiID8ge21lZGlhVHlwZTogY2FuZGlkYXRlLm1lZGlhVHlwZX0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCIgPyB7ZnJvbnRlbmQ6IGNhbmRpZGF0ZS5mcm9udGVuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCIgPyB7dGV4dEJhY2tlbmQ6IGNhbmRpZGF0ZS50ZXh0QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIiA/IHtiaW5hcnlCYWNrZW5kOiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiID8ge2FwcGxpY2F0aW9uQmFja2VuZDogY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5pbnRlcm9wZXJhYmlsaXR5ID09IFwiZnVuY3Rpb25cIiA/IHtpbnRlcm9wZXJhYmlsaXR5OiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eX0gOiB7fSlcbiAgICB9KSlcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXN9ICovICh7XG4gICAgICBhY2NlcHRhbmNlLFxuICAgICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHksXG4gICAgICBpZCxcbiAgICAgIG1hcHBpbmcsXG4gICAgICByb2xlczoge1xuICAgICAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuYXBwbGljYXRpb25CYWNrZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgYmluYXJ5QmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgZnJvbnRlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuZnJvbnRlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBpbnRlcm9wZXJhYmlsaXR5OiB0eXBlb2YgY2FuZGlkYXRlLmludGVyb3BlcmFiaWxpdHkgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICB0ZXh0QmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICAgIH0sXG4gICAgICByb3VuZFRyaXA6IGNhbmRpZGF0ZS5yb3VuZFRyaXBcbiAgICB9KSlcblxuICAgIHJlY29yZHNCeUlkLnNldChpZCwgcmVjb3JkKVxuICAgIGRlc2NyaXB0b3JzLnB1c2goZGVzY3JpcHRvcilcbiAgfVxuXG4gIGNvbnN0IGZyb3plbkRlc2NyaXB0b3JzID0gZGVlcEZyZWV6ZShkZXNjcmlwdG9ycylcbiAgY29uc3QgaWRzID0gT2JqZWN0LmZyZWV6ZShmcm96ZW5EZXNjcmlwdG9ycy5tYXAoKHtpZH0pID0+IGlkKSlcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZGVzY3JpcHRvcnM6IGZyb3plbkRlc2NyaXB0b3JzLFxuICAgIGlkcyxcbiAgICByZWNvcmQoaWQpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNCeUlkLmdldChpZClcblxuICAgICAgaWYgKCFyZWNvcmQpIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQpXG5cbiAgICAgIHJldHVybiByZWNvcmRcbiAgICB9LFxuICAgIHJlc29sdmUoaWQsIHJvbGUsIGxvY2F0aW9uKSB7XG4gICAgICBpZiAoIXJlZ2lzdHJ5Um9sZXMuaW5jbHVkZXMocm9sZSkpIGludmFsaWRSZWdpc3RyeShgVW5rbm93biByZWdpc3RyeSByb2xlICcke3JvbGV9Jy5gLCBpZClcbiAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNCeUlkLmdldChpZClcblxuICAgICAgaWYgKCFyZWNvcmQpIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQsIGxvY2F0aW9uLCByb2xlKVxuICAgICAgY29uc3QgaW1wbGVtZW50YXRpb24gPSByZWNvcmRbcm9sZV1cblxuICAgICAgaWYgKHR5cGVvZiBpbXBsZW1lbnRhdGlvbiAhPSBcImZ1bmN0aW9uXCIpIHVuc3VwcG9ydGVkUm9sZShpZCwgcHVibGljUm9sZU5hbWUocm9sZSksIGxvY2F0aW9uKVxuXG4gICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUEhQIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHBocEZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VQaHAoe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIFJ1YnkgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcnVieUZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VSdWJ5KHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBKYXZhU2NyaXB0IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGphdmFTY3JpcHRGcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHQoe2ZpbGVuYW1lLCBsYW5ndWFnZTogXCJqYXZhc2NyaXB0XCIsIHNvdXJjZX0pXG5cbi8qKlxuICogVHlwZVNjcmlwdCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCB0eXBlU2NyaXB0RnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUphdmFTY3JpcHRUeXBlU2NyaXB0KHtmaWxlbmFtZSwgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLCBzb3VyY2V9KVxuXG4vKipcbiAqIEphdmEgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgamF2YUZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VKYXZhKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBQeXRob24gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcHl0aG9uRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZVB5dGhvbih7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogQyMgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgY3NoYXJwRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUNTaGFycCh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogR28gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgZ29Gcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlR28oe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG5jb25zdCByZWNvcmRzID0gW1xuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInBocFwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucGhwXCIsXG4gICAgZnJvbnRlbmQ6IHBocEZyb250ZW5kLFxuICAgIGlkOiBcInBocFwiLFxuICAgIG1lZGlhVHlwZTogXCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVBocFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJydWJ5XCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5yYlwiLFxuICAgIGZyb250ZW5kOiBydWJ5RnJvbnRlbmQsXG4gICAgaWQ6IFwicnVieVwiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtcnVieVwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVJ1YnlcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wibm9kZVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0uanNcIixcbiAgICBmcm9udGVuZDogamF2YVNjcmlwdEZyb250ZW5kLFxuICAgIGlkOiBcImphdmFzY3JpcHRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlSmF2YVNjcmlwdFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1widHNjXCIsIFwibm9kZVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0udHNcIixcbiAgICBmcm9udGVuZDogdHlwZVNjcmlwdEZyb250ZW5kLFxuICAgIGlkOiBcInR5cGVzY3JpcHRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC90eXBlc2NyaXB0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlVHlwZVNjcmlwdFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiamF2YWNcIiwgXCJqYXZhXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiTWFpbi5qYXZhXCIsXG4gICAgZnJvbnRlbmQ6IGphdmFGcm9udGVuZCxcbiAgICBpZDogXCJqYXZhXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1qYXZhLXNvdXJjZVwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUphdmFcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInB5dGhvblwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucHlcIixcbiAgICBmcm9udGVuZDogcHl0aG9uRnJvbnRlbmQsXG4gICAgaWQ6IFwicHl0aG9uXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1weXRob25cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVQeXRob25cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJkb3RuZXRcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIlByb2dyYW0uY3NcIixcbiAgICBmcm9udGVuZDogY3NoYXJwRnJvbnRlbmQsXG4gICAgaWQ6IFwiY3NoYXJwXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1jc2hhcnBcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDU2hhcnBQcm9qZWN0XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImdvXCJdfSxcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJtYWluLmdvXCIsXG4gICAgZnJvbnRlbmQ6IGdvRnJvbnRlbmQsXG4gICAgaWQ6IFwiZ29cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWdvXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlR29Nb2R1bGVcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ1wiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5jXCIsXG4gICAgZnJvbnRlbmQ6IHBhcnNlQyxcbiAgICBpZDogXCJjXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1jXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlQ1Byb2dyYW1cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ3BwXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5jcHBcIiwgZnJvbnRlbmQ6IHBhcnNlQ3BwLCBpZDogXCJjcHBcIiwgbWVkaWFUeXBlOiBcInRleHQveC1jKytzcmNcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlQ3BwXG4gIH0pXG5dXG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZVJlZ2lzdHJ5ID0gY3JlYXRlTGFuZ3VhZ2VSZWdpc3RyeShyZWNvcmRzKVxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlQ2FwYWJpbGl0aWVzID0gbGFuZ3VhZ2VSZWdpc3RyeS5kZXNjcmlwdG9yc1xuLyoqIEB0eXBlIHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2VbXX0gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXMgPSBPYmplY3QuZnJlZXplKGxhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gIC5maWx0ZXIoKHtyb2xlc30pID0+IHJvbGVzLmZyb250ZW5kICYmIHJvbGVzLnRleHRCYWNrZW5kKVxuICAubWFwKCh7aWR9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlkKSkpXG5cbi8qKlxuICogU3VwcGxpZXMgY29tbW9uIG9yaWdpbmFsLWZpdmUgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSB2YWx1ZXMgLSBMYW5ndWFnZS1zcGVjaWZpYyByZWNvcmQgZmllbGRzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBDb21wbGV0ZSByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGxhbmd1YWdlKHZhbHVlcykge1xuICByZXR1cm4ge1xuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcInNpbmdsZVwiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IGZhbHNlLCByaWNoVGV4dDogdHJ1ZSwgc291cmNlTWFwVjM6IHRydWV9LFxuICAgIHJvdW5kVHJpcDogdHJ1ZSxcbiAgICAuLi52YWx1ZXNcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYW4gaW50ZXJuYWwgcmVnaXN0cnkga2V5IGZvciBhIHB1YmxpYyByb2xlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIEludGVybmFsIHJvbGUga2V5LlxuICogQHJldHVybnMge3N0cmluZ30gUHVibGljIHJvbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcHVibGljUm9sZU5hbWUocm9sZSkge1xuICBpZiAocm9sZSA9PSBcInRleHRCYWNrZW5kXCIpIHJldHVybiBcInRleHQgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYmluYXJ5QmFja2VuZFwiKSByZXR1cm4gXCJiaW5hcnkgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYXBwbGljYXRpb25CYWNrZW5kXCIpIHJldHVybiBcImFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmRcIlxuXG4gIHJldHVybiByb2xlXG59XG5cbi8qKlxuICogVGhyb3dzIGFuIHVua25vd24tbGFuZ3VhZ2UgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFVua25vd24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IFtsb2NhdGlvbl0gLSBSZWxhdGVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtSZWdpc3RyeVJvbGUgfCB1bmRlZmluZWR9IFtyb2xlXSAtIFJlcXVlc3RlZCByb2xlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB1bnN1cHBvcnRlZExhbmd1YWdlKGlkLCBsb2NhdGlvbiwgcm9sZSkge1xuICBjb25zdCBtZXNzYWdlID0gcm9sZSA9PSBcImZyb250ZW5kXCIgPyBcIk5vIGZyb250ZW5kIGFkYXB0ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBsYW5ndWFnZS5cIiA6XG4gICAgcm9sZSA9PSBcInRleHRCYWNrZW5kXCIgPyBcIk5vIHNvdXJjZSBiYWNrZW5kIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXCIgOlxuICAgICAgXCJObyBsYW5ndWFnZSBvciB0YXJnZXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBJRC5cIlxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiVU5TVVBQT1JURURfTEFOR1VBR0VcIixcbiAgICBsYW5ndWFnZTogaWQsXG4gICAgbG9jYXRpb24sXG4gICAgbWVzc2FnZVxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcmVnaXN0cnktc2hhcGUgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2lkXSAtIENhbmRpZGF0ZSByZWdpc3RyeSBJRC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFJlZ2lzdHJ5KG1lc3NhZ2UsIGlkID0gXCJyZWdpc3RyeVwiKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9SRUdJU1RSWVwiLCBsYW5ndWFnZTogaWQsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyByZWdpc3RyeSByZWNvcmRzIGFuZCBwdWJsaWMgZGVzY3JpcHRvcnMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFJlZ2lzdHJ5LW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
585
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ2pELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3hELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQ2hF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SyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLHdCQUF3QixFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLGlDQUFpQyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xILHdCQUF3QixFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLG9CQUFvQixFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRixvQkFBb0IsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFN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QUMsQ0FBQTtJQUU3RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWMsIHVuc3VwcG9ydGVkUm9sZX0gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YX0gZnJvbSBcIi4vYmFja2VuZHMvamF2YS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlS290bGlufSBmcm9tIFwiLi9iYWNrZW5kcy9rb3RsaW4uanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUNTaGFycFByb2plY3R9IGZyb20gXCIuL2JhY2tlbmRzL2NzaGFycC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlR29Nb2R1bGV9IGZyb20gXCIuL2JhY2tlbmRzL2dvLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVSdXN0UHJvamVjdH0gZnJvbSBcIi4vYmFja2VuZHMvcnVzdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlU3dpZnR9IGZyb20gXCIuL2JhY2tlbmRzL3N3aWZ0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVEYXJ0UGFja2FnZX0gZnJvbSBcIi4vYmFja2VuZHMvZGFydC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YVNjcmlwdH0gZnJvbSBcIi4vYmFja2VuZHMvamF2YXNjcmlwdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUGhwfSBmcm9tIFwiLi9iYWNrZW5kcy9waHAuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVB5dGhvbn0gZnJvbSBcIi4vYmFja2VuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVSdWJ5fSBmcm9tIFwiLi9iYWNrZW5kcy9ydWJ5LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVUeXBlU2NyaXB0fSBmcm9tIFwiLi9iYWNrZW5kcy90eXBlc2NyaXB0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVCcm93c2VyV2FzbX0gZnJvbSBcIi4vYmFja2VuZHMvd2FzbS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSW9zQXBwbGljYXRpb259IGZyb20gXCIuL2JhY2tlbmRzL2lvcy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQW5kcm9pZEFwcGxpY2F0aW9ufSBmcm9tIFwiLi9iYWNrZW5kcy9hbmRyb2lkLmpzXCJcbmltcG9ydCB7cGFyc2VKYXZhfSBmcm9tIFwiLi9mcm9udGVuZHMvamF2YS5qc1wiXG5pbXBvcnQge3BhcnNlS290bGlufSBmcm9tIFwiLi9mcm9udGVuZHMva290bGluLmpzXCJcbmltcG9ydCB7cGFyc2VDU2hhcnB9IGZyb20gXCIuL2Zyb250ZW5kcy9jc2hhcnAuanNcIlxuaW1wb3J0IHtwYXJzZUdvfSBmcm9tIFwiLi9mcm9udGVuZHMvZ28uanNcIlxuaW1wb3J0IHtwYXJzZVJ1c3R9IGZyb20gXCIuL2Zyb250ZW5kcy9ydXN0LmpzXCJcbmltcG9ydCB7cGFyc2VTd2lmdH0gZnJvbSBcIi4vZnJvbnRlbmRzL3N3aWZ0LmpzXCJcbmltcG9ydCB7cGFyc2VEYXJ0fSBmcm9tIFwiLi9mcm9udGVuZHMvZGFydC5qc1wiXG5pbXBvcnQge3BhcnNlQ3BwfSBmcm9tIFwiLi9mcm9udGVuZHMvY3BwLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVDcHB9IGZyb20gXCIuL2JhY2tlbmRzL2NwcC5qc1wiXG5pbXBvcnQge3BhcnNlQ30gZnJvbSBcIi4vZnJvbnRlbmRzL2MuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUNQcm9ncmFtfSBmcm9tIFwiLi9iYWNrZW5kcy9jLmpzXCJcbmltcG9ydCB7cGFyc2VKYXZhU2NyaXB0VHlwZVNjcmlwdH0gZnJvbSBcIi4vZnJvbnRlbmRzL2phdmFzY3JpcHQtdHlwZXNjcmlwdC5qc1wiXG5pbXBvcnQge3BhcnNlUGhwfSBmcm9tIFwiLi9mcm9udGVuZHMvcGhwLmpzXCJcbmltcG9ydCB7cGFyc2VQeXRob259IGZyb20gXCIuL2Zyb250ZW5kcy9weXRob24uanNcIlxuaW1wb3J0IHtwYXJzZVJ1Ynl9IGZyb20gXCIuL2Zyb250ZW5kcy9ydWJ5LmpzXCJcblxuY29uc3QgcmVnaXN0cnlSb2xlcyA9IE9iamVjdC5mcmVlemUoW1wiZnJvbnRlbmRcIiwgXCJ0ZXh0QmFja2VuZFwiLCBcImJpbmFyeUJhY2tlbmRcIiwgXCJhcHBsaWNhdGlvbkJhY2tlbmRcIiwgXCJpbnRlcm9wZXJhYmlsaXR5XCJdKVxuY29uc3QgYWNjZXB0YW5jZVN0YWdlT3JkZXIgPSBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJsaW5rXCIsIFwidmFsaWRhdGVcIiwgXCJpbnN0YW50aWF0ZVwiLCBcImV4ZWN1dGVcIl1cbmNvbnN0IGFjY2VwdGFuY2VTdGFnZXMgPSBuZXcgTWFwKGFjY2VwdGFuY2VTdGFnZU9yZGVyLm1hcCgoc3RhZ2UsIGluZGV4KSA9PiBbc3RhZ2UsIGluZGV4XSkpXG5jb25zdCByZWdpc3RyeUtleXMgPSBuZXcgU2V0KFtcbiAgXCJhY2NlcHRhbmNlXCIsIFwiYXBwbGljYXRpb25CYWNrZW5kXCIsIFwiYXJ0aWZhY3RNdWx0aXBsaWNpdHlcIiwgXCJiaW5hcnlCYWNrZW5kXCIsIFwiZGVmYXVsdEZpbGVuYW1lXCIsIFwiZnJvbnRlbmRcIiwgXCJpZFwiLFxuICBcImZlYXR1cmVzXCIsIFwiaW50ZXJvcGVyYWJpbGl0eVwiLCBcIm1hcHBpbmdcIiwgXCJtZWRpYVR5cGVcIiwgXCJwcm92aWRlclwiLCBcInJvdW5kVHJpcFwiLCBcInRleHRCYWNrZW5kXCJcbl0pXG5cbi8qKiBAdHlwZWRlZiB7XCJmcm9udGVuZFwiIHwgXCJ0ZXh0QmFja2VuZFwiIHwgXCJiaW5hcnlCYWNrZW5kXCIgfCBcImFwcGxpY2F0aW9uQmFja2VuZFwiIHwgXCJpbnRlcm9wZXJhYmlsaXR5XCJ9IFJlZ2lzdHJ5Um9sZSAqL1xuLyoqIEB0eXBlZGVmIHsoLi4udmFsdWVzOiB1bmtub3duW10pID0+IHVua25vd259IFJlZ2lzdHJ5SW1wbGVtZW50YXRpb24gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGcm9udGVuZElucHV0XG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IFtjYXBhYmlsaXRpZXNdIC0gQ29tcGlsZXItYXV0aG9yaXplZCBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcHJvcGVydHkge3tpc0VudHJ5OiBib29sZWFuLCBmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIHJlY29yZHM6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+LCB2YWx1ZVJlY29yZHM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn19IFtwcm9ncmFtXSAtIFByb2dyYW0gY29udmVyc2lvbiBjb250ZXh0LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEZyb250ZW5kXG4gKiBAcGFyYW0ge0Zyb250ZW5kSW5wdXR9IGlucHV0IC0gRnJvbnRlbmQgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpYyBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTdGFibGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3tzdGFnZXM6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlW10sIHRvb2xjaGFpbnM6IHN0cmluZ1tdfX0gYWNjZXB0YW5jZSAtIEFjY2VwdGFuY2UgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge1wic2luZ2xlXCIgfCBcIm11bHRpcGxlXCJ9IGFydGlmYWN0TXVsdGlwbGljaXR5IC0gQXJ0aWZhY3QgbXVsdGlwbGljaXR5LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllc30gZmVhdHVyZXMgLSBTZW1hbnRpYyBmZWF0dXJlIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXN9IG1hcHBpbmcgLSBNYXBwaW5nIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRUcmlwIC0gUm91bmQtdHJpcCBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVmYXVsdEZpbGVuYW1lXSAtIERlZmF1bHQgYmFja2VuZCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbWVkaWFUeXBlXSAtIERlZmF1bHQgYmFja2VuZCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJvdmlkZXJdIC0gVGFyZ2V0IGhvc3Qgc3RkbGliIHByb3ZpZGVyL25hdGl2ZS1iaW5kaW5nIHJvbGUuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtmcm9udGVuZF0gLSBGcm9udGVuZCBhZGFwdGVyLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbdGV4dEJhY2tlbmRdIC0gVGV4dCBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbYmluYXJ5QmFja2VuZF0gLSBCaW5hcnkgYmFja2VuZC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2FwcGxpY2F0aW9uQmFja2VuZF0gLSBBcHBsaWNhdGlvbi1hcnRpZmFjdCBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbaW50ZXJvcGVyYWJpbGl0eV0gLSBJbnRlcm9wZXJhYmlsaXR5IGJyaWRnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUmVnaXN0cnlcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZUNhcGFiaWxpdGllc1tdfSBkZXNjcmlwdG9ycyAtIFB1YmxpYyBkZXNjcmlwdG9ycy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGlkcyAtIFJlZ2lzdGVyZWQgSURzIGluIHN0YWJsZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7KGlkOiBzdHJpbmcpID0+IFJlYWRvbmx5PExhbmd1YWdlUmVnaXN0cnlSZWNvcmQ+fSByZWNvcmQgLSBFeGFjdCByZWNvcmQgbG9va3VwLlxuICogQHByb3BlcnR5IHsoaWQ6IHN0cmluZywgcm9sZTogUmVnaXN0cnlSb2xlLCBsb2NhdGlvbj86IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IFJlZ2lzdHJ5SW1wbGVtZW50YXRpb259IHJlc29sdmUgLSBSb2xlIGxvb2t1cC5cbiAqL1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYW4gaW1tdXRhYmxlIHJvbGUgcmVnaXN0cnkgZnJvbSBvcmRlcmVkIHJlY29yZHMuXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVJlY29yZHMgLSBPcmRlcmVkIGxhbmd1YWdlIHJlY29yZHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeT59IFJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZ3VhZ2VSZWdpc3RyeShjYW5kaWRhdGVSZWNvcmRzKSB7XG4gIGlmICghaXNEZW5zZUFycmF5KGNhbmRpZGF0ZVJlY29yZHMpKSBpbnZhbGlkUmVnaXN0cnkoXCJSZWdpc3RyeSByZWNvcmRzIG11c3QgYmUgYW4gb3JkZXJlZCBkZW5zZSBhcnJheS5cIilcblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFJlYWRvbmx5PExhbmd1YWdlUmVnaXN0cnlSZWNvcmQ+Pn0gKi9cbiAgY29uc3QgcmVjb3Jkc0J5SWQgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQ2FwYWJpbGl0aWVzW119ICovXG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gW11cblxuICBmb3IgKGxldCByZWNvcmRJbmRleCA9IDA7IHJlY29yZEluZGV4IDwgY2FuZGlkYXRlUmVjb3Jkcy5sZW5ndGg7IHJlY29yZEluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBjYW5kaWRhdGVSZWNvcmRzW3JlY29yZEluZGV4XVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZSkpIGludmFsaWRSZWdpc3RyeShcIkV2ZXJ5IHJlZ2lzdHJ5IHJlY29yZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LlwiKVxuICAgIGNvbnN0IGlkID0gY2FuZGlkYXRlLmlkXG5cbiAgICBpZiAodHlwZW9mIGlkICE9IFwic3RyaW5nXCIgfHwgaWQubGVuZ3RoID09IDAgfHwgIS9eW2Etel1bYS16MC05LV0qJC91LnRlc3QoaWQpKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoXCJFdmVyeSByZWdpc3RyeSByZWNvcmQgcmVxdWlyZXMgYSBzdGFibGUgbG93ZXJjYXNlIElELlwiLCB0eXBlb2YgaWQgPT0gXCJzdHJpbmdcIiA/IGlkIDogdW5kZWZpbmVkKVxuICAgIH1cbiAgICBpZiAocmVjb3Jkc0J5SWQuaGFzKGlkKSkgaW52YWxpZFJlZ2lzdHJ5KGBEdXBsaWNhdGUgcmVnaXN0cnkgSUQgJyR7aWR9Jy5gLCBpZClcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb21lKChrZXkpID0+ICFyZWdpc3RyeUtleXMuaGFzKGtleSkpKSBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyB1bmtub3duIGZpZWxkcy5gLCBpZClcbiAgICBpZiAoY2FuZGlkYXRlLnByb3ZpZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGNhbmRpZGF0ZS5wcm92aWRlciAhPSBcImJvb2xlYW5cIikge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyBhbiBpbnZhbGlkIHByb3ZpZGVyIHJvbGUuYCwgaWQpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJlZ2lzdHJ5Um9sZXMpIHtcbiAgICAgIGlmIChjYW5kaWRhdGVbcm9sZV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2FuZGlkYXRlW3JvbGVdICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJvbGUgJyR7cm9sZX0nIGZvciAnJHtpZH0nIG11c3QgYmUgYSBmdW5jdGlvbiB3aGVuIHByZXNlbnQuYCwgaWQpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFydGlmYWN0TXVsdGlwbGljaXR5ID0gY2FuZGlkYXRlLmFydGlmYWN0TXVsdGlwbGljaXR5XG5cbiAgICBpZiAoYXJ0aWZhY3RNdWx0aXBsaWNpdHkgIT0gXCJzaW5nbGVcIiAmJiBhcnRpZmFjdE11bHRpcGxpY2l0eSAhPSBcIm11bHRpcGxlXCIpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYXJ0aWZhY3QgbXVsdGlwbGljaXR5LmAsIGlkKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZS5yb3VuZFRyaXAgIT0gXCJib29sZWFuXCIpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgcmVxdWlyZXMgYSBCb29sZWFuIHJvdW5kLXRyaXAgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgY29uc3QgZmVhdHVyZXNDYW5kaWRhdGUgPSBjYW5kaWRhdGUuZmVhdHVyZXMgPz8ge1xuICAgICAgY2xvc2VkUmVjb3JkczogZmFsc2UsXG4gICAgICBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLFxuICAgICAgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSxcbiAgICAgIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsXG4gICAgICBpbW11dGFibGVDb2xsZWN0aW9uczogZmFsc2UsXG4gICAgICBvcHRpb25hbFZhbHVlczogZmFsc2UsXG4gICAgICBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmYWxzZSxcbiAgICAgIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLFxuICAgICAgdHlwZWRFcnJvcnM6IGZhbHNlLFxuICAgICAgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoZmVhdHVyZXNDYW5kaWRhdGUpIHx8XG4gICAgICBPYmplY3Qua2V5cyhmZWF0dXJlc0NhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiY2xvc2VkUmVjb3Jkcyxjb25kaXRpb25Db250cm9sbGVkTG9vcHMsZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzLGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxscyxpbW11dGFibGVDb2xsZWN0aW9ucyxvcHRpb25hbFZhbHVlcyxvcmRlcmVkTGlzdEl0ZXJhdGlvbixvcmRlcmVkTWFwSXRlcmF0aW9uLHJlZmVyZW5jZUNsYXNzZXMsdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljcyx0eXBlZEVycm9yc1wiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuY2xvc2VkUmVjb3JkcyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLmNvbmRpdGlvbkNvbnRyb2xsZWRMb29wcyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLmVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlcyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLmdlbmVyYWxGdW5jdGlvbnNBbmRDYWxscyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLmltbXV0YWJsZUNvbGxlY3Rpb25zICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUub3B0aW9uYWxWYWx1ZXMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5vcmRlcmVkTGlzdEl0ZXJhdGlvbiAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLm9yZGVyZWRNYXBJdGVyYXRpb24gIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5yZWZlcmVuY2VDbGFzc2VzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUudHlwZWRFcnJvcnMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS50eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIGZlYXR1cmUgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IGZlYXR1cmVzID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgY2xvc2VkUmVjb3JkczogZmVhdHVyZXNDYW5kaWRhdGUuY2xvc2VkUmVjb3JkcyxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmVhdHVyZXNDYW5kaWRhdGUuY29uZGl0aW9uQ29udHJvbGxlZExvb3BzLFxuICAgICAgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmZWF0dXJlc0NhbmRpZGF0ZS5lZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXMsXG4gICAgICBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IGZlYXR1cmVzQ2FuZGlkYXRlLmdlbmVyYWxGdW5jdGlvbnNBbmRDYWxscyxcbiAgICAgIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmZWF0dXJlc0NhbmRpZGF0ZS5pbW11dGFibGVDb2xsZWN0aW9ucyxcbiAgICAgIG9wdGlvbmFsVmFsdWVzOiBmZWF0dXJlc0NhbmRpZGF0ZS5vcHRpb25hbFZhbHVlcyxcbiAgICAgIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmZWF0dXJlc0NhbmRpZGF0ZS5vcmRlcmVkTGlzdEl0ZXJhdGlvbixcbiAgICAgIG9yZGVyZWRNYXBJdGVyYXRpb246IGZlYXR1cmVzQ2FuZGlkYXRlLm9yZGVyZWRNYXBJdGVyYXRpb24sXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBmZWF0dXJlc0NhbmRpZGF0ZS5yZWZlcmVuY2VDbGFzc2VzLFxuICAgICAgdHlwZWRFcnJvcnM6IGZlYXR1cmVzQ2FuZGlkYXRlLnR5cGVkRXJyb3JzLFxuICAgICAgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmVhdHVyZXNDYW5kaWRhdGUudHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljc1xuICAgIH0pKVxuICAgIGNvbnN0IG1hcHBpbmdDYW5kaWRhdGUgPSBjYW5kaWRhdGUubWFwcGluZ1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KG1hcHBpbmdDYW5kaWRhdGUpKSBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIG1hcHBpbmcgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgY29uc3QgbWFwcGluZ1NuYXBzaG90ID0ge1xuICAgICAgYmluYXJ5UmFuZ2VzOiBtYXBwaW5nQ2FuZGlkYXRlLmJpbmFyeVJhbmdlcyxcbiAgICAgIHJpY2hUZXh0OiBtYXBwaW5nQ2FuZGlkYXRlLnJpY2hUZXh0LFxuICAgICAgc291cmNlTWFwVjM6IG1hcHBpbmdDYW5kaWRhdGUuc291cmNlTWFwVjNcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1hcHBpbmdTbmFwc2hvdC5yaWNoVGV4dCAhPSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgbWFwcGluZ1NuYXBzaG90LnNvdXJjZU1hcFYzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgbWFwcGluZ1NuYXBzaG90LmJpbmFyeVJhbmdlcyAhPSBcImJvb2xlYW5cIikge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBtYXBwaW5nIGRlY2xhcmF0aW9uLmAsIGlkKVxuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzfSAqLyAobWFwcGluZ1NuYXBzaG90KSlcbiAgICBjb25zdCBhY2NlcHRhbmNlQ2FuZGlkYXRlID0gY2FuZGlkYXRlLmFjY2VwdGFuY2VcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChhY2NlcHRhbmNlQ2FuZGlkYXRlKSB8fCAhaXNEZW5zZUFycmF5KGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzKSB8fFxuICAgICAgIWlzRGVuc2VBcnJheShhY2NlcHRhbmNlQ2FuZGlkYXRlLnRvb2xjaGFpbnMpKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIGFjY2VwdGFuY2UgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bltdfSAqL1xuICAgIGNvbnN0IHN0YWdlU25hcHNob3QgPSBbXVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bltdfSAqL1xuICAgIGNvbnN0IHRvb2xjaGFpblNuYXBzaG90ID0gW11cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhY2NlcHRhbmNlQ2FuZGlkYXRlLnN0YWdlcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0YWdlU25hcHNob3QucHVzaChhY2NlcHRhbmNlQ2FuZGlkYXRlLnN0YWdlc1tpbmRleF0pXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhY2NlcHRhbmNlQ2FuZGlkYXRlLnRvb2xjaGFpbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICB0b29sY2hhaW5TbmFwc2hvdC5wdXNoKGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWluc1tpbmRleF0pXG4gICAgfVxuICAgIGlmICghc3RhZ2VTbmFwc2hvdC5ldmVyeSgoc3RhZ2UpID0+IHR5cGVvZiBzdGFnZSA9PSBcInN0cmluZ1wiICYmIGFjY2VwdGFuY2VTdGFnZXMuaGFzKHN0YWdlKSkgfHxcbiAgICAgICF0b29sY2hhaW5TbmFwc2hvdC5ldmVyeSgodG9vbGNoYWluKSA9PiB0eXBlb2YgdG9vbGNoYWluID09IFwic3RyaW5nXCIgJiYgdG9vbGNoYWluLmxlbmd0aCA+IDApKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIGFjY2VwdGFuY2UgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IHN0YWdlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VbXX0gKi8gKHN0YWdlU25hcHNob3QpXG4gICAgY29uc3QgdG9vbGNoYWlucyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovICh0b29sY2hhaW5TbmFwc2hvdClcbiAgICBsZXQgcHJldmlvdXNTdGFnZSA9IC0xXG4gICAgY29uc3QgZGVjbGFyZWRTdGFnZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2Ygc3RhZ2VzKSB7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChhY2NlcHRhbmNlU3RhZ2VzLmdldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHN0YWdlKSkpXG5cbiAgICAgIGlmIChkZWNsYXJlZFN0YWdlcy5oYXMoc3RhZ2UpIHx8IHN0YWdlSW5kZXggPCBwcmV2aW91c1N0YWdlKSBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyB1bm9yZGVyZWQgb3IgZHVwbGljYXRlIGFjY2VwdGFuY2Ugc3RhZ2VzLmAsIGlkKVxuICAgICAgZGVjbGFyZWRTdGFnZXMuYWRkKHN0YWdlKVxuICAgICAgcHJldmlvdXNTdGFnZSA9IHN0YWdlSW5kZXhcbiAgICB9XG4gICAgaWYgKG5ldyBTZXQodG9vbGNoYWlucykuc2l6ZSAhPSB0b29sY2hhaW5zLmxlbmd0aCkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgZHVwbGljYXRlIGFjY2VwdGFuY2UgdG9vbGNoYWlucy5gLCBpZClcbiAgICB9XG5cbiAgICBjb25zdCBoYXNGcm9udGVuZCA9IHR5cGVvZiBjYW5kaWRhdGUuZnJvbnRlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzVGV4dEJhY2tlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLnRleHRCYWNrZW5kID09IFwiZnVuY3Rpb25cIlxuICAgIGNvbnN0IGhhc0JpbmFyeUJhY2tlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLmJpbmFyeUJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzQXBwbGljYXRpb25CYWNrZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzQmFja2VuZCA9IGhhc1RleHRCYWNrZW5kIHx8IGhhc0JpbmFyeUJhY2tlbmQgfHwgaGFzQXBwbGljYXRpb25CYWNrZW5kXG5cbiAgICBpZiAoKG1hcHBpbmcucmljaFRleHQgfHwgbWFwcGluZy5zb3VyY2VNYXBWMyB8fCBtYXBwaW5nLmJpbmFyeVJhbmdlcykgJiYgIWhhc0JhY2tlbmQgfHxcbiAgICAgIG1hcHBpbmcuc291cmNlTWFwVjMgJiYgIW1hcHBpbmcucmljaFRleHQgfHxcbiAgICAgIG1hcHBpbmcuYmluYXJ5UmFuZ2VzICYmICFoYXNCaW5hcnlCYWNrZW5kICYmICFoYXNBcHBsaWNhdGlvbkJhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgbWFwcGluZyBzdXBwb3J0IHdpdGhvdXQgaXRzIHJlcXVpcmVkIGJhY2tlbmQgcm9sZS5gLCBpZClcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS5yb3VuZFRyaXAgJiYgKCFoYXNGcm9udGVuZCB8fCAhaGFzQmFja2VuZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgcm91bmQtdHJpcCBzdXBwb3J0IHdpdGhvdXQgZnJvbnRlbmQgYW5kIGJhY2tlbmQgcm9sZXMuYCwgaWQpXG4gICAgfVxuICAgIGlmIChzdGFnZXMuaW5jbHVkZXMoXCJwYXJzZVwiKSAmJiAhaGFzRnJvbnRlbmQgfHwgc3RhZ2VzLmluY2x1ZGVzKFwiZ2VuZXJhdGVcIikgJiYgIWhhc0JhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgYW4gYWNjZXB0YW5jZSBzdGFnZSB3aXRob3V0IGl0cyByZXF1aXJlZCByb2xlLmAsIGlkKVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0RlZmF1bHRlZEJhY2tlbmQgPSBoYXNUZXh0QmFja2VuZCB8fCBoYXNCaW5hcnlCYWNrZW5kXG5cbiAgICBpZiAoKGhhc0RlZmF1bHRlZEJhY2tlbmQgfHwgY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKHR5cGVvZiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgYmFja2VuZCAnJHtpZH0nIHJlcXVpcmVzIGEgZGVmYXVsdCBmaWxlbmFtZS5gLCBpZClcbiAgICB9XG4gICAgaWYgKChoYXNEZWZhdWx0ZWRCYWNrZW5kIHx8IGNhbmRpZGF0ZS5tZWRpYVR5cGUgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICh0eXBlb2YgY2FuZGlkYXRlLm1lZGlhVHlwZSAhPSBcInN0cmluZ1wiIHx8IGNhbmRpZGF0ZS5tZWRpYVR5cGUubGVuZ3RoID09IDApKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IGJhY2tlbmQgJyR7aWR9JyByZXF1aXJlcyBhIG1lZGlhIHR5cGUuYCwgaWQpXG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXB0YW5jZSA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllc30gKi8gKHtcbiAgICAgIHN0YWdlcyxcbiAgICAgIHRvb2xjaGFpbnNcbiAgICB9KSlcbiAgICBjb25zdCByZWNvcmQgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZH0gKi8gKHtcbiAgICAgIGFjY2VwdGFuY2UsXG4gICAgICBhcnRpZmFjdE11bHRpcGxpY2l0eSxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgaWQsXG4gICAgICBtYXBwaW5nLFxuICAgICAgcm91bmRUcmlwOiBjYW5kaWRhdGUucm91bmRUcmlwLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lID09IFwic3RyaW5nXCIgPyB7ZGVmYXVsdEZpbGVuYW1lOiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLm1lZGlhVHlwZSA9PSBcInN0cmluZ1wiID8ge21lZGlhVHlwZTogY2FuZGlkYXRlLm1lZGlhVHlwZX0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5wcm92aWRlciA9PSBcImJvb2xlYW5cIiA/IHtwcm92aWRlcjogY2FuZGlkYXRlLnByb3ZpZGVyfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLmZyb250ZW5kID09IFwiZnVuY3Rpb25cIiA/IHtmcm9udGVuZDogY2FuZGlkYXRlLmZyb250ZW5kfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLnRleHRCYWNrZW5kID09IFwiZnVuY3Rpb25cIiA/IHt0ZXh0QmFja2VuZDogY2FuZGlkYXRlLnRleHRCYWNrZW5kfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLmJpbmFyeUJhY2tlbmQgPT0gXCJmdW5jdGlvblwiID8ge2JpbmFyeUJhY2tlbmQ6IGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZCA9PSBcImZ1bmN0aW9uXCIgPyB7YXBwbGljYXRpb25CYWNrZW5kOiBjYW5kaWRhdGUuYXBwbGljYXRpb25CYWNrZW5kfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLmludGVyb3BlcmFiaWxpdHkgPT0gXCJmdW5jdGlvblwiID8ge2ludGVyb3BlcmFiaWxpdHk6IGNhbmRpZGF0ZS5pbnRlcm9wZXJhYmlsaXR5fSA6IHt9KVxuICAgIH0pKVxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZUNhcGFiaWxpdGllc30gKi8gKHtcbiAgICAgIGFjY2VwdGFuY2UsXG4gICAgICBhcnRpZmFjdE11bHRpcGxpY2l0eSxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgaWQsXG4gICAgICBtYXBwaW5nLFxuICAgICAgcm9sZXM6IHtcbiAgICAgICAgYXBwbGljYXRpb25CYWNrZW5kOiB0eXBlb2YgY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZCA9PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIGJpbmFyeUJhY2tlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZCA9PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIGZyb250ZW5kOiB0eXBlb2YgY2FuZGlkYXRlLmZyb250ZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgaW50ZXJvcGVyYWJpbGl0eTogdHlwZW9mIGNhbmRpZGF0ZS5pbnRlcm9wZXJhYmlsaXR5ID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgcHJvdmlkZXI6IGNhbmRpZGF0ZS5wcm92aWRlciA9PT0gdHJ1ZSxcbiAgICAgICAgdGV4dEJhY2tlbmQ6IHR5cGVvZiBjYW5kaWRhdGUudGV4dEJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgICB9LFxuICAgICAgcm91bmRUcmlwOiBjYW5kaWRhdGUucm91bmRUcmlwXG4gICAgfSkpXG5cbiAgICByZWNvcmRzQnlJZC5zZXQoaWQsIHJlY29yZClcbiAgICBkZXNjcmlwdG9ycy5wdXNoKGRlc2NyaXB0b3IpXG4gIH1cblxuICBjb25zdCBmcm96ZW5EZXNjcmlwdG9ycyA9IGRlZXBGcmVlemUoZGVzY3JpcHRvcnMpXG4gIGNvbnN0IGlkcyA9IE9iamVjdC5mcmVlemUoZnJvemVuRGVzY3JpcHRvcnMubWFwKCh7aWR9KSA9PiBpZCkpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGRlc2NyaXB0b3JzOiBmcm96ZW5EZXNjcmlwdG9ycyxcbiAgICBpZHMsXG4gICAgcmVjb3JkKGlkKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzQnlJZC5nZXQoaWQpXG5cbiAgICAgIGlmICghcmVjb3JkKSB1bnN1cHBvcnRlZExhbmd1YWdlKGlkKVxuXG4gICAgICByZXR1cm4gcmVjb3JkXG4gICAgfSxcbiAgICByZXNvbHZlKGlkLCByb2xlLCBsb2NhdGlvbikge1xuICAgICAgaWYgKCFyZWdpc3RyeVJvbGVzLmluY2x1ZGVzKHJvbGUpKSBpbnZhbGlkUmVnaXN0cnkoYFVua25vd24gcmVnaXN0cnkgcm9sZSAnJHtyb2xlfScuYCwgaWQpXG4gICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzQnlJZC5nZXQoaWQpXG5cbiAgICAgIGlmICghcmVjb3JkKSB1bnN1cHBvcnRlZExhbmd1YWdlKGlkLCBsb2NhdGlvbiwgcm9sZSlcbiAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uID0gcmVjb3JkW3JvbGVdXG5cbiAgICAgIGlmICh0eXBlb2YgaW1wbGVtZW50YXRpb24gIT0gXCJmdW5jdGlvblwiKSB1bnN1cHBvcnRlZFJvbGUoaWQsIHB1YmxpY1JvbGVOYW1lKHJvbGUpLCBsb2NhdGlvbilcblxuICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIFBIUCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBwaHBGcm9udGVuZCA9ICh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSkgPT4gcGFyc2VQaHAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogUnVieSByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBydWJ5RnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlUnVieSh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSlcblxuLyoqXG4gKiBKYXZhU2NyaXB0IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGphdmFTY3JpcHRGcm9udGVuZCA9ICh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSkgPT4gcGFyc2VKYXZhU2NyaXB0VHlwZVNjcmlwdCh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgbGFuZ3VhZ2U6IFwiamF2YXNjcmlwdFwiLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIFR5cGVTY3JpcHQgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgdHlwZVNjcmlwdEZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZUphdmFTY3JpcHRUeXBlU2NyaXB0KHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBsYW5ndWFnZTogXCJ0eXBlc2NyaXB0XCIsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogSmF2YSByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBqYXZhRnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlSmF2YSh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSlcblxuLyoqXG4gKiBLb3RsaW4gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3Qga290bGluRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUtvdGxpbih7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogUHl0aG9uIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHB5dGhvbkZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VQeXRob24oe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIEMjIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGNzaGFycEZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VDU2hhcnAoe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIEdvIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGdvRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUdvKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBEYXJ0IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGRhcnRGcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlRGFydCh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbmNvbnN0IHJlY29yZHMgPSBbXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicGhwODJcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnBocFwiLFxuICAgIGZyb250ZW5kOiBwaHBGcm9udGVuZCxcbiAgICBpZDogXCJwaHBcIixcbiAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24veC1odHRwZC1waHBcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVQaHBcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicnVieVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucmJcIixcbiAgICBmcm9udGVuZDogcnVieUZyb250ZW5kLFxuICAgIGlkOiBcInJ1YnlcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LXJ1YnlcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVSdWJ5XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcIm5vZGVcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmpzXCIsXG4gICAgZnJvbnRlbmQ6IGphdmFTY3JpcHRGcm9udGVuZCxcbiAgICBpZDogXCJqYXZhc2NyaXB0XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQvamF2YXNjcmlwdFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUphdmFTY3JpcHRcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInRzY1wiLCBcIm5vZGVcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnRzXCIsXG4gICAgZnJvbnRlbmQ6IHR5cGVTY3JpcHRGcm9udGVuZCxcbiAgICBpZDogXCJ0eXBlc2NyaXB0XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQvdHlwZXNjcmlwdFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVR5cGVTY3JpcHRcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImphdmFjXCIsIFwiamF2YVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIk1haW4uamF2YVwiLFxuICAgIGZyb250ZW5kOiBqYXZhRnJvbnRlbmQsXG4gICAgaWQ6IFwiamF2YVwiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtamF2YS1zb3VyY2VcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVKYXZhXG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJrb3RsaW5jXCIsIFwiamF2YTI1XCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiUHJvZ3JhbS5rdFwiLFxuICAgIGZyb250ZW5kOiBrb3RsaW5Gcm9udGVuZCxcbiAgICBpZDogXCJrb3RsaW5cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWtvdGxpblwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUtvdGxpblxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicHl0aG9uXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5weVwiLFxuICAgIGZyb250ZW5kOiBweXRob25Gcm9udGVuZCxcbiAgICBpZDogXCJweXRob25cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LXB5dGhvblwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVB5dGhvblxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImRvdG5ldFwiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiUHJvZ3JhbS5jc1wiLFxuICAgIGZyb250ZW5kOiBjc2hhcnBGcm9udGVuZCxcbiAgICBpZDogXCJjc2hhcnBcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWNzaGFycFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUNTaGFycFByb2plY3RcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiZ29cIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIm1haW4uZ29cIixcbiAgICBmcm9udGVuZDogZ29Gcm9udGVuZCxcbiAgICBpZDogXCJnb1wiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtZ29cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVHb01vZHVsZVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImNsYW5nXCJdfSxcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmNcIixcbiAgICBmcm9udGVuZDogcGFyc2VDLFxuICAgIGlkOiBcImNcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWNcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDUHJvZ3JhbVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImNsYW5ncHBcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmNwcFwiLCBmcm9udGVuZDogcGFyc2VDcHAsIGlkOiBcImNwcFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWMrK3NyY1wiLCB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDcHBcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicnVzdGNcIiwgXCJjYXJnb1wiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwic3JjL21haW4ucnNcIiwgZnJvbnRlbmQ6IHBhcnNlUnVzdCwgaWQ6IFwicnVzdFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LXJ1c3RcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlUnVzdFByb2plY3RcbiAgfSksXG4gIGxhbmd1YWdlKHthY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInN3aWZ0Y1wiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0uc3dpZnRcIiwgZnJvbnRlbmQ6IHBhcnNlU3dpZnQsIGlkOiBcInN3aWZ0XCIsIG1lZGlhVHlwZTogXCJ0ZXh0L3gtc3dpZnRcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlU3dpZnR9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiZGFydFwiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiYmluL3Byb2dyYW0uZGFydFwiLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBmYWxzZSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiB0cnVlLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIHR5cGVkRXJyb3JzOiBmYWxzZSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlXG4gICAgfSxcbiAgICBmcm9udGVuZDogZGFydEZyb250ZW5kLFxuICAgIGlkOiBcImRhcnRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWRhcnRcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVEYXJ0UGFja2FnZVxuICB9KSxcbiAge1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcImdlbmVyYXRlXCIsIFwidmFsaWRhdGVcIiwgXCJpbnN0YW50aWF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcIndhc20tdmFsaWRhdGVcIiwgXCJub2RlXCIsIFwiY2hyb21pdW1cIl19LFxuICAgIGFwcGxpY2F0aW9uQmFja2VuZDogZ2VuZXJhdGVCcm93c2VyV2FzbSxcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGJpbmFyeUJhY2tlbmQ6IGdlbmVyYXRlQnJvd3Nlcldhc20sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ud2FzbVwiLFxuICAgIGZlYXR1cmVzOiB7Y2xvc2VkUmVjb3JkczogZmFsc2UsIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSwgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLCBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLCByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSwgdHlwZWRFcnJvcnM6IGZhbHNlLCB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZX0sXG4gICAgaWQ6IFwid2FzbVwiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IHRydWUsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgbWVkaWFUeXBlOiBcImFwcGxpY2F0aW9uL3dhc21cIixcbiAgICByb3VuZFRyaXA6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiYW5kcm9pZFwiXX0sXG4gICAgYXBwbGljYXRpb25CYWNrZW5kOiBnZW5lcmF0ZUFuZHJvaWRBcHBsaWNhdGlvbixcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGZlYXR1cmVzOiB7Y2xvc2VkUmVjb3JkczogZmFsc2UsIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSwgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLCBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLCByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSwgdHlwZWRFcnJvcnM6IGZhbHNlLCB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZX0sXG4gICAgaWQ6IFwiYW5kcm9pZFwiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IHRydWUsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcm91bmRUcmlwOiBmYWxzZVxuICB9LFxuICB7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wiZ2VuZXJhdGVcIl0sIHRvb2xjaGFpbnM6IFtdfSxcbiAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IGdlbmVyYXRlSW9zQXBwbGljYXRpb24sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBmZWF0dXJlczoge2Nsb3NlZFJlY29yZHM6IGZhbHNlLCBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLCBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLCBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IGZhbHNlLCBpbW11dGFibGVDb2xsZWN0aW9uczogZmFsc2UsIG9wdGlvbmFsVmFsdWVzOiBmYWxzZSwgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLCBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmYWxzZSwgcmVmZXJlbmNlQ2xhc3NlczogZmFsc2UsIHR5cGVkRXJyb3JzOiBmYWxzZSwgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmFsc2V9LFxuICAgIGlkOiBcImlvc1wiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IHRydWUsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcm91bmRUcmlwOiBmYWxzZVxuICB9XG5dXG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZVJlZ2lzdHJ5ID0gY3JlYXRlTGFuZ3VhZ2VSZWdpc3RyeShyZWNvcmRzKVxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlQ2FwYWJpbGl0aWVzID0gbGFuZ3VhZ2VSZWdpc3RyeS5kZXNjcmlwdG9yc1xuLyoqIEB0eXBlIHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2VbXX0gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXMgPSBPYmplY3QuZnJlZXplKGxhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gIC5maWx0ZXIoKHtyb2xlc30pID0+IHJvbGVzLmZyb250ZW5kICYmIHJvbGVzLnRleHRCYWNrZW5kKVxuICAubWFwKCh7aWR9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlkKSkpXG5cbi8qKlxuICogU3VwcGxpZXMgY29tbW9uIG9yaWdpbmFsLWZpdmUgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSB2YWx1ZXMgLSBMYW5ndWFnZS1zcGVjaWZpYyByZWNvcmQgZmllbGRzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBDb21wbGV0ZSByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGxhbmd1YWdlKHZhbHVlcykge1xuICByZXR1cm4ge1xuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcInNpbmdsZVwiLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9wdGlvbmFsVmFsdWVzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9yZGVyZWRNYXBJdGVyYXRpb246IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICB0eXBlZEVycm9yczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKVxuICAgIH0sXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogZmFsc2UsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcHJvdmlkZXI6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgIHJvdW5kVHJpcDogdHJ1ZSxcbiAgICAuLi52YWx1ZXNcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYW4gaW50ZXJuYWwgcmVnaXN0cnkga2V5IGZvciBhIHB1YmxpYyByb2xlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIEludGVybmFsIHJvbGUga2V5LlxuICogQHJldHVybnMge3N0cmluZ30gUHVibGljIHJvbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcHVibGljUm9sZU5hbWUocm9sZSkge1xuICBpZiAocm9sZSA9PSBcInRleHRCYWNrZW5kXCIpIHJldHVybiBcInRleHQgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYmluYXJ5QmFja2VuZFwiKSByZXR1cm4gXCJiaW5hcnkgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYXBwbGljYXRpb25CYWNrZW5kXCIpIHJldHVybiBcImFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmRcIlxuXG4gIHJldHVybiByb2xlXG59XG5cbi8qKlxuICogVGhyb3dzIGFuIHVua25vd24tbGFuZ3VhZ2UgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFVua25vd24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IFtsb2NhdGlvbl0gLSBSZWxhdGVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtSZWdpc3RyeVJvbGUgfCB1bmRlZmluZWR9IFtyb2xlXSAtIFJlcXVlc3RlZCByb2xlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB1bnN1cHBvcnRlZExhbmd1YWdlKGlkLCBsb2NhdGlvbiwgcm9sZSkge1xuICBjb25zdCBtZXNzYWdlID0gcm9sZSA9PSBcImZyb250ZW5kXCIgPyBcIk5vIGZyb250ZW5kIGFkYXB0ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBsYW5ndWFnZS5cIiA6XG4gICAgcm9sZSA9PSBcInRleHRCYWNrZW5kXCIgPyBcIk5vIHNvdXJjZSBiYWNrZW5kIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXCIgOlxuICAgICAgXCJObyBsYW5ndWFnZSBvciB0YXJnZXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBJRC5cIlxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiVU5TVVBQT1JURURfTEFOR1VBR0VcIixcbiAgICBsYW5ndWFnZTogaWQsXG4gICAgbG9jYXRpb24sXG4gICAgbWVzc2FnZVxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcmVnaXN0cnktc2hhcGUgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2lkXSAtIENhbmRpZGF0ZSByZWdpc3RyeSBJRC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFJlZ2lzdHJ5KG1lc3NhZ2UsIGlkID0gXCJyZWdpc3RyeVwiKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9SRUdJU1RSWVwiLCBsYW5ndWFnZTogaWQsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyByZWdpc3RyeSByZWNvcmRzIGFuZCBwdWJsaWMgZGVzY3JpcHRvcnMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFJlZ2lzdHJ5LW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
@@ -97,14 +97,14 @@ export declare function composeSourceMaps(outer: import("@jridgewell/trace-mappi
97
97
  * @param {object} generated - Generated program.
98
98
  * @param {string} generated.content - Exact generated content.
99
99
  * @param {string} generated.filename - Generated filename.
100
- * @param {import("./semantic/types.js").SemanticLanguage} generated.language - Generated language.
100
+ * @param {import("./semantic/types.js").GeneratedTextLanguage} generated.language - Generated text language.
101
101
  * @param {{filename: string, content: string, language?: import("./semantic/types.js").SemanticLanguage}[]} [generated.sources] - Exact source content overrides.
102
102
  * @returns {import("./semantic/types.js").SemantifoldMapping} Imported rich map.
103
103
  */
104
104
  export declare function mappingFromSourceMap(sourceMap: import("@jridgewell/trace-mapping").SourceMapInput, { content, filename, language, sources: provided }: {
105
105
  content: string;
106
106
  filename: string;
107
- language: import("./semantic/types.js").SemanticLanguage;
107
+ language: import("./semantic/types.js").GeneratedTextLanguage;
108
108
  sources?: {
109
109
  filename: string;
110
110
  content: string;