semantifold 0.9.0 → 0.11.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 (198) hide show
  1. package/README.md +6 -3
  2. package/bin/semantifold.js +6 -0
  3. package/build/bin/semantifold.d.ts +3 -0
  4. package/build/bin/semantifold.d.ts.map +1 -0
  5. package/build/bin/semantifold.js +5 -0
  6. package/build/index.d.ts +8 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +9 -1
  9. package/build/src/artifact-path.d.ts +16 -0
  10. package/build/src/artifact-path.d.ts.map +1 -1
  11. package/build/src/artifact-path.js +29 -3
  12. package/build/src/backends/c-check.d.ts +7 -0
  13. package/build/src/backends/c-check.d.ts.map +1 -0
  14. package/build/src/backends/c-check.js +65 -0
  15. package/build/src/backends/check-plan.d.ts +96 -0
  16. package/build/src/backends/check-plan.d.ts.map +1 -0
  17. package/build/src/backends/check-plan.js +135 -0
  18. package/build/src/backends/cpp-check.d.ts +7 -0
  19. package/build/src/backends/cpp-check.d.ts.map +1 -0
  20. package/build/src/backends/cpp-check.js +59 -0
  21. package/build/src/backends/csharp-check.d.ts +7 -0
  22. package/build/src/backends/csharp-check.d.ts.map +1 -0
  23. package/build/src/backends/csharp-check.js +125 -0
  24. package/build/src/backends/csharp.d.ts +1 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -1
  26. package/build/src/backends/csharp.js +5 -4
  27. package/build/src/backends/dart-check.d.ts +7 -0
  28. package/build/src/backends/dart-check.d.ts.map +1 -0
  29. package/build/src/backends/dart-check.js +103 -0
  30. package/build/src/backends/dart.d.ts +2 -0
  31. package/build/src/backends/dart.d.ts.map +1 -1
  32. package/build/src/backends/dart.js +5 -5
  33. package/build/src/backends/go-check.d.ts +7 -0
  34. package/build/src/backends/go-check.d.ts.map +1 -0
  35. package/build/src/backends/go-check.js +77 -0
  36. package/build/src/backends/go.d.ts +1 -0
  37. package/build/src/backends/go.d.ts.map +1 -1
  38. package/build/src/backends/go.js +3 -3
  39. package/build/src/backends/java-check.d.ts +21 -0
  40. package/build/src/backends/java-check.d.ts.map +1 -0
  41. package/build/src/backends/java-check.js +73 -0
  42. package/build/src/backends/javascript-check.d.ts +7 -0
  43. package/build/src/backends/javascript-check.d.ts.map +1 -0
  44. package/build/src/backends/javascript-check.js +29 -0
  45. package/build/src/backends/kotlin-check.d.ts +7 -0
  46. package/build/src/backends/kotlin-check.d.ts.map +1 -0
  47. package/build/src/backends/kotlin-check.js +31 -0
  48. package/build/src/backends/kotlin.d.ts +1 -1
  49. package/build/src/backends/kotlin.js +2 -2
  50. package/build/src/backends/php-check.d.ts +7 -0
  51. package/build/src/backends/php-check.d.ts.map +1 -0
  52. package/build/src/backends/php-check.js +21 -0
  53. package/build/src/backends/program.d.ts +7 -0
  54. package/build/src/backends/program.d.ts.map +1 -1
  55. package/build/src/backends/program.js +16 -1
  56. package/build/src/backends/python-check.d.ts +7 -0
  57. package/build/src/backends/python-check.d.ts.map +1 -0
  58. package/build/src/backends/python-check.js +28 -0
  59. package/build/src/backends/ruby-check.d.ts +7 -0
  60. package/build/src/backends/ruby-check.d.ts.map +1 -0
  61. package/build/src/backends/ruby-check.js +21 -0
  62. package/build/src/backends/rust-check.d.ts +7 -0
  63. package/build/src/backends/rust-check.d.ts.map +1 -0
  64. package/build/src/backends/rust-check.js +65 -0
  65. package/build/src/backends/shared.d.ts.map +1 -1
  66. package/build/src/backends/shared.js +29 -1
  67. package/build/src/backends/swift-check.d.ts +7 -0
  68. package/build/src/backends/swift-check.d.ts.map +1 -0
  69. package/build/src/backends/swift-check.js +77 -0
  70. package/build/src/backends/typescript-check.d.ts +7 -0
  71. package/build/src/backends/typescript-check.d.ts.map +1 -0
  72. package/build/src/backends/typescript-check.js +33 -0
  73. package/build/src/backends/zig-check.d.ts +7 -0
  74. package/build/src/backends/zig-check.d.ts.map +1 -0
  75. package/build/src/backends/zig-check.js +70 -0
  76. package/build/src/diagnostic.d.ts +13 -1
  77. package/build/src/diagnostic.d.ts.map +1 -1
  78. package/build/src/diagnostic.js +14 -2
  79. package/build/src/frontends/java.d.ts.map +1 -1
  80. package/build/src/frontends/java.js +23 -1
  81. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  82. package/build/src/frontends/javascript-typescript.js +45 -4
  83. package/build/src/frontends/php.d.ts.map +1 -1
  84. package/build/src/frontends/php.js +54 -3
  85. package/build/src/frontends/program.d.ts +6 -0
  86. package/build/src/frontends/program.d.ts.map +1 -1
  87. package/build/src/frontends/program.js +9 -1
  88. package/build/src/frontends/ruby.d.ts.map +1 -1
  89. package/build/src/frontends/ruby.js +55 -5
  90. package/build/src/language-registry.d.ts +54 -0
  91. package/build/src/language-registry.d.ts.map +1 -1
  92. package/build/src/language-registry.js +124 -10
  93. package/build/src/project-build.d.ts +172 -0
  94. package/build/src/project-build.d.ts.map +1 -0
  95. package/build/src/project-build.js +320 -0
  96. package/build/src/project-cli.d.ts +40 -0
  97. package/build/src/project-cli.d.ts.map +1 -0
  98. package/build/src/project-cli.js +145 -0
  99. package/build/src/project-manifest.d.ts +148 -0
  100. package/build/src/project-manifest.d.ts.map +1 -0
  101. package/build/src/project-manifest.js +432 -0
  102. package/build/src/project-reporter.d.ts +81 -0
  103. package/build/src/project-reporter.d.ts.map +1 -0
  104. package/build/src/project-reporter.js +293 -0
  105. package/build/src/project-snapshot.d.ts +129 -0
  106. package/build/src/project-snapshot.d.ts.map +1 -0
  107. package/build/src/project-snapshot.js +362 -0
  108. package/build/src/project-watch-reporter.d.ts +125 -0
  109. package/build/src/project-watch-reporter.d.ts.map +1 -0
  110. package/build/src/project-watch-reporter.js +280 -0
  111. package/build/src/project-watch.d.ts +133 -0
  112. package/build/src/project-watch.d.ts.map +1 -0
  113. package/build/src/project-watch.js +839 -0
  114. package/build/src/publication.d.ts +69 -5
  115. package/build/src/publication.d.ts.map +1 -1
  116. package/build/src/publication.js +246 -57
  117. package/build/src/semantic/effects.js +3 -1
  118. package/build/src/semantic/provenance.d.ts.map +1 -1
  119. package/build/src/semantic/provenance.js +11 -1
  120. package/build/src/semantic/types.d.ts +355 -4
  121. package/build/src/semantic/types.d.ts.map +1 -1
  122. package/build/src/semantic/types.js +92 -3
  123. package/build/src/semantic/validate.js +18 -1
  124. package/build/src/subprocess.d.ts +8 -0
  125. package/build/src/subprocess.d.ts.map +1 -1
  126. package/build/src/subprocess.js +50 -9
  127. package/build/src/target-check.d.ts +52 -0
  128. package/build/src/target-check.d.ts.map +1 -0
  129. package/build/src/target-check.js +796 -0
  130. package/build/src/toolchains.d.ts.map +1 -1
  131. package/build/src/toolchains.js +3 -3
  132. package/docs/adr-expression-breadth.md +186 -0
  133. package/docs/architecture.md +3 -1
  134. package/docs/c.md +4 -0
  135. package/docs/cpp.md +4 -0
  136. package/docs/dart.md +4 -0
  137. package/docs/generated-artifact-publication.md +11 -8
  138. package/docs/kotlin.md +2 -2
  139. package/docs/language-support.md +40 -6
  140. package/docs/parser-qualification.md +1 -1
  141. package/docs/project-build-cli.md +147 -0
  142. package/docs/project-watch.md +60 -0
  143. package/docs/rust.md +4 -0
  144. package/docs/swift.md +2 -0
  145. package/docs/testing.md +70 -3
  146. package/docs/watch-build-pipeline.md +39 -23
  147. package/docs/zig.md +2 -0
  148. package/examples/jsdoc-java-watch/expected-output.txt +3 -0
  149. package/examples/jsdoc-java-watch/semantifold.json +23 -0
  150. package/examples/jsdoc-java-watch/src/main.js +21 -0
  151. package/index.js +8 -0
  152. package/package.json +6 -1
  153. package/src/artifact-path.js +31 -2
  154. package/src/backends/c-check.js +80 -0
  155. package/src/backends/check-plan.js +147 -0
  156. package/src/backends/cpp-check.js +73 -0
  157. package/src/backends/csharp-check.js +139 -0
  158. package/src/backends/csharp.js +4 -3
  159. package/src/backends/dart-check.js +117 -0
  160. package/src/backends/dart.js +4 -4
  161. package/src/backends/go-check.js +89 -0
  162. package/src/backends/go.js +2 -2
  163. package/src/backends/java-check.js +77 -0
  164. package/src/backends/javascript-check.js +33 -0
  165. package/src/backends/kotlin-check.js +41 -0
  166. package/src/backends/kotlin.js +1 -1
  167. package/src/backends/php-check.js +23 -0
  168. package/src/backends/program.js +17 -0
  169. package/src/backends/python-check.js +30 -0
  170. package/src/backends/ruby-check.js +23 -0
  171. package/src/backends/rust-check.js +78 -0
  172. package/src/backends/shared.js +30 -0
  173. package/src/backends/swift-check.js +89 -0
  174. package/src/backends/typescript-check.js +37 -0
  175. package/src/backends/zig-check.js +81 -0
  176. package/src/diagnostic.js +9 -1
  177. package/src/frontends/java.js +24 -0
  178. package/src/frontends/javascript-typescript.js +49 -2
  179. package/src/frontends/php.js +61 -2
  180. package/src/frontends/program.js +9 -0
  181. package/src/frontends/ruby.js +62 -2
  182. package/src/language-registry.js +130 -9
  183. package/src/project-build.js +353 -0
  184. package/src/project-cli.js +155 -0
  185. package/src/project-manifest.js +479 -0
  186. package/src/project-reporter.js +320 -0
  187. package/src/project-snapshot.js +403 -0
  188. package/src/project-watch-reporter.js +303 -0
  189. package/src/project-watch.js +870 -0
  190. package/src/publication.js +275 -58
  191. package/src/semantic/effects.js +1 -0
  192. package/src/semantic/provenance.js +8 -0
  193. package/src/semantic/types.js +101 -2
  194. package/src/semantic/validate.js +26 -0
  195. package/src/subprocess.js +49 -8
  196. package/src/target-check.js +844 -0
  197. package/src/toolchains.js +3 -2
  198. package/tsconfig.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;0BAoLA,MAAM;qCAA+B,MAAM;0BAAoB,MAAM;0BAAoB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA5J/H,CAAA;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAJxC,MAAM,OAAO,mBAI2B,EAAE,OAAO,AAHzD,CACA,EADQ;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAG5C,GAFpD,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CA+BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAT1C;IAAsB,gBAAgB,EAA9B,MAAM,CACd;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsB,EAAE,EAAhB,MAAM,CACd;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAAuB,gBAAgB,AAAvC,CACA,EADQ,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;IAAwB,gBAAgB,EAAhC,MAAM,EAAE,CAChB;CAE0C,GAFhC,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CAmGtE;AA+HD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAHzC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGqB,GAF9D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB5C"}
1
+ {"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;0BAqLA,MAAM;qCAA+B,MAAM;0BAAoB,MAAM;0BAAoB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA5J/H,CAAA;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAJxC,MAAM,OAAO,mBAI2B,EAAE,OAAO,AAHzD,CACA,EADQ;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAG5C,GAFpD,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CA+BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAT1C;IAAsB,gBAAgB,EAA9B,MAAM,CACd;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsB,EAAE,EAAhB,MAAM,CACd;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAAuB,gBAAgB,AAAvC,CACA,EADQ,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;IAAwB,gBAAgB,EAAhC,MAAM,EAAE,CAChB;CAE0C,GAFhC,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CAmGtE;AA+HD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAHzC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGqB,GAF9D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB5C"}
@@ -16,8 +16,8 @@ export const canonicalToolchains = deepFreeze({
16
16
  tsc: definition("tsc", "SEMANTIFOLD_TSC", ["--version"], /^Version 7\./u),
17
17
  javac: definition("javac", "SEMANTIFOLD_JAVAC", ["-version"], /^javac (?:1[7-9]|2[0-9])\./u),
18
18
  java: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^(?:openjdk|java) version "(?:1[7-9]|2[0-9])\./u),
19
- java25: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^openjdk version "25\.0\.4" 2026-07-21\nOpenJDK Runtime Environment \(build 25\.0\.4\+7-1-((?:24|26)\.04)-Ubuntu\)\nOpenJDK 64-Bit Server VM \(build 25\.0\.4\+7-1-\1-Ubuntu, mixed mode, sharing\)$/u),
20
- kotlinc: definition("kotlinc", "SEMANTIFOLD_KOTLINC", ["-version"], /^info: kotlinc-jvm 2\.4\.20 \(JRE 25\.0\.4\+7-1-(?:24|26)\.04-Ubuntu\)$/u),
19
+ java25: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^openjdk version "25\.0\.4\.1" 2026-08-18\nOpenJDK Runtime Environment \(build 25\.0\.4\.1\+1-1-(?:24\.04\.4|26\.04\.4)-Ubuntu\)\nOpenJDK 64-Bit Server VM \(build 25\.0\.4\.1\+1-1-(?:24\.04\.4|26\.04\.4)-Ubuntu, mixed mode, sharing\)$/u),
20
+ kotlinc: definition("kotlinc", "SEMANTIFOLD_KOTLINC", ["-version"], /^info: kotlinc-jvm 2\.4\.20 \(JRE 25\.0\.4\.1\+1-1-(?:24\.04\.4|26\.04\.4)-Ubuntu\)$/u),
21
21
  python: definition("python3", "SEMANTIFOLD_PYTHON", ["--version"], /^Python 3\./u),
22
22
  dotnet: definition("dotnet", "SEMANTIFOLD_DOTNET", ["--version"], /^10\./u),
23
23
  go: definition("go", "SEMANTIFOLD_GO", ["version"], /^go version go1\.26\.\d+ linux\/amd64$/u),
@@ -426,4 +426,4 @@ function deepFreeze(value) {
426
426
  deepFreeze(nested);
427
427
  return Object.freeze(value);
428
428
  }
429
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUM7SUFDdEUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDekUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSw2QkFBNkIsQ0FBQztJQUM1RixJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGlEQUFpRCxDQUFDO0lBQzdHLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQ3pELHVNQUF1TSxDQUFDO0lBQzFNLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLHFCQUFxQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsMEVBQTBFLENBQUM7SUFDL0ksTUFBTSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUM7SUFDbEYsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDM0UsRUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSx5Q0FBeUMsQ0FBQztJQUM5RixPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLHVFQUF1RSxDQUFDO0lBQzdJLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsdUVBQXVFLENBQUM7SUFDdkksS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsc05BQXNOLENBQUM7SUFDblMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsZ0xBQWdMLENBQUM7SUFDN1AsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxhQUFhLENBQUM7SUFDckUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLENBQUMsRUFBRSxzRkFBc0YsQ0FBQztJQUNqTCxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQztJQUN2RyxRQUFRLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLG1DQUFtQyxDQUFDO0NBQzdHLENBQUMsQ0FBQTtBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDL0QsSUFBSSxPQUFPLEVBQUUsSUFBSSxRQUFRLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QyxnQkFBZ0IsQ0FBQyw4REFBOEQsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFBRSxnQkFBZ0IsQ0FBQyxnREFBZ0QsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuRyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztRQUN2RCxDQUFDLENBQUMsbUJBQW1CLEVBQUMsK0NBQWdELENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUViLElBQUksQ0FBQyxVQUFVO1FBQUUsZ0JBQWdCLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTO1FBQ2hFLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDaEQsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQTtJQUNwRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFDL0MsQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFNBQVM7WUFDdEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO1lBQ3JELENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQUM7UUFDcEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFFcEIsT0FBTyxpQkFBaUIsQ0FBQztRQUN2QixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCO1FBQzdDLFdBQVc7UUFDWCxFQUFFO1FBQ0YsUUFBUSxFQUFFLFVBQVU7UUFDcEIsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtRQUM3QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtLQUM5QyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEtBQUs7SUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxnQkFBZ0IsQ0FBQyxnREFBZ0QsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMxRyxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQTtJQUN2RCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQzNHLE1BQU0sU0FBUyxHQUFHO1FBQ2hCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7UUFDeEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVztRQUN2RixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDWixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUN4QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUztRQUM3RSxnQkFBZ0I7S0FDakIsQ0FBQTtJQUVELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzVCLE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUMzRSxNQUFNLFdBQVcsR0FBRywyREFBMkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN2RyxNQUFNLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMvQyxNQUFNLFFBQVEsR0FBRyxpQ0FBaUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN2RSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsWUFBWSxNQUFNO1FBQ25FLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7UUFDakYsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzdELE1BQU0seUJBQXlCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN0RixNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLEdBQUcsUUFBUSxLQUFLLFNBQVM7UUFDakQsQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEYsQ0FBQyxDQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFBO0lBQ2xILCtDQUErQztJQUMvQyxJQUFJLE1BQU0sQ0FBQTtJQUVWLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxNQUFNLHVCQUF1QixDQUFDO1lBQ3JDLFNBQVMsRUFBRSx5QkFBeUI7WUFDcEMsV0FBVyxFQUFFLHFCQUFxQjtZQUNsQyxVQUFVO1lBQ1YsU0FBUyxFQUFFLElBQUksR0FBRyxJQUFJO1lBQ3RCLFNBQVM7U0FDVixDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzlDLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTdDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQztZQUM5QixHQUFHLFlBQVk7WUFDZixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ2pELElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxzQkFBc0I7WUFDaEUsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixVQUFVO1lBQ1YsUUFBUSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsUUFBUTtnQkFDZixDQUFDLENBQUMsd0JBQXdCLFVBQVUsY0FBYyxTQUFTLEtBQUs7Z0JBQ2hFLENBQUMsQ0FBQyx3QkFBd0IsVUFBVSxXQUFXO1lBQ2pELE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtZQUMzQixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDNUIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFBO0lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3RDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQTtJQUN2RixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUV0RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLHFCQUFxQixDQUFDO1lBQzlCLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixVQUFVO1lBQ1YsUUFBUSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsd0JBQXdCLFVBQVUsK0JBQStCO1lBQzFFLE1BQU07WUFDTixNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLElBQUkscUJBQXFCLENBQUM7WUFDOUIsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFVBQVU7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLE9BQU8sRUFBRSxlQUFlLFVBQVUsbUNBQW1DLE9BQU8sSUFBSTtZQUNoRixNQUFNO1lBQ04sTUFBTTtZQUNOLE9BQU87U0FDUixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7UUFDaEIsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixVQUFVO1FBQ1YsRUFBRTtRQUNGLE1BQU07UUFDTixPQUFPO1FBQ1AsZ0JBQWdCLEVBQUUseUJBQXlCO1FBQzNDLGFBQWE7S0FDZCxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLDJCQUEyQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNuRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQTtBQUM1RixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQ3JELE9BQU8sS0FBSyxDQUFDLGdCQUFnQixJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDL0UsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3RILENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDckYsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMzRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsWUFBWSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUosZ0JBQWdCLENBQUMsaUlBQWlJLGdCQUFnQixLQUFLLEVBQ3JLLE9BQU8sS0FBSyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUztJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXpCLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFBRSxTQUFRO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRS9DLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFcEQsSUFBSSxLQUFLLElBQUksU0FBUztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNuRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsdUZBQXVGO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQztZQUM5QixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLE9BQU87WUFDUCxRQUFRLEVBQUUsRUFBRTtZQUNaLE9BQU8sRUFBRSxzQkFBc0IsT0FBTywyQ0FBMkM7U0FDbEYsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUkscUJBQXFCLENBQUM7WUFDOUIsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixPQUFPO1lBQ1AsUUFBUSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsc0JBQXNCLE9BQU8sdUNBQXVDLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7U0FDL0csQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBQyxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBQyxDQUFBO0FBQ2pILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTztJQUNsRCxnQ0FBZ0M7SUFDaEMsSUFBSSxLQUFLLENBQUE7SUFFVCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRW5ELElBQUksS0FBSyxJQUFJLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQTtJQUN0QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEtBQUssR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNwRCxDQUFDO0lBRUQsTUFBTSxJQUFJLHFCQUFxQixDQUFDO1FBQzlCLEtBQUs7UUFDTCxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLE9BQU87UUFDUCxVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRSwwQkFBMEIsUUFBUSxpQ0FBaUM7S0FDN0UsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsU0FBUztJQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQ3RDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFckMsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLEVBQUU7SUFDekUsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFL0MsSUFBSSxPQUFPLElBQUksU0FBUztRQUFFLGdCQUFnQixDQUFDLDZGQUE2RixFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ3hKLHFDQUFxQztJQUNyQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRXRDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xILGdCQUFnQixDQUFDLHVEQUF1RCxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQzFGLENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUNsRCxDQUFDO0lBQ0QsVUFBVSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUE7SUFDM0IsVUFBVSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7SUFDN0IsVUFBVSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFDckIsVUFBVSxDQUFDLElBQUksS0FBSyw4QkFBOEIsQ0FBQTtJQUVsRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUMsQ0FBQTtBQUNqQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBSztJQUMvQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7UUFBRSxPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxDQUFBO0lBQy9HLE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsT0FBTztRQUNMLFFBQVEsRUFBRSxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2hFLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2xFLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNELE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzVELENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsT0FBTyxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQzFELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXpDLElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixDQUFDLHlHQUF5RyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ2pJLENBQUM7SUFDRCxpREFBaUQ7SUFDakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVwQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksT0FBTztRQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7SUFFekQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ2hDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLO0lBQy9CLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUV2RixJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUMxRSw2Q0FBNkM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBRWxCLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksT0FBTyxHQUFHLElBQUksUUFBUTtnQkFBRSxPQUFPLFNBQVMsQ0FBQTtZQUM1QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBRTlELElBQUksVUFBVSxJQUFJLFNBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUM7Z0JBQy9FLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxVQUFVLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQTtZQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDL0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge2FjY2VzcywgcmVhbHBhdGgsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcblxuY29uc3QgZGVmYXVsdFRpbWVvdXRNcyA9IDEwXzAwMFxuXG5leHBvcnQgY29uc3QgY2Fub25pY2FsVG9vbGNoYWlucyA9IGRlZXBGcmVlemUoe1xuICBkYXJ0OiBkZWZpbml0aW9uKFwiZGFydFwiLCBcIlNFTUFOVElGT0xEX0RBUlRcIiwgW1wiLS12ZXJzaW9uXCJdLFxuICAgIC9eRGFydCBTREsgdmVyc2lvbjogM1xcLjEzXFwuMyBcXChzdGFibGVcXCkgXFwoVHVlIFNlcCAxIDAxOjA3OjE3IDIwMjYgLTA3MDBcXCkgb24gXCJsaW51eF94NjRcIiQvdSksXG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHBocDgyOiBkZWZpbml0aW9uKFwicGhwXCIsIFwiU0VNQU5USUZPTERfUEhQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QSFAgKD86OFxcLig/OlsyLTldfFsxLTldWzAtOV0rKXwoPzo5fFsxLTldWzAtOV0rKVxcLlswLTldKylcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBqYXZhMjU6IGRlZmluaXRpb24oXCJqYXZhXCIsIFwiU0VNQU5USUZPTERfSkFWQVwiLCBbXCItdmVyc2lvblwiXSxcbiAgICAvXm9wZW5qZGsgdmVyc2lvbiBcIjI1XFwuMFxcLjRcIiAyMDI2LTA3LTIxXFxuT3BlbkpESyBSdW50aW1lIEVudmlyb25tZW50IFxcKGJ1aWxkIDI1XFwuMFxcLjRcXCs3LTEtKCg/OjI0fDI2KVxcLjA0KS1VYnVudHVcXClcXG5PcGVuSkRLIDY0LUJpdCBTZXJ2ZXIgVk0gXFwoYnVpbGQgMjVcXC4wXFwuNFxcKzctMS1cXDEtVWJ1bnR1LCBtaXhlZCBtb2RlLCBzaGFyaW5nXFwpJC91KSxcbiAga290bGluYzogZGVmaW5pdGlvbihcImtvdGxpbmNcIiwgXCJTRU1BTlRJRk9MRF9LT1RMSU5DXCIsIFtcIi12ZXJzaW9uXCJdLCAvXmluZm86IGtvdGxpbmMtanZtIDJcXC40XFwuMjAgXFwoSlJFIDI1XFwuMFxcLjRcXCs3LTEtKD86MjR8MjYpXFwuMDQtVWJ1bnR1XFwpJC91KSxcbiAgcHl0aG9uOiBkZWZpbml0aW9uKFwicHl0aG9uM1wiLCBcIlNFTUFOVElGT0xEX1BZVEhPTlwiLCBbXCItLXZlcnNpb25cIl0sIC9eUHl0aG9uIDNcXC4vdSksXG4gIGRvdG5ldDogZGVmaW5pdGlvbihcImRvdG5ldFwiLCBcIlNFTUFOVElGT0xEX0RPVE5FVFwiLCBbXCItLXZlcnNpb25cIl0sIC9eMTBcXC4vdSksXG4gIGdvOiBkZWZpbml0aW9uKFwiZ29cIiwgXCJTRU1BTlRJRk9MRF9HT1wiLCBbXCJ2ZXJzaW9uXCJdLCAvXmdvIHZlcnNpb24gZ28xXFwuMjZcXC5cXGQrIGxpbnV4XFwvYW1kNjQkL3UpLFxuICBjbGFuZ3BwOiBkZWZpbml0aW9uKFwiY2xhbmcrK1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HUFBcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KSxcbiAgY2xhbmc6IGRlZmluaXRpb24oXCJjbGFuZ1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HXCIsIFtcIi0tdmVyc2lvblwiXSwgL15VYnVudHUgY2xhbmcgdmVyc2lvbiAyMVxcLjFcXC44IFteXFxuXStcXG5UYXJnZXQ6IHg4Nl82NC1wYy1saW51eC1nbnVcXG4vdSksXG4gIHJ1c3RjOiBkZWZpbml0aW9uKFwicnVzdGNcIiwgXCJTRU1BTlRJRk9MRF9SVVNUQ1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9ecnVzdGMgMVxcLjk4XFwuMSBcXCg0OGEyMjljZWEgMjAyNi0wOS0wMVxcKVxcbmJpbmFyeTogcnVzdGNcXG5jb21taXQtaGFzaDogNDhhMjI5Y2VhZWZkNDk4NWM1MDk5MGIxNDExNmI2ZDg1NmFmMDk4NVxcbmNvbW1pdC1kYXRlOiAyMDI2LTA5LTAxXFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxucmVsZWFzZTogMVxcLjk4XFwuMVxcbkxMVk0gdmVyc2lvbjogMjJcXC4xXFwuOCQvdSksXG4gIGNhcmdvOiBkZWZpbml0aW9uKFwiY2FyZ29cIiwgXCJTRU1BTlRJRk9MRF9DQVJHT1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9eY2FyZ28gMVxcLjk4XFwuMSBcXCg3OTdlOGE5YmMgMjAyNi0wOC0wNVxcKVxcbnJlbGVhc2U6IDFcXC45OFxcLjFcXG5jb21taXQtaGFzaDogNzk3ZThhOWJjYTI3NmMxYzlmOWY3MzhkMmEyMGY0ODRmYTRlZWE5ZFxcbmNvbW1pdC1kYXRlOiAyMDI2LTA4LTA1XFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxuL3UpLFxuICB6aWc6IGRlZmluaXRpb24oXCJ6aWdcIiwgXCJTRU1BTlRJRk9MRF9aSUdcIiwgW1widmVyc2lvblwiXSwgL14wXFwuMTVcXC4yJC91KSxcbiAgc3dpZnRjOiBkZWZpbml0aW9uKFwic3dpZnRjXCIsIFwiU0VNQU5USUZPTERfU1dJRlRDXCIsIFtcIi0tZHJpdmVyLW1vZGU9c3dpZnRjXCIsIFwiLS12ZXJzaW9uXCJdLCAvXlN3aWZ0IHZlcnNpb24gNlxcLjNcXC4zIFxcKHN3aWZ0LTZcXC4zXFwuMy1SRUxFQVNFXFwpXFxuVGFyZ2V0OiB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUkL3UpLFxuICBcIndhc20tdmFsaWRhdGVcIjogZGVmaW5pdGlvbihcIndhc20tdmFsaWRhdGVcIiwgXCJTRU1BTlRJRk9MRF9XQVNNX1ZBTElEQVRFXCIsIFtcIi0tdmVyc2lvblwiXSwgL14xXFwuMFxcLjM2JC91KSxcbiAgY2hyb21pdW06IGRlZmluaXRpb24oXCJjaHJvbWl1bVwiLCBcIlNFTUFOVElGT0xEX0NIUk9NSVVNXCIsIFtcIi0tdmVyc2lvblwiXSwgL15Hb29nbGUgQ2hyb21lIDE1MlxcLjBcXC43OTc3XFwuODIkL3UpXG59KVxuXG4vKipcbiAqIERpc2NvdmVycyBvbmUgcmVwb3NpdG9yeS1kZWNsYXJlZCBjYW5vbmljYWwgdG9vbGNoYWluLlxuICogQHBhcmFtIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gaWQgLSBDYW5vbmljYWwgdG9vbGNoYWluIElELlxuICogQHBhcmFtIHt7ZW52aXJvbm1lbnQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Piwgb3ZlcnJpZGU/OiBzdHJpbmcsIHRpbWVvdXRNcz86IG51bWJlcn19IFtvcHRpb25zXSAtIERpc2NvdmVyeSBvcHRpb25zLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWluPn0gRXhhY3QgZXhlY3V0YWJsZSBhbmQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyQ2Fub25pY2FsVG9vbGNoYWluKGlkLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiBpZCAhPSBcInN0cmluZ1wiIHx8IGlkLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihcIkNhbm9uaWNhbCB0b29sY2hhaW4gSUQgbXVzdCBiZSBhIG5vbi1lbXB0eSBwcmltaXRpdmUgc3RyaW5nLlwiLCBcInRvb2xjaGFpblwiKVxuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChvcHRpb25zKSkgaW52YWxpZFRvb2xjaGFpbihcIkNhbm9uaWNhbCB0b29sY2hhaW4gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdC5cIiwgaWQpXG4gIGNvbnN0IGRlZmluaXRpb24gPSBPYmplY3QuaGFzT3duKGNhbm9uaWNhbFRvb2xjaGFpbnMsIGlkKVxuICAgID8gY2Fub25pY2FsVG9vbGNoYWluc1svKiogQHR5cGUge2tleW9mIHR5cGVvZiBjYW5vbmljYWxUb29sY2hhaW5zfSAqLyAoaWQpXVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKCFkZWZpbml0aW9uKSBpbnZhbGlkVG9vbGNoYWluKGBVbmtub3duIGNhbm9uaWNhbCB0b29sY2hhaW4gJyR7aWR9Jy5gLCBpZClcbiAgY29uc3QgY29uZmlndXJhdGlvbkVudmlyb25tZW50ID0gb3B0aW9ucy5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHNuYXBzaG90RW52aXJvbm1lbnQob3B0aW9ucy5lbnZpcm9ubWVudCwgaWQpXG4gIGNvbnN0IGVudmlyb25tZW50ID0gY29uZmlndXJhdGlvbkVudmlyb25tZW50ID8/IGRlZmF1bHRFbnZpcm9ubWVudCgpXG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBvcHRpb25zLm92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHByb2Nlc3MuZW52W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgICAgOiBjb25maWd1cmF0aW9uRW52aXJvbm1lbnRbZGVmaW5pdGlvbi5vdmVycmlkZUVudmlyb25tZW50VmFyaWFibGVdXG4gICAgOiBvcHRpb25zLm92ZXJyaWRlXG5cbiAgcmV0dXJuIGRpc2NvdmVyVG9vbGNoYWluKHtcbiAgICBjYW5vbmljYWxDb21tYW5kOiBkZWZpbml0aW9uLmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQsXG4gICAgaWQsXG4gICAgb3ZlcnJpZGU6IGNvbmZpZ3VyZWQsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogZGVmaW5pdGlvbi5zdXBwb3J0ZWRWZXJzaW9uLFxuICAgIHRpbWVvdXRNczogb3B0aW9ucy50aW1lb3V0TXMsXG4gICAgdmVyc2lvbkFyZ3VtZW50czogZGVmaW5pdGlvbi52ZXJzaW9uQXJndW1lbnRzXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW5kIHZlcnNpb25zIG9uZSBjb25maWd1cmVkIG9yIGNhbm9uaWNhbCBleGVjdXRhYmxlIHdpdGhvdXQgaW52b2tpbmcgYSBzaGVsbC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIERpc2NvdmVyeSByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmNhbm9uaWNhbENvbW1hbmQgLSBDYW5vbmljYWwgUEFUSCBjb21tYW5kLlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gW2lucHV0LmVudmlyb25tZW50XSAtIEV4cGxpY2l0IGRpc2NvdmVyeSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5pZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5wdXQub3ZlcnJpZGVdIC0gQ29uZmlndXJlZCBhYnNvbHV0ZSBleGVjdXRhYmxlIHBhdGguXG4gKiBAcGFyYW0ge1JlZ0V4cH0gW2lucHV0LnN1cHBvcnRlZFZlcnNpb25dIC0gRnVsbCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBwb2xpY3kuXG4gKiBAcGFyYW0ge251bWJlcn0gW2lucHV0LnRpbWVvdXRNc10gLSBWZXJzaW9uIGNvbW1hbmQgdGltZW91dC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGlucHV0LnZlcnNpb25Bcmd1bWVudHMgLSBFeGFjdCB2ZXJzaW9uIGFyZ3VtZW50IGFycmF5LlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWluPn0gRGlzY292ZXJlZCB0b29sLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJUb29sY2hhaW4oaW5wdXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0KSkgaW52YWxpZFRvb2xjaGFpbihcIlRvb2xjaGFpbiBkaXNjb3ZlcnkgcmVxdWlyZXMgYSByZXF1ZXN0IG9iamVjdC5cIiwgXCJ0b29sY2hhaW5cIilcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlID0gaW5wdXQudmVyc2lvbkFyZ3VtZW50c1xuICBjb25zdCB2ZXJzaW9uQXJndW1lbnRzID0gaXNEZW5zZUFycmF5KHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSkgPyBbLi4udmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlXSA6IHVuZGVmaW5lZFxuICBjb25zdCBjYW5kaWRhdGUgPSB7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogaW5wdXQuY2Fub25pY2FsQ29tbWFuZCxcbiAgICBlbnZpcm9ubWVudDogaW5wdXQuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRFbnZpcm9ubWVudCgpIDogaW5wdXQuZW52aXJvbm1lbnQsXG4gICAgaWQ6IGlucHV0LmlkLFxuICAgIG92ZXJyaWRlOiBpbnB1dC5vdmVycmlkZSxcbiAgICBzdXBwb3J0ZWRWZXJzaW9uOiBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLFxuICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dE1zID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VGltZW91dE1zIDogaW5wdXQudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHNcbiAgfVxuXG4gIHZhbGlkYXRlRGlzY292ZXJ5KGNhbmRpZGF0ZSlcbiAgY29uc3QgY2Fub25pY2FsQ29tbWFuZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoY2FuZGlkYXRlLmNhbm9uaWNhbENvbW1hbmQpXG4gIGNvbnN0IGVudmlyb25tZW50ID0gLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gKi8gKGNhbmRpZGF0ZS5lbnZpcm9ubWVudClcbiAgY29uc3QgaWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5pZClcbiAgY29uc3Qgb3ZlcnJpZGUgPSAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi8gKGNhbmRpZGF0ZS5vdmVycmlkZSlcbiAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbiA9IGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgPyBuZXcgUmVnRXhwKGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLnNvdXJjZSwgY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24uZmxhZ3MpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgdGltZW91dE1zID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjYW5kaWRhdGUudGltZW91dE1zKVxuICBjb25zdCB2YWxpZGF0ZWRWZXJzaW9uQXJndW1lbnRzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKGNhbmRpZGF0ZS52ZXJzaW9uQXJndW1lbnRzKVxuICBjb25zdCBub3JtYWxpemVkRW52aXJvbm1lbnQgPSBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQpXG4gIGNvbnN0IHtleGVjdXRhYmxlLCBzb3VyY2V9ID0gb3ZlcnJpZGUgPT09IHVuZGVmaW5lZFxuICAgID8gYXdhaXQgcmVzb2x2ZUNhbm9uaWNhbChpZCwgY2Fub25pY2FsQ29tbWFuZCwgbm9ybWFsaXplZEVudmlyb25tZW50LlBBVEggPz8gXCJcIilcbiAgICA6IHtleGVjdXRhYmxlOiBhd2FpdCByZXNvbHZlT3ZlcnJpZGUoaWQsIG92ZXJyaWRlLCBjYW5vbmljYWxDb21tYW5kKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJvdmVycmlkZVwiKX1cbiAgLyoqIEB0eXBlIHt7c3Rkb3V0OiBzdHJpbmcsIHN0ZGVycjogc3RyaW5nfX0gKi9cbiAgbGV0IHJlc3VsdFxuXG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoe1xuICAgICAgYXJndW1lbnRzOiB2YWxpZGF0ZWRWZXJzaW9uQXJndW1lbnRzLFxuICAgICAgZW52aXJvbm1lbnQ6IG5vcm1hbGl6ZWRFbnZpcm9ubWVudCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dE1zXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSBwcm9jZXNzRXJyb3JGaWVsZHMoZXJyb3IpXG4gICAgY29uc3QgdGltZWRPdXQgPSBleGNlZWRlZE93bmVkRGVhZGxpbmUoZXJyb3IpXG5cbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIC4uLnByb2Nlc3NFcnJvcixcbiAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICBjb2RlOiB0aW1lZE91dCA/IFwiVE9PTF9WRVJTSU9OX1RJTUVPVVRcIiA6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogdGltZWRPdXRcbiAgICAgICAgPyBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZXhjZWVkZWQgJHt0aW1lb3V0TXN9bXMuYFxuICAgICAgICA6IGBWZXJzaW9uIGNvbW1hbmQgZm9yICcke2V4ZWN1dGFibGV9JyBmYWlsZWQuYCxcbiAgICAgIHN0ZGVycjogcHJvY2Vzc0Vycm9yLnN0ZGVycixcbiAgICAgIHN0ZG91dDogcHJvY2Vzc0Vycm9yLnN0ZG91dFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB7c3RkZXJyLCBzdGRvdXR9ID0gcmVzdWx0XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGRvdXQgPSBzdGRvdXQudHJpbSgpXG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGRlcnIgPSBzdGRlcnIudHJpbSgpXG4gIGNvbnN0IHZlcnNpb25PdXRwdXQgPSBub3JtYWxpemVkU3Rkb3V0Lmxlbmd0aCA+IDAgPyBub3JtYWxpemVkU3Rkb3V0IDogbm9ybWFsaXplZFN0ZGVyclxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk91dHB1dC5zcGxpdCgvXFxyP1xcbi91KVswXSA/PyBcIlwiXG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIHJldHVybmVkIG5vIHZlcnNpb24gb3V0cHV0LmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXRcbiAgICB9KVxuICB9XG4gIGlmIChzdXBwb3J0ZWRWZXJzaW9uICYmICFzdXBwb3J0ZWRWZXJzaW9uLnRlc3QodmVyc2lvbk91dHB1dCkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9VTlNVUFBPUlRFRF9WRVJTSU9OXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBFeGVjdXRhYmxlICcke2V4ZWN1dGFibGV9JyByZXBvcnRlZCB1bnN1cHBvcnRlZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0LFxuICAgICAgdmVyc2lvblxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICBleGVjdXRhYmxlLFxuICAgIGlkLFxuICAgIHNvdXJjZSxcbiAgICB2ZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgdmVyc2lvbk91dHB1dFxuICB9KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgY2Fub25pY2FsIGltbXV0YWJsZSB0b29sY2hhaW4gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY2Fub25pY2FsQ29tbWFuZCAtIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUgLSBDb25maWd1cmVkIG92ZXJyaWRlIHZhcmlhYmxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWdFeHB9IHN1cHBvcnRlZFZlcnNpb24gLSBTdXBwb3J0ZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcmV0dXJucyB7e2Nhbm9uaWNhbENvbW1hbmQ6IHN0cmluZywgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlOiBzdHJpbmcsIHN1cHBvcnRlZFZlcnNpb246IFJlZ0V4cCwgdmVyc2lvbkFyZ3VtZW50czogc3RyaW5nW119fSBEZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmaW5pdGlvbihjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHZlcnNpb25Bcmd1bWVudHMsIHN1cHBvcnRlZFZlcnNpb24pIHtcbiAgcmV0dXJuIHtjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHN1cHBvcnRlZFZlcnNpb24sIHZlcnNpb25Bcmd1bWVudHN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRvb2wgZGlzY292ZXJ5IGJlZm9yZSBmaWxlc3lzdGVtIG9yIHByb2Nlc3MgYWNjZXNzLlxuICogQHBhcmFtIHt7XG4gKiAgIGNhbm9uaWNhbENvbW1hbmQ6IHVua25vd24sXG4gKiAgIGVudmlyb25tZW50OiB1bmtub3duLFxuICogICBpZDogdW5rbm93bixcbiAqICAgb3ZlcnJpZGU6IHVua25vd24sXG4gKiAgIHN1cHBvcnRlZFZlcnNpb246IHVua25vd24sXG4gKiAgIHRpbWVvdXRNczogdW5rbm93bixcbiAqICAgdmVyc2lvbkFyZ3VtZW50czogdW5rbm93blxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgZGlzY292ZXJ5IGZpZWxkcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpc2NvdmVyeShpbnB1dCkge1xuICBpZiAodHlwZW9mIGlucHV0LmlkICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuaWQubGVuZ3RoID09IDAgfHxcbiAgICB0eXBlb2YgaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQubGVuZ3RoID09IDAgfHxcbiAgICBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiL1wiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWlzRGVuc2VBcnJheShpbnB1dC52ZXJzaW9uQXJndW1lbnRzKSB8fCAhaW5wdXQudmVyc2lvbkFyZ3VtZW50cy5ldmVyeSh2YWxpZEFyZ3VtZW50KSB8fFxuICAgICFpc0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KSB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgIChpbnB1dC5vdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgaW5wdXQub3ZlcnJpZGUgIT0gXCJzdHJpbmdcIiB8fCAhcGF0aC5pc0Fic29sdXRlKGlucHV0Lm92ZXJyaWRlKSB8fCBpbnB1dC5vdmVycmlkZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHx8XG4gICAgKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAoIShpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLmdsb2JhbCB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLnN0aWNreSkpKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihgVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIGNhbm9uaWNhbCBiYXNlbmFtZSwgYWJzb2x1dGUgb3ZlcnJpZGUsIGFyZ3VtZW50IGFycmF5LCBlbnZpcm9ubWVudCwgYW5kIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLmAsXG4gICAgICB0eXBlb2YgaW5wdXQuaWQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LmlkIDogXCJ0b29sY2hhaW5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSB1bmFtYmlndW91cyBjYW5vbmljYWwgY29tbWFuZCBmcm9tIGFuIGV4cGxpY2l0IFBBVEguXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhWYWx1ZSAtIEV4cGxpY2l0IFBBVEguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7ZXhlY3V0YWJsZTogc3RyaW5nLCBzb3VyY2U6IFwiY2Fub25pY2FsXCJ9Pn0gRXhhY3QgZXhlY3V0YWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhbm9uaWNhbChpZCwgY29tbWFuZCwgcGF0aFZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoVmFsdWUuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT0gMCB8fCAhcGF0aC5pc0Fic29sdXRlKGRpcmVjdG9yeSkpIGNvbnRpbnVlXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgY29tbWFuZClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIG1hdGNoZXMuc2V0KGV4YWN0LCBleGFjdClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgUEFUSCBjYW5kaWRhdGUgaXMgYWJzZW50IG9yIG5vbi1leGVjdXRhYmxlOyBkaXNjb3ZlcnkgY29udGludWVzIGRldGVybWluaXN0aWNhbGx5LlxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLnNpemUgPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgd2FzIG5vdCBmb3VuZCBhcyBhbiBleGVjdXRhYmxlIG9uIFBBVEguYFxuICAgIH0pXG4gIH1cbiAgaWYgKG1hdGNoZXMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9BTUJJR1VPVVNcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHJlc29sdmVzIHRvIG11bHRpcGxlIGV4ZWN1dGFibGVzOiAke1suLi5tYXRjaGVzLmtleXMoKV0uam9pbihcIiwgXCIpfS5gXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7ZXhlY3V0YWJsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChbLi4ubWF0Y2hlcy5rZXlzKCldWzBdKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJjYW5vbmljYWxcIil9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZSAtIEFic29sdXRlIG92ZXJyaWRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY29tbWFuZCkge1xuICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgY2F1c2VcblxuICB0cnkge1xuICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKG92ZXJyaWRlKVxuXG4gICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGV4YWN0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2F1c2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlLFxuICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICBjb21tYW5kLFxuICAgIGV4ZWN1dGFibGU6IG92ZXJyaWRlLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBtZXNzYWdlOiBgQ29uZmlndXJlZCBleGVjdXRhYmxlICcke292ZXJyaWRlfScgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZS5gXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNhbmRpZGF0ZSB0byBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59IEV4YWN0IHJlZ3VsYXIgZXhlY3V0YWJsZSwgaWYgdGhlIGZpbGUgdHlwZSBpcyB2YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSkge1xuICBjb25zdCBleGFjdCA9IGF3YWl0IHJlYWxwYXRoKGNhbmRpZGF0ZSlcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdChleGFjdClcblxuICBpZiAoIXN0YXR1cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBhd2FpdCBhY2Nlc3MoZXhhY3QsIGZzQ29uc3RhbnRzLlhfT0spXG5cbiAgcmV0dXJuIGV4YWN0XG59XG5cbi8qKlxuICogUHJvZHVjZXMgdGhlIG1pbmltYWwgZGV0ZXJtaW5pc3RpYyBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gZW52aXJvbm1lbnQgLSBFeHBsaWNpdCBpbnB1dHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52aXJvbm1lbnQoKSkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKGVudmlyb25tZW50KVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICghL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3Qoa2V5KSB8fCBrZXkuaW5jbHVkZXMoXCJcXDBcIikgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpKSB7XG4gICAgICBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBjb250YWlucyBhbiBpbnZhbGlkIGtleSBvciB2YWx1ZS5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZFtrZXldID0gdmFsdWVcbiAgfVxuICBub3JtYWxpemVkLkxBTkcgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLkxDX0FMTCA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuVFogPSBcIlVUQ1wiXG4gIG5vcm1hbGl6ZWQuUEFUSCA/Pz0gXCIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluXCJcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBleGVjdXRhYmxlIGxvb2t1cCBmcm9tIHRoZSBhbWJpZW50IGVudmlyb25tZW50LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBNaW5pbWFsIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbnZpcm9ubWVudCgpIHtcbiAgcmV0dXJuIHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfVxufVxuXG4vKipcbiAqIE5hcnJvd3Mgc3RhYmxlIGZpZWxkcyBmcm9tIGEgdmVyc2lvbiBzdWJwcm9jZXNzIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ319IFN0YWJsZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcikge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4ge2V4aXRDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzaGVsbC1mcmVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHNhZmUgdG8gcGFzcyBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBcmd1bWVudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGV4cGxpY2l0IHByb2Nlc3MtZW52aXJvbm1lbnQgdmFsdWVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gV2hldGhlciBlbnRyaWVzIGFyZSBzdHJpbmdzIG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNFbnZpcm9ubWVudCh2YWx1ZSkge1xuICByZXR1cm4gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSAhPSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBEZXRhY2hlcyBhbiBleHBsaWNpdCBlbnZpcm9ubWVudCBiZWZvcmUgY2Fub25pY2FsIG92ZXJyaWRlIGxvb2t1cCBjYW4geWllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gT3duZWQgZW52aXJvbm1lbnQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RFbnZpcm9ubWVudCh2YWx1ZSwgaWQpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyh2YWx1ZSlcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBpZClcbiAgfVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG4gIGNvbnN0IHNuYXBzaG90ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGVudHJpZXMpIHNuYXBzaG90W2tleV0gPSBlbnRyeVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHNuYXBzaG90KVxufVxuXG4vKipcbiAqIFJlYWRzIG9ubHkgZW51bWVyYWJsZSBvd24gZGF0YSBwcm9wZXJ0aWVzIGZyb20gYW4gb3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdIHwgdW5kZWZpbmVkfSBEZXRhY2hlZCBlbnRyaWVzIHdoZW4gdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpXG5cbiAgICAgIGlmIChkZXNjcmlwdG9yID09IHVuZGVmaW5lZCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8ICEoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIHx8XG4gICAgICAgIChkZXNjcmlwdG9yLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT0gXCJzdHJpbmdcIikpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBkZXNjcmlwdG9yLnZhbHVlXSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBkaXNjb3ZlcnktY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFRvb2xjaGFpbihtZXNzYWdlLCBpZCkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfVE9PTENIQUlOXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyBhbmQgZGlzY292ZXJ5IHJlc3VsdHMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFRvb2xjaGFpbi1vd25lZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
429
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtC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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NvbnN0YW50cyBhcyBmc0NvbnN0YW50c30gZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHthY2Nlc3MsIHJlYWxwYXRoLCBzdGF0fSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2V4Y2VlZGVkT3duZWREZWFkbGluZSwgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmV9IGZyb20gXCIuL3N1YnByb2Nlc3MuanNcIlxuaW1wb3J0IHtpc1N1cHBvcnRlZFRpbWVvdXRNcywgbWF4aW11bVRpbWVvdXRNc30gZnJvbSBcIi4vdGltZW91dC5qc1wiXG5cbmNvbnN0IGRlZmF1bHRUaW1lb3V0TXMgPSAxMF8wMDBcblxuZXhwb3J0IGNvbnN0IGNhbm9uaWNhbFRvb2xjaGFpbnMgPSBkZWVwRnJlZXplKHtcbiAgZGFydDogZGVmaW5pdGlvbihcImRhcnRcIiwgXCJTRU1BTlRJRk9MRF9EQVJUXCIsIFtcIi0tdmVyc2lvblwiXSxcbiAgICAvXkRhcnQgU0RLIHZlcnNpb246IDNcXC4xM1xcLjMgXFwoc3RhYmxlXFwpIFxcKFR1ZSBTZXAgMSAwMTowNzoxNyAyMDI2IC0wNzAwXFwpIG9uIFwibGludXhfeDY0XCIkL3UpLFxuICBwaHA6IGRlZmluaXRpb24oXCJwaHBcIiwgXCJTRU1BTlRJRk9MRF9QSFBcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlBIUCA4XFwuL3UpLFxuICBwaHA4MjogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQICg/OjhcXC4oPzpbMi05XXxbMS05XVswLTldKyl8KD86OXxbMS05XVswLTldKylcXC5bMC05XSspXFwuL3UpLFxuICBydWJ5OiBkZWZpbml0aW9uKFwicnVieVwiLCBcIlNFTUFOVElGT0xEX1JVQllcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnJ1YnkgM1xcLi91KSxcbiAgbm9kZTogZGVmaW5pdGlvbihcIm5vZGVcIiwgXCJTRU1BTlRJRk9MRF9OT0RFXCIsIFtcIi0tdmVyc2lvblwiXSwgL152MjRcXC4vdSksXG4gIHRzYzogZGVmaW5pdGlvbihcInRzY1wiLCBcIlNFTUFOVElGT0xEX1RTQ1wiLCBbXCItLXZlcnNpb25cIl0sIC9eVmVyc2lvbiA3XFwuL3UpLFxuICBqYXZhYzogZGVmaW5pdGlvbihcImphdmFjXCIsIFwiU0VNQU5USUZPTERfSkFWQUNcIiwgW1wiLXZlcnNpb25cIl0sIC9eamF2YWMgKD86MVs3LTldfDJbMC05XSlcXC4vdSksXG4gIGphdmE6IGRlZmluaXRpb24oXCJqYXZhXCIsIFwiU0VNQU5USUZPTERfSkFWQVwiLCBbXCItdmVyc2lvblwiXSwgL14oPzpvcGVuamRrfGphdmEpIHZlcnNpb24gXCIoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTI1OiBkZWZpbml0aW9uKFwiamF2YVwiLCBcIlNFTUFOVElGT0xEX0pBVkFcIiwgW1wiLXZlcnNpb25cIl0sXG4gICAgL15vcGVuamRrIHZlcnNpb24gXCIyNVxcLjBcXC40XFwuMVwiIDIwMjYtMDgtMThcXG5PcGVuSkRLIFJ1bnRpbWUgRW52aXJvbm1lbnQgXFwoYnVpbGQgMjVcXC4wXFwuNFxcLjFcXCsxLTEtKD86MjRcXC4wNFxcLjR8MjZcXC4wNFxcLjQpLVVidW50dVxcKVxcbk9wZW5KREsgNjQtQml0IFNlcnZlciBWTSBcXChidWlsZCAyNVxcLjBcXC40XFwuMVxcKzEtMS0oPzoyNFxcLjA0XFwuNHwyNlxcLjA0XFwuNCktVWJ1bnR1LCBtaXhlZCBtb2RlLCBzaGFyaW5nXFwpJC91KSxcbiAga290bGluYzogZGVmaW5pdGlvbihcImtvdGxpbmNcIiwgXCJTRU1BTlRJRk9MRF9LT1RMSU5DXCIsIFtcIi12ZXJzaW9uXCJdLFxuICAgIC9eaW5mbzoga290bGluYy1qdm0gMlxcLjRcXC4yMCBcXChKUkUgMjVcXC4wXFwuNFxcLjFcXCsxLTEtKD86MjRcXC4wNFxcLjR8MjZcXC4wNFxcLjQpLVVidW50dVxcKSQvdSksXG4gIHB5dGhvbjogZGVmaW5pdGlvbihcInB5dGhvbjNcIiwgXCJTRU1BTlRJRk9MRF9QWVRIT05cIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlB5dGhvbiAzXFwuL3UpLFxuICBkb3RuZXQ6IGRlZmluaXRpb24oXCJkb3RuZXRcIiwgXCJTRU1BTlRJRk9MRF9ET1RORVRcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXjEwXFwuL3UpLFxuICBnbzogZGVmaW5pdGlvbihcImdvXCIsIFwiU0VNQU5USUZPTERfR09cIiwgW1widmVyc2lvblwiXSwgL15nbyB2ZXJzaW9uIGdvMVxcLjI2XFwuXFxkKyBsaW51eFxcL2FtZDY0JC91KSxcbiAgY2xhbmdwcDogZGVmaW5pdGlvbihcImNsYW5nKytcIiwgXCJTRU1BTlRJRk9MRF9DTEFOR1BQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15VYnVudHUgY2xhbmcgdmVyc2lvbiAyMVxcLjFcXC44IFteXFxuXStcXG5UYXJnZXQ6IHg4Nl82NC1wYy1saW51eC1nbnVcXG4vdSksXG4gIGNsYW5nOiBkZWZpbml0aW9uKFwiY2xhbmdcIiwgXCJTRU1BTlRJRk9MRF9DTEFOR1wiLCBbXCItLXZlcnNpb25cIl0sIC9eVWJ1bnR1IGNsYW5nIHZlcnNpb24gMjFcXC4xXFwuOCBbXlxcbl0rXFxuVGFyZ2V0OiB4ODZfNjQtcGMtbGludXgtZ251XFxuL3UpLFxuICBydXN0YzogZGVmaW5pdGlvbihcInJ1c3RjXCIsIFwiU0VNQU5USUZPTERfUlVTVENcIiwgW1wiLS12ZXJzaW9uXCIsIFwiLS12ZXJib3NlXCJdLCAvXnJ1c3RjIDFcXC45OFxcLjEgXFwoNDhhMjI5Y2VhIDIwMjYtMDktMDFcXClcXG5iaW5hcnk6IHJ1c3RjXFxuY29tbWl0LWhhc2g6IDQ4YTIyOWNlYWVmZDQ5ODVjNTA5OTBiMTQxMTZiNmQ4NTZhZjA5ODVcXG5jb21taXQtZGF0ZTogMjAyNi0wOS0wMVxcbmhvc3Q6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudVxcbnJlbGVhc2U6IDFcXC45OFxcLjFcXG5MTFZNIHZlcnNpb246IDIyXFwuMVxcLjgkL3UpLFxuICBjYXJnbzogZGVmaW5pdGlvbihcImNhcmdvXCIsIFwiU0VNQU5USUZPTERfQ0FSR09cIiwgW1wiLS12ZXJzaW9uXCIsIFwiLS12ZXJib3NlXCJdLCAvXmNhcmdvIDFcXC45OFxcLjEgXFwoNzk3ZThhOWJjIDIwMjYtMDgtMDVcXClcXG5yZWxlYXNlOiAxXFwuOThcXC4xXFxuY29tbWl0LWhhc2g6IDc5N2U4YTliY2EyNzZjMWM5ZjlmNzM4ZDJhMjBmNDg0ZmE0ZWVhOWRcXG5jb21taXQtZGF0ZTogMjAyNi0wOC0wNVxcbmhvc3Q6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudVxcbi91KSxcbiAgemlnOiBkZWZpbml0aW9uKFwiemlnXCIsIFwiU0VNQU5USUZPTERfWklHXCIsIFtcInZlcnNpb25cIl0sIC9eMFxcLjE1XFwuMiQvdSksXG4gIHN3aWZ0YzogZGVmaW5pdGlvbihcInN3aWZ0Y1wiLCBcIlNFTUFOVElGT0xEX1NXSUZUQ1wiLCBbXCItLWRyaXZlci1tb2RlPXN3aWZ0Y1wiLCBcIi0tdmVyc2lvblwiXSwgL15Td2lmdCB2ZXJzaW9uIDZcXC4zXFwuMyBcXChzd2lmdC02XFwuM1xcLjMtUkVMRUFTRVxcKVxcblRhcmdldDogeDg2XzY0LXVua25vd24tbGludXgtZ251JC91KSxcbiAgXCJ3YXNtLXZhbGlkYXRlXCI6IGRlZmluaXRpb24oXCJ3YXNtLXZhbGlkYXRlXCIsIFwiU0VNQU5USUZPTERfV0FTTV9WQUxJREFURVwiLCBbXCItLXZlcnNpb25cIl0sIC9eMVxcLjBcXC4zNiQvdSksXG4gIGNocm9taXVtOiBkZWZpbml0aW9uKFwiY2hyb21pdW1cIiwgXCJTRU1BTlRJRk9MRF9DSFJPTUlVTVwiLCBbXCItLXZlcnNpb25cIl0sIC9eR29vZ2xlIENocm9tZSAxNTJcXC4wXFwuNzk3N1xcLjgyJC91KVxufSlcblxuLyoqXG4gKiBEaXNjb3ZlcnMgb25lIHJlcG9zaXRvcnktZGVjbGFyZWQgY2Fub25pY2FsIHRvb2xjaGFpbi5cbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9IGlkIC0gQ2Fub25pY2FsIHRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7e2Vudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG92ZXJyaWRlPzogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBEaXNjb3Zlcnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IEV4YWN0IGV4ZWN1dGFibGUgYW5kIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbihpZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIElEIG11c3QgYmUgYSBub24tZW1wdHkgcHJpbWl0aXZlIHN0cmluZy5cIiwgXCJ0b29sY2hhaW5cIilcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3Qob3B0aW9ucykpIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuXCIsIGlkKVxuICBjb25zdCBkZWZpbml0aW9uID0gT2JqZWN0Lmhhc093bihjYW5vbmljYWxUb29sY2hhaW5zLCBpZClcbiAgICA/IGNhbm9uaWNhbFRvb2xjaGFpbnNbLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKGlkKV1cbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmICghZGVmaW5pdGlvbikgaW52YWxpZFRvb2xjaGFpbihgVW5rbm93biBjYW5vbmljYWwgdG9vbGNoYWluICcke2lkfScuYCwgaWQpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBzbmFwc2hvdEVudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQsIGlkKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA/PyBkZWZhdWx0RW52aXJvbm1lbnQoKVxuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9ucy5vdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgICAgPyBwcm9jZXNzLmVudltkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICAgIDogY29uZmlndXJhdGlvbkVudmlyb25tZW50W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgIDogb3B0aW9ucy5vdmVycmlkZVxuXG4gIHJldHVybiBkaXNjb3ZlclRvb2xjaGFpbih7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogZGVmaW5pdGlvbi5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50LFxuICAgIGlkLFxuICAgIG92ZXJyaWRlOiBjb25maWd1cmVkLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGRlZmluaXRpb24uc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IGRlZmluaXRpb24udmVyc2lvbkFyZ3VtZW50c1xuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2ZXJzaW9ucyBvbmUgY29uZmlndXJlZCBvciBjYW5vbmljYWwgZXhlY3V0YWJsZSB3aXRob3V0IGludm9raW5nIGEgc2hlbGwuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBEaXNjb3ZlcnkgcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5jYW5vbmljYWxDb21tYW5kIC0gQ2Fub25pY2FsIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFtpbnB1dC5lbnZpcm9ubWVudF0gLSBFeHBsaWNpdCBkaXNjb3ZlcnkgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0Lm92ZXJyaWRlXSAtIENvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHBhcmFtIHtSZWdFeHB9IFtpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uXSAtIEZ1bGwgc2VsZWN0ZWQtc3RyZWFtIHZlcnNpb24gcG9saWN5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnB1dC50aW1lb3V0TXNdIC0gVmVyc2lvbiBjb21tYW5kIHRpbWVvdXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IERpc2NvdmVyZWQgdG9vbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyVG9vbGNoYWluKGlucHV0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dCkpIGludmFsaWRUb29sY2hhaW4oXCJUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgcmVxdWVzdCBvYmplY3QuXCIsIFwidG9vbGNoYWluXCIpXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSA9IGlucHV0LnZlcnNpb25Bcmd1bWVudHNcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50cyA9IGlzRGVuc2VBcnJheSh2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLnZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZV0gOiB1bmRlZmluZWRcbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGlucHV0LmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQ6IGlucHV0LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0RW52aXJvbm1lbnQoKSA6IGlucHV0LmVudmlyb25tZW50LFxuICAgIGlkOiBpbnB1dC5pZCxcbiAgICBvdmVycmlkZTogaW5wdXQub3ZlcnJpZGUsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogaW5wdXQuc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFRpbWVvdXRNcyA6IGlucHV0LnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzXG4gIH1cblxuICB2YWxpZGF0ZURpc2NvdmVyeShjYW5kaWRhdGUpXG4gIGNvbnN0IGNhbm9uaWNhbENvbW1hbmQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5jYW5vbmljYWxDb21tYW5kKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59ICovIChjYW5kaWRhdGUuZW52aXJvbm1lbnQpXG4gIGNvbnN0IGlkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuaWQpXG4gIGNvbnN0IG92ZXJyaWRlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovIChjYW5kaWRhdGUub3ZlcnJpZGUpXG4gIGNvbnN0IHN1cHBvcnRlZFZlcnNpb24gPSBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgID8gbmV3IFJlZ0V4cChjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5zb3VyY2UsIGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLmZsYWdzKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLnRpbWVvdXRNcylcbiAgY29uc3QgdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChjYW5kaWRhdGUudmVyc2lvbkFyZ3VtZW50cylcbiAgY29uc3Qgbm9ybWFsaXplZEVudmlyb25tZW50ID0gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGVudmlyb25tZW50KVxuICBjb25zdCB7ZXhlY3V0YWJsZSwgc291cmNlfSA9IG92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGF3YWl0IHJlc29sdmVDYW5vbmljYWwoaWQsIGNhbm9uaWNhbENvbW1hbmQsIG5vcm1hbGl6ZWRFbnZpcm9ubWVudC5QQVRIID8/IFwiXCIpXG4gICAgOiB7ZXhlY3V0YWJsZTogYXdhaXQgcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY2Fub25pY2FsQ29tbWFuZCksIHNvdXJjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwib3ZlcnJpZGVcIil9XG4gIC8qKiBAdHlwZSB7e3N0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZ319ICovXG4gIGxldCByZXN1bHRcblxuICB0cnkge1xuICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgIGFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICAgIGVudmlyb25tZW50OiBub3JtYWxpemVkRW52aXJvbm1lbnQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXRNc1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICAgIGNvbnN0IHRpbWVkT3V0ID0gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAuLi5wcm9jZXNzRXJyb3IsXG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogdGltZWRPdXQgPyBcIlRPT0xfVkVSU0lPTl9USU1FT1VUXCIgOiBcIlRPT0xfVkVSU0lPTl9GQUlMVVJFXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IHRpbWVkT3V0XG4gICAgICAgID8gYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGV4Y2VlZGVkICR7dGltZW91dE1zfW1zLmBcbiAgICAgICAgOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZmFpbGVkLmAsXG4gICAgICBzdGRlcnI6IHByb2Nlc3NFcnJvci5zdGRlcnIsXG4gICAgICBzdGRvdXQ6IHByb2Nlc3NFcnJvci5zdGRvdXRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qge3N0ZGVyciwgc3Rkb3V0fSA9IHJlc3VsdFxuICBjb25zdCBub3JtYWxpemVkU3Rkb3V0ID0gc3Rkb3V0LnRyaW0oKVxuICBjb25zdCBub3JtYWxpemVkU3RkZXJyID0gc3RkZXJyLnRyaW0oKVxuICBjb25zdCB2ZXJzaW9uT3V0cHV0ID0gbm9ybWFsaXplZFN0ZG91dC5sZW5ndGggPiAwID8gbm9ybWFsaXplZFN0ZG91dCA6IG5vcm1hbGl6ZWRTdGRlcnJcbiAgY29uc3QgdmVyc2lvbiA9IHZlcnNpb25PdXRwdXQuc3BsaXQoL1xccj9cXG4vdSlbMF0gPz8gXCJcIlxuXG4gIGlmICh2ZXJzaW9uLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlRPT0xfVkVSU0lPTl9GQUlMVVJFXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBWZXJzaW9uIGNvbW1hbmQgZm9yICcke2V4ZWN1dGFibGV9JyByZXR1cm5lZCBubyB2ZXJzaW9uIG91dHB1dC5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0XG4gICAgfSlcbiAgfVxuICBpZiAoc3VwcG9ydGVkVmVyc2lvbiAmJiAhc3VwcG9ydGVkVmVyc2lvbi50ZXN0KHZlcnNpb25PdXRwdXQpKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlRPT0xfVU5TVVBQT1JURURfVkVSU0lPTlwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgRXhlY3V0YWJsZSAnJHtleGVjdXRhYmxlfScgcmVwb3J0ZWQgdW5zdXBwb3J0ZWQgdmVyc2lvbiAnJHt2ZXJzaW9ufScuYCxcbiAgICAgIHN0ZGVycixcbiAgICAgIHN0ZG91dCxcbiAgICAgIHZlcnNpb25cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGRlZXBGcmVlemUoe1xuICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgZXhlY3V0YWJsZSxcbiAgICBpZCxcbiAgICBzb3VyY2UsXG4gICAgdmVyc2lvbixcbiAgICB2ZXJzaW9uQXJndW1lbnRzOiB2YWxpZGF0ZWRWZXJzaW9uQXJndW1lbnRzLFxuICAgIHZlcnNpb25PdXRwdXRcbiAgfSlcbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIGNhbm9uaWNhbCBpbW11dGFibGUgdG9vbGNoYWluIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbm9uaWNhbENvbW1hbmQgLSBQQVRIIGNvbW1hbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlIC0gQ29uZmlndXJlZCBvdmVycmlkZSB2YXJpYWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHZlcnNpb25Bcmd1bWVudHMgLSBFeGFjdCB2ZXJzaW9uIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7UmVnRXhwfSBzdXBwb3J0ZWRWZXJzaW9uIC0gU3VwcG9ydGVkIHZlcnNpb24gb3V0cHV0LlxuICogQHJldHVybnMge3tjYW5vbmljYWxDb21tYW5kOiBzdHJpbmcsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZTogc3RyaW5nLCBzdXBwb3J0ZWRWZXJzaW9uOiBSZWdFeHAsIHZlcnNpb25Bcmd1bWVudHM6IHN0cmluZ1tdfX0gRGVjbGFyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmluaXRpb24oY2Fub25pY2FsQ29tbWFuZCwgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlLCB2ZXJzaW9uQXJndW1lbnRzLCBzdXBwb3J0ZWRWZXJzaW9uKSB7XG4gIHJldHVybiB7Y2Fub25pY2FsQ29tbWFuZCwgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlLCBzdXBwb3J0ZWRWZXJzaW9uLCB2ZXJzaW9uQXJndW1lbnRzfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0b29sIGRpc2NvdmVyeSBiZWZvcmUgZmlsZXN5c3RlbSBvciBwcm9jZXNzIGFjY2Vzcy5cbiAqIEBwYXJhbSB7e1xuICogICBjYW5vbmljYWxDb21tYW5kOiB1bmtub3duLFxuICogICBlbnZpcm9ubWVudDogdW5rbm93bixcbiAqICAgaWQ6IHVua25vd24sXG4gKiAgIG92ZXJyaWRlOiB1bmtub3duLFxuICogICBzdXBwb3J0ZWRWZXJzaW9uOiB1bmtub3duLFxuICogICB0aW1lb3V0TXM6IHVua25vd24sXG4gKiAgIHZlcnNpb25Bcmd1bWVudHM6IHVua25vd25cbiAqIH19IGlucHV0IC0gQ2FuZGlkYXRlIGRpc2NvdmVyeSBmaWVsZHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEaXNjb3ZlcnkoaW5wdXQpIHtcbiAgaWYgKHR5cGVvZiBpbnB1dC5pZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmlkLmxlbmd0aCA9PSAwIHx8XG4gICAgdHlwZW9mIGlucHV0LmNhbm9uaWNhbENvbW1hbmQgIT0gXCJzdHJpbmdcIiB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmxlbmd0aCA9PSAwIHx8XG4gICAgaW5wdXQuY2Fub25pY2FsQ29tbWFuZC5pbmNsdWRlcyhcIi9cIikgfHwgaW5wdXQuY2Fub25pY2FsQ29tbWFuZC5pbmNsdWRlcyhcIlxcXFxcIikgfHwgaW5wdXQuY2Fub25pY2FsQ29tbWFuZC5pbmNsdWRlcyhcIlxcMFwiKSB8fFxuICAgICFpc0RlbnNlQXJyYXkoaW5wdXQudmVyc2lvbkFyZ3VtZW50cykgfHwgIWlucHV0LnZlcnNpb25Bcmd1bWVudHMuZXZlcnkodmFsaWRBcmd1bWVudCkgfHxcbiAgICAhaXNFbnZpcm9ubWVudChpbnB1dC5lbnZpcm9ubWVudCkgfHwgIWlzU3VwcG9ydGVkVGltZW91dE1zKGlucHV0LnRpbWVvdXRNcykgfHxcbiAgICAoaW5wdXQub3ZlcnJpZGUgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIGlucHV0Lm92ZXJyaWRlICE9IFwic3RyaW5nXCIgfHwgIXBhdGguaXNBYnNvbHV0ZShpbnB1dC5vdmVycmlkZSkgfHwgaW5wdXQub3ZlcnJpZGUuaW5jbHVkZXMoXCJcXDBcIikpKSB8fFxuICAgIChpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKCEoaW5wdXQuc3VwcG9ydGVkVmVyc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cCkgfHwgaW5wdXQuc3VwcG9ydGVkVmVyc2lvbi5nbG9iYWwgfHwgaW5wdXQuc3VwcG9ydGVkVmVyc2lvbi5zdGlja3kpKSkge1xuICAgIGludmFsaWRUb29sY2hhaW4oYFRvb2xjaGFpbiBkaXNjb3ZlcnkgcmVxdWlyZXMgYSBjYW5vbmljYWwgYmFzZW5hbWUsIGFic29sdXRlIG92ZXJyaWRlLCBhcmd1bWVudCBhcnJheSwgZW52aXJvbm1lbnQsIGFuZCB0aW1lb3V0IGZyb20gMSB0aHJvdWdoICR7bWF4aW11bVRpbWVvdXRNc31tcy5gLFxuICAgICAgdHlwZW9mIGlucHV0LmlkID09IFwic3RyaW5nXCIgPyBpbnB1dC5pZCA6IFwidG9vbGNoYWluXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgdW5hbWJpZ3VvdXMgY2Fub25pY2FsIGNvbW1hbmQgZnJvbSBhbiBleHBsaWNpdCBQQVRILlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoVmFsdWUgLSBFeHBsaWNpdCBQQVRILlxuICogQHJldHVybnMge1Byb21pc2U8e2V4ZWN1dGFibGU6IHN0cmluZywgc291cmNlOiBcImNhbm9uaWNhbFwifT59IEV4YWN0IGV4ZWN1dGFibGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDYW5vbmljYWwoaWQsIGNvbW1hbmQsIHBhdGhWYWx1ZSkge1xuICBjb25zdCBtYXRjaGVzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgcGF0aFZhbHVlLnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgIGlmIChkaXJlY3RvcnkubGVuZ3RoID09IDAgfHwgIXBhdGguaXNBYnNvbHV0ZShkaXJlY3RvcnkpKSBjb250aW51ZVxuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihkaXJlY3RvcnksIGNvbW1hbmQpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhhY3QgPSBhd2FpdCByZXNvbHZlRXhlY3V0YWJsZUZpbGUoY2FuZGlkYXRlKVxuXG4gICAgICBpZiAoZXhhY3QgIT0gdW5kZWZpbmVkKSBtYXRjaGVzLnNldChleGFjdCwgZXhhY3QpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIFBBVEggY2FuZGlkYXRlIGlzIGFic2VudCBvciBub24tZXhlY3V0YWJsZTsgZGlzY292ZXJ5IGNvbnRpbnVlcyBkZXRlcm1pbmlzdGljYWxseS5cbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5zaXplID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHdhcyBub3QgZm91bmQgYXMgYW4gZXhlY3V0YWJsZSBvbiBQQVRILmBcbiAgICB9KVxuICB9XG4gIGlmIChtYXRjaGVzLnNpemUgPiAxKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlRPT0xfQU1CSUdVT1VTXCIsXG4gICAgICBjb21tYW5kLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYENhbm9uaWNhbCBjb21tYW5kICcke2NvbW1hbmR9JyByZXNvbHZlcyB0byBtdWx0aXBsZSBleGVjdXRhYmxlczogJHtbLi4ubWF0Y2hlcy5rZXlzKCldLmpvaW4oXCIsIFwiKX0uYFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge2V4ZWN1dGFibGU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoWy4uLm1hdGNoZXMua2V5cygpXVswXSksIHNvdXJjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiY2Fub25pY2FsXCIpfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBjb25maWd1cmVkIGFic29sdXRlIGV4ZWN1dGFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3ZlcnJpZGUgLSBBYnNvbHV0ZSBvdmVycmlkZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gQ2Fub25pY2FsIGNvbW1hbmQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBFeGFjdCBleGVjdXRhYmxlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPdmVycmlkZShpZCwgb3ZlcnJpZGUsIGNvbW1hbmQpIHtcbiAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGNhdXNlXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShvdmVycmlkZSlcblxuICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIHJldHVybiBleGFjdFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhdXNlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkXG4gIH1cblxuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZSxcbiAgICBjb2RlOiBcIlRPT0xfTk9UX0ZPVU5EXCIsXG4gICAgY29tbWFuZCxcbiAgICBleGVjdXRhYmxlOiBvdmVycmlkZSxcbiAgICBsYW5ndWFnZTogaWQsXG4gICAgbWVzc2FnZTogYENvbmZpZ3VyZWQgZXhlY3V0YWJsZSAnJHtvdmVycmlkZX0nIGlzIG1pc3Npbmcgb3Igbm90IGV4ZWN1dGFibGUuYFxuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBjYW5kaWRhdGUgdG8gYW4gZXhlY3V0YWJsZSByZWd1bGFyIGZpbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FuZGlkYXRlIC0gQ2FuZGlkYXRlIHBhdGguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fSBFeGFjdCByZWd1bGFyIGV4ZWN1dGFibGUsIGlmIHRoZSBmaWxlIHR5cGUgaXMgdmFsaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpIHtcbiAgY29uc3QgZXhhY3QgPSBhd2FpdCByZWFscGF0aChjYW5kaWRhdGUpXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXQoZXhhY3QpXG5cbiAgaWYgKCFzdGF0dXMuaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWRcbiAgYXdhaXQgYWNjZXNzKGV4YWN0LCBmc0NvbnN0YW50cy5YX09LKVxuXG4gIHJldHVybiBleGFjdFxufVxuXG4vKipcbiAqIFByb2R1Y2VzIHRoZSBtaW5pbWFsIGRldGVybWluaXN0aWMgcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IGVudmlyb25tZW50IC0gRXhwbGljaXQgaW5wdXRzLlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBOb3JtYWxpemVkIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGVudmlyb25tZW50ID0gZGVmYXVsdEVudmlyb25tZW50KCkpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyhlbnZpcm9ubWVudClcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIGludmFsaWRUb29sY2hhaW4oXCJQcm9jZXNzIGVudmlyb25tZW50IG11c3QgYmUgYSBwbGFpbiBvd24tcHJvcGVydHkgZGF0YSByZWNvcmQgb2Ygc3RyaW5nIG9yIHVuZGVmaW5lZCB2YWx1ZXMuXCIsIFwiZW52aXJvbm1lbnRcIilcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBub3JtYWxpemVkID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIS9eW0EtWmEtel9dW0EtWmEtejAtOV9dKiQvdS50ZXN0KGtleSkgfHwga2V5LmluY2x1ZGVzKFwiXFwwXCIpIHx8ICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpKSkge1xuICAgICAgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgY29udGFpbnMgYW4gaW52YWxpZCBrZXkgb3IgdmFsdWUuXCIsIFwiZW52aXJvbm1lbnRcIilcbiAgICB9XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWRba2V5XSA9IHZhbHVlXG4gIH1cbiAgbm9ybWFsaXplZC5MQU5HID0gXCJDLlVURi04XCJcbiAgbm9ybWFsaXplZC5MQ19BTEwgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLlRaID0gXCJVVENcIlxuICBub3JtYWxpemVkLlBBVEggPz89IFwiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpblwiXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUobm9ybWFsaXplZClcbn1cblxuLyoqXG4gKiBSZXRhaW5zIG9ubHkgZXhlY3V0YWJsZSBsb29rdXAgZnJvbSB0aGUgYW1iaWVudCBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gTWluaW1hbCBkZWZhdWx0IGVudmlyb25tZW50LlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RW52aXJvbm1lbnQoKSB7XG4gIHJldHVybiB7UEFUSDogcHJvY2Vzcy5lbnYuUEFUSH1cbn1cblxuLyoqXG4gKiBOYXJyb3dzIHN0YWJsZSBmaWVsZHMgZnJvbSBhIHZlcnNpb24gc3VicHJvY2VzcyByZWplY3Rpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIC0gUHJvY2VzcyByZWplY3Rpb24uXG4gKiBAcmV0dXJucyB7e2V4aXRDb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGRlcnI6IHN0cmluZywgc3Rkb3V0OiBzdHJpbmd9fSBTdGFibGUgZmllbGRzLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzRXJyb3JGaWVsZHMoZXJyb3IpIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT0gXCJvYmplY3RcIikgcmV0dXJuIHtleGl0Q29kZTogdW5kZWZpbmVkLCBzaWduYWw6IHVuZGVmaW5lZCwgc3RkZXJyOiBcIlwiLCBzdGRvdXQ6IFwiXCJ9XG4gIGNvbnN0IHZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGVycm9yKVxuXG4gIHJldHVybiB7XG4gICAgZXhpdENvZGU6IHR5cGVvZiB2YWx1ZS5jb2RlID09IFwibnVtYmVyXCIgPyB2YWx1ZS5jb2RlIDogdW5kZWZpbmVkLFxuICAgIHNpZ25hbDogdHlwZW9mIHZhbHVlLnNpZ25hbCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc2lnbmFsIDogdW5kZWZpbmVkLFxuICAgIHN0ZGVycjogdHlwZW9mIHZhbHVlLnN0ZGVyciA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3RkZXJyIDogXCJcIixcbiAgICBzdGRvdXQ6IHR5cGVvZiB2YWx1ZS5zdGRvdXQgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnN0ZG91dCA6IFwiXCJcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBvbmUgc2hlbGwtZnJlZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgYXJndW1lbnQuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgc3RyaW5nfSBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBzYWZlIHRvIHBhc3MgZGlyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkQXJndW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmICF2YWx1ZS5pbmNsdWRlcyhcIlxcMFwiKVxufVxuXG4vKipcbiAqIENoZWNrcyBleHBsaWNpdCBwcm9jZXNzLWVudmlyb25tZW50IHZhbHVlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFdoZXRoZXIgZW50cmllcyBhcmUgc3RyaW5ncyBvciB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGlzRW52aXJvbm1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkgIT0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRGV0YWNoZXMgYW4gZXhwbGljaXQgZW52aXJvbm1lbnQgYmVmb3JlIGNhbm9uaWNhbCBvdmVycmlkZSBsb29rdXAgY2FuIHlpZWxkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IE93bmVkIGVudmlyb25tZW50IGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNuYXBzaG90RW52aXJvbm1lbnQodmFsdWUsIGlkKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBlbnZpcm9ubWVudEVudHJpZXModmFsdWUpXG5cbiAgaWYgKGVudHJpZXMgPT0gdW5kZWZpbmVkKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihcIkNhbm9uaWNhbCB0b29sY2hhaW4gZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgaWQpXG4gIH1cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+fSAqL1xuICBjb25zdCBzbmFwc2hvdCA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBlbnRyaWVzKSBzbmFwc2hvdFtrZXldID0gZW50cnlcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzbmFwc2hvdClcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmx5IGVudW1lcmFibGUgb3duIGRhdGEgcHJvcGVydGllcyBmcm9tIGFuIG9yZGluYXJ5IG9yIG51bGwtcHJvdG90eXBlIHJlY29yZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZW52aXJvbm1lbnQgcmVjb3JkLlxuICogQHJldHVybnMge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXSB8IHVuZGVmaW5lZH0gRGV0YWNoZWQgZW50cmllcyB3aGVuIHZhbGlkLlxuICovXG5mdW5jdGlvbiBlbnZpcm9ubWVudEVudHJpZXModmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHZhbHVlID09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB1bmRlZmluZWRcblxuICB0cnkge1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICAgIGlmIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG90eXBlICE9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdW119ICovXG4gICAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXModmFsdWUpKSB7XG4gICAgICBpZiAodHlwZW9mIGtleSAhPSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KVxuXG4gICAgICBpZiAoZGVzY3JpcHRvciA9PSB1bmRlZmluZWQgfHwgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCAhKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB8fFxuICAgICAgICAoZGVzY3JpcHRvci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9IFwic3RyaW5nXCIpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBlbnRyaWVzLnB1c2goW2tleSwgZGVzY3JpcHRvci52YWx1ZV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciBhbiBvcmRpbmFyeSBzdHJpbmcta2V5ZWQgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgZGlzY292ZXJ5LWNvbmZpZ3VyYXRpb24gZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRUb29sY2hhaW4obWVzc2FnZSwgaWQpIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJJTlZBTElEX1RPT0xDSEFJTlwiLCBsYW5ndWFnZTogaWQsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIERlZXBseSBmcmVlemVzIGNhbm9uaWNhbCBkZWNsYXJhdGlvbnMgYW5kIGRpc2NvdmVyeSByZXN1bHRzLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWUgLSBUb29sY2hhaW4tb3duZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7VH0gRnJvemVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZWVwRnJlZXplKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgZm9yIChjb25zdCBuZXN0ZWQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGRlZXBGcmVlemUobmVzdGVkKVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlKVxufVxuIl19
@@ -0,0 +1,186 @@
1
+ # Expression breadth ADR — conditional expressions, nullish/optional access, string interpolation, ranges, casts
2
+
3
+ Status: accepted (design record for the STOE-58 implementation chain).
4
+
5
+ This ADR decides, per construct, what can be modeled soundly against the closed semantic model
6
+ (`todo/README.md` guiding principles 1–11) and what stays a located fail-loud rejection. It is the
7
+ per-construct accept/reject matrix required by the issue; the implementation chain lands construct by
8
+ construct behind one registry feature flag per construct family.
9
+
10
+ ## Shared ground rules
11
+
12
+ 1. **Strict Optional model stays closed.** No truthiness, no implicit coercion, no unchecked
13
+ navigation. `boolean` is the only condition type (`NON_BOOLEAN_CONDITION`), absence is only
14
+ `Optional<T>`, and every value position must be provably typed.
15
+ 2. **Frontends own source rules, backends own target rules.** A construct is accepted by a frontend
16
+ only when its parser node shape is fully traversed (no recovery nodes, no unmodeled children); a
17
+ backend emits it only when the target can represent the semantics exactly, otherwise located
18
+ `UNSUPPORTED_CAPABILITY` before any partial artifact.
19
+ 3. **Evaluation order is semantic, not target-default.** Where a native spelling would evaluate
20
+ operands in an order the IR does not model (or would collapse an explicit optional boundary into a
21
+ native null), the construct is rejected or lowered through the compiler-owned helper pattern.
22
+ 4. **Feature flags gate cohorts.** Each accepted construct family gets one
23
+ `LanguageFeatureCapabilities` flag; the registry pins the cohort per language, and every language
24
+ outside the cohort keeps its located rejection.
25
+
26
+ ## Construct 1 — Conditional (ternary) expressions → ACCEPTED for the original-five cohort
27
+
28
+ **Decision.** Add a closed `ConditionalExpression` IR node:
29
+ `{kind: "ConditionalExpression", condition, consequent, alternate, type, location}` with a strict
30
+ `boolean` condition and both arms independently typed to the same value type. The node is an
31
+ expression, not a statement sugar: arms are expressions, effects from either arm are collected, and
32
+ flow joins like the existing `IfStatement` join.
33
+
34
+ **Why sound.** The original-five cohort already models `IfStatement` with a strict boolean condition
35
+ and joins both branches. A ternary is exactly that shape with expression arms. All five frontends
36
+ parse it as a single unambiguous node (`retif` in php-parser, Prism `IfNode` with `?` spelling,
37
+ Babel `ConditionalExpression`, Lezer Java `TernaryExpression`) and all five targets have a native
38
+ conditional expression with identical short-circuit semantics (`?:` in PHP/Ruby/JS/TS/Java).
39
+
40
+ **Type rule.** Both arms must resolve to the same `SemanticValueType` (scalar, optional, or
41
+ collection). Mixed arms fail with `TYPE_MISMATCH` at the alternate arm. An arm of type `void` fails
42
+ with `VOID_AS_VALUE`. Optional arms follow the existing optional-equality rules; no arm is ever
43
+ "widened".
44
+
45
+ **Backend spelling.** `(cond ? a : b)` with explicit parentheses in all five text backends (JS/TS
46
+ already parenthesize binary emissions; the ternary is parenthesized the same way to keep precedence
47
+ deterministic). Wasm lowers to a block/local pair (the existing short-circuit `if` opcode pattern
48
+ used for `BooleanAnd`/`BooleanOr`).
49
+
50
+ **Cohort.** `php`, `ruby`, `javascript`, `typescript`, `java` (the cohort that already has
51
+ `IfStatement`, optional values, and general calls). Dart/Zig/Kotlin/Python/C#/Go/C/CPP/Rust/Swift/
52
+ Swift keep the located `UNSUPPORTED_SYNTAX` (frontend) or `UNSUPPORTED_CAPABILITY` (backend)
53
+ rejection until their own wave adopts the construct; the registry flag pins the cohort.
54
+
55
+ **Rejected spellings.** Ruby modifier-`if`/`unless` and `if` as an expression value (statement-only
56
+ model), PHP short ternary `$a ?: $b` (truthiness), Python `a if c else b` (kept rejected in this
57
+ wave: Python has no optional model and its frontend cohort is Tasks 001–004 only), C/CPP comma or
58
+ ternary forms (their profiles reject ternary today and the ordered planner would need a new region
59
+ kind), Rust `if`-expressions (Rust profile rejects control flow), Kotlin `if`-expressions (Kotlin
60
+ cohort is scalar baseline only).
61
+
62
+ ## Construct 2 — Nullish coalescing and safe navigation → REJECTED (kept fail-loud)
63
+
64
+ **Decision.** `??`, `?.`, and every nullish/safe-navigation spelling stay rejected in every language.
65
+
66
+ **Why.** The semantic model has no universal null: absence exists only as `Optional<T>`, and the
67
+ delivered Task 007 model already provides the total alternatives — `OptionalIsPresent`,
68
+ `OptionalUnwrap`, and the parser-proved `Map#get(...)!` exception. `??` is exactly truthiness over a
69
+ nullable value (the model's central exclusion), and `?.` is unchecked navigation that silently
70
+ propagates absence through arbitrary call chains — the issue itself says to keep the strict Optional
71
+ model and accept optional chaining only "where presence is provable". Presence in the IR is provable
72
+ only through the existing narrowing (`presenceProofs`) and `OptionalUnwrap`; a general `?.` chain
73
+ would require a new propagation-typed call model that no backend can represent uniformly (Java
74
+ `Optional`, JS `?.`, Ruby `&.` all have different evaluation and failure semantics).
75
+
76
+ **What stays.** `OptionalUnwrap` remains the only navigation, and the frontend auto-wrapping/auto-
77
+ unwrapping around optional bindings is unchanged. Ruby `&.`, PHP `?->`, JS/TS `?.` and `??`, Dart
78
+ `?.`/`??`, Kotlin `?.`/`?:`, Swift `?.`/`??`, Rust `?`, C# `?.`/`??` all keep located
79
+ `UNSUPPORTED_SYNTAX`.
80
+
81
+ **Reconsider when:** a future task adds a propagation-typed call/error model (Task 011 error values
82
+ plus optional returns) across a cohort; that is a separate design decision, not part of this issue.
83
+
84
+ ## Construct 3 — String interpolation → ACCEPTED as canonical concatenation lowering
85
+
86
+ **Decision.** Interpolation is not a new IR node. Frontends lower a parser-proved interpolation to
87
+ the existing `StringConcat` `BinaryExpression` spine over pre-rendered parts: literal segments become
88
+ `StringLiteral` nodes and interpolated segments must already be `string`-typed expressions (no
89
+ implicit `string(x)` coercion — an interpolated integer/boolean/optional fails with
90
+ `INVALID_OPERAND_TYPE` at that segment). N literal segments + M expressions lower to a left-
91
+ associated `StringConcat` tree of exactly `N+M-1` binary nodes.
92
+
93
+ **Why sound.** `StringConcat` is already in the closed operation set with per-target spellings
94
+ (`+` / `.`), proven evaluation order, and full backend coverage in the cohort. Interpolation adds no
95
+ new semantics — only the parser-side decomposition. The lowering happens in the frontend, so the IR,
96
+ validation, provenance, and every backend see only existing nodes.
97
+
98
+ **Frontend acceptance (cohort: php, ruby, javascript, typescript, java):**
99
+ - PHP double-quoted `encapsed` strings: every segment must be a plain string or a scalar
100
+ expression; `${...}`, `{$...}`, escape-sensitive dynamic forms traverse normally; heredoc/nowdoc
101
+ stay rejected (their raw-text semantics are outside the scalar model).
102
+ - Ruby Prism `InterpolatedStringNode`: `String`/`StringNode` parts and embedded expression parts;
103
+ heredocs stay rejected.
104
+ - JavaScript/TypeScript `TemplateLiteral` with `expressions.length > 0`: quasis become literals,
105
+ expressions must be `string`-typed; tagged templates and `\u{}`-invalid content stay rejected.
106
+ - Java text blocks and string concatenation: Java has no interpolation construct; text blocks stay
107
+ rejected (multi-line raw semantics), and this construct adds nothing for Java beyond keeping the
108
+ rejection located.
109
+ - Python f-strings, Go raw/interpreted interpolation forms, C# interpolated/raw strings, Dart
110
+ interpolation, Kotlin interpolation, Swift interpolation, Zig `\\{}` — stay located rejections in
111
+ this wave (their cohorts are Tasks 001–004 scalar baselines; the lowering lands with each
112
+ language's own adoption).
113
+
114
+ **Backend spelling.** Nothing changes: the lowered tree emits through the existing `StringConcat`
115
+ spelling table. Provenance maps each synthetic binary node to the interpolation span via the
116
+ existing `withParserRanges` mechanism (the whole interpolated literal is the mapped range; the
117
+ synthetic operators are synthetic regions).
118
+
119
+ ## Construct 4 — Ranges → REJECTED as a value; loop-only form deferred
120
+
121
+ **Decision.** No range value type and no range literal in this wave. `1..3`, `1...3`, `1..`,
122
+ `Range...` stay rejected in every language.
123
+
124
+ **Why.** A first-class range value would be a new semantic type (bounds, inclusivity, direction,
125
+ step, emptiness, equality) that no backend in the cohort can represent without a new runtime type —
126
+ PHP/Ruby/JS/TS/Java would each need a compiler-owned class, which contradicts "model meaning once"
127
+ without a delivered type story. The issue's alternative — a loop-only form — is exactly Task 032's
128
+ condition-controlled loop territory (`while i < limit` with an explicit bound) and is already the
129
+ delivered portable spelling. A `for i in range` sugar would add an iteration domain (Task 008/014
130
+ territory) with its own join/flow rules; that is a separate bounded task, not an expression.
131
+
132
+ **Reconsider when:** a numeric-tower or collection-domain task (STOE-57 chain) delivers a portable
133
+ sequence type; the loop-only sugar can then be added without inventing a value type here.
134
+
135
+ ## Construct 5 — General casts and assertions → REJECTED (kept fail-loud)
136
+
137
+ **Decision.** No general cast/assertion construct. `(int) x`, `x as T`, `T(x)`, `x!` (beyond the
138
+ delivered Task 006 `Map#get(...)!` exception), `assert`, `@type`-style coercion all stay rejected.
139
+
140
+ **Why.** A cast is only sound where the source and target types have a total, target-independent
141
+ conversion. In the closed model the only such conversions are already explicit IR operations
142
+ (`StringConcat` is not a cast; integer arithmetic is checked per target). Any general cast would
143
+ either be a no-op type lie (`string as string`), a partial function (`string as integer` — what is
144
+ `"abc"`?), or a width change (the numeric tower, STOE-57's separate ADR). The model's answer to
145
+ "make this optional total" is already `OptionalUnwrap` with its located failure, and the answer to
146
+ "prove this lookup total" is the existing independently-proven `!` exception. Adding a general
147
+ assertion would create a second, unchecked escape hatch next to the strict Optional model — the
148
+ issue explicitly says to keep that model strict.
149
+
150
+ **What stays.** Task 006's exact TypeScript `Map#get(...)!` wrapper remains the sole assertion
151
+ exception, unchanged.
152
+
153
+ ## Accept/reject matrix (per construct × language role)
154
+
155
+ | Construct | IR | Cohort (frontend+backend) | All other languages |
156
+ | --- | --- | --- | --- |
157
+ | Conditional expression | new `ConditionalExpression` | php, ruby, javascript, typescript, java (+ wasm lowering for the cohort's programs) | located `UNSUPPORTED_SYNTAX` (frontend) / `UNSUPPORTED_CAPABILITY` (backend) |
158
+ | Nullish `??` | none | none — rejected everywhere | located `UNSUPPORTED_SYNTAX` |
159
+ | Safe navigation `?.` | none | none — rejected everywhere | located `UNSUPPORTED_SYNTAX` |
160
+ | String interpolation | lowering to `StringConcat` | php, ruby, javascript, typescript (java: text blocks stay rejected) | located `UNSUPPORTED_SYNTAX` |
161
+ | Range literal/value | none | none — rejected everywhere | located `UNSUPPORTED_SYNTAX` |
162
+ | General cast/assertion | none | none — rejected everywhere (Task 006 `!` exception unchanged) | located `UNSUPPORTED_SYNTAX` |
163
+
164
+ ## Registry flags
165
+
166
+ - `conditionalExpressions: boolean` — true for php, ruby, javascript, typescript, java.
167
+ - `stringInterpolation: boolean` — true for php, ruby, javascript, typescript.
168
+ - `nullishOrSafeNavigation`, `rangeValues`, `generalCasts` — deliberately **not** added as flags:
169
+ they are rejections, and a rejection needs no capability advertisement. The registry validation
170
+ pins the exact feature-key set; adding a construct later adds its flag with its cohort.
171
+
172
+ ## Implementation chain (this issue)
173
+
174
+ 1. IR + validation: `ConditionalExpression` node, `inferExpressionType` arm join, effect collection,
175
+ presence-narrowing join parity with `IfStatement` (condition narrowing applies to both arms).
176
+ 2. Frontends (cohort): accept the parser node shapes above with exact located rejections for the
177
+ rejected spellings; interpolation lowering in php/ruby/javascript/typescript.
178
+ 3. Backends (cohort text + wasm): ternary emission with parenthesized spelling and provenance;
179
+ interpolation needs no backend change (lowered tree); every non-cohort backend keeps the located
180
+ `UNSUPPORTED_CAPABILITY` for a `ConditionalExpression` that reaches it.
181
+ 4. Specs: per-construct frontend accept/reject corpus, semantic validation corpus, backend emission +
182
+ real-toolchain execution per cohort language, registry cohort pins, provenance/mapping coverage,
183
+ and the cross-language matrix (a cohort ternary/interpolation program round-trips through every
184
+ cohort target).
185
+ 5. Docs: this ADR, `docs/language-support.md` limitations paragraph update, per-language docs,
186
+ changelog fragment.
@@ -8,10 +8,12 @@ Task 018's C path follows these layers through the unchanged root-bundled privat
8
8
  2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects. Task 010's `SemanticProgram` adds dependency-first logical modules, a caller-order multi-source registry, explicit import/export nodes, one selected entry module, and stable module-qualified declaration identities; native filenames, package names, and target paths remain outside semantic resolution. Value types are scalar `integer`/`boolean`/`string` references or recursive acyclic `ListType`, unordered string-keyed `MapType`, insertion-ordered `OrderedMapType`, `OptionalType`, nominal `RecordType`, nominal Task 033 `ReferenceType`, and Task 034 linear `OwnedResourceType`/`OwnedReferenceType`; `void` exists only as a callable return. Task 012 adds invariant unbounded declaration-owned `TypeParameter` values, scoped `TypeVariableReference` leaves, and exact ordered arguments on generic record types. Task 011 adds nominal `ErrorType` only for catch bindings and error constructions, never as an ordinary parameter/local/return value. Task 034 adds compiler-authorized capability/resource/failure/operation declarations, complete resolved `EffectCallExpression` sites, and explicit `OwnedMoveExpression`/`OwnedBorrowExpression` nodes. Every function and reference class/member has a deterministic declaration identity; every list, ordered-map, condition-controlled loop, capability member, and effect site has a deterministic module-local identity. Every direct function, constructor, receiver method, and effect call carries exact resolution facts. Literal and access nodes distinguish scalars, collections, presence/absence, nominal values/references/resources, errors, receivers, and private fields. Unary and binary expressions carry a closed semantic `operation` and explicit result `type`, never a source operator symbol. Every function, constructor, method, entry point, branch, loop, try body, and catch body owns a located `Block` containing ordered `Statement` nodes. Statements additionally include exact `ForEachMapStatement`, strict-Boolean precondition `WhileStatement`, identity-resolved `BreakStatement`/`ContinueStatement`, private receiver-field writes, `RaiseStatement`, and one-handler `TryStatement`; general exception constructs have no semantic node. `lifetime.js` retains distinct normal/return/raise/break/continue ownership states and proves every owner terminal or transferred at every reachable scope exit. Task 033 class identity/private state remains single-module semantics; Task 034's effect/resource nodes stay compiler-authorized and single-module by default, Task 035 extends Task 010 `SemanticProgram` with versioned canonical capability modules and negotiated provider link requirements, and Task 036 adds exact facade-resolution evidence plus compiler-owned source/module roles and a complete selected-facade descriptor.
9
9
  3. Source and binary backends in `src/backends/` validate their semantic capabilities before emitting target syntax or bytes. Shared validation owns recursive block shape, reachability and all-path abrupt-completion analysis, recursively complete expressions, exhaustive operation/type signatures, function signatures, lexical binding scopes, mutability, declaration-before-use, strict condition/return/argument/initializer/assignment types, fixed-point propagation of nominal unchecked errors, and Task 034 capability/effect/resource graph integrity. `backends/effects.js` rejects unsupported authority/target/context combinations before writer allocation and plans nested eager effects into statement-local collision-safe temporaries in semantic evaluation order. Dependency-first Task 010 validation carries ordinary inferred error sets across resolved function-import identities; both single-module generation and program mode accept compiler-authorized capability modules, while program mode additionally resolves their canonical standard-library contract references and links negotiated target host provider artifacts before any writer allocation. Target-specific validation adds identifier rules, entry-scaffolding name collisions, numeric/memory/resource bounds, and target string representation. The single-module original five retain one fixed compiler-owned Task 034 probe binding, and program mode materializes the same probe behavior as a tree-shaken provider artifact under a protected native binding. Text emitters write through `SourceWriter`; the Wasm encoder writes through an annotated binary writer so every byte range is semantic or explicitly synthetic. A backend either returns a complete executable program/project/application set or raises `UNSUPPORTED_CAPABILITY`; it never silently drops nodes, exposes a partial artifact, or lets an emitter discover malformed shape through a native error.
10
10
 
11
- `src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, semantic feature flags, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `generalFunctionsAndCalls` is true for PHP, Ruby, JavaScript, TypeScript, Java, Dart, and Zig; every later feature flag remains true only for the original five. `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
11
+ `src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, interoperability, and non-executing developer-check capabilities. Public descriptors derive role booleans, semantic feature flags, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, acceptance stages/toolchains, and the immutable check `supported`/stage/tool subset from those records; all fifteen text targets advertise target-owned check plans. `generalFunctionsAndCalls` is true for PHP, Ruby, JavaScript, TypeScript, Java, Dart, and Zig; every later feature flag remains true only for the original five. `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, unordered acceptance stages, executing developer-check stages, and undeclared check tools fail as `INVALID_REGISTRY`.
12
12
 
13
13
  `index.js` is the public boundary. `createCapabilityAuthority(input)` validates, detaches, and freezes explicit Task 034 compilation authority. `parse({language, filename, source, capabilityAuthority?})` resolves only the frontend role; omitted authority retains the legacy empty capability set and explicit `null` is malformed. `parseProgram(...)` composes only the original-five parser adapters over an explicit complete source set, resolves declarations by identity, performs no I/O, and accepts the same optional compiler authority so program modules may carry Task 034 capability declarations and a Task 035 standard-library contract descriptor. `createStdlibContractRegistry`, `listStdlibModules`, and `resolveStdlibModule` own the versioned canonical contract registry; `createStdlibProviderRegistry` and `listStdlibProviders` own the target host provider registry; `negotiateStdlibProviders` computes the transitive capability closure; and Task 036's `createStdlibFacadeRegistry`, `listStdlibFacades`, and `resolveStdlibFacade` expose detached versioned source-language facade definitions. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, C, Rust, Dart, Zig, and Wasm backends. `generateArtifactSet(...)` remains the additive single-module artifact boundary, while `generateProgramArtifactSet(...)` plans and validates a complete original-five program before any writer allocation. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID missing the program cohort is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of semantic content or target layout. `src/artifacts.js` owns transactional generated-file validation and detached, deeply frozen JSON metadata snapshots, including JSON object keys without prototype interpretation. `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
14
14
 
15
+ Task 039 adds a filesystem/project orchestration layer without moving I/O into semantic frontends or backends. `src/project-manifest.js` validates the closed version-1 JSON boundary and canonical path ownership once. `src/project-snapshot.js` produces one twice-read, bounded-retry, content-hashed immutable source graph. `src/project-build.js` feeds that graph to the existing program parser and backend dispatch exactly once, then supplies every ordered artifact set to `GeneratedArtifactPublisher` under either its deterministic generation-only identity or a fresh checked-transaction identity. Task 040 adds `src/target-check.js`: it validates target-owned immutable plans before spawning, enforces staged source/build ownership, deterministic environments, bounded output, timeout/cancellation, close-only settlement, and compiler-output inventory. `src/backends/java-check.js` alone owns Java filenames and the exact `javac -d` argv; `src/project-build.js` composes it through publisher validators without a target switch. Task 043 adds `src/project-watch.js` and `src/project-watch-reporter.js`: filesystem backends supply hints only, complete content snapshots admit serialized cycles, a post-check pre-pointer currentness guard rejects stale candidates, and shutdown reuses the existing owned cancellation/cleanup path. Task 044 proves this unchanged target-neutral composition in a packed JavaScript/JSDoc-to-Java consumer and adds an NDJSON dirty acknowledgement without adding a Java watcher. `src/project-cli.js` owns only strict arguments and command lifecycle selection. The executable remains a thin ESM wrapper. See [project manifest and one-shot build CLI](project-build-cli.md) and [deterministic project watch](project-watch.md).
16
+
15
17
  The [iOS application target](ios.md) is a target-only spoke on that artifact boundary. `src/backends/ios.js` reuses Task 010 project/source ownership and the Task 022 Tasks 001–004 Swift capability profile, validates the complete graph/configuration/asset layout, then emits captured namespaced Swift plus synthetic SwiftUI, unsigned project, test, asset-catalog, and versioned manifest artifacts. Apple lifecycle/configuration/resources do not enter semantic IR, and generation performs no filesystem access. There is no public project materializer: transactional create-only directory publication is deferred because Node's public filesystem API cannot combine atomic no-replace publication with descriptor-relative no-follow staging and cleanup without a separately authorized native boundary. No best-effort writer replaces that guarantee. Linux semantic/tool/packed-generator proofs are implemented; Apple/Xcode/Simulator proof remains explicitly deferred.
16
18
 
17
19
  The [Android application target](android.md) is a Kotlin/Android spoke on the same boundary. `src/backends/android.js` validates a complete Kotlin-supported semantic module or Task 010 program plus closed Android configuration/resource inputs before writer allocation, then emits mapped namespaced semantic Kotlin and synthetic Gradle/manifest/Activity/native-view/test artifacts under one fixed ownership root. Android lifecycle/UI/build syntax stays outside semantic IR, and generic Kotlin/JVM output is unchanged. Public generation remains in-memory; a repository-private create-only helper materializes only fresh mode-0700 acceptance directories. The actual build is offline, while TensorBuzz alone prepares official caches and runs two clean KVM-accelerated API-35 emulator boots.
package/docs/c.md CHANGED
@@ -58,3 +58,7 @@ Missing, duplicated, reordered, forged or wrong-version markers; extra/dead/esca
58
58
  Rich mappings and Source Map v3 retain original operator, call, literal, binding and final-consumer origins. All generated declarations/names/markers, prototypes, unused-binding uses, short-circuit control and cleanup are synthetic with related semantic origins. Shared IR objects receive distinct occurrence paths, temporary names and map records. The header is a synthetic artifact related to the module root.
59
59
 
60
60
  See [testing](testing.md) for package pins, portable qualification commands, strict C17 flags, mandatory O0/O2 sanitizer execution, ownership instrumentation and original-five crossings. These changes neither publish a package nor extend the standard-library portability contract.
61
+
62
+ ## Non-executing developer check
63
+
64
+ The registered Task 042 plan compiles every staged `.c` unit and declares every staged header with the strict Clang C17 flags above at ordinary `-O0`, then links the complete object set into the generation-owned `semantifold-c` output. Object and TMPDIR state are transient and removed only after the linker closes. The plan never runs the executable. Existing `-O2` and ASan/UBSan/leak variants remain explicit real acceptance and TensorBuzz profiles rather than hidden every-edit branches.
package/docs/cpp.md CHANGED
@@ -59,3 +59,7 @@ The qualified binding accepts at most 32,767 UTF-16 code units, including all in
59
59
  Malformed IR, unsupported target options/identifiers/types and unrepresentable integer/string/source bounds use `UNSUPPORTED_CAPABILITY` before any artifact. Unsupported source forms use located frontend diagnostics; malformed generated regions normalize semantic/capability failures to `UNSUPPORTED_SYNTAX`. Parser recovery uses `PARSE_ERROR`.
60
60
 
61
61
  Original operators, call targets, types and statement consumers retain rich/v3 provenance. Runtime code, prototypes, discards, marker comments, temporary declarations/uses and short-circuit control have explicit synthetic origins related to semantic occurrences. Generation/reparse is deterministic, including shared semantic objects, Unicode/CRLF source positions, serialized maps and stale-provenance rebuilding. Tests use the complete C distinguishable-call matrix, five CPP fixture profiles, original-five crossings and real native execution; expanded language-cohort matrices remain Task025 work.
62
+
63
+ ## Non-executing developer check
64
+
65
+ The registered Task 042 plan compiles every staged `.cpp` unit with the exact Clang C++20/libstdc++, warnings-as-errors, no-exceptions/no-RTTI, UTF-8, checked-overflow `-O0` profile and then links the complete object set into generation-owned `semantifold-cpp`. Object and TMPDIR state are transient and the executable is not run. Existing `-O2` and ASan/UBSan/leak variants remain explicit acceptance and TensorBuzz profiles, not automatic watcher work.
package/docs/dart.md CHANGED
@@ -58,3 +58,7 @@ dart compile exe bin/program.dart -o semantifold-dart
58
58
  ```
59
59
 
60
60
  All three generated artifact hashes remain unchanged after every command; only disposable `.dart_tool/` state and the native executable appear. The six Tasks 001–005 Dart fixtures translate to every compatible target and execute identically on Dart VM/native. Representative PHP, Ruby, JavaScript, TypeScript, and Java fixtures translate into Dart. Additional acceptance proves Unicode, eager argument ordering, direct recursion, void calls, Boolean short-circuiting, and the safe-integer boundary with exact empty stderr and identical VM/native stdout.
61
+
62
+ ## Non-executing developer check
63
+
64
+ The registered Task 042 plan accepts only the exact producer-owned dependency-free pubspec, lockfile, and Dart sources. Its length-framed restore hash contains only `pubspec.lock` and `pubspec.yaml`, so ordinary source changes cannot alter restore identity. Each fresh checked candidate performs an enforced-lock `dart pub get --offline --dry-run --no-precompile`, compiles `bin/program.dart` to a generation-owned native output, verifies format with no writes, and runs fatal analysis. HOME, PUB_CACHE, TMPDIR, candidate `.dart_tool`, and the native check output are declared transient and removed after all children close; `PUB_HOSTED_URL` is unreachable. Dart 3.13.3 embeds the candidate's absolute source URI in that executable, so publishing it would make otherwise identical generations path-dependent; the developer plan verifies but never runs or publishes it.
@@ -35,9 +35,9 @@ const published = await publisher.publish({
35
35
  })
36
36
  ```
37
37
 
38
- The constructor requires a stable lowercase project ID, one canonical absolute project root, one dedicated canonical publication directory strictly beneath that project root, and at least one canonical absolute source root within the project. Publication and source roots must remain disjoint both lexically and after real-path resolution. Absolute roots use the active host's native separator and reject its non-native separator alias; target-relative artifact and projection paths remain portable POSIX-style paths. The publication directory must be on a filesystem that supports atomic same-directory regular-file replacement and directory synchronization, and must not be changed concurrently by an untrusted process.
38
+ The constructor requires a stable lowercase project ID, one canonical absolute project root, one dedicated canonical publication directory strictly beneath that project root, and at least one canonical absolute source directory (`sourceRoots`) or exact source file (`sourceFiles`) within the project. Publication and declared source paths must remain disjoint both lexically and after real-path resolution. Task 039 uses exact source files so a source such as `<project>/main.js` does not falsely make every other path below the project source-owned. Absolute paths use the active host's native separator and reject its non-native separator alias; target-relative artifact and projection paths remain portable POSIX-style paths. The publication directory must be on a filesystem that supports atomic same-directory regular-file replacement and directory synchronization, and must not be changed concurrently by an untrusted process.
39
39
 
40
- Each publication request supplies a unique generation ID and a complete ordered target array. A target has its own stable ID, explicit language-neutral `text`, `binary`, or `application` role, immutable `GeneratedArtifactSet`, and disjoint normalized source/build projections. Empty, absolute, dot, dot-dot, separator-alias, duplicate, portable case-fold, nested, manifest-reserved, escaping, and symlink-traversing paths fail before reachability. The class serializes calls made through one instance; callers must ensure there is only one project publication writer across instances and processes.
40
+ Each publication request supplies an explicit generation ID and a complete ordered target array. A fresh ID stages a new generation. An existing retained ID may be reactivated only for a validator-free request whose canonical manifest bytes exactly match the retained manifest; the publisher then revalidates the full immutable filesystem inventory before switching the pointer. It never invokes validators against, deletes, or overwrites a retained directory. A target has its own stable ID, explicit language-neutral `text`, `binary`, or `application` role, immutable `GeneratedArtifactSet`, and disjoint normalized source/build projections. Empty, absolute, dot, dot-dot, separator-alias, duplicate, portable case-fold, nested, manifest-reserved, escaping, and symlink-traversing paths fail before reachability. The class serializes calls made through one instance; callers must ensure there is only one project publication writer across instances and processes.
41
41
 
42
42
  Validators receive one frozen object containing only `targetId`, the exact generation-scoped `sourcePath`, and the exact generation-scoped `buildPath`. The publisher does not grant a project root, publication root, command runner, or general filesystem capability. A validator may create regular files below its build path and must return ordered `{path, mediaType, role}` metadata for every such file. The publisher inventories the complete generation namespace, including all intermediate directories, and allows only the manifest plus declared source/build projections and files. Every projection root and descended directory is checked without following symbolic links before its entries are read. Undeclared siblings or directories, missing files, symlinks, special nodes, hard-linked files, duplicate reported device/inode identities, collisions, invalid metadata, callback failures, or generated-source mutation reject the candidate.
43
43
 
@@ -65,7 +65,7 @@ The publisher synchronizes staged files, validator outputs, the manifest, and ca
65
65
 
66
66
  ## Commit and reader state machine
67
67
 
68
- Publication uses this order:
68
+ Fresh publication uses this order:
69
69
 
70
70
  1. Validate identities, roots, projections, portable collisions, existing state, and the host replacement contract.
71
71
  2. Write and synchronize an ownership journal, then create one unique candidate generation.
@@ -74,22 +74,25 @@ Publication uses this order:
74
74
  5. Atomically rename that regular file over `active-generation.json` in the same directory.
75
75
  6. Synchronize the publication-root directory, then clean the no-longer-needed journal and synchronize the journal directory.
76
76
 
77
- There is no copy, truncate, live-pointer rewrite, per-target promotion, or source/build directory rename fallback. Before step 5, the prior pointer remains authoritative. Once step 5 succeeds, the new complete generation is the visible authority; a later directory-sync failure is reported as `PUBLICATION_POINTER_FAILED` without deleting that generation. A journal-cleanup failure returns the committed result with `cleanupPending: true` and cannot roll the pointer back.
77
+ There is no copy, truncate, live-pointer rewrite, per-target promotion, or source/build directory rename fallback. Before step 5, the prior pointer remains authoritative. A publication transaction may supply an `AbortSignal`; the publisher checks it before filesystem work and again immediately before step 5, so cancellation after validation but before pointer replacement removes the journal-owned candidate and leaves the prior source/build bytes authoritative with `PUBLICATION_CANCELLED`. Once step 5 succeeds, the new complete generation is the visible authority; a later directory-sync failure is reported as `PUBLICATION_POINTER_FAILED` without deleting that generation. A journal-cleanup failure returns the committed result with `cleanupPending: true` and cannot roll the pointer back.
78
+
79
+ Retained-generation reactivation performs the same root, existing-pointer, atomic-replacement, temporary-pointer, rename, synchronization, and cleanup checks. Before writing its journal, it derives the exact validator-free candidate manifest in memory, requires byte equality with the retained canonical manifest, and verifies every retained file and directory. Its version-2 `reactivate` journal owns only the temporary pointer and journal, never the retained generation. Any failure before pointer replacement preserves the prior authority and the retained bytes.
78
80
 
79
81
  Readers call `resolveActive()`. It reads the pointer exactly once, verifies the selected manifest, complete filesystem inventory, and all referenced bytes/provenance, then validates journal state without consulting the pointer again. It returns frozen `generationPath`, `manifestPath`, manifest, target ID/role plus `sourcePath`/`buildPath` values, and truthful `cleanupPending` state for a committed journal. Malformed or ambiguous journal state fails closed. A reader must retain that resolved result for its whole operation and must not re-read the active pointer between files. Old committed generations remain present because an existing reader may still hold their paths. Retention and garbage collection are deliberately outside Task 038.
80
82
 
81
83
  ## Recovery
82
84
 
83
- The journal proves publisher ownership of a candidate and its sibling temporary pointer; it is not the commit mechanism. Before a later valid publication starts, reconciliation first validates any active pointer and selected generation. It then:
85
+ The version-1 journal proves publisher ownership of a fresh candidate and its sibling temporary pointer; the version-2 `reactivate` journal proves ownership only of its sibling temporary pointer. Neither journal is the commit mechanism. Before a later valid publication starts, reconciliation first validates any active pointer and selected generation. It then:
84
86
 
85
87
  - removes a journal-proven candidate and temporary pointer when another generation is active or no pointer exists;
86
- - retains a journal-proven candidate when the active pointer selects it, removing only its stale temporary pointer and journal; and
88
+ - retains a journal-proven candidate when the active pointer selects it, removing only its stale temporary pointer and journal;
89
+ - removes version-2 reactivation temporary state without ever removing the retained generation; and
87
90
  - leaves every unjournaled, committed, or otherwise ambiguous generation untouched.
88
91
 
89
92
  Every candidate-directory deletion is followed by synchronization of `generations/`, and every temporary-pointer deletion is followed by synchronization of the publication directory, before the journal may be removed and its own directory synchronized. An interruption therefore cannot durably retain an orphan after durably losing its only ownership proof.
90
93
 
91
94
  Malformed pointers, manifests, hashes, journals, symlinks, special nodes, project mismatches, and ambiguous reserved entries fail closed with `SemantifoldDiagnostic`. Filesystem failures are preserved as `cause`; stable diagnostic details avoid embedding unrelated ambient environment data.
92
95
 
93
- The main diagnostic families are `INVALID_PUBLICATION_REQUEST`, `INVALID_PUBLICATION_ROOT`, `INVALID_PUBLICATION_PROJECTION`, `PUBLICATION_SOURCE_OVERLAP`, `PUBLICATION_PATH_COLLISION`, `PUBLICATION_PROJECTION_OVERLAP`, `PUBLICATION_PATH_ESCAPE`, `PUBLICATION_SYMLINK_TRAVERSAL`, `PUBLICATION_HARD_LINK`, `PUBLICATION_GENERATION_INVENTORY_MISMATCH`, `PUBLICATION_GENERATION_VERIFICATION_FAILED`, `PUBLICATION_UNOWNED_CONFLICT`, `PUBLICATION_ATOMIC_REPLACE_UNSUPPORTED`, `PUBLICATION_STAGE_WRITE_FAILED`, `PUBLICATION_STAGE_HASH_MISMATCH`, `PUBLICATION_VALIDATION_FAILED`, `PUBLICATION_POINTER_FAILED`, `PUBLICATION_RECOVERY_FAILED`, `MALFORMED_ACTIVE_GENERATION`, `ACTIVE_GENERATION_MISSING`, and `MALFORMED_GENERATION_MANIFEST`.
96
+ The main diagnostic families are `INVALID_PUBLICATION_REQUEST`, `INVALID_PUBLICATION_ROOT`, `INVALID_PUBLICATION_PROJECTION`, `PUBLICATION_SOURCE_OVERLAP`, `PUBLICATION_PATH_COLLISION`, `PUBLICATION_PROJECTION_OVERLAP`, `PUBLICATION_PATH_ESCAPE`, `PUBLICATION_SYMLINK_TRAVERSAL`, `PUBLICATION_HARD_LINK`, `PUBLICATION_GENERATION_INVENTORY_MISMATCH`, `PUBLICATION_GENERATION_VERIFICATION_FAILED`, `PUBLICATION_UNOWNED_CONFLICT`, `PUBLICATION_ATOMIC_REPLACE_UNSUPPORTED`, `PUBLICATION_STAGE_WRITE_FAILED`, `PUBLICATION_STAGE_HASH_MISMATCH`, `PUBLICATION_VALIDATION_FAILED`, `PUBLICATION_CANCELLED`, `PUBLICATION_POINTER_FAILED`, `PUBLICATION_RECOVERY_FAILED`, `MALFORMED_ACTIVE_GENERATION`, `ACTIVE_GENERATION_MISSING`, and `MALFORMED_GENERATION_MANIFEST`.
94
97
 
95
- Task 038 does not load a project manifest, discover sources, derive compiler arguments, start a CLI or watcher, invoke language-specific tools, delete committed generations, or implement retention. Those responsibilities remain in Tasks 039 and later.
98
+ Task 038 itself does not load a project manifest, discover sources, derive compiler arguments, start a CLI or watcher, invoke language-specific tools, delete committed generations, or implement retention. Task 039 composes its public publisher for a strict project manifest and one-shot generation CLI. Task 040 supplies registry-derived validators for checked Java candidates: `javac` writes only under the already-isolated build path, returned class metadata enters the same generation manifest, and the existing single pointer remains the sole publication boundary. Other target plans, watching, and retention remain later tasks.
package/docs/kotlin.md CHANGED
@@ -37,6 +37,6 @@ No Gradle files or downloaded project dependencies are generated.
37
37
 
38
38
  ## Compiler contract
39
39
 
40
- `kotlinc` discovery accepts only Kotlin/JVM 2.4.20 on the exact OpenJDK 25.0.4+7 Ubuntu builds: `info: kotlinc-jvm 2.4.20 (JRE 25.0.4+7-1-26.04-Ubuntu)` in the Ubuntu26.04 development image or the corresponding `...-1-24.04-Ubuntu` identity in Ubuntu24.04 TensorBuzz. The canonical command is `kotlinc`; `SEMANTIFOLD_KOTLINC` may provide an absolute executable override. Kotlin execution uses the separate `java25` contract, which invokes `java` through `SEMANTIFOLD_JAVA` and accepts only the complete matching OpenJDK25.0.4 runtime and 64-bit Server VM output for one of those two Ubuntu revisions; the broader Java-language `java` contract remains JRE17-29. Missing, ambiguous, non-executable, wrong-compiler, wrong-Kotlin, or wrong-JRE identities fail loudly.
40
+ `kotlinc` discovery accepts only Kotlin/JVM 2.4.20 on the two exact qualified Ubuntu JDK builds: `info: kotlinc-jvm 2.4.20 (JRE 25.0.4.1+1-1-26.04.4-Ubuntu)` in the Ubuntu26.04 development image or `info: kotlinc-jvm 2.4.20 (JRE 25.0.4.1+1-1-24.04.4-Ubuntu)` in Ubuntu24.04 TensorBuzz. The canonical command is `kotlinc`; `SEMANTIFOLD_KOTLINC` may provide an absolute executable override. Kotlin execution uses the separate `java25` contract, which invokes `java` through `SEMANTIFOLD_JAVA` and accepts only the complete matching runtime and 64-bit Server VM output for one of those two package identities; the broader Java-language `java` contract remains JRE17-29. Missing, ambiguous, non-executable, wrong-compiler, wrong-Kotlin, or wrong-JRE identities fail loudly.
41
41
 
42
- The Dockerfile and TensorBuzz download only the official Kotlin `2.4.20` compiler ZIP from JetBrains and verify SHA-256 `59e9ca74c7904ef2c122b12114937673ccce68de820a663f0ed66ccf8799e0b7` before installation at `/opt/kotlinc`. The development image pins `openjdk-25-jdk-headless=25.0.4+7-1~26.04`; Noble TensorBuzz pins the repository-compatible `25.0.4+7-1~24.04` build. Their bootstrap probes require the complete Kotlin/JVM 2.4.20 and JRE 25.0.4+7 identity while admitting only the known Ubuntu 24.04 or 26.04 packaging suffix. They expose `/opt/kotlinc/bin/kotlinc` through `SEMANTIFOLD_KOTLINC` without shadowing `PATH`. Runtime tests materialize fresh directories, compile original and generated five-profile sources with the exact metadata arguments, execute runnable JARs through the discovered Java25 contract, assert status/stderr/exact UTF-8 stdout bytes, and remove all temporary artifacts.
42
+ The Dockerfile and TensorBuzz download only the official Kotlin `2.4.20` compiler ZIP from JetBrains and verify SHA-256 `59e9ca74c7904ef2c122b12114937673ccce68de820a663f0ed66ccf8799e0b7` before installation at `/opt/kotlinc`. The development image pins `openjdk-25-jdk-headless=25.0.4.1+1-1~26.04.4`; Noble TensorBuzz pins `25.0.4.1+1-1~24.04.4`. Each bootstrap probe requires its complete Kotlin/JVM and JRE package identity. They expose `/opt/kotlinc/bin/kotlinc` through `SEMANTIFOLD_KOTLINC` without shadowing `PATH`. Runtime tests materialize fresh directories, compile original and generated five-profile sources with the exact metadata arguments, execute runnable JARs through the discovered Java25 contract, assert status/stderr/exact UTF-8 stdout bytes, and remove all temporary artifacts.