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
@@ -5,9 +5,31 @@
5
5
  */
6
6
  export declare function isValidFilenameMetadata(value: unknown): value is string;
7
7
  /**
8
- * Validates a safe relative POSIX artifact path.
8
+ * Validates a safe relative POSIX source path while retaining Unicode filename metadata.
9
9
  * @param {unknown} value - Candidate path.
10
10
  * @returns {value is string} Whether the value is safe.
11
11
  */
12
+ export declare function isSafeSourcePath(value: unknown): value is string;
13
+ /**
14
+ * Validates a safe portable artifact/resource path in the closed ASCII comparison domain.
15
+ * @param {unknown} value - Candidate path.
16
+ * @returns {value is string} Whether the value is safe and portably comparable.
17
+ */
12
18
  export declare function isSafeArtifactPath(value: unknown): value is string;
19
+ /**
20
+ * Produces a conservative portable comparison key for a validated artifact path.
21
+ * @param {string} value - Safe relative POSIX path.
22
+ * @returns {string} Complete ASCII case-fold key.
23
+ */
24
+ export declare function portableArtifactPathKey(value: string): string;
25
+ /**
26
+ * Finds the first unsafe, duplicate, portable case-fold, or file/directory-prefix conflict.
27
+ * @param {readonly string[]} paths - Ordered candidate artifact paths.
28
+ * @returns {{kind: "case-fold" | "duplicate" | "prefix" | "unsafe", path: string, other?: string} | null} First conflict.
29
+ */
30
+ export declare function findPortableArtifactPathConflict(paths: readonly string[]): {
31
+ kind: "case-fold" | "duplicate" | "prefix" | "unsafe";
32
+ path: string;
33
+ other?: string;
34
+ } | null;
13
35
  //# sourceMappingURL=artifact-path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-path.d.ts","sourceRoot":"","sources":["../../src/artifact-path.js"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAHlC,OAGkC,GAFhC,KAAK,IAAI,MAAM,CAI3B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAH7B,OAG6B,GAF3B,KAAK,IAAI,MAAM,CAe3B"}
1
+ {"version":3,"file":"artifact-path.d.ts","sourceRoot":"","sources":["../../src/artifact-path.js"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAHlC,OAGkC,GAFhC,KAAK,IAAI,MAAM,CAI3B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAH3B,OAG2B,GAFzB,KAAK,IAAI,MAAM,CAe3B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAH7B,OAG6B,GAF3B,KAAK,IAAI,MAAM,CAI3B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAHlC,MAGkC,GAFhC,MAAM,CAIlB;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAH3C,SAAS,MAAM,EAG4B,GAFzC;IAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAqBxG"}
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
  import { hasOnlyUnicodeScalars } from "./semantic/scalars.js";
3
3
  const lineTerminatorPattern = /[\n\r\u2028\u2029]/u;
4
+ const portableArtifactComponentPattern = /^[A-Za-z0-9._-]+$/u;
4
5
  /**
5
6
  * Validates filename metadata without imposing artifact-set path semantics.
6
7
  * @param {unknown} value - Candidate filename.
@@ -10,11 +11,11 @@ export function isValidFilenameMetadata(value) {
10
11
  return typeof value == "string" && value.length > 0 && !lineTerminatorPattern.test(value);
11
12
  }
12
13
  /**
13
- * Validates a safe relative POSIX artifact path.
14
+ * Validates a safe relative POSIX source path while retaining Unicode filename metadata.
14
15
  * @param {unknown} value - Candidate path.
15
16
  * @returns {value is string} Whether the value is safe.
16
17
  */
17
- export function isSafeArtifactPath(value) {
18
+ export function isSafeSourcePath(value) {
18
19
  if (typeof value != "string" || value.length == 0 || value.includes("\\") || value.includes("\0") ||
19
20
  !hasOnlyUnicodeScalars(value))
20
21
  return false;
@@ -27,4 +28,45 @@ export function isSafeArtifactPath(value) {
27
28
  return codePoint != undefined && codePoint > 31 && codePoint != 127;
28
29
  }));
29
30
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3QtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcnRpZmFjdC1wYXRoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUUzRCxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFBO0FBRW5EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBSztJQUMzQyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMzRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFLO0lBQ3RDLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDL0YsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUM3QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUVwRSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRTlCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSTtRQUN6RSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUUxQyxPQUFPLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxTQUFTLElBQUksR0FBRyxDQUFBO1FBQ3JFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzfSBmcm9tIFwiLi9zZW1hbnRpYy9zY2FsYXJzLmpzXCJcblxuY29uc3QgbGluZVRlcm1pbmF0b3JQYXR0ZXJuID0gL1tcXG5cXHJcXHUyMDI4XFx1MjAyOV0vdVxuXG4vKipcbiAqIFZhbGlkYXRlcyBmaWxlbmFtZSBtZXRhZGF0YSB3aXRob3V0IGltcG9zaW5nIGFydGlmYWN0LXNldCBwYXRoIHNlbWFudGljcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZmlsZW5hbWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgc3RyaW5nfSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzaW5nbGUtbGluZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRmlsZW5hbWVNZXRhZGF0YSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAhbGluZVRlcm1pbmF0b3JQYXR0ZXJuLnRlc3QodmFsdWUpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2FmZSByZWxhdGl2ZSBQT1NJWCBhcnRpZmFjdCBwYXRoLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMge3ZhbHVlIGlzIHN0cmluZ30gV2hldGhlciB0aGUgdmFsdWUgaXMgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZUFydGlmYWN0UGF0aCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoID09IDAgfHwgdmFsdWUuaW5jbHVkZXMoXCJcXFxcXCIpIHx8IHZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWhhc09ubHlVbmljb2RlU2NhbGFycyh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIi9cIikgfHwgL15bQS1aYS16XTovdS50ZXN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdChcIi9cIilcblxuICByZXR1cm4gcGFydHMuZXZlcnkoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMCAmJiBwYXJ0ICE9IFwiLlwiICYmIHBhcnQgIT0gXCIuLlwiICYmXG4gICAgWy4uLnBhcnRdLmV2ZXJ5KChjaGFyYWN0ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKVxuXG4gICAgICByZXR1cm4gY29kZVBvaW50ICE9IHVuZGVmaW5lZCAmJiBjb2RlUG9pbnQgPiAzMSAmJiBjb2RlUG9pbnQgIT0gMTI3XG4gICAgfSkpXG59XG4iXX0=
31
+ /**
32
+ * Validates a safe portable artifact/resource path in the closed ASCII comparison domain.
33
+ * @param {unknown} value - Candidate path.
34
+ * @returns {value is string} Whether the value is safe and portably comparable.
35
+ */
36
+ export function isSafeArtifactPath(value) {
37
+ return isSafeSourcePath(value) && value.split("/").every(part => portableArtifactComponentPattern.test(part));
38
+ }
39
+ /**
40
+ * Produces a conservative portable comparison key for a validated artifact path.
41
+ * @param {string} value - Safe relative POSIX path.
42
+ * @returns {string} Complete ASCII case-fold key.
43
+ */
44
+ export function portableArtifactPathKey(value) {
45
+ return value.toLowerCase();
46
+ }
47
+ /**
48
+ * Finds the first unsafe, duplicate, portable case-fold, or file/directory-prefix conflict.
49
+ * @param {readonly string[]} paths - Ordered candidate artifact paths.
50
+ * @returns {{kind: "case-fold" | "duplicate" | "prefix" | "unsafe", path: string, other?: string} | null} First conflict.
51
+ */
52
+ export function findPortableArtifactPathConflict(paths) {
53
+ /** @type {{key: string, path: string}[]} */
54
+ const accepted = [];
55
+ for (const path of paths) {
56
+ if (!isSafeArtifactPath(path))
57
+ return { kind: "unsafe", path: String(path) };
58
+ const key = portableArtifactPathKey(path);
59
+ for (const previous of accepted) {
60
+ if (path == previous.path)
61
+ return { kind: "duplicate", other: previous.path, path };
62
+ if (key == previous.key)
63
+ return { kind: "case-fold", other: previous.path, path };
64
+ if (key.startsWith(`${previous.key}/`) || previous.key.startsWith(`${key}/`)) {
65
+ return { kind: "prefix", other: previous.path, path };
66
+ }
67
+ }
68
+ accepted.push({ key, path });
69
+ }
70
+ return null;
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3QtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcnRpZmFjdC1wYXRoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUUzRCxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFBO0FBQ25ELE1BQU0sZ0NBQWdDLEdBQUcsb0JBQW9CLENBQUE7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFLO0lBQzNDLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzNGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQUs7SUFDcEMsSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMvRixDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzdDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXBFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFOUIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJO1FBQ3pFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUM1QixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRTFDLE9BQU8sU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLEdBQUcsRUFBRSxJQUFJLFNBQVMsSUFBSSxHQUFHLENBQUE7UUFDckUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQUs7SUFDdEMsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQy9HLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQUs7SUFDM0MsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDNUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0NBQWdDLENBQUMsS0FBSztJQUNwRCw0Q0FBNEM7SUFDNUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFBO0lBRW5CLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQTtRQUMxRSxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV6QyxLQUFLLE1BQU0sUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJO2dCQUFFLE9BQU8sRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFBO1lBQ2pGLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHO2dCQUFFLE9BQU8sRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFBO1lBQy9FLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3RSxPQUFPLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQTtZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzfSBmcm9tIFwiLi9zZW1hbnRpYy9zY2FsYXJzLmpzXCJcblxuY29uc3QgbGluZVRlcm1pbmF0b3JQYXR0ZXJuID0gL1tcXG5cXHJcXHUyMDI4XFx1MjAyOV0vdVxuY29uc3QgcG9ydGFibGVBcnRpZmFjdENvbXBvbmVudFBhdHRlcm4gPSAvXltBLVphLXowLTkuXy1dKyQvdVxuXG4vKipcbiAqIFZhbGlkYXRlcyBmaWxlbmFtZSBtZXRhZGF0YSB3aXRob3V0IGltcG9zaW5nIGFydGlmYWN0LXNldCBwYXRoIHNlbWFudGljcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZmlsZW5hbWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgc3RyaW5nfSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzaW5nbGUtbGluZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRmlsZW5hbWVNZXRhZGF0YSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAhbGluZVRlcm1pbmF0b3JQYXR0ZXJuLnRlc3QodmFsdWUpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2FmZSByZWxhdGl2ZSBQT1NJWCBzb3VyY2UgcGF0aCB3aGlsZSByZXRhaW5pbmcgVW5pY29kZSBmaWxlbmFtZSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIHZhbHVlIGlzIHNhZmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVTb3VyY2VQYXRoKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPT0gMCB8fCB2YWx1ZS5pbmNsdWRlcyhcIlxcXFxcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikgfHxcbiAgICAhaGFzT25seVVuaWNvZGVTY2FsYXJzKHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiL1wiKSB8fCAvXltBLVphLXpdOi91LnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KFwiL1wiKVxuXG4gIHJldHVybiBwYXJ0cy5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT0gXCIuXCIgJiYgcGFydCAhPSBcIi4uXCIgJiZcbiAgICBbLi4ucGFydF0uZXZlcnkoKGNoYXJhY3RlcikgPT4ge1xuICAgICAgY29uc3QgY29kZVBvaW50ID0gY2hhcmFjdGVyLmNvZGVQb2ludEF0KDApXG5cbiAgICAgIHJldHVybiBjb2RlUG9pbnQgIT0gdW5kZWZpbmVkICYmIGNvZGVQb2ludCA+IDMxICYmIGNvZGVQb2ludCAhPSAxMjdcbiAgICB9KSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzYWZlIHBvcnRhYmxlIGFydGlmYWN0L3Jlc291cmNlIHBhdGggaW4gdGhlIGNsb3NlZCBBU0NJSSBjb21wYXJpc29uIGRvbWFpbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIHZhbHVlIGlzIHNhZmUgYW5kIHBvcnRhYmx5IGNvbXBhcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVBcnRpZmFjdFBhdGgodmFsdWUpIHtcbiAgcmV0dXJuIGlzU2FmZVNvdXJjZVBhdGgodmFsdWUpICYmIHZhbHVlLnNwbGl0KFwiL1wiKS5ldmVyeShwYXJ0ID0+IHBvcnRhYmxlQXJ0aWZhY3RDb21wb25lbnRQYXR0ZXJuLnRlc3QocGFydCkpXG59XG5cbi8qKlxuICogUHJvZHVjZXMgYSBjb25zZXJ2YXRpdmUgcG9ydGFibGUgY29tcGFyaXNvbiBrZXkgZm9yIGEgdmFsaWRhdGVkIGFydGlmYWN0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBTYWZlIHJlbGF0aXZlIFBPU0lYIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21wbGV0ZSBBU0NJSSBjYXNlLWZvbGQga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9ydGFibGVBcnRpZmFjdFBhdGhLZXkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKClcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3QgdW5zYWZlLCBkdXBsaWNhdGUsIHBvcnRhYmxlIGNhc2UtZm9sZCwgb3IgZmlsZS9kaXJlY3RvcnktcHJlZml4IGNvbmZsaWN0LlxuICogQHBhcmFtIHtyZWFkb25seSBzdHJpbmdbXX0gcGF0aHMgLSBPcmRlcmVkIGNhbmRpZGF0ZSBhcnRpZmFjdCBwYXRocy5cbiAqIEByZXR1cm5zIHt7a2luZDogXCJjYXNlLWZvbGRcIiB8IFwiZHVwbGljYXRlXCIgfCBcInByZWZpeFwiIHwgXCJ1bnNhZmVcIiwgcGF0aDogc3RyaW5nLCBvdGhlcj86IHN0cmluZ30gfCBudWxsfSBGaXJzdCBjb25mbGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQb3J0YWJsZUFydGlmYWN0UGF0aENvbmZsaWN0KHBhdGhzKSB7XG4gIC8qKiBAdHlwZSB7e2tleTogc3RyaW5nLCBwYXRoOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IGFjY2VwdGVkID0gW11cblxuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBpZiAoIWlzU2FmZUFydGlmYWN0UGF0aChwYXRoKSkgcmV0dXJuIHtraW5kOiBcInVuc2FmZVwiLCBwYXRoOiBTdHJpbmcocGF0aCl9XG4gICAgY29uc3Qga2V5ID0gcG9ydGFibGVBcnRpZmFjdFBhdGhLZXkocGF0aClcblxuICAgIGZvciAoY29uc3QgcHJldmlvdXMgb2YgYWNjZXB0ZWQpIHtcbiAgICAgIGlmIChwYXRoID09IHByZXZpb3VzLnBhdGgpIHJldHVybiB7a2luZDogXCJkdXBsaWNhdGVcIiwgb3RoZXI6IHByZXZpb3VzLnBhdGgsIHBhdGh9XG4gICAgICBpZiAoa2V5ID09IHByZXZpb3VzLmtleSkgcmV0dXJuIHtraW5kOiBcImNhc2UtZm9sZFwiLCBvdGhlcjogcHJldmlvdXMucGF0aCwgcGF0aH1cbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHtwcmV2aW91cy5rZXl9L2ApIHx8IHByZXZpb3VzLmtleS5zdGFydHNXaXRoKGAke2tleX0vYCkpIHtcbiAgICAgICAgcmV0dXJuIHtraW5kOiBcInByZWZpeFwiLCBvdGhlcjogcHJldmlvdXMucGF0aCwgcGF0aH1cbiAgICAgIH1cbiAgICB9XG4gICAgYWNjZXB0ZWQucHVzaCh7a2V5LCBwYXRofSlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/artifacts.js"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAHzC,OAGyC,GAFvC,OAAO,qBAAqB,EAAE,oBAAoB,CAgG9D"}
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/artifacts.js"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAHzC,OAGyC,GAFvC,OAAO,qBAAqB,EAAE,oBAAoB,CAoG9D"}
@@ -24,6 +24,9 @@ export function createGeneratedArtifactSet(candidate) {
24
24
  invalidArtifactSet("Artifact set requires a non-empty ordered artifact array.", candidate.target);
25
25
  }
26
26
  const target = candidate.target;
27
+ const metadata = candidate.metadata === undefined
28
+ ? undefined
29
+ : snapshotMetadataObject(candidate.metadata, target);
27
30
  const paths = new Set();
28
31
  const directoryPaths = new Set();
29
32
  /** @type {string[]} */
@@ -99,6 +102,7 @@ export function createGeneratedArtifactSet(candidate) {
99
102
  return Object.freeze({
100
103
  artifacts: Object.freeze(artifacts),
101
104
  entry: entryPaths[0],
105
+ ...(metadata === undefined ? {} : { metadata }),
102
106
  schema: /** @type {const} */ ("GeneratedArtifactSet"),
103
107
  target,
104
108
  version: /** @type {const} */ (1)
@@ -110,6 +114,67 @@ export function createGeneratedArtifactSet(candidate) {
110
114
  return invalidArtifactSet("Artifact-set validation failed.", targetOf(candidate), error);
111
115
  }
112
116
  }
117
+ /**
118
+ * Validates target-specific metadata as detached, immutable JSON.
119
+ * @param {unknown} value - Metadata candidate.
120
+ * @param {string} target - Artifact target.
121
+ * @returns {Readonly<Record<string, unknown>>} Metadata snapshot.
122
+ */
123
+ function snapshotMetadataObject(value, target) {
124
+ if (!isPlainObject(value))
125
+ invalidArtifactSet("Artifact-set metadata must be a plain JSON object.", target);
126
+ return /** @type {Readonly<Record<string, unknown>>} */ (deepFreeze(snapshotMetadataValue(value, target, new WeakSet())));
127
+ }
128
+ /**
129
+ * Recursively snapshots a JSON metadata value without retaining caller objects.
130
+ * @param {unknown} value - JSON candidate.
131
+ * @param {string} target - Artifact target.
132
+ * @param {WeakSet<object>} ancestors - Active object path for cycle rejection.
133
+ * @returns {unknown} Detached JSON value.
134
+ */
135
+ function snapshotMetadataValue(value, target, ancestors) {
136
+ if (value === null || typeof value == "boolean")
137
+ return value;
138
+ if (typeof value == "string") {
139
+ if (!hasOnlyUnicodeScalars(value))
140
+ invalidArtifactSet("Artifact-set metadata contains a lone Unicode surrogate.", target);
141
+ return value;
142
+ }
143
+ if (typeof value == "number") {
144
+ if (!Number.isFinite(value))
145
+ invalidArtifactSet("Artifact-set metadata numbers must be finite.", target);
146
+ return value;
147
+ }
148
+ if (typeof value != "object")
149
+ invalidArtifactSet("Artifact-set metadata must contain only JSON values.", target);
150
+ if (ancestors.has(value))
151
+ invalidArtifactSet("Artifact-set metadata must not contain cycles.", target);
152
+ ancestors.add(value);
153
+ if (Array.isArray(value)) {
154
+ if (!isDenseArray(value))
155
+ invalidArtifactSet("Artifact-set metadata arrays must be dense.", target);
156
+ /** @type {unknown[]} */
157
+ const result = [];
158
+ for (let index = 0; index < value.length; index += 1)
159
+ result.push(snapshotMetadataValue(value[index], target, ancestors));
160
+ ancestors.delete(value);
161
+ return result;
162
+ }
163
+ if (!isPlainObject(value))
164
+ invalidArtifactSet("Artifact-set metadata must contain only plain JSON objects.", target);
165
+ /** @type {Record<string, unknown>} */
166
+ const result = {};
167
+ for (const key of Object.keys(value).sort()) {
168
+ Object.defineProperty(result, key, {
169
+ configurable: true,
170
+ enumerable: true,
171
+ value: snapshotMetadataValue(value[key], target, ancestors),
172
+ writable: true
173
+ });
174
+ }
175
+ ancestors.delete(value);
176
+ return result;
177
+ }
113
178
  /**
114
179
  * Validates artifact-level text, byte, or synthetic provenance.
115
180
  * @param {unknown} value - Provenance candidate.
@@ -386,4 +451,4 @@ function deepFreeze(value) {
386
451
  deepFreeze(nested);
387
452
  return Object.freeze(value);
388
453
  }
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FydGlmYWN0cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDekcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUUzRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyx1RUFBdUUsQ0FBQTtBQUVoRzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFNBQVM7SUFDbEQsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDbEcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0s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Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVjb2RlZE1hcHBpbmdzLCBlbmNvZGVkTWFwcGluZ3MsIHByZXNvcnRlZERlY29kZWRNYXAsIFRyYWNlTWFwfSBmcm9tIFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtpc1NhZmVBcnRpZmFjdFBhdGgsIGlzVmFsaWRGaWxlbmFtZU1ldGFkYXRhfSBmcm9tIFwiLi9hcnRpZmFjdC1wYXRoLmpzXCJcbmltcG9ydCB7ZmluYWxpemVCeXRlTWFwcGluZ30gZnJvbSBcIi4vYmluYXJ5LW1hcHBpbmcuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtmaW5hbGl6ZU1hcHBpbmcsIHRvU291cmNlTWFwVjN9IGZyb20gXCIuL21hcHBpbmcuanNcIlxuaW1wb3J0IHtpc1NvdXJjZVJhbmdlT3JkZXJlZH0gZnJvbSBcIi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHtoYXNPbmx5VW5pY29kZVNjYWxhcnN9IGZyb20gXCIuL3NlbWFudGljL3NjYWxhcnMuanNcIlxuXG5jb25zdCBhcnRpZmFjdFJvbGVzID0gbmV3IFNldChbXCJlbnRyeVwiLCBcInNvdXJjZVwiLCBcIm1hbmlmZXN0XCIsIFwic3VwcG9ydFwiLCBcIm1hcHBpbmdcIiwgXCJyZXNvdXJjZVwiLCBcImxvYWRlclwiXSlcbmNvbnN0IG1lZGlhVHlwZVBhdHRlcm4gPSAvXltBLVphLXowLTkhIyQmXl8uKy1dK1xcL1tBLVphLXowLTkhIyQmXl8uKy1dKyg/OjtbXFx1MDAyMC1cXHUwMDdlXSspPyQvdVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uYWxseSB2YWxpZGF0ZXMgYW5kIGNvbnN0cnVjdHMgb25lIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkIGFydGlmYWN0IHNldC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQXJ0aWZhY3Qtc2V0IGZpZWxkcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBEZXRhY2hlZCBpbW11dGFibGUgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoY2FuZGlkYXRlKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZSkgfHwgdHlwZW9mIGNhbmRpZGF0ZS50YXJnZXQgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUudGFyZ2V0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAhL15bYS16XVthLXowLTktXSokL3UudGVzdChjYW5kaWRhdGUudGFyZ2V0KSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qgc2V0IHJlcXVpcmVzIGEgc3RhYmxlIGxvd2VyY2FzZSB0YXJnZXQgSUQuXCIsIHRhcmdldE9mKGNhbmRpZGF0ZSkpXG4gICAgfVxuICAgIGlmICghaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5hcnRpZmFjdHMpIHx8IGNhbmRpZGF0ZS5hcnRpZmFjdHMubGVuZ3RoID09IDApIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCByZXF1aXJlcyBhIG5vbi1lbXB0eSBvcmRlcmVkIGFydGlmYWN0IGFycmF5LlwiLCBjYW5kaWRhdGUudGFyZ2V0KVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBjYW5kaWRhdGUudGFyZ2V0XG5cbiAgICBjb25zdCBwYXRocyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IGRpcmVjdG9yeVBhdGhzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBlbnRyeVBhdGhzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gKi9cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZS5hcnRpZmFjdHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBhcnRpZmFjdCA9IGNhbmRpZGF0ZS5hcnRpZmFjdHNbaW5kZXhdXG5cbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChhcnRpZmFjdCkpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJHtpbmRleH0gbXVzdCBiZSBhIHBsYWluIG9iamVjdC5gLCB0YXJnZXQpXG4gICAgICBjb25zdCBhcnRpZmFjdFBhdGggPSBhcnRpZmFjdC5wYXRoXG4gICAgICBjb25zdCBtZWRpYVR5cGUgPSBhcnRpZmFjdC5tZWRpYVR5cGVcbiAgICAgIGNvbnN0IHJvbGUgPSBhcnRpZmFjdC5yb2xlXG4gICAgICBjb25zdCBjb250ZW50S2luZCA9IGFydGlmYWN0LmNvbnRlbnRLaW5kXG5cbiAgICAgIGlmICghaXNTYWZlQXJ0aWZhY3RQYXRoKGFydGlmYWN0UGF0aCkpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJHtpbmRleH0gaGFzIGFuIHVuc2FmZSBwYXRoLmAsIHRhcmdldClcbiAgICAgIGlmIChwYXRocy5oYXMoYXJ0aWZhY3RQYXRoKSkgaW52YWxpZEFydGlmYWN0U2V0KGBEdXBsaWNhdGUgYXJ0aWZhY3QgcGF0aCAnJHthcnRpZmFjdFBhdGh9Jy5gLCB0YXJnZXQpXG4gICAgICBpZiAoZGlyZWN0b3J5UGF0aHMuaGFzKGFydGlmYWN0UGF0aCkpIHtcbiAgICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCBwYXRoICcke2FydGlmYWN0UGF0aH0nIGNvbGxpZGVzIHdpdGggYSByZXF1aXJlZCBkaXJlY3RvcnkuYCwgdGFyZ2V0KVxuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aHMgPSBhcnRpZmFjdERpcmVjdG9yeVBhdGhzKGFydGlmYWN0UGF0aClcblxuICAgICAgZm9yIChjb25zdCBwYXJlbnRQYXRoIG9mIHBhcmVudFBhdGhzKSB7XG4gICAgICAgIGlmIChwYXRocy5oYXMocGFyZW50UGF0aCkpIHtcbiAgICAgICAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0IHBhdGggJyR7YXJ0aWZhY3RQYXRofScgZGVzY2VuZHMgZnJvbSBhcnRpZmFjdCBmaWxlICcke3BhcmVudFBhdGh9Jy5gLCB0YXJnZXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhdGhzLmFkZChhcnRpZmFjdFBhdGgpXG4gICAgICBmb3IgKGNvbnN0IHBhcmVudFBhdGggb2YgcGFyZW50UGF0aHMpIGRpcmVjdG9yeVBhdGhzLmFkZChwYXJlbnRQYXRoKVxuICAgICAgaWYgKHR5cGVvZiBtZWRpYVR5cGUgIT0gXCJzdHJpbmdcIiB8fCAhbWVkaWFUeXBlUGF0dGVybi50ZXN0KG1lZGlhVHlwZSkgfHwgL1tcXHJcXG5dL3UudGVzdChtZWRpYVR5cGUpKSB7XG4gICAgICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIGludmFsaWQgbWVkaWEgdHlwZS5gLCB0YXJnZXQpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJvbGUgIT0gXCJzdHJpbmdcIiB8fCAhYXJ0aWZhY3RSb2xlcy5oYXMocm9sZSkpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIGludmFsaWQgcm9sZS5gLCB0YXJnZXQpXG4gICAgICBpZiAoYXJ0aWZhY3Qub3duZXJzaGlwICE9IFwiZ2VuZXJhdGVkXCIpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgbXVzdCBoYXZlIGdlbmVyYXRlZCBvd25lcnNoaXAuYCwgdGFyZ2V0KVxuICAgICAgaWYgKHJvbGUgPT0gXCJlbnRyeVwiKSB7XG4gICAgICAgIGlmIChlbnRyeVBhdGhzLmxlbmd0aCA+IDApIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCBtdXN0IGRlY2xhcmUgZXhhY3RseSBvbmUgZW50cnkgYXJ0aWZhY3QuXCIsIHRhcmdldClcbiAgICAgICAgZW50cnlQYXRocy5wdXNoKGFydGlmYWN0UGF0aClcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFZhbHVlID0gYXJ0aWZhY3QuY29udGVudFxuICAgICAgLyoqIEB0eXBlIHtzdHJpbmcgfCBVaW50OEFycmF5fSAqL1xuICAgICAgbGV0IGNvbnRlbnRcblxuICAgICAgaWYgKGNvbnRlbnRLaW5kID09IFwidGV4dFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudFZhbHVlICE9IFwic3RyaW5nXCIgfHwgY29udGVudFZhbHVlLmxlbmd0aCA9PSAwIHx8ICFoYXNPbmx5VW5pY29kZVNjYWxhcnMoY29udGVudFZhbHVlKSkge1xuICAgICAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyByZXF1aXJlcyBub24tZW1wdHkgc3RyaW5nIGNvbnRlbnQuYCwgdGFyZ2V0KVxuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50VmFsdWVcbiAgICAgIH0gZWxzZSBpZiAoY29udGVudEtpbmQgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBpZiAoIShjb250ZW50VmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBjb250ZW50VmFsdWUuYnl0ZUxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBCaW5hcnkgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgcmVxdWlyZXMgbm9uLWVtcHR5IGJ5dGVzLmAsIHRhcmdldClcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoY29udGVudFZhbHVlKVxuICAgICAgfSBlbHNlIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIGludmFsaWQgY29udGVudCBraW5kLmAsIHRhcmdldClcblxuICAgICAgY29uc3QgcHJvdmVuYW5jZSA9IHZhbGlkYXRlQXJ0aWZhY3RQcm92ZW5hbmNlKGFydGlmYWN0LnByb3ZlbmFuY2UsIGNvbnRlbnRLaW5kLCBhcnRpZmFjdFBhdGgsIGNvbnRlbnQsIHRhcmdldClcblxuICAgICAgYXJ0aWZhY3RzLnB1c2goLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNldEFydGlmYWN0fSAqLyAoZnJlZXplQXJ0aWZhY3Qoe1xuICAgICAgICBjb250ZW50LFxuICAgICAgICBjb250ZW50S2luZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBvd25lcnNoaXA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImdlbmVyYXRlZFwiKSxcbiAgICAgICAgcGF0aDogYXJ0aWZhY3RQYXRoLFxuICAgICAgICBwcm92ZW5hbmNlLFxuICAgICAgICByb2xlXG4gICAgICB9KSkpXG4gICAgfVxuXG4gICAgaWYgKGVudHJ5UGF0aHMubGVuZ3RoICE9IDEpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCBtdXN0IGRlY2xhcmUgZXhhY3RseSBvbmUgZW50cnkgYXJ0aWZhY3QuXCIsIGNhbmRpZGF0ZS50YXJnZXQpXG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBhcnRpZmFjdHM6IE9iamVjdC5mcmVlemUoYXJ0aWZhY3RzKSxcbiAgICAgIGVudHJ5OiBlbnRyeVBhdGhzWzBdLFxuICAgICAgc2NoZW1hOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwiKSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcnNpb246IC8qKiBAdHlwZSB7Y29uc3R9ICovICgxKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VtYW50aWZvbGREaWFnbm9zdGljICYmIGVycm9yLmNvZGUgPT0gXCJJTlZBTElEX0FSVElGQUNUX1NFVFwiKSB0aHJvdyBlcnJvclxuXG4gICAgcmV0dXJuIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCB2YWxpZGF0aW9uIGZhaWxlZC5cIiwgdGFyZ2V0T2YoY2FuZGlkYXRlKSwgZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYXJ0aWZhY3QtbGV2ZWwgdGV4dCwgYnl0ZSwgb3Igc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUHJvdmVuYW5jZSBjYW5kaWRhdGUuXG4gKiBAcGFyYW0ge3Vua25vd259IGNvbnRlbnRLaW5kIC0gVmFsaWRhdGVkIGFydGlmYWN0IGNvbnRlbnQga2luZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBWYWxpZGF0ZWQgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIERldGFjaGVkIGFydGlmYWN0IGNvbnRlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3QgdGFyZ2V0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQXJ0aWZhY3RQcm92ZW5hbmNlfSBWYWxpZGF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBcnRpZmFjdFByb3ZlbmFuY2UodmFsdWUsIGNvbnRlbnRLaW5kLCBhcnRpZmFjdFBhdGgsIGNvbnRlbnQsIHRhcmdldCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIHJlcXVpcmVzIHByb3ZlbmFuY2UuYCwgdGFyZ2V0KVxuXG4gIGlmICh2YWx1ZS5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLnJlYXNvbiAhPSBcInN0cmluZ1wiIHx8IHZhbHVlLnJlYXNvbi5sZW5ndGggPT0gMCB8fCAhaXNEZW5zZUFycmF5KHZhbHVlLnJlbGF0ZWRPcmlnaW5zKSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBTeW50aGV0aWMgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVhc29uIGFuZCByZWxhdGVkIG9yaWdpbnMuYCwgdGFyZ2V0KVxuICAgIH1cbiAgICBpZiAoY29udGVudEtpbmQgPT0gXCJiaW5hcnlcIikge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBCaW5hcnkgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgcmVxdWlyZXMgYnl0ZS1yYW5nZSBwcm92ZW5hbmNlLmAsIHRhcmdldClcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gKi9cbiAgICBjb25zdCByZWxhdGVkT3JpZ2lucyA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUucmVsYXRlZE9yaWdpbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICByZWxhdGVkT3JpZ2lucy5wdXNoKHZhbGlkYXRlUmVsYXRlZE9yaWdpbih2YWx1ZS5yZWxhdGVkT3JpZ2luc1tpbmRleF0sIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSwgcmVhc29uOiB2YWx1ZS5yZWFzb24sIHJlbGF0ZWRPcmlnaW5zOiBPYmplY3QuZnJlZXplKHJlbGF0ZWRPcmlnaW5zKX0pXG4gIH1cblxuICBpZiAodmFsdWUua2luZCA9PSBcInRleHRcIikge1xuICAgIGNvbnN0IG1hcHBpbmdDYW5kaWRhdGUgPSB2YWx1ZS5tYXBwaW5nXG5cbiAgICBpZiAoY29udGVudEtpbmQgIT0gXCJ0ZXh0XCIgfHwgIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZSkgfHwgbWFwcGluZ0NhbmRpZGF0ZS5zY2hlbWEgIT0gXCJTZW1hbnRpZm9sZE1hcHBpbmdcIiB8fFxuICAgICAgIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZS5nZW5lcmF0ZWQpIHx8IG1hcHBpbmdDYW5kaWRhdGUuZ2VuZXJhdGVkLmZpbGVuYW1lICE9IGFydGlmYWN0UGF0aCB8fFxuICAgICAgbWFwcGluZ0NhbmRpZGF0ZS5nZW5lcmF0ZWQuY29udGVudCAhPSBjb250ZW50IHx8ICFpc1BsYWluT2JqZWN0KHZhbHVlLnNvdXJjZU1hcCkpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgbWlzbWF0Y2hlZCByaWNoIG9yIFNvdXJjZSBNYXAgcHJvdmVuYW5jZS5gLCB0YXJnZXQpXG4gICAgfVxuICAgIGlmICh2YWx1ZS5zb3VyY2VNYXBGaWxlbmFtZSAhPT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkRmlsZW5hbWVNZXRhZGF0YSh2YWx1ZS5zb3VyY2VNYXBGaWxlbmFtZSkpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgaW52YWxpZCBTb3VyY2UgTWFwIGZpbGVuYW1lIG1ldGFkYXRhLmAsIHRhcmdldClcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZyA9IGZpbmFsaXplTWFwcGluZyhtYXBwaW5nQ2FuZGlkYXRlKVxuICAgIGNvbnN0IHNvdXJjZU1hcCA9IHZhbGlkYXRlU291cmNlTWFwKHZhbHVlLnNvdXJjZU1hcCwgYXJ0aWZhY3RQYXRoLCB0YXJnZXQpXG4gICAgY29uc3QgcHJvamVjdGVkU291cmNlTWFwID0gdG9Tb3VyY2VNYXBWMyhtYXBwaW5nKVxuXG4gICAgaWYgKCFzYW1lSnNvblZhbHVlKHNvdXJjZU1hcCwgcHJvamVjdGVkU291cmNlTWFwKSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBUZXh0IGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIGhhcyBTb3VyY2UgTWFwIHByb3ZlbmFuY2UgdGhhdCBjb250cmFkaWN0cyBpdHMgcmljaCBtYXBwaW5nLmAsIHRhcmdldClcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ0ZXh0XCIpLFxuICAgICAgbWFwcGluZyxcbiAgICAgIHNvdXJjZU1hcCxcbiAgICAgIHNvdXJjZU1hcEZpbGVuYW1lOiB2YWx1ZS5zb3VyY2VNYXBGaWxlbmFtZVxuICAgIH0pXG4gIH1cblxuICBpZiAodmFsdWUua2luZCA9PSBcImJ5dGVzXCIpIHtcbiAgICBpZiAoY29udGVudEtpbmQgIT0gXCJiaW5hcnlcIikgaW52YWxpZEFydGlmYWN0U2V0KGBCeXRlIHByb3ZlbmFuY2UgcmVxdWlyZXMgYmluYXJ5IGNvbnRlbnQgZm9yICcke2FydGlmYWN0UGF0aH0nLmAsIHRhcmdldClcbiAgICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVCeXRlTWFwcGluZyh2YWx1ZS5tYXBwaW5nKVxuXG4gICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkLnBhdGggIT0gYXJ0aWZhY3RQYXRoIHx8IG1hcHBpbmcuZ2VuZXJhdGVkLmJ5dGVMZW5ndGggIT0gLyoqIEB0eXBlIHtVaW50OEFycmF5fSAqLyAoY29udGVudCkuYnl0ZUxlbmd0aCkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBCeXRlIHByb3ZlbmFuY2UgZG9lcyBub3QgbWF0Y2ggYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScuYCwgdGFyZ2V0KVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJieXRlc1wiKSwgbWFwcGluZ30pXG4gIH1cblxuICByZXR1cm4gaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgYW4gdW5rbm93biBwcm92ZW5hbmNlIGtpbmQuYCwgdGFyZ2V0KVxufVxuXG4vKipcbiAqIEZyZWV6ZXMgb25lIHZhbGlkYXRlZCBhcnRpZmFjdCByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhcnRpZmFjdCAtIFZhbGlkYXRlZCBmaWVsZHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBGcm96ZW4gcmVjb3JkLlxuICovXG5mdW5jdGlvbiBmcmVlemVBcnRpZmFjdChhcnRpZmFjdCkge1xuICBpZiAoYXJ0aWZhY3QuY29udGVudEtpbmQgPT0gXCJiaW5hcnlcIiAmJiBhcnRpZmFjdC5jb250ZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhcnRpZmFjdC5jb250ZW50XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJ0aWZhY3QsIFwiY29udGVudFwiLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGNvbnRlbnQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKGFydGlmYWN0KVxufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBhIHNhZmUgcmVsYXRpdmUgUE9TSVggYXJ0aWZhY3QgcGF0aCByZXF1aXJlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBWYWxpZGF0ZWQgYXJ0aWZhY3QgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gT3JkZXJlZCBwYXJlbnQgZGlyZWN0b3J5IHBhdGhzLlxuICovXG5mdW5jdGlvbiBhcnRpZmFjdERpcmVjdG9yeVBhdGhzKGFydGlmYWN0UGF0aCkge1xuICBjb25zdCBwYXJ0cyA9IGFydGlmYWN0UGF0aC5zcGxpdChcIi9cIilcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgZGlyZWN0b3JpZXMgPSBbXVxuXG4gIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBwYXJ0cy5sZW5ndGg7IGluZGV4ICs9IDEpIGRpcmVjdG9yaWVzLnB1c2gocGFydHMuc2xpY2UoMCwgaW5kZXgpLmpvaW4oXCIvXCIpKVxuXG4gIHJldHVybiBkaXJlY3Rvcmllc1xufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgYXJ0aWZhY3Qtc2V0IGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0IHRhcmdldC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gW2Vycm9yXSAtIFByZXNlcnZlZCB2YWxpZGF0aW9uIGNhdXNlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkQXJ0aWZhY3RTZXQobWVzc2FnZSwgdGFyZ2V0LCBlcnJvcikge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgIGNvZGU6IFwiSU5WQUxJRF9BUlRJRkFDVF9TRVRcIixcbiAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgIG1lc3NhZ2VcbiAgfSlcbn1cblxuLyoqXG4gKiBEZXJpdmVzIGEgc2FmZSBkaWFnbm9zdGljIGlkZW50aXR5IGZyb20gYW4gdW5rbm93biByZXF1ZXN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEaWFnbm9zdGljIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiB0YXJnZXRPZih2YWx1ZSkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLnRhcmdldCA9PSBcInN0cmluZ1wiICYmIHZhbHVlLnRhcmdldC5sZW5ndGggPiAwID8gdmFsdWUudGFyZ2V0IDogXCJhcnRpZmFjdFwiXG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciBhbiBvcmRpbmFyeSBzdHJpbmcta2V5ZWQgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbiBhcnRpZmFjdC1sZXZlbCByZWxhdGVkIG9yaWdpbiB3aXRob3V0IGludGVycHJldGluZyBzb3VyY2Ugb2Zmc2V0cyBhcyBnZW5lcmF0ZWQgYnl0ZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmVsYXRlZC1vcmlnaW4gY2FuZGlkYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFydGlmYWN0UGF0aCAtIE93bmluZyBhcnRpZmFjdCBwYXRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gT3JpZ2luIGluZGV4LlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0IHRhcmdldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IERldGFjaGVkIHJlbGF0ZWQgb3JpZ2luLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlbGF0ZWRPcmlnaW4odmFsdWUsIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZS5zb3VyY2VJZCAhPSBcInN0cmluZ1wiIHx8IHZhbHVlLnNvdXJjZUlkLmxlbmd0aCA9PSAwIHx8XG4gICAgIWlzUGxhaW5PYmplY3QodmFsdWUubG9jYXRpb24pIHx8IHR5cGVvZiB2YWx1ZS5sb2NhdGlvbi5maWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8IHZhbHVlLmxvY2F0aW9uLmZpbGVuYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgIXZhbGlkU291cmNlUG9pbnQodmFsdWUubG9jYXRpb24uc3RhcnQpIHx8ICF2YWxpZFNvdXJjZVBvaW50KHZhbHVlLmxvY2F0aW9uLmVuZCkgfHxcbiAgICB2YWx1ZS5sb2NhdGlvbi5lbmQub2Zmc2V0IDwgdmFsdWUubG9jYXRpb24uc3RhcnQub2Zmc2V0IHx8ICFpc1NvdXJjZVJhbmdlT3JkZXJlZCh2YWx1ZS5sb2NhdGlvbi5zdGFydCwgdmFsdWUubG9jYXRpb24uZW5kKSkge1xuICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIG1hbGZvcm1lZCByZWxhdGVkIG9yaWdpbiAke2luZGV4fS5gLCB0YXJnZXQpXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgbG9jYXRpb246IHtcbiAgICAgIGVuZDogey4uLnZhbHVlLmxvY2F0aW9uLmVuZH0sXG4gICAgICBmaWxlbmFtZTogdmFsdWUubG9jYXRpb24uZmlsZW5hbWUsXG4gICAgICBzdGFydDogey4uLnZhbHVlLmxvY2F0aW9uLnN0YXJ0fVxuICAgIH0sXG4gICAgc291cmNlSWQ6IHZhbHVlLnNvdXJjZUlkLFxuICAgIC4uLihvcHRpb25hbFN0cmluZyh2YWx1ZS5ub2RlSWQsIFwibm9kZUlkXCIsIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkpLFxuICAgIC4uLihvcHRpb25hbFN0cmluZyh2YWx1ZS5zeW1ib2xJZCwgXCJzeW1ib2xJZFwiLCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpKSxcbiAgICAuLi4ob3B0aW9uYWxTdHJpbmcodmFsdWUucm9sZSwgXCJyb2xlXCIsIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkpXG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBvcHRpb25hbCByZWxhdGVkLW9yaWdpbiBzdHJpbmcgZmllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gUHJvcGVydHkgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBPd25pbmcgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIE9yaWdpbiBpbmRleC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gUHJlc2VudCB2YWxpZGF0ZWQgcHJvcGVydHkgb3IgYW4gZW1wdHkgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBvcHRpb25hbFN0cmluZyh2YWx1ZSwgcHJvcGVydHksIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHt9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgJHtwcm9wZXJ0eX0gaW4gcmVsYXRlZCBvcmlnaW4gJHtpbmRleH0uYCwgdGFyZ2V0KVxuICB9XG5cbiAgcmV0dXJuIHtbcHJvcGVydHldOiB2YWx1ZX1cbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIFVURi0xNiBzb3VyY2UgcG9pbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHBvaW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlUG9pbnR9IFdoZXRoZXIgdGhlIHBvaW50IGlzIHN0cnVjdHVyYWxseSB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRTb3VyY2VQb2ludCh2YWx1ZSkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLmxpbmUgPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZS5saW5lKSAmJiB2YWx1ZS5saW5lID4gMCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5jb2x1bW4gPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZS5jb2x1bW4pICYmIHZhbHVlLmNvbHVtbiA+IDAgJiZcbiAgICB0eXBlb2YgdmFsdWUub2Zmc2V0ID09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUub2Zmc2V0KSAmJiB2YWx1ZS5vZmZzZXQgPj0gMFxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgZGV0YWNoZXMgdGhlIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbiBjYXJyaWVkIGJ5IGEgdGV4dCBhcnRpZmFjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBTb3VyY2UgTWFwIGNhbmRpZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBPd25pbmcgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gRGV0YWNoZWQgU291cmNlIE1hcC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTb3VyY2VNYXAodmFsdWUsIGFydGlmYWN0UGF0aCwgdGFyZ2V0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHwgdmFsdWUudmVyc2lvbiAhPSAzIHx8IHZhbHVlLmZpbGUgIT0gYXJ0aWZhY3RQYXRoIHx8IHR5cGVvZiB2YWx1ZS5tYXBwaW5ncyAhPSBcInN0cmluZ1wiIHx8XG4gICAgIWlzRGVuc2VBcnJheSh2YWx1ZS5uYW1lcykgfHwgIXZhbHVlLm5hbWVzLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PSBcInN0cmluZ1wiKSB8fFxuICAgICFpc0RlbnNlQXJyYXkodmFsdWUuc291cmNlcykgfHwgIXZhbHVlLnNvdXJjZXMuZXZlcnkoKHNvdXJjZSkgPT4gdHlwZW9mIHNvdXJjZSA9PSBcInN0cmluZ1wiKSB8fFxuICAgICh2YWx1ZS5zb3VyY2VzQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICghaXNEZW5zZUFycmF5KHZhbHVlLnNvdXJjZXNDb250ZW50KSB8fFxuICAgICAgIXZhbHVlLnNvdXJjZXNDb250ZW50LmV2ZXJ5KChzb3VyY2UpID0+IHNvdXJjZSA9PSBudWxsIHx8IHR5cGVvZiBzb3VyY2UgPT0gXCJzdHJpbmdcIikpKSkge1xuICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgbWFsZm9ybWVkIFNvdXJjZSBNYXAgdjMgcHJvdmVuYW5jZS5gLCB0YXJnZXQpXG4gIH1cbiAgdmFsaWRhdGVFbmNvZGVkU291cmNlTWFwTWFwcGluZ3MoXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh2YWx1ZSkpLFxuICAgIGFydGlmYWN0UGF0aCxcbiAgICB0YXJnZXRcbiAgKVxuXG4gIGNvbnN0IGRldGFjaGVkID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc3RydWN0dXJlZENsb25lKHZhbHVlKSlcblxuICByZXR1cm4gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9ICovIChkZXRhY2hlZCkpXG59XG5cbi8qKlxuICogRGVjb2RlcyBhbmQgdmFsaWRhdGVzIHRoZSBTb3VyY2UgTWFwIHBheWxvYWQgd2l0aCB0aGUgaW5zdGFsbGVkIG1hcHBpbmcgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gU3RydWN0dXJhbGx5IHZhbGlkYXRlZCBtYXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWZhY3RQYXRoIC0gT3duaW5nIGFydGlmYWN0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3QgdGFyZ2V0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW5jb2RlZFNvdXJjZU1hcE1hcHBpbmdzKHNvdXJjZU1hcCwgYXJ0aWZhY3RQYXRoLCB0YXJnZXQpIHtcbiAgLyoqIEB0eXBlIHtSZWFkb25seTxpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcFNlZ21lbnRbXVtdPn0gKi9cbiAgbGV0IGRlY29kZWRcbiAgbGV0IGNhbm9uaWNhbE1hcHBpbmdzXG5cbiAgdHJ5IHtcbiAgICBkZWNvZGVkID0gZGVjb2RlZE1hcHBpbmdzKG5ldyBUcmFjZU1hcChzb3VyY2VNYXApKVxuICAgIGNvbnN0IGRlY29kZWRNYXAgPSAvKiogQHR5cGUge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRGVjb2RlZFNvdXJjZU1hcH0gKi8gKHtcbiAgICAgIC4uLnNvdXJjZU1hcCxcbiAgICAgIG1hcHBpbmdzOiBzdHJ1Y3R1cmVkQ2xvbmUoZGVjb2RlZClcbiAgICB9KVxuXG4gICAgY2Fub25pY2FsTWFwcGluZ3MgPSBlbmNvZGVkTWFwcGluZ3MocHJlc29ydGVkRGVjb2RlZE1hcChkZWNvZGVkTWFwKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgZW5jb2RlZCBTb3VyY2UgTWFwIG1hcHBpbmdzLmAsIHRhcmdldCwgZXJyb3IpXG4gIH1cblxuICBpZiAoY2Fub25pY2FsTWFwcGluZ3MgIT0gc291cmNlTWFwLm1hcHBpbmdzIHx8XG4gICAgIXZhbGlkRGVjb2RlZFNvdXJjZU1hcE1hcHBpbmdzKGRlY29kZWQsIHNvdXJjZU1hcC5zb3VyY2VzLmxlbmd0aCwgc291cmNlTWFwLm5hbWVzLmxlbmd0aCkpIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgZW5jb2RlZCBTb3VyY2UgTWFwIG1hcHBpbmdzLmAsIHRhcmdldClcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkZWNvZGVkIFNvdXJjZSBNYXAgc2VnbWVudCBzaGFwZSBhbmQgcmVmZXJlbmNlZCBpbmRpY2VzLlxuICogQHBhcmFtIHtSZWFkb25seTxpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcFNlZ21lbnRbXVtdPn0gbGluZXMgLSBEZWNvZGVkIG1hcHBpbmcgbGluZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gc291cmNlQ291bnQgLSBEZWNsYXJlZCBzb3VyY2UgY291bnQuXG4gKiBAcGFyYW0ge251bWJlcn0gbmFtZUNvdW50IC0gRGVjbGFyZWQgbmFtZSBjb3VudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGV2ZXJ5IHNlZ21lbnQgaXMgc2VtYW50aWNhbGx5IHZhbGlkLlxuICovXG5mdW5jdGlvbiB2YWxpZERlY29kZWRTb3VyY2VNYXBNYXBwaW5ncyhsaW5lcywgc291cmNlQ291bnQsIG5hbWVDb3VudCkge1xuICByZXR1cm4gbGluZXMuZXZlcnkoKGxpbmUpID0+IGxpbmUuZXZlcnkoKHNlZ21lbnQpID0+IHtcbiAgICBpZiAoc2VnbWVudC5sZW5ndGggIT0gMSAmJiBzZWdtZW50Lmxlbmd0aCAhPSA0ICYmIHNlZ21lbnQubGVuZ3RoICE9IDUpIHJldHVybiBmYWxzZVxuICAgIGlmICghc2VnbWVudC5ldmVyeSgoZmllbGQpID0+IE51bWJlci5pc1NhZmVJbnRlZ2VyKGZpZWxkKSAmJiBmaWVsZCA+PSAwKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHNlZ21lbnQubGVuZ3RoID09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHNlZ21lbnRbMV0gPj0gc291cmNlQ291bnQpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIHNlZ21lbnQubGVuZ3RoID09IDQgfHwgc2VnbWVudFs0XSA8IG5hbWVDb3VudFxuICB9KSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBkZXRhY2hlZCBKU09OIHZhbHVlcyB3aXRob3V0IGRlcGVuZGluZyBvbiBjYWxsZXIgb2JqZWN0LWtleSBvcmRlci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIEZpcnN0IEpTT04gdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHJpZ2h0IC0gU2Vjb25kIEpTT04gdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBib3RoIHZhbHVlcyBhcmUgc3RydWN0dXJhbGx5IGlkZW50aWNhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZUpzb25WYWx1ZShsZWZ0LCByaWdodCkge1xuICBpZiAobGVmdCA9PT0gcmlnaHQpIHJldHVybiB0cnVlXG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpIHx8IEFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkgJiYgbGVmdC5sZW5ndGggPT0gcmlnaHQubGVuZ3RoICYmXG4gICAgICBsZWZ0LmV2ZXJ5KChlbnRyeSwgaW5kZXgpID0+IHNhbWVKc29uVmFsdWUoZW50cnksIHJpZ2h0W2luZGV4XSkpXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGxlZnQpIHx8ICFpc1BsYWluT2JqZWN0KHJpZ2h0KSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGxlZnRLZXlzID0gT2JqZWN0LmtleXMobGVmdClcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpXG5cbiAgcmV0dXJuIGxlZnRLZXlzLmxlbmd0aCA9PSByaWdodEtleXMubGVuZ3RoICYmXG4gICAgbGVmdEtleXMuZXZlcnkoKGtleSkgPT4gT2JqZWN0Lmhhc093bihyaWdodCwga2V5KSAmJiBzYW1lSnNvblZhbHVlKGxlZnRba2V5XSwgcmlnaHRba2V5XSkpXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgYSBkZXRhY2hlZCBKU09OIHZhbHVlLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWUgLSBEZXRhY2hlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FydGlmYWN0cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDekcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUUzRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyx1RUFBdUUsQ0FBQTtBQUVoRzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFNBQVM7SUFDbEQsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDbEcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0s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Q0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU07UUFDeEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzlGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVjb2RlZE1hcHBpbmdzLCBlbmNvZGVkTWFwcGluZ3MsIHByZXNvcnRlZERlY29kZWRNYXAsIFRyYWNlTWFwfSBmcm9tIFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtpc1NhZmVBcnRpZmFjdFBhdGgsIGlzVmFsaWRGaWxlbmFtZU1ldGFkYXRhfSBmcm9tIFwiLi9hcnRpZmFjdC1wYXRoLmpzXCJcbmltcG9ydCB7ZmluYWxpemVCeXRlTWFwcGluZ30gZnJvbSBcIi4vYmluYXJ5LW1hcHBpbmcuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtmaW5hbGl6ZU1hcHBpbmcsIHRvU291cmNlTWFwVjN9IGZyb20gXCIuL21hcHBpbmcuanNcIlxuaW1wb3J0IHtpc1NvdXJjZVJhbmdlT3JkZXJlZH0gZnJvbSBcIi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHtoYXNPbmx5VW5pY29kZVNjYWxhcnN9IGZyb20gXCIuL3NlbWFudGljL3NjYWxhcnMuanNcIlxuXG5jb25zdCBhcnRpZmFjdFJvbGVzID0gbmV3IFNldChbXCJlbnRyeVwiLCBcInNvdXJjZVwiLCBcIm1hbmlmZXN0XCIsIFwic3VwcG9ydFwiLCBcIm1hcHBpbmdcIiwgXCJyZXNvdXJjZVwiLCBcImxvYWRlclwiXSlcbmNvbnN0IG1lZGlhVHlwZVBhdHRlcm4gPSAvXltBLVphLXowLTkhIyQmXl8uKy1dK1xcL1tBLVphLXowLTkhIyQmXl8uKy1dKyg/OjtbXFx1MDAyMC1cXHUwMDdlXSspPyQvdVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uYWxseSB2YWxpZGF0ZXMgYW5kIGNvbnN0cnVjdHMgb25lIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkIGFydGlmYWN0IHNldC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQXJ0aWZhY3Qtc2V0IGZpZWxkcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBEZXRhY2hlZCBpbW11dGFibGUgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoY2FuZGlkYXRlKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZSkgfHwgdHlwZW9mIGNhbmRpZGF0ZS50YXJnZXQgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUudGFyZ2V0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAhL15bYS16XVthLXowLTktXSokL3UudGVzdChjYW5kaWRhdGUudGFyZ2V0KSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qgc2V0IHJlcXVpcmVzIGEgc3RhYmxlIGxvd2VyY2FzZSB0YXJnZXQgSUQuXCIsIHRhcmdldE9mKGNhbmRpZGF0ZSkpXG4gICAgfVxuICAgIGlmICghaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5hcnRpZmFjdHMpIHx8IGNhbmRpZGF0ZS5hcnRpZmFjdHMubGVuZ3RoID09IDApIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCByZXF1aXJlcyBhIG5vbi1lbXB0eSBvcmRlcmVkIGFydGlmYWN0IGFycmF5LlwiLCBjYW5kaWRhdGUudGFyZ2V0KVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBjYW5kaWRhdGUudGFyZ2V0XG4gICAgY29uc3QgbWV0YWRhdGEgPSBjYW5kaWRhdGUubWV0YWRhdGEgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogc25hcHNob3RNZXRhZGF0YU9iamVjdChjYW5kaWRhdGUubWV0YWRhdGEsIHRhcmdldClcblxuICAgIGNvbnN0IHBhdGhzID0gbmV3IFNldCgpXG4gICAgY29uc3QgZGlyZWN0b3J5UGF0aHMgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIGNvbnN0IGVudHJ5UGF0aHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSAqL1xuICAgIGNvbnN0IGFydGlmYWN0cyA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2FuZGlkYXRlLmFydGlmYWN0cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGFydGlmYWN0ID0gY2FuZGlkYXRlLmFydGlmYWN0c1tpbmRleF1cblxuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGFydGlmYWN0KSkgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAke2luZGV4fSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LmAsIHRhcmdldClcbiAgICAgIGNvbnN0IGFydGlmYWN0UGF0aCA9IGFydGlmYWN0LnBhdGhcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IGFydGlmYWN0Lm1lZGlhVHlwZVxuICAgICAgY29uc3Qgcm9sZSA9IGFydGlmYWN0LnJvbGVcbiAgICAgIGNvbnN0IGNvbnRlbnRLaW5kID0gYXJ0aWZhY3QuY29udGVudEtpbmRcblxuICAgICAgaWYgKCFpc1NhZmVBcnRpZmFjdFBhdGgoYXJ0aWZhY3RQYXRoKSkgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAke2luZGV4fSBoYXMgYW4gdW5zYWZlIHBhdGguYCwgdGFyZ2V0KVxuICAgICAgaWYgKHBhdGhzLmhhcyhhcnRpZmFjdFBhdGgpKSBpbnZhbGlkQXJ0aWZhY3RTZXQoYER1cGxpY2F0ZSBhcnRpZmFjdCBwYXRoICcke2FydGlmYWN0UGF0aH0nLmAsIHRhcmdldClcbiAgICAgIGlmIChkaXJlY3RvcnlQYXRocy5oYXMoYXJ0aWZhY3RQYXRoKSkge1xuICAgICAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0IHBhdGggJyR7YXJ0aWZhY3RQYXRofScgY29sbGlkZXMgd2l0aCBhIHJlcXVpcmVkIGRpcmVjdG9yeS5gLCB0YXJnZXQpXG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRocyA9IGFydGlmYWN0RGlyZWN0b3J5UGF0aHMoYXJ0aWZhY3RQYXRoKVxuXG4gICAgICBmb3IgKGNvbnN0IHBhcmVudFBhdGggb2YgcGFyZW50UGF0aHMpIHtcbiAgICAgICAgaWYgKHBhdGhzLmhhcyhwYXJlbnRQYXRoKSkge1xuICAgICAgICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgcGF0aCAnJHthcnRpZmFjdFBhdGh9JyBkZXNjZW5kcyBmcm9tIGFydGlmYWN0IGZpbGUgJyR7cGFyZW50UGF0aH0nLmAsIHRhcmdldClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGF0aHMuYWRkKGFydGlmYWN0UGF0aClcbiAgICAgIGZvciAoY29uc3QgcGFyZW50UGF0aCBvZiBwYXJlbnRQYXRocykgZGlyZWN0b3J5UGF0aHMuYWRkKHBhcmVudFBhdGgpXG4gICAgICBpZiAodHlwZW9mIG1lZGlhVHlwZSAhPSBcInN0cmluZ1wiIHx8ICFtZWRpYVR5cGVQYXR0ZXJuLnRlc3QobWVkaWFUeXBlKSB8fCAvW1xcclxcbl0vdS50ZXN0KG1lZGlhVHlwZSkpIHtcbiAgICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgYW4gaW52YWxpZCBtZWRpYSB0eXBlLmAsIHRhcmdldClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygcm9sZSAhPSBcInN0cmluZ1wiIHx8ICFhcnRpZmFjdFJvbGVzLmhhcyhyb2xlKSkgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgYW4gaW52YWxpZCByb2xlLmAsIHRhcmdldClcbiAgICAgIGlmIChhcnRpZmFjdC5vd25lcnNoaXAgIT0gXCJnZW5lcmF0ZWRcIikgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBtdXN0IGhhdmUgZ2VuZXJhdGVkIG93bmVyc2hpcC5gLCB0YXJnZXQpXG4gICAgICBpZiAocm9sZSA9PSBcImVudHJ5XCIpIHtcbiAgICAgICAgaWYgKGVudHJ5UGF0aHMubGVuZ3RoID4gMCkgaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qgc2V0IG11c3QgZGVjbGFyZSBleGFjdGx5IG9uZSBlbnRyeSBhcnRpZmFjdC5cIiwgdGFyZ2V0KVxuICAgICAgICBlbnRyeVBhdGhzLnB1c2goYXJ0aWZhY3RQYXRoKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZW50VmFsdWUgPSBhcnRpZmFjdC5jb250ZW50XG4gICAgICAvKiogQHR5cGUge3N0cmluZyB8IFVpbnQ4QXJyYXl9ICovXG4gICAgICBsZXQgY29udGVudFxuXG4gICAgICBpZiAoY29udGVudEtpbmQgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50VmFsdWUgIT0gXCJzdHJpbmdcIiB8fCBjb250ZW50VmFsdWUubGVuZ3RoID09IDAgfHwgIWhhc09ubHlVbmljb2RlU2NhbGFycyhjb250ZW50VmFsdWUpKSB7XG4gICAgICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBUZXh0IGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIHJlcXVpcmVzIG5vbi1lbXB0eSBzdHJpbmcgY29udGVudC5gLCB0YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IGNvbnRlbnRWYWx1ZVxuICAgICAgfSBlbHNlIGlmIChjb250ZW50S2luZCA9PSBcImJpbmFyeVwiKSB7XG4gICAgICAgIGlmICghKGNvbnRlbnRWYWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGNvbnRlbnRWYWx1ZS5ieXRlTGVuZ3RoID09IDApIHtcbiAgICAgICAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYEJpbmFyeSBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyByZXF1aXJlcyBub24tZW1wdHkgYnl0ZXMuYCwgdGFyZ2V0KVxuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBuZXcgVWludDhBcnJheShjb250ZW50VmFsdWUpXG4gICAgICB9IGVsc2UgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgYW4gaW52YWxpZCBjb250ZW50IGtpbmQuYCwgdGFyZ2V0KVxuXG4gICAgICBjb25zdCBwcm92ZW5hbmNlID0gdmFsaWRhdGVBcnRpZmFjdFByb3ZlbmFuY2UoYXJ0aWZhY3QucHJvdmVuYW5jZSwgY29udGVudEtpbmQsIGFydGlmYWN0UGF0aCwgY29udGVudCwgdGFyZ2V0KVxuXG4gICAgICBhcnRpZmFjdHMucHVzaCgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU2V0QXJ0aWZhY3R9ICovIChmcmVlemVBcnRpZmFjdCh7XG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGNvbnRlbnRLaW5kLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIG93bmVyc2hpcDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZ2VuZXJhdGVkXCIpLFxuICAgICAgICBwYXRoOiBhcnRpZmFjdFBhdGgsXG4gICAgICAgIHByb3ZlbmFuY2UsXG4gICAgICAgIHJvbGVcbiAgICAgIH0pKSlcbiAgICB9XG5cbiAgICBpZiAoZW50cnlQYXRocy5sZW5ndGggIT0gMSkgaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qgc2V0IG11c3QgZGVjbGFyZSBleGFjdGx5IG9uZSBlbnRyeSBhcnRpZmFjdC5cIiwgY2FuZGlkYXRlLnRhcmdldClcblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGFydGlmYWN0czogT2JqZWN0LmZyZWV6ZShhcnRpZmFjdHMpLFxuICAgICAgZW50cnk6IGVudHJ5UGF0aHNbMF0sXG4gICAgICAuLi4obWV0YWRhdGEgPT09IHVuZGVmaW5lZCA/IHt9IDoge21ldGFkYXRhfSksXG4gICAgICBzY2hlbWE6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkdlbmVyYXRlZEFydGlmYWN0U2V0XCIpLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyc2lvbjogLyoqIEB0eXBlIHtjb25zdH0gKi8gKDEpXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMgJiYgZXJyb3IuY29kZSA9PSBcIklOVkFMSURfQVJUSUZBQ1RfU0VUXCIpIHRocm93IGVycm9yXG5cbiAgICByZXR1cm4gaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qtc2V0IHZhbGlkYXRpb24gZmFpbGVkLlwiLCB0YXJnZXRPZihjYW5kaWRhdGUpLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0YXJnZXQtc3BlY2lmaWMgbWV0YWRhdGEgYXMgZGV0YWNoZWQsIGltbXV0YWJsZSBKU09OLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIE1ldGFkYXRhIGNhbmRpZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBNZXRhZGF0YSBzbmFwc2hvdC5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RNZXRhZGF0YU9iamVjdCh2YWx1ZSwgdGFyZ2V0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCBtZXRhZGF0YSBtdXN0IGJlIGEgcGxhaW4gSlNPTiBvYmplY3QuXCIsIHRhcmdldClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59ICovIChcbiAgICBkZWVwRnJlZXplKHNuYXBzaG90TWV0YWRhdGFWYWx1ZSh2YWx1ZSwgdGFyZ2V0LCBuZXcgV2Vha1NldCgpKSkpXG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgc25hcHNob3RzIGEgSlNPTiBtZXRhZGF0YSB2YWx1ZSB3aXRob3V0IHJldGFpbmluZyBjYWxsZXIgb2JqZWN0cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBKU09OIGNhbmRpZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcGFyYW0ge1dlYWtTZXQ8b2JqZWN0Pn0gYW5jZXN0b3JzIC0gQWN0aXZlIG9iamVjdCBwYXRoIGZvciBjeWNsZSByZWplY3Rpb24uXG4gKiBAcmV0dXJucyB7dW5rbm93bn0gRGV0YWNoZWQgSlNPTiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RNZXRhZGF0YVZhbHVlKHZhbHVlLCB0YXJnZXQsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09IFwiYm9vbGVhblwiKSByZXR1cm4gdmFsdWVcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKCFoYXNPbmx5VW5pY29kZVNjYWxhcnModmFsdWUpKSBpbnZhbGlkQXJ0aWZhY3RTZXQoXCJBcnRpZmFjdC1zZXQgbWV0YWRhdGEgY29udGFpbnMgYSBsb25lIFVuaWNvZGUgc3Vycm9nYXRlLlwiLCB0YXJnZXQpXG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCBtZXRhZGF0YSBudW1iZXJzIG11c3QgYmUgZmluaXRlLlwiLCB0YXJnZXQpXG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCBtZXRhZGF0YSBtdXN0IGNvbnRhaW4gb25seSBKU09OIHZhbHVlcy5cIiwgdGFyZ2V0KVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCBtZXRhZGF0YSBtdXN0IG5vdCBjb250YWluIGN5Y2xlcy5cIiwgdGFyZ2V0KVxuICBhbmNlc3RvcnMuYWRkKHZhbHVlKVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICghaXNEZW5zZUFycmF5KHZhbHVlKSkgaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qtc2V0IG1ldGFkYXRhIGFycmF5cyBtdXN0IGJlIGRlbnNlLlwiLCB0YXJnZXQpXG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHJlc3VsdC5wdXNoKHNuYXBzaG90TWV0YWRhdGFWYWx1ZSh2YWx1ZVtpbmRleF0sIHRhcmdldCwgYW5jZXN0b3JzKSlcbiAgICBhbmNlc3RvcnMuZGVsZXRlKHZhbHVlKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCBtZXRhZGF0YSBtdXN0IGNvbnRhaW4gb25seSBwbGFpbiBKU09OIG9iamVjdHMuXCIsIHRhcmdldClcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgY29uc3QgcmVzdWx0ID0ge31cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHNuYXBzaG90TWV0YWRhdGFWYWx1ZSh2YWx1ZVtrZXldLCB0YXJnZXQsIGFuY2VzdG9ycyksXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZSh2YWx1ZSlcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFydGlmYWN0LWxldmVsIHRleHQsIGJ5dGUsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFByb3ZlbmFuY2UgY2FuZGlkYXRlLlxuICogQHBhcmFtIHt1bmtub3dufSBjb250ZW50S2luZCAtIFZhbGlkYXRlZCBhcnRpZmFjdCBjb250ZW50IGtpbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWZhY3RQYXRoIC0gVmFsaWRhdGVkIGFydGlmYWN0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBEZXRhY2hlZCBhcnRpZmFjdCBjb250ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0IHRhcmdldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFydGlmYWN0UHJvdmVuYW5jZX0gVmFsaWRhdGVkIHByb3ZlbmFuY2UuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQXJ0aWZhY3RQcm92ZW5hbmNlKHZhbHVlLCBjb250ZW50S2luZCwgYXJ0aWZhY3RQYXRoLCBjb250ZW50LCB0YXJnZXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyByZXF1aXJlcyBwcm92ZW5hbmNlLmAsIHRhcmdldClcblxuICBpZiAodmFsdWUua2luZCA9PSBcInN5bnRoZXRpY1wiKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5yZWFzb24gIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5yZWFzb24ubGVuZ3RoID09IDAgfHwgIWlzRGVuc2VBcnJheSh2YWx1ZS5yZWxhdGVkT3JpZ2lucykpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgU3ludGhldGljIGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHJlYXNvbiBhbmQgcmVsYXRlZCBvcmlnaW5zLmAsIHRhcmdldClcbiAgICB9XG4gICAgaWYgKGNvbnRlbnRLaW5kID09IFwiYmluYXJ5XCIpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgQmluYXJ5IGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIHJlcXVpcmVzIGJ5dGUtcmFuZ2UgcHJvdmVuYW5jZS5gLCB0YXJnZXQpXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119ICovXG4gICAgY29uc3QgcmVsYXRlZE9yaWdpbnMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlLnJlbGF0ZWRPcmlnaW5zLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgcmVsYXRlZE9yaWdpbnMucHVzaCh2YWxpZGF0ZVJlbGF0ZWRPcmlnaW4odmFsdWUucmVsYXRlZE9yaWdpbnNbaW5kZXhdLCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIiksIHJlYXNvbjogdmFsdWUucmVhc29uLCByZWxhdGVkT3JpZ2luczogT2JqZWN0LmZyZWV6ZShyZWxhdGVkT3JpZ2lucyl9KVxuICB9XG5cbiAgaWYgKHZhbHVlLmtpbmQgPT0gXCJ0ZXh0XCIpIHtcbiAgICBjb25zdCBtYXBwaW5nQ2FuZGlkYXRlID0gdmFsdWUubWFwcGluZ1xuXG4gICAgaWYgKGNvbnRlbnRLaW5kICE9IFwidGV4dFwiIHx8ICFpc1BsYWluT2JqZWN0KG1hcHBpbmdDYW5kaWRhdGUpIHx8IG1hcHBpbmdDYW5kaWRhdGUuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIgfHxcbiAgICAgICFpc1BsYWluT2JqZWN0KG1hcHBpbmdDYW5kaWRhdGUuZ2VuZXJhdGVkKSB8fCBtYXBwaW5nQ2FuZGlkYXRlLmdlbmVyYXRlZC5maWxlbmFtZSAhPSBhcnRpZmFjdFBhdGggfHxcbiAgICAgIG1hcHBpbmdDYW5kaWRhdGUuZ2VuZXJhdGVkLmNvbnRlbnQgIT0gY29udGVudCB8fCAhaXNQbGFpbk9iamVjdCh2YWx1ZS5zb3VyY2VNYXApKSB7XG4gICAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIG1pc21hdGNoZWQgcmljaCBvciBTb3VyY2UgTWFwIHByb3ZlbmFuY2UuYCwgdGFyZ2V0KVxuICAgIH1cbiAgICBpZiAodmFsdWUuc291cmNlTWFwRmlsZW5hbWUgIT09IHVuZGVmaW5lZCAmJiAhaXNWYWxpZEZpbGVuYW1lTWV0YWRhdGEodmFsdWUuc291cmNlTWFwRmlsZW5hbWUpKSB7XG4gICAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgU291cmNlIE1hcCBmaWxlbmFtZSBtZXRhZGF0YS5gLCB0YXJnZXQpXG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSBmaW5hbGl6ZU1hcHBpbmcobWFwcGluZ0NhbmRpZGF0ZSlcbiAgICBjb25zdCBzb3VyY2VNYXAgPSB2YWxpZGF0ZVNvdXJjZU1hcCh2YWx1ZS5zb3VyY2VNYXAsIGFydGlmYWN0UGF0aCwgdGFyZ2V0KVxuICAgIGNvbnN0IHByb2plY3RlZFNvdXJjZU1hcCA9IHRvU291cmNlTWFwVjMobWFwcGluZylcblxuICAgIGlmICghc2FtZUpzb25WYWx1ZShzb3VyY2VNYXAsIHByb2plY3RlZFNvdXJjZU1hcCkpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgU291cmNlIE1hcCBwcm92ZW5hbmNlIHRoYXQgY29udHJhZGljdHMgaXRzIHJpY2ggbWFwcGluZy5gLCB0YXJnZXQpXG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICAgIG1hcHBpbmcsXG4gICAgICBzb3VyY2VNYXAsXG4gICAgICBzb3VyY2VNYXBGaWxlbmFtZTogdmFsdWUuc291cmNlTWFwRmlsZW5hbWVcbiAgICB9KVxuICB9XG5cbiAgaWYgKHZhbHVlLmtpbmQgPT0gXCJieXRlc1wiKSB7XG4gICAgaWYgKGNvbnRlbnRLaW5kICE9IFwiYmluYXJ5XCIpIGludmFsaWRBcnRpZmFjdFNldChgQnl0ZSBwcm92ZW5hbmNlIHJlcXVpcmVzIGJpbmFyeSBjb250ZW50IGZvciAnJHthcnRpZmFjdFBhdGh9Jy5gLCB0YXJnZXQpXG4gICAgY29uc3QgbWFwcGluZyA9IGZpbmFsaXplQnl0ZU1hcHBpbmcodmFsdWUubWFwcGluZylcblxuICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZC5wYXRoICE9IGFydGlmYWN0UGF0aCB8fCBtYXBwaW5nLmdlbmVyYXRlZC5ieXRlTGVuZ3RoICE9IC8qKiBAdHlwZSB7VWludDhBcnJheX0gKi8gKGNvbnRlbnQpLmJ5dGVMZW5ndGgpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgQnl0ZSBwcm92ZW5hbmNlIGRvZXMgbm90IG1hdGNoIGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nLmAsIHRhcmdldClcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiYnl0ZXNcIiksIG1hcHBpbmd9KVxuICB9XG5cbiAgcmV0dXJuIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIHVua25vd24gcHJvdmVuYW5jZSBraW5kLmAsIHRhcmdldClcbn1cblxuLyoqXG4gKiBGcmVlemVzIG9uZSB2YWxpZGF0ZWQgYXJ0aWZhY3QgcmVjb3JkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYXJ0aWZhY3QgLSBWYWxpZGF0ZWQgZmllbGRzLlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pn0gRnJvemVuIHJlY29yZC5cbiAqL1xuZnVuY3Rpb24gZnJlZXplQXJ0aWZhY3QoYXJ0aWZhY3QpIHtcbiAgaWYgKGFydGlmYWN0LmNvbnRlbnRLaW5kID09IFwiYmluYXJ5XCIgJiYgYXJ0aWZhY3QuY29udGVudCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBjb250ZW50ID0gYXJ0aWZhY3QuY29udGVudFxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFydGlmYWN0LCBcImNvbnRlbnRcIiwge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShjb250ZW50KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShhcnRpZmFjdClcbn1cblxuLyoqXG4gKiBMaXN0cyBldmVyeSBkaXJlY3RvcnkgYSBzYWZlIHJlbGF0aXZlIFBPU0lYIGFydGlmYWN0IHBhdGggcmVxdWlyZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWZhY3RQYXRoIC0gVmFsaWRhdGVkIGFydGlmYWN0IHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IE9yZGVyZWQgcGFyZW50IGRpcmVjdG9yeSBwYXRocy5cbiAqL1xuZnVuY3Rpb24gYXJ0aWZhY3REaXJlY3RvcnlQYXRocyhhcnRpZmFjdFBhdGgpIHtcbiAgY29uc3QgcGFydHMgPSBhcnRpZmFjdFBhdGguc3BsaXQoXCIvXCIpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGRpcmVjdG9yaWVzID0gW11cblxuICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgcGFydHMubGVuZ3RoOyBpbmRleCArPSAxKSBkaXJlY3Rvcmllcy5wdXNoKHBhcnRzLnNsaWNlKDAsIGluZGV4KS5qb2luKFwiL1wiKSlcblxuICByZXR1cm4gZGlyZWN0b3JpZXNcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBub3JtYWxpemVkIGFydGlmYWN0LXNldCBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcGFyYW0ge3Vua25vd259IFtlcnJvcl0gLSBQcmVzZXJ2ZWQgdmFsaWRhdGlvbiBjYXVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZEFydGlmYWN0U2V0KG1lc3NhZ2UsIHRhcmdldCwgZXJyb3IpIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICBjb2RlOiBcIklOVkFMSURfQVJUSUZBQ1RfU0VUXCIsXG4gICAgbGFuZ3VhZ2U6IHRhcmdldCxcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbi8qKlxuICogRGVyaXZlcyBhIHNhZmUgZGlhZ25vc3RpYyBpZGVudGl0eSBmcm9tIGFuIHVua25vd24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2V0LlxuICogQHJldHVybnMge3N0cmluZ30gRGlhZ25vc3RpYyBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0T2YodmFsdWUpIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpICYmIHR5cGVvZiB2YWx1ZS50YXJnZXQgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50YXJnZXQubGVuZ3RoID4gMCA/IHZhbHVlLnRhcmdldCA6IFwiYXJ0aWZhY3RcIlxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gYXJ0aWZhY3QtbGV2ZWwgcmVsYXRlZCBvcmlnaW4gd2l0aG91dCBpbnRlcnByZXRpbmcgc291cmNlIG9mZnNldHMgYXMgZ2VuZXJhdGVkIGJ5dGVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJlbGF0ZWQtb3JpZ2luIGNhbmRpZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBPd25pbmcgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIE9yaWdpbiBpbmRleC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBEZXRhY2hlZCByZWxhdGVkIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWxhdGVkT3JpZ2luKHZhbHVlLCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUuc291cmNlSWQgIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5zb3VyY2VJZC5sZW5ndGggPT0gMCB8fFxuICAgICFpc1BsYWluT2JqZWN0KHZhbHVlLmxvY2F0aW9uKSB8fCB0eXBlb2YgdmFsdWUubG9jYXRpb24uZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sb2NhdGlvbi5maWxlbmFtZS5sZW5ndGggPT0gMCB8fFxuICAgICF2YWxpZFNvdXJjZVBvaW50KHZhbHVlLmxvY2F0aW9uLnN0YXJ0KSB8fCAhdmFsaWRTb3VyY2VQb2ludCh2YWx1ZS5sb2NhdGlvbi5lbmQpIHx8XG4gICAgdmFsdWUubG9jYXRpb24uZW5kLm9mZnNldCA8IHZhbHVlLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCB8fCAhaXNTb3VyY2VSYW5nZU9yZGVyZWQodmFsdWUubG9jYXRpb24uc3RhcnQsIHZhbHVlLmxvY2F0aW9uLmVuZCkpIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIGhhcyBtYWxmb3JtZWQgcmVsYXRlZCBvcmlnaW4gJHtpbmRleH0uYCwgdGFyZ2V0KVxuICB9XG5cbiAgcmV0dXJuIGRlZXBGcmVlemUoe1xuICAgIGxvY2F0aW9uOiB7XG4gICAgICBlbmQ6IHsuLi52YWx1ZS5sb2NhdGlvbi5lbmR9LFxuICAgICAgZmlsZW5hbWU6IHZhbHVlLmxvY2F0aW9uLmZpbGVuYW1lLFxuICAgICAgc3RhcnQ6IHsuLi52YWx1ZS5sb2NhdGlvbi5zdGFydH1cbiAgICB9LFxuICAgIHNvdXJjZUlkOiB2YWx1ZS5zb3VyY2VJZCxcbiAgICAuLi4ob3B0aW9uYWxTdHJpbmcodmFsdWUubm9kZUlkLCBcIm5vZGVJZFwiLCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpKSxcbiAgICAuLi4ob3B0aW9uYWxTdHJpbmcodmFsdWUuc3ltYm9sSWQsIFwic3ltYm9sSWRcIiwgYXJ0aWZhY3RQYXRoLCBpbmRleCwgdGFyZ2V0KSksXG4gICAgLi4uKG9wdGlvbmFsU3RyaW5nKHZhbHVlLnJvbGUsIFwicm9sZVwiLCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpKVxuICB9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgb3B0aW9uYWwgcmVsYXRlZC1vcmlnaW4gc3RyaW5nIGZpZWxkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWZhY3RQYXRoIC0gT3duaW5nIGFydGlmYWN0IHBhdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBPcmlnaW4gaW5kZXguXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3QgdGFyZ2V0LlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFByZXNlbnQgdmFsaWRhdGVkIHByb3BlcnR5IG9yIGFuIGVtcHR5IHJlY29yZC5cbiAqL1xuZnVuY3Rpb24gb3B0aW9uYWxTdHJpbmcodmFsdWUsIHByb3BlcnR5LCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB7fVxuICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIGhhcyBpbnZhbGlkICR7cHJvcGVydHl9IGluIHJlbGF0ZWQgb3JpZ2luICR7aW5kZXh9LmAsIHRhcmdldClcbiAgfVxuXG4gIHJldHVybiB7W3Byb3BlcnR5XTogdmFsdWV9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBVVEYtMTYgc291cmNlIHBvaW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBwb2ludC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBXaGV0aGVyIHRoZSBwb2ludCBpcyBzdHJ1Y3R1cmFsbHkgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkU291cmNlUG9pbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpICYmIHR5cGVvZiB2YWx1ZS5saW5lID09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUubGluZSkgJiYgdmFsdWUubGluZSA+IDAgJiZcbiAgICB0eXBlb2YgdmFsdWUuY29sdW1uID09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUuY29sdW1uKSAmJiB2YWx1ZS5jb2x1bW4gPiAwICYmXG4gICAgdHlwZW9mIHZhbHVlLm9mZnNldCA9PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlLm9mZnNldCkgJiYgdmFsdWUub2Zmc2V0ID49IDBcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIGRldGFjaGVzIHRoZSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24gY2FycmllZCBieSBhIHRleHQgYXJ0aWZhY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gU291cmNlIE1hcCBjYW5kaWRhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWZhY3RQYXRoIC0gT3duaW5nIGFydGlmYWN0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3QgdGFyZ2V0LlxuICogQHJldHVybnMge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IERldGFjaGVkIFNvdXJjZSBNYXAuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU291cmNlTWFwKHZhbHVlLCBhcnRpZmFjdFBhdGgsIHRhcmdldCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpIHx8IHZhbHVlLnZlcnNpb24gIT0gMyB8fCB2YWx1ZS5maWxlICE9IGFydGlmYWN0UGF0aCB8fCB0eXBlb2YgdmFsdWUubWFwcGluZ3MgIT0gXCJzdHJpbmdcIiB8fFxuICAgICFpc0RlbnNlQXJyYXkodmFsdWUubmFtZXMpIHx8ICF2YWx1ZS5uYW1lcy5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIG5hbWUgPT0gXCJzdHJpbmdcIikgfHxcbiAgICAhaXNEZW5zZUFycmF5KHZhbHVlLnNvdXJjZXMpIHx8ICF2YWx1ZS5zb3VyY2VzLmV2ZXJ5KChzb3VyY2UpID0+IHR5cGVvZiBzb3VyY2UgPT0gXCJzdHJpbmdcIikgfHxcbiAgICAodmFsdWUuc291cmNlc0NvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAoIWlzRGVuc2VBcnJheSh2YWx1ZS5zb3VyY2VzQ29udGVudCkgfHxcbiAgICAgICF2YWx1ZS5zb3VyY2VzQ29udGVudC5ldmVyeSgoc291cmNlKSA9PiBzb3VyY2UgPT0gbnVsbCB8fCB0eXBlb2Ygc291cmNlID09IFwic3RyaW5nXCIpKSkpIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIG1hbGZvcm1lZCBTb3VyY2UgTWFwIHYzIHByb3ZlbmFuY2UuYCwgdGFyZ2V0KVxuICB9XG4gIHZhbGlkYXRlRW5jb2RlZFNvdXJjZU1hcE1hcHBpbmdzKFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodmFsdWUpKSxcbiAgICBhcnRpZmFjdFBhdGgsXG4gICAgdGFyZ2V0XG4gIClcblxuICBjb25zdCBkZXRhY2hlZCA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpXG5cbiAgcmV0dXJuIGRlZXBGcmVlemUoLyoqIEB0eXBlIHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSAqLyAoZGV0YWNoZWQpKVxufVxuXG4vKipcbiAqIERlY29kZXMgYW5kIHZhbGlkYXRlcyB0aGUgU291cmNlIE1hcCBwYXlsb2FkIHdpdGggdGhlIGluc3RhbGxlZCBtYXBwaW5nIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IHNvdXJjZU1hcCAtIFN0cnVjdHVyYWxseSB2YWxpZGF0ZWQgbWFwLlxuICogQHBhcmFtIHtzdHJpbmd9IGFydGlmYWN0UGF0aCAtIE93bmluZyBhcnRpZmFjdCBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0IHRhcmdldC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVuY29kZWRTb3VyY2VNYXBNYXBwaW5ncyhzb3VyY2VNYXAsIGFydGlmYWN0UGF0aCwgdGFyZ2V0KSB7XG4gIC8qKiBAdHlwZSB7UmVhZG9ubHk8aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBTZWdtZW50W11bXT59ICovXG4gIGxldCBkZWNvZGVkXG4gIGxldCBjYW5vbmljYWxNYXBwaW5nc1xuXG4gIHRyeSB7XG4gICAgZGVjb2RlZCA9IGRlY29kZWRNYXBwaW5ncyhuZXcgVHJhY2VNYXAoc291cmNlTWFwKSlcbiAgICBjb25zdCBkZWNvZGVkTWFwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLkRlY29kZWRTb3VyY2VNYXB9ICovICh7XG4gICAgICAuLi5zb3VyY2VNYXAsXG4gICAgICBtYXBwaW5nczogc3RydWN0dXJlZENsb25lKGRlY29kZWQpXG4gICAgfSlcblxuICAgIGNhbm9uaWNhbE1hcHBpbmdzID0gZW5jb2RlZE1hcHBpbmdzKHByZXNvcnRlZERlY29kZWRNYXAoZGVjb2RlZE1hcCkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW52YWxpZEFydGlmYWN0U2V0KGBUZXh0IGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIGhhcyBpbnZhbGlkIGVuY29kZWQgU291cmNlIE1hcCBtYXBwaW5ncy5gLCB0YXJnZXQsIGVycm9yKVxuICB9XG5cbiAgaWYgKGNhbm9uaWNhbE1hcHBpbmdzICE9IHNvdXJjZU1hcC5tYXBwaW5ncyB8fFxuICAgICF2YWxpZERlY29kZWRTb3VyY2VNYXBNYXBwaW5ncyhkZWNvZGVkLCBzb3VyY2VNYXAuc291cmNlcy5sZW5ndGgsIHNvdXJjZU1hcC5uYW1lcy5sZW5ndGgpKSB7XG4gICAgaW52YWxpZEFydGlmYWN0U2V0KGBUZXh0IGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIGhhcyBpbnZhbGlkIGVuY29kZWQgU291cmNlIE1hcCBtYXBwaW5ncy5gLCB0YXJnZXQpXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZGVjb2RlZCBTb3VyY2UgTWFwIHNlZ21lbnQgc2hhcGUgYW5kIHJlZmVyZW5jZWQgaW5kaWNlcy5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBTZWdtZW50W11bXT59IGxpbmVzIC0gRGVjb2RlZCBtYXBwaW5nIGxpbmVzLlxuICogQHBhcmFtIHtudW1iZXJ9IHNvdXJjZUNvdW50IC0gRGVjbGFyZWQgc291cmNlIGNvdW50LlxuICogQHBhcmFtIHtudW1iZXJ9IG5hbWVDb3VudCAtIERlY2xhcmVkIG5hbWUgY291bnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBldmVyeSBzZWdtZW50IGlzIHNlbWFudGljYWxseSB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWREZWNvZGVkU291cmNlTWFwTWFwcGluZ3MobGluZXMsIHNvdXJjZUNvdW50LCBuYW1lQ291bnQpIHtcbiAgcmV0dXJuIGxpbmVzLmV2ZXJ5KChsaW5lKSA9PiBsaW5lLmV2ZXJ5KChzZWdtZW50KSA9PiB7XG4gICAgaWYgKHNlZ21lbnQubGVuZ3RoICE9IDEgJiYgc2VnbWVudC5sZW5ndGggIT0gNCAmJiBzZWdtZW50Lmxlbmd0aCAhPSA1KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIXNlZ21lbnQuZXZlcnkoKGZpZWxkKSA9PiBOdW1iZXIuaXNTYWZlSW50ZWdlcihmaWVsZCkgJiYgZmllbGQgPj0gMCkpIHJldHVybiBmYWxzZVxuICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PSAxKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChzZWdtZW50WzFdID49IHNvdXJjZUNvdW50KSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBzZWdtZW50Lmxlbmd0aCA9PSA0IHx8IHNlZ21lbnRbNF0gPCBuYW1lQ291bnRcbiAgfSkpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgZGV0YWNoZWQgSlNPTiB2YWx1ZXMgd2l0aG91dCBkZXBlbmRpbmcgb24gY2FsbGVyIG9iamVjdC1rZXkgb3JkZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IGxlZnQgLSBGaXJzdCBKU09OIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFNlY29uZCBKU09OIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYm90aCB2YWx1ZXMgYXJlIHN0cnVjdHVyYWxseSBpZGVudGljYWwuXG4gKi9cbmZ1bmN0aW9uIHNhbWVKc29uVmFsdWUobGVmdCwgcmlnaHQpIHtcbiAgaWYgKGxlZnQgPT09IHJpZ2h0KSByZXR1cm4gdHJ1ZVxuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGxlZnQpICYmIEFycmF5LmlzQXJyYXkocmlnaHQpICYmIGxlZnQubGVuZ3RoID09IHJpZ2h0Lmxlbmd0aCAmJlxuICAgICAgbGVmdC5ldmVyeSgoZW50cnksIGluZGV4KSA9PiBzYW1lSnNvblZhbHVlKGVudHJ5LCByaWdodFtpbmRleF0pKVxuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChsZWZ0KSB8fCAhaXNQbGFpbk9iamVjdChyaWdodCkpIHJldHVybiBmYWxzZVxuICBjb25zdCBsZWZ0S2V5cyA9IE9iamVjdC5rZXlzKGxlZnQpXG4gIGNvbnN0IHJpZ2h0S2V5cyA9IE9iamVjdC5rZXlzKHJpZ2h0KVxuXG4gIHJldHVybiBsZWZ0S2V5cy5sZW5ndGggPT0gcmlnaHRLZXlzLmxlbmd0aCAmJlxuICAgIGxlZnRLZXlzLmV2ZXJ5KChrZXkpID0+IE9iamVjdC5oYXNPd24ocmlnaHQsIGtleSkgJiYgc2FtZUpzb25WYWx1ZShsZWZ0W2tleV0sIHJpZ2h0W2tleV0pKVxufVxuXG4vKipcbiAqIERlZXBseSBmcmVlemVzIGEgZGV0YWNoZWQgSlNPTiB2YWx1ZS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gRGV0YWNoZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7VH0gRnJvemVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZWVwRnJlZXplKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgZm9yIChjb25zdCBuZXN0ZWQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGRlZXBGcmVlemUobmVzdGVkKVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlKVxufVxuIl19
@@ -0,0 +1,49 @@
1
+ export type AndroidInputFile = {
2
+ content: string | Uint8Array;
3
+ contentKind: "binary" | "text";
4
+ fullPath: string;
5
+ mediaType: string;
6
+ path: string;
7
+ sha256: string;
8
+ };
9
+ export type ConfigurationSpan = {
10
+ end: number;
11
+ field: string;
12
+ path: string;
13
+ start: number;
14
+ };
15
+ /** @typedef {{content: string | Uint8Array, contentKind: "binary" | "text", fullPath: string, mediaType: string, path: string, sha256: string}} AndroidInputFile */
16
+ /** @typedef {{end: number, field: string, path: string, start: number}} ConfigurationSpan */
17
+ /**
18
+ * Preflights a complete Android application request before allocating a source writer.
19
+ * @param {Record<string, unknown>} input - Candidate application request.
20
+ * @returns {{assets: AndroidInputFile[], configuration: import("../semantic/types.js").AndroidApplicationConfiguration, modulePaths: Map<string, string>, modules: import("../semantic/types.js").SemanticModule[], packagePath: string, program: import("../semantic/types.js").SemanticProgram, resources: AndroidInputFile[], sources: {content: string, filename: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} Prepared application.
21
+ */
22
+ export declare function preflightAndroidApplication(input: Record<string, unknown>): {
23
+ assets: AndroidInputFile[];
24
+ configuration: import("../semantic/types.js").AndroidApplicationConfiguration;
25
+ modulePaths: Map<string, string>;
26
+ modules: import("../semantic/types.js").SemanticModule[];
27
+ packagePath: string;
28
+ program: import("../semantic/types.js").SemanticProgram;
29
+ resources: AndroidInputFile[];
30
+ sources: {
31
+ content: string;
32
+ filename: string;
33
+ language?: import("../semantic/types.js").SemanticLanguage;
34
+ }[];
35
+ };
36
+ /**
37
+ * Generates one complete deterministic Android/Kotlin project.
38
+ * @param {Record<string, unknown>} input - Application generation request.
39
+ * @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], metadata: {applicationManifest: string, platformQualification: string}, target: "android"}} Candidate artifact set.
40
+ */
41
+ export declare function generateAndroidApplication(input: Record<string, unknown>): {
42
+ artifacts: import("../semantic/types.js").GeneratedSetArtifact[];
43
+ metadata: {
44
+ applicationManifest: string;
45
+ platformQualification: string;
46
+ };
47
+ target: "android";
48
+ };
49
+ //# sourceMappingURL=android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../../src/backends/android.js"],"names":[],"mappings":"AAgHI,YAA6I,gBAAgB,GAAnJ;IAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAkB;AAC7J,YAAqE,iBAAiB,GAA5E;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAmB;AAD1F,oKAAoK;AACpK,6FAA6F;AAE7F;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAHtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAGgB,GAFpC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAAC,aAAa,EAAE,OAAO,sBAAsB,EAAE,+BAA+B,CAAC;IAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,sBAAsB,EAAE,cAAc,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,sBAAsB,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAAC,OAAO,EAAE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CAAA;CAAC,CAyC5a;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAHrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAGe,GAFnC;IAAC,SAAS,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IAAC,QAAQ,EAAE;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,qBAAqB,EAAE,MAAM,CAAA;KAAC,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAC,CAwDzK"}