semantifold 0.2.0 → 0.3.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 (356) hide show
  1. package/README.md +37 -12
  2. package/build/index.js +2 -2
  3. package/build/src/acceptance.d.ts +10 -0
  4. package/build/src/acceptance.d.ts.map +1 -1
  5. package/build/src/acceptance.js +24 -5
  6. package/build/src/backends/c-runtime.d.ts +3 -0
  7. package/build/src/backends/c-runtime.d.ts.map +1 -0
  8. package/build/src/backends/c-runtime.js +151 -0
  9. package/build/src/backends/c-validation.d.ts +12 -0
  10. package/build/src/backends/c-validation.d.ts.map +1 -0
  11. package/build/src/backends/c-validation.js +85 -0
  12. package/build/src/backends/c.d.ts +31 -0
  13. package/build/src/backends/c.d.ts.map +1 -0
  14. package/build/src/backends/c.js +308 -0
  15. package/build/src/backends/cpp-runtime.d.ts +3 -0
  16. package/build/src/backends/cpp-runtime.d.ts.map +1 -0
  17. package/build/src/backends/cpp-runtime.js +99 -0
  18. package/build/src/backends/cpp-validation.d.ts +9 -0
  19. package/build/src/backends/cpp-validation.d.ts.map +1 -0
  20. package/build/src/backends/cpp-validation.js +74 -0
  21. package/build/src/backends/cpp.d.ts +16 -0
  22. package/build/src/backends/cpp.d.ts.map +1 -0
  23. package/build/src/backends/cpp.js +285 -0
  24. package/build/src/backends/csharp.d.ts +20 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -0
  26. package/build/src/backends/csharp.js +259 -0
  27. package/build/src/backends/go.d.ts +20 -0
  28. package/build/src/backends/go.d.ts.map +1 -0
  29. package/build/src/backends/go.js +374 -0
  30. package/build/src/backends/identifiers.d.ts +12 -0
  31. package/build/src/backends/identifiers.d.ts.map +1 -1
  32. package/build/src/backends/identifiers.js +71 -2
  33. package/build/src/backends/index.d.ts.map +1 -1
  34. package/build/src/backends/index.js +9 -1
  35. package/build/src/backends/native-validation.d.ts +9 -0
  36. package/build/src/backends/native-validation.d.ts.map +1 -0
  37. package/build/src/backends/native-validation.js +59 -0
  38. package/build/src/backends/ordered-expressions.d.ts +74 -0
  39. package/build/src/backends/ordered-expressions.d.ts.map +1 -0
  40. package/build/src/backends/ordered-expressions.js +159 -0
  41. package/build/src/backends/scalars.d.ts.map +1 -1
  42. package/build/src/backends/scalars.js +7 -2
  43. package/build/src/backends/shared.d.ts.map +1 -1
  44. package/build/src/backends/shared.js +59 -14
  45. package/build/src/frontends/c-parser.d.ts +20 -0
  46. package/build/src/frontends/c-parser.d.ts.map +1 -0
  47. package/build/src/frontends/c-parser.js +14 -0
  48. package/build/src/frontends/c.d.ts +220 -0
  49. package/build/src/frontends/c.d.ts.map +1 -0
  50. package/build/src/frontends/c.js +750 -0
  51. package/build/src/frontends/cpp-parser.d.ts +11 -0
  52. package/build/src/frontends/cpp-parser.d.ts.map +1 -0
  53. package/build/src/frontends/cpp-parser.js +15 -0
  54. package/build/src/frontends/cpp.d.ts +227 -0
  55. package/build/src/frontends/cpp.d.ts.map +1 -0
  56. package/build/src/frontends/cpp.js +784 -0
  57. package/build/src/frontends/csharp.d.ts +14 -0
  58. package/build/src/frontends/csharp.d.ts.map +1 -0
  59. package/build/src/frontends/csharp.js +708 -0
  60. package/build/src/frontends/go.d.ts +15 -0
  61. package/build/src/frontends/go.d.ts.map +1 -0
  62. package/build/src/frontends/go.js +712 -0
  63. package/build/src/frontends/scalars.d.ts.map +1 -1
  64. package/build/src/frontends/scalars.js +16 -1
  65. package/build/src/language-registry.d.ts.map +1 -1
  66. package/build/src/language-registry.js +51 -2
  67. package/build/src/mapping.js +2 -2
  68. package/build/src/semantic/provenance.js +3 -3
  69. package/build/src/semantic/types.d.ts +4 -4
  70. package/build/src/semantic/types.d.ts.map +1 -1
  71. package/build/src/semantic/types.js +3 -3
  72. package/build/src/subprocess.d.ts +10 -1
  73. package/build/src/subprocess.d.ts.map +1 -1
  74. package/build/src/subprocess.js +29 -3
  75. package/build/src/toolchains.d.ts +24 -0
  76. package/build/src/toolchains.d.ts.map +1 -1
  77. package/build/src/toolchains.js +6 -2
  78. package/docs/architecture.md +20 -6
  79. package/docs/c.md +60 -0
  80. package/docs/cpp.md +61 -0
  81. package/docs/goals.md +4 -2
  82. package/docs/language-support.md +27 -8
  83. package/docs/parser-qualification.md +153 -4
  84. package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
  85. package/docs/source-maps.md +11 -5
  86. package/docs/standard-library-portability.md +190 -0
  87. package/docs/testing.md +113 -4
  88. package/index.js +1 -1
  89. package/node_modules/node-addon-api/LICENSE.md +9 -0
  90. package/node_modules/node-addon-api/README.md +95 -0
  91. package/node_modules/node-addon-api/common.gypi +21 -0
  92. package/node_modules/node-addon-api/except.gypi +25 -0
  93. package/node_modules/node-addon-api/index.js +14 -0
  94. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  95. package/node_modules/node-addon-api/napi-inl.h +7250 -0
  96. package/node_modules/node-addon-api/napi.h +3463 -0
  97. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  98. package/node_modules/node-addon-api/node_api.gyp +9 -0
  99. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  100. package/node_modules/node-addon-api/nothing.c +0 -0
  101. package/node_modules/node-addon-api/package-support.json +21 -0
  102. package/node_modules/node-addon-api/package.json +481 -0
  103. package/node_modules/node-addon-api/tools/README.md +73 -0
  104. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  105. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  106. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  107. package/node_modules/node-gyp-build/LICENSE +21 -0
  108. package/node_modules/node-gyp-build/README.md +58 -0
  109. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  110. package/node_modules/node-gyp-build/bin.js +84 -0
  111. package/node_modules/node-gyp-build/build-test.js +19 -0
  112. package/node_modules/node-gyp-build/index.js +6 -0
  113. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  114. package/node_modules/node-gyp-build/optional.js +7 -0
  115. package/node_modules/node-gyp-build/package.json +43 -0
  116. package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
  117. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
  118. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
  119. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
  120. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
  121. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
  122. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
  123. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  124. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  125. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  126. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  127. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
  128. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
  129. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
  130. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
  131. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
  132. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
  133. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
  134. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
  135. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  136. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  137. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
  138. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
  139. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
  140. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
  141. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
  142. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
  143. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
  144. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
  145. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  146. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  147. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
  148. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
  149. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  150. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  151. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
  152. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  153. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  154. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  155. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  156. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  157. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  158. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
  159. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
  160. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  161. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
  162. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  163. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
  164. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
  165. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
  166. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
  167. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  168. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
  169. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  170. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  171. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  172. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  173. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
  174. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
  175. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
  176. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  177. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
  178. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  179. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  180. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  181. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  182. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  183. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  184. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  185. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  186. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  187. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  188. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
  189. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
  190. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  191. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
  192. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
  193. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  194. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
  195. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
  196. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
  197. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
  198. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
  199. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
  200. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
  236. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
  237. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
  238. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
  239. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
  240. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
  241. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
  242. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
  243. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
  244. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
  245. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
  246. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
  247. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
  248. package/node_modules/tree-sitter/LICENSE +21 -0
  249. package/node_modules/tree-sitter/README.md +128 -0
  250. package/node_modules/tree-sitter/binding.gyp +88 -0
  251. package/node_modules/tree-sitter/index.js +950 -0
  252. package/node_modules/tree-sitter/package.json +76 -0
  253. package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  254. package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  255. package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
  256. package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  257. package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
  258. package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  259. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  260. package/node_modules/tree-sitter/src/binding.cc +35 -0
  261. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  262. package/node_modules/tree-sitter/src/conversions.h +22 -0
  263. package/node_modules/tree-sitter/src/language.cc +105 -0
  264. package/node_modules/tree-sitter/src/language.h +17 -0
  265. package/node_modules/tree-sitter/src/logger.cc +70 -0
  266. package/node_modules/tree-sitter/src/logger.h +19 -0
  267. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  268. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  269. package/node_modules/tree-sitter/src/node.cc +1088 -0
  270. package/node_modules/tree-sitter/src/node.h +30 -0
  271. package/node_modules/tree-sitter/src/parser.cc +332 -0
  272. package/node_modules/tree-sitter/src/parser.h +35 -0
  273. package/node_modules/tree-sitter/src/query.cc +425 -0
  274. package/node_modules/tree-sitter/src/query.h +40 -0
  275. package/node_modules/tree-sitter/src/tree.cc +316 -0
  276. package/node_modules/tree-sitter/src/tree.h +45 -0
  277. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  278. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  279. package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
  280. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
  281. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  282. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  283. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  284. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  285. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  286. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  287. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
  288. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  289. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  290. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
  291. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
  292. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  293. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
  294. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
  295. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  296. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
  297. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
  298. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
  299. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
  300. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
  301. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
  302. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  303. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  304. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
  305. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  306. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
  307. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  308. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  309. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  310. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
  311. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  312. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  313. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  314. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  315. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  316. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  317. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  318. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  319. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  320. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  321. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  322. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
  323. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  324. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
  325. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
  326. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
  327. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  328. package/package.json +21 -5
  329. package/src/acceptance.js +25 -4
  330. package/src/backends/c-runtime.js +151 -0
  331. package/src/backends/c-validation.js +83 -0
  332. package/src/backends/c.js +308 -0
  333. package/src/backends/cpp-runtime.js +99 -0
  334. package/src/backends/cpp-validation.js +70 -0
  335. package/src/backends/cpp.js +285 -0
  336. package/src/backends/csharp.js +270 -0
  337. package/src/backends/go.js +383 -0
  338. package/src/backends/identifiers.js +72 -1
  339. package/src/backends/index.js +7 -0
  340. package/src/backends/native-validation.js +64 -0
  341. package/src/backends/ordered-expressions.js +161 -0
  342. package/src/backends/scalars.js +7 -1
  343. package/src/backends/shared.js +56 -12
  344. package/src/frontends/c-parser.js +17 -0
  345. package/src/frontends/c.js +780 -0
  346. package/src/frontends/cpp-parser.js +18 -0
  347. package/src/frontends/cpp.js +816 -0
  348. package/src/frontends/csharp.js +759 -0
  349. package/src/frontends/go.js +770 -0
  350. package/src/frontends/scalars.js +15 -0
  351. package/src/language-registry.js +52 -1
  352. package/src/mapping.js +1 -1
  353. package/src/semantic/provenance.js +2 -2
  354. package/src/semantic/types.js +2 -2
  355. package/src/subprocess.js +31 -2
  356. package/src/toolchains.js +5 -1
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Semantifold
2
2
 
3
- Semantifold is an early language-neutral semantic code toolkit. This first release candidate proves a deliberately small end-to-end slice: parse equivalent PHP, Ruby, JavaScript with JSDoc, TypeScript, Java, and strictly annotated Python programs into one typed semantic representation, then generate and genuinely execute equivalent programs in every target language.
3
+ Task019 adds independent [C++20 source and target support](docs/cpp.md) (`cpp`): one deterministic `program.cpp`, owned UTF-8 `std::string` values, checked integer arithmetic, exact ordered-expression reparsing, and real Clang O0/O2 sanitizer acceptance. The official CPP grammar shares the existing private isolated parser runtime inside the single root distribution.
4
+
5
+ Semantifold is an early language-neutral semantic code toolkit. The current source tree proves a deliberately small ten-language end-to-end baseline: parse equivalent PHP, Ruby, JavaScript with JSDoc, TypeScript, Java, strictly annotated Python, canonical C#, bounded Go, C17, and C++20 programs into one typed semantic representation, then generate and execute equivalent programs in every target language. The published package remains `semantifold@0.2.0`; Task019 does not publish a release.
4
6
 
5
7
  ## Current API
6
8
 
@@ -22,7 +24,7 @@ const module = parse({
22
24
  const javaSource = generate({language: "java", module})
23
25
  ```
24
26
 
25
- `parse` returns parser-independent discriminated semantic nodes with normalized types, source locations, a versioned source registry, and deterministic node/symbol provenance. `generate` accepts that shared module and returns an independently executable source program with its historical bytes unchanged. `generateArtifact` adds an output filename, an authoritative range-based `SemantifoldMapping` v1, and a Source Map v3 sidecar for every target:
27
+ `parse` returns parser-independent discriminated semantic nodes with normalized types, source locations, a versioned source registry, and deterministic node/symbol provenance. `generate` accepts that shared module and returns an independently executable source program with its historical bytes unchanged. For each single-artifact target, `generateArtifact` adds an output filename, an authoritative range-based `SemantifoldMapping` v1, and a Source Map v3 sidecar:
26
28
 
27
29
  ```js
28
30
  import {generateArtifact, originalPositionFor} from "semantifold"
@@ -31,37 +33,58 @@ const artifact = generateArtifact({language: "java", module})
31
33
  const original = originalPositionFor(artifact.mapping, {offset: artifact.code.indexOf("label")})
32
34
  ```
33
35
 
34
- Generated output always uses LF. Exact original content, including LF, CRLF, lone CR, and astral UTF-16 coordinates, remains in the source registry and `sourcesContent`. Optional inline/external `sourceMappingURL` directives apply only to JavaScript and TypeScript; PHP, Ruby, Java, and Python use the same rich/v3 sidecars without foreign comments. See [source provenance and mappings](docs/source-maps.md) for schemas, lookups, composition, diagnostics, directives, and compatibility.
36
+ Generated output always uses LF. Exact original content, including LF, CRLF, lone CR, and astral UTF-16 coordinates, remains in the source registry and `sourcesContent`. Optional inline/external `sourceMappingURL` directives apply only to JavaScript and TypeScript; PHP, Ruby, Java, Python, C#, Go, C, and CPP use the same rich/v3 model without foreign comments. See [source provenance and mappings](docs/source-maps.md) for schemas, lookups, composition, diagnostics, directives, and compatibility.
35
37
 
36
- `supportedLanguages` is the immutable registry-derived list `php`, `ruby`, `javascript`, `typescript`, `java`, and `python`. `languageCapabilities` exposes each ID's independent frontend, text-backend, binary-backend, application-backend, and interoperability roles together with artifact multiplicity, round-trip, mapping, acceptance-stage, and toolchain declarations. Unknown IDs use `UNSUPPORTED_LANGUAGE`; a registered ID missing a requested role uses `UNSUPPORTED_ROLE`; an existing backend that cannot represent a semantic module uses `UNSUPPORTED_CAPABILITY`.
38
+ `supportedLanguages` is the immutable registry-derived list `php`, `ruby`, `javascript`, `typescript`, `java`, `python`, `csharp`, `go`, `c`, and `cpp`. `languageCapabilities` exposes each ID's independent frontend, text-backend, binary-backend, application-backend, and interoperability roles together with artifact multiplicity, round-trip, mapping, acceptance-stage, and toolchain declarations. Unknown IDs use `UNSUPPORTED_LANGUAGE`; a registered ID missing a requested role uses `UNSUPPORTED_ROLE`; an existing backend that cannot represent a semantic module uses `UNSUPPORTED_CAPABILITY`.
37
39
 
38
- `generateArtifactSet` is the additive single-module artifact API. Original text targets return an entry artifact with the exact legacy bytes and rich/v3 mappings; an external JavaScript-family map directive also returns the referenced serialized mapping sidecar. `createGeneratedArtifactSet` validates future multi-file text, binary, mixed loader/binary, and application shapes transactionally: paths are ordered, unique, safe relative POSIX paths with no file/directory prefix collisions; content is explicitly text or bytes; media type, role, generated ownership, and provenance are required; and exactly one artifact has role `entry`. Binary content is held privately and returned as a fresh detached byte view on every read, so caller mutation cannot change validated bytes or their provenance. Generated helper files do not create semantic modules and are not Task 010 projects.
40
+ `generateArtifactSet` is the additive single-module artifact API. Original text targets return an entry artifact with the exact legacy bytes and rich/v3 mappings; an external JavaScript-family map directive also returns the referenced serialized mapping sidecar. C# returns mapped `Program.cs` then synthetic-provenance `Semantifold.csproj`. Go returns exactly two ordered artifacts: fixed synthetic-provenance `go.mod` first, then mapped `main.go`; the fixed module is `example.com/semantifold/generated` with `go 1.26.0` and creates no `go.sum`. C returns mapped `program.c` followed by synthetic `semantifold_runtime.h`. Because C#, Go, and C are deliberately multi-artifact, `generate()` and `generateArtifact()` reject them with `UNSUPPORTED_ROLE`. Go accepts only an omitted filename or exact `main.go`, and C accepts only omitted or exact `program.c`; these multi-artifact backends reject mapping options rather than ignoring them. `createGeneratedArtifactSet` validates multi-file text, binary, mixed loader/binary, and application shapes transactionally: paths are ordered, unique, safe relative POSIX paths with no file/directory prefix collisions; content is explicitly text or bytes; media type, role, generated ownership, and provenance are required; and exactly one artifact has role `entry`. Binary content is held privately and returned as a fresh detached byte view on every read, so caller mutation cannot change validated bytes or their provenance. Generated helper files do not create semantic modules and are not Task 010 projects.
39
41
 
40
42
  Binary/resource provenance uses `SemantifoldByteMapping` v1 through `createByteMapping`, `parseByteMapping`, and `stringifyByteMapping`. Generated ranges are ordered, non-overlapping, half-open byte offsets with semantic identities or explicit synthetic reasons. They are never interpreted as UTF-16 positions.
41
43
 
42
- `discoverCanonicalToolchain` and `discoverToolchain` resolve an exact executable from a configured absolute override or one unambiguous canonical PATH command and capture its version. `runAcceptanceStages` materializes a validated artifact set in a unique temporary directory and runs applicable `parse`, `generate`, `compile`, `link`, `validate`, `instantiate`, and `execute` stages with exact argument arrays, a deterministic locale/timezone, bounded per-stage timeouts, captured output, no shell, and normalized stage diagnostics. The canonical overrides are `SEMANTIFOLD_PHP`, `SEMANTIFOLD_RUBY`, `SEMANTIFOLD_NODE`, `SEMANTIFOLD_TSC`, `SEMANTIFOLD_JAVAC`, `SEMANTIFOLD_JAVA`, and `SEMANTIFOLD_PYTHON`; none of these APIs installs or downloads a tool.
44
+ `discoverCanonicalToolchain` and `discoverToolchain` resolve an exact executable from a configured absolute override or one unambiguous canonical PATH command and capture its version. `runAcceptanceStages` materializes a validated artifact set in a unique temporary directory and runs applicable `parse`, `generate`, `restore`, `compile`, `link`, `validate`, `instantiate`, and `execute` stages with exact argument arrays, a deterministic locale/timezone, bounded per-stage timeouts, captured output, no shell, and normalized stage diagnostics. The canonical overrides are `SEMANTIFOLD_PHP`, `SEMANTIFOLD_RUBY`, `SEMANTIFOLD_NODE`, `SEMANTIFOLD_TSC`, `SEMANTIFOLD_JAVAC`, `SEMANTIFOLD_JAVA`, `SEMANTIFOLD_PYTHON`, `SEMANTIFOLD_DOTNET`, `SEMANTIFOLD_GO`, `SEMANTIFOLD_CLANG`, and `SEMANTIFOLD_CLANGPP`; none of these APIs installs or downloads a tool. C# requires .NET SDK major 10, while Go requires Go 1.26.x on Linux/amd64 with matching-GOROOT `gofmt`.
45
+
46
+ This is not general-purpose support for any of the ten languages. The implemented subset is a two-parameter function using explicit integer, boolean, or string types; explicitly typed, initialized scalar locals; plain assignment to mutable locals; ordered lexical blocks; strictly boolean, nested `if` statements with optional `else`; explicit scalar returns; typed scalar operations; a two-argument function call; and sequenced printing. Operations cover integer add/subtract/multiply/negate and ordering, Boolean not/short-circuit and/or, same-type scalar value equality/inequality, and string concatenation. Non-void functions must return on every reachable path, and statements after an unconditional return are rejected. See [language support](docs/language-support.md) before using it on other code.
47
+
48
+ Semantic integers must be JavaScript-safe mathematical integers and have one unsigned zero. Generated JavaScript and TypeScript canonically render scalar output for modules containing negation or multiplication so IEEE-754 `-0` is observed as `0` without folding or rewriting the semantic operation tree. Java generation narrows literals and compile-time-known arithmetic trees further to signed 32-bit `int`. C# uses checked signed-64-bit arithmetic. Go uses exact decimal `int64` literals, rejects compile-time-known results outside signed 64-bit, and otherwise preserves native runtime wrap outside the portable guarantee. Strings are parser-decoded Unicode scalar values and are re-escaped for each target without preserving source quotes or escapes. Equality never coerces and never applies to objects or collections. Division, remainder, exponentiation, bitwise/shift/update/compound operations, ternary/nullish forms, casts/assertions, truthiness, implicit returns, loops, switches, exceptions, and constant folding are unsupported. JavaScript and TypeScript functions must be synchronous and non-generator; Ruby annotations must be immediately associated comment blocks; and PHP accepts only an optional exact `declare(strict_types=1)`. Python requires exact `int`/`bool`/`str` annotations and its exact adjacent immutable carrier. C# requires its exact generated namespace/class shell. Go requires `package main`, at most the exact `fmt` import, explicit `int64`/`bool`/`string` types, final zero-argument `func main()`, and direct `fmt.Println`; assignment occurrence determines source-local mutability, while generated immutable locals carry exact adjacent `// @semantifold-immutable`. Frontends reject syntax instead of dropping receivers, arguments, parameters, declarations, or statements. Before emission, each backend recursively validates blocks, flow, scalar types, typed operations, modeled bindings, mutability, target identifiers, and literal representability.
49
+
50
+ C17 support uses exact `int64_t`, `bool` and immutable UTF-8 byte slices. Its deterministic `program.c`/header pair preserves left-to-right and short-circuit effects through checked ordered-expression regions, uses checked signed-64-bit arithmetic, and owns concatenation storage until main cleanup. Reparse verifies the complete generated CST before collapsing temporary values. The qualified toolchain is Ubuntu Clang 21.1.8 on Linux x86-64 with mandatory O0/O2 ordinary and sanitizer execution. See the [C source/target profile](docs/c.md) and [portable toolchain commands](docs/testing.md).
51
+
52
+ ## Standard-library portability direction
43
53
 
44
- This is not general-purpose support for any of the six languages. The implemented subset is a two-parameter function using explicit integer, boolean, or string types; explicitly typed, initialized scalar locals; plain assignment to mutable locals; ordered lexical blocks; strictly boolean, nested `if` statements with optional `else`; explicit scalar returns; typed scalar operations; a two-argument function call; and sequenced printing. Operations cover integer add/subtract/multiply/negate and ordering, Boolean not/short-circuit and/or, same-type scalar value equality/inequality, and string concatenation. Non-void functions must return on every reachable path, and statements after an unconditional return are rejected. See [language support](docs/language-support.md) before using it on other code.
54
+ Standard-library portability is planned and is not implemented in `semantifold@0.2.0`. The design is hub-and-spoke, with two integrations per language: a source-facing **language compatibility stdlib/facade** preserves that language's familiar supported API shape in portable executable definitions, while a **target host provider/native binding** implements versioned **canonical Semantifold stdlib contracts/capabilities** with the target's genuine native standard library.
45
55
 
46
- Semantic integers must be JavaScript-safe mathematical integers and have one unsigned zero. Generated JavaScript and TypeScript canonically render scalar output for modules containing negation or multiplication so IEEE-754 `-0` is observed as `0` without folding or rewriting the semantic operation tree. Java generation narrows literals and compile-time-known arithmetic trees further to signed 32-bit `int`; general runtime-overflow equivalence remains outside the portable contract. Strings are parser-decoded Unicode scalar values and are re-escaped for each target without preserving source quotes or escapes. Equality never coerces and never applies to objects or collections. Division, remainder, exponentiation, bitwise/shift/update/compound operations, ternary/nullish forms, casts/assertions, truthiness, implicit returns, loops, switches, exceptions, and constant folding are unsupported. JavaScript and TypeScript functions must be synchronous and non-generator; Ruby annotations must be immediately associated comment blocks; and PHP accepts only an optional exact `declare(strict_types=1)`. Python requires exact `int`/`bool`/`str` annotations on parameters, returns, and initialized locals, treats `bool` and `int` as distinct, and rejects dynamic forms; its exact adjacent `# @semantifold-immutable` carrier preserves immutable-local intent. Frontends reject syntax instead of dropping receivers, arguments, parameters, declarations, or statements. Before emission, each backend recursively validates blocks, flow, scalar types, typed operations, modeled bindings, mutability, target identifiers, and literal representability.
56
+ For example, planned Ruby-to-PHP compilation would compile a Ruby application with portable Ruby `TCPSocket` and bounded one-string `puts`/`Kernel.puts` compatibility facades through the semantic IR. The generated PHP could retain those source-compatible names in a collision-safe compatibility namespace, call canonical `SocketClient`, text-stream, output, and resource capabilities, and link only the required PHP provider modules. That provider would use native `fsockopen`, `fgets`, and `fclose` for socket operations and native stdout output without adding a duplicate LF. This requires no handwritten Ruby-on-PHP bridge, source-specific loop recognition, or whole-program intelligent refactor. See the [authoritative standard-library portability design](docs/standard-library-portability.md) and [dependency-ordered implementation plan](docs/plans/2026-09-05-standard-library-portability.md).
47
57
 
48
58
  ## Development
49
59
 
50
- Use Node.js 24 and install with `npm ci`. Specs use `@velocious/testing@0.0.0` and the standalone `velocious-test` runner. Run a focused spec with `npx velocious-test spec/repository-contract.spec.js`; run the framework-native `spec` directory discovery with `npm test`.
60
+ Use Node.js 24 and install with `npm ci`. Specs use `@velocious/testing@0.0.0` and the standalone `velocious-test` runner. Run a focused spec with `npx velocious-test spec/repository-contract.spec.js`. Task 018 local validation runs explicitly named changed/affected spec files sequentially; aggregate `npm test` discovery runs only in TensorBuzz.
51
61
 
52
- The complete local gate is:
62
+ The aggregate suite includes direct real-toolchain specs that inherit the outer test process locale, so repository validation requires `LANG=C.UTF-8` and `LC_ALL=C.UTF-8`. The canonical container currently exports neither variable. This outer-suite requirement is separate from `runAcceptanceStages`, which normalizes the locale and timezone of every child it owns and does not depend on ambient locale.
63
+
64
+ The local quality/package gate follows the named focused specs documented in [testing](docs/testing.md):
53
65
 
54
66
  ```sh
55
- npm test
67
+ export LANG=C.UTF-8
68
+ export LC_ALL=C.UTF-8
69
+ npm run verify:legacy-runtime
70
+ npx velocious-test spec/repository-contract.spec.js
56
71
  npm run lint
57
72
  npm run typecheck
58
73
  npm run build
59
74
  npm audit --audit-level=high
60
75
  npm ls --omit=dev --all
76
+ npm ls --all
61
77
  npm pack --dry-run --json
78
+ git diff --check
62
79
  ```
63
80
 
64
- The execution specs require PHP CLI, Ruby, Python 3, TypeScript, and a Java JDK in addition to Node; missing tools are failures. The canonical container provides them: `docker compose up --build --detach`, followed by `docker compose exec dev npm ci` and the commands above.
81
+ The one `semantifold@0.2.0` distribution explicitly bundles root `tree-sitter@0.25.1` and a private internal package containing an isolated exact `tree-sitter@0.21.1` plus `tree-sitter-c@0.23.2` and `tree-sitter-cpp@0.23.4` dependency subtree. The private `packages/tree-sitter-legacy` workspace owns source checking and declaration generation, but has no export or publication identity. Its serializer returns only recursively frozen parser-neutral CST data; native parser, tree, node, and language handles stay inside the legacy runtime. The packed-consumer spec installs the real root tarball with a fresh npm cache and proves modern Go and legacy C parsing together without a workspace or registry fallback for the internal package.
82
+
83
+ Because `install-links=true` installs a copy of the private runtime, run `npm ci` again after editing its shipped files under `packages/tree-sitter-legacy/runtime/`. Tests, lint, and `npm pack` reject a stale installed payload with that recovery instruction. The gate compares npm's source file inventory and every file's bytes, including the manifest, serializer, README, and license; it never copies or repairs dependencies itself.
84
+
85
+ Consumers need no Semantifold-specific npm settings: default `npm install`, `npm ls --all`, and subsequent `npm ci` work with `install-links=false`. The repository alone uses `install-links=true` to materialize the local source. Root `acceptDependencies` accepts the exact private `0.1.0` package already present in the bundle; npm still resolves new installations from the declared `file:` source, never from a registry release of the internal name. The cold-consumer proof isolates user/global configuration, verifies the public registry and ordinary default, and repeats dependency, parser, and TypeScript checks after both install and clean reinstall.
86
+
87
+ The execution specs require PHP CLI, Ruby, Python 3, TypeScript, a Java JDK, .NET 10, Clang 21.1.8 with compiler-rt, and Go 1.26 with matching `gofmt` in addition to Node; missing tools are failures. The canonical container provides them: `docker compose up --build --detach`, followed by `docker compose exec dev npm ci` and the commands above.
65
88
 
66
89
  ## Documentation
67
90
 
@@ -72,6 +95,8 @@ The execution specs require PHP CLI, Ruby, Python 3, TypeScript, and a Java JDK
72
95
  - [Parser qualification](docs/parser-qualification.md)
73
96
  - [Testing](docs/testing.md)
74
97
  - [Source provenance and mappings](docs/source-maps.md)
98
+ - [Standard-library portability design](docs/standard-library-portability.md)
99
+ - [Standard-library portability implementation plan](docs/plans/2026-09-05-standard-library-portability.md)
75
100
  - [Language feature roadmap](https://github.com/kaspernj/semantifold/blob/master/todo/README.md)
76
101
  - [Initial toolchain plan](docs/plans/2026-09-02-initial-toolchain.md)
77
102
 
package/build/index.js CHANGED
@@ -88,7 +88,7 @@ export function generateArtifactSet(input) {
88
88
  const record = languageRegistry.record(language);
89
89
  if (record.artifactMultiplicity == "multiple") {
90
90
  const backend = languageRegistry.resolve(language, "textBackend", module?.location);
91
- return constructArtifactSet(backend({ filename, language, module, sources }));
91
+ return constructArtifactSet(backend({ filename, language, mapDirective, module, sourceMapFilename, sources }));
92
92
  }
93
93
  const artifact = generateArtifactSource({
94
94
  filename,
@@ -137,4 +137,4 @@ export function generateArtifactSet(input) {
137
137
  const backend = languageRegistry.resolve(language, registryRole, module?.location);
138
138
  return constructArtifactSet(backend({ filename, language, module, sources }));
139
139
  }
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsMEJBQTBCLElBQUksb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUUzRCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO0FBRXZFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxDQUFBO0FBQzlCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ25GLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQzdELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQ2pHLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3RHLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3ZELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBQ25GLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQTtBQUM1RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixvQkFBb0IsRUFD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QUFPLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQTtBQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cGFyc2VTb3VyY2V9IGZyb20gXCIuL3NyYy9mcm9udGVuZHMvaW5kZXguanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUFydGlmYWN0U291cmNlLCBnZW5lcmF0ZVNvdXJjZX0gZnJvbSBcIi4vc3JjL2JhY2tlbmRzL2luZGV4LmpzXCJcbmltcG9ydCB7Y3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQgYXMgY29uc3RydWN0QXJ0aWZhY3RTZXR9IGZyb20gXCIuL3NyYy9hcnRpZmFjdHMuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL3NyYy9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7bGFuZ3VhZ2VSZWdpc3RyeX0gZnJvbSBcIi4vc3JjL2xhbmd1YWdlLXJlZ2lzdHJ5LmpzXCJcblxuY29uc3QgYXJ0aWZhY3RCYWNrZW5kUm9sZXMgPSBuZXcgU2V0KFtcInRleHRcIiwgXCJiaW5hcnlcIiwgXCJhcHBsaWNhdGlvblwiXSlcblxuZXhwb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9XG5leHBvcnQge2xhbmd1YWdlQ2FwYWJpbGl0aWVzLCBzdXBwb3J0ZWRMYW5ndWFnZXN9IGZyb20gXCIuL3NyYy9sYW5ndWFnZS1yZWdpc3RyeS5qc1wiXG5leHBvcnQge2NyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0fSBmcm9tIFwiLi9zcmMvYXJ0aWZhY3RzLmpzXCJcbmV4cG9ydCB7Y3JlYXRlQnl0ZU1hcHBpbmcsIHBhcnNlQnl0ZU1hcHBpbmcsIHN0cmluZ2lmeUJ5dGVNYXBwaW5nfSBmcm9tIFwiLi9zcmMvYmluYXJ5LW1hcHBpbmcuanNcIlxuZXhwb3J0IHtjYW5vbmljYWxUb29sY2hhaW5zLCBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbiwgZGlzY292ZXJUb29sY2hhaW59IGZyb20gXCIuL3NyYy90b29sY2hhaW5zLmpzXCJcbmV4cG9ydCB7cnVuQWNjZXB0YW5jZVN0YWdlc30gZnJvbSBcIi4vc3JjL2FjY2VwdGFuY2UuanNcIlxuZXhwb3J0IHtnZXROb2RlUHJvdmVuYW5jZSwgZ2V0U3ltYm9sUHJvdmVuYW5jZX0gZnJvbSBcIi4vc3JjL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuZXhwb3J0IHtwcmltYXJ5TG9jYXRpb259IGZyb20gXCIuL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcbmV4cG9ydCB7XG4gIGNvbXBvc2VNYXBwaW5ncyxcbiAgY29tcG9zZVNvdXJjZU1hcHMsXG4gIGdlbmVyYXRlZFBvc2l0aW9uRm9yLFxuICBtYXBwaW5nRnJvbVNvdXJjZU1hcCxcbiAgb3JpZ2luYWxQb3NpdGlvbkZvcixcbiAgcGFyc2VNYXBwaW5nLFxuICByZW1hcERpYWdub3N0aWMsXG4gIHJlbWFwTG9jYXRpb24sXG4gIHNwYW5zRm9yTm9kZSxcbiAgc3BhbnNGb3JTeW1ib2wsXG4gIHN0cmluZ2lmeU1hcHBpbmcsXG4gIHRvU291cmNlTWFwVjNcbn0gZnJvbSBcIi4vc3JjL21hcHBpbmcuanNcIlxuXG4vKipcbiAqIFBhcnNlcyBzb3VyY2UgaW50byBTZW1hbnRpZm9sZCdzIHNoYXJlZCBzZW1hbnRpYyByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFBhcnNlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUgdXNlZCBpbiBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gaW5wdXQubGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFNlbWFudGljIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7XG4gIHJldHVybiBwYXJzZVNvdXJjZShpbnB1dClcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGFyZ2V0LWxhbmd1YWdlIHNvdXJjZSBmcm9tIGEgc2hhcmVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIEdlbmVyYXRpb24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gaW5wdXQubGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBpbnB1dC5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBHZW5lcmF0ZWQgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGUoaW5wdXQpIHtcbiAgcmV0dXJuIGdlbmVyYXRlU291cmNlKGlucHV0KVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJldXNhYmxlIG91dHB1dCBhcnRpZmFjdCB3aXRoIHJpY2ggYW5kIFNvdXJjZSBNYXAgdjMgbWFwcGluZ3MuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBHZW5lcmF0aW9uIHJlcXVlc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGlucHV0Lmxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gaW5wdXQubW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5maWxlbmFtZV0gLSBPdXRwdXQgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge1wibm9uZVwiIHwgXCJleHRlcm5hbFwiIHwgXCJpbmxpbmVcIn0gW2lucHV0Lm1hcERpcmVjdGl2ZV0gLSBKYXZhU2NyaXB0LWZhbWlseSBtYXAgZGlyZWN0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5zb3VyY2VNYXBGaWxlbmFtZV0gLSBFeHRlcm5hbCBtYXAgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX0gW2lucHV0LnNvdXJjZXNdIC0gU291cmNlcyBmb3IgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3R9IEdlbmVyYXRlZCBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQXJ0aWZhY3QoaW5wdXQpIHtcbiAgcmV0dXJuIGdlbmVyYXRlQXJ0aWZhY3RTb3VyY2UoaW5wdXQpXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgZGV0ZXJtaW5pc3RpYyBhcnRpZmFjdCBzZXQgZm9yIG9uZSBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBBcnRpZmFjdC1zZXQgZ2VuZXJhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0Lmxhbmd1YWdlIC0gUmVnaXN0ZXJlZCB0YXJnZXQgbGFuZ3VhZ2Ugb3IgcGxhdGZvcm0gSUQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBpbnB1dC5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge1widGV4dFwiIHwgXCJiaW5hcnlcIiB8IFwiYXBwbGljYXRpb25cIn0gW2lucHV0LnJvbGVdIC0gUmVxdWVzdGVkIGJhY2tlbmQgYXJ0aWZhY3Qgcm9sZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5wdXQuZmlsZW5hbWVdIC0gU2FmZSBvdXRwdXQgcGF0aCBmb3IgYSB0ZXh0IHRhcmdldC5cbiAqIEBwYXJhbSB7XCJub25lXCIgfCBcImV4dGVybmFsXCIgfCBcImlubGluZVwifSBbaW5wdXQubWFwRGlyZWN0aXZlXSAtIEphdmFTY3JpcHQtZmFtaWx5IG1hcCBkaXJlY3RpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LnNvdXJjZU1hcEZpbGVuYW1lXSAtIEV4dGVybmFsIG1hcCBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbaW5wdXQuc291cmNlc10gLSBPcmlnaW5hbCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBDb21wbGV0ZSBnZW5lcmF0ZWQgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBcnRpZmFjdFNldChpbnB1dCkge1xuICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnB1dCkgIT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJJTlZBTElEX0FSVElGQUNUX1NFVFwiLFxuICAgICAgbGFuZ3VhZ2U6IFwiYXJ0aWZhY3RcIixcbiAgICAgIG1lc3NhZ2U6IFwiQXJ0aWZhY3Qtc2V0IGdlbmVyYXRpb24gcmVxdWlyZXMgYSByZXF1ZXN0IG9iamVjdC5cIlxuICAgIH0pXG4gIH1cbiAgY29uc3Qge2ZpbGVuYW1lLCBsYW5ndWFnZSwgbWFwRGlyZWN0aXZlLCBtb2R1bGUsIHJvbGUgPSBcInRleHRcIiwgc291cmNlTWFwRmlsZW5hbWUsIHNvdXJjZXN9ID0gaW5wdXRcblxuICBpZiAodHlwZW9mIGxhbmd1YWdlICE9IFwic3RyaW5nXCIgfHwgbGFuZ3VhZ2UubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiSU5WQUxJRF9BUlRJRkFDVF9TRVRcIixcbiAgICAgIGxhbmd1YWdlOiBcImFydGlmYWN0XCIsXG4gICAgICBtZXNzYWdlOiBcIkFydGlmYWN0LXNldCBnZW5lcmF0aW9uIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXCJcbiAgICB9KVxuICB9XG4gIGlmICh0eXBlb2Ygcm9sZSAhPSBcInN0cmluZ1wiIHx8ICFhcnRpZmFjdEJhY2tlbmRSb2xlcy5oYXMocm9sZSkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiSU5WQUxJRF9BUlRJRkFDVF9TRVRcIixcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgbWVzc2FnZTogXCJBcnRpZmFjdCBiYWNrZW5kIHJvbGUgbXVzdCBiZSAndGV4dCcsICdiaW5hcnknLCBvciAnYXBwbGljYXRpb24nLlwiXG4gICAgfSlcbiAgfVxuXG4gIGlmIChyb2xlID09IFwidGV4dFwiKSB7XG4gICAgY29uc3QgcmVjb3JkID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZWNvcmQobGFuZ3VhZ2UpXG5cbiAgICBpZiAocmVjb3JkLmFydGlmYWN0TXVsdGlwbGljaXR5ID09IFwibXVsdGlwbGVcIikge1xuICAgICAgY29uc3QgYmFja2VuZCA9IGxhbmd1YWdlUmVnaXN0cnkucmVzb2x2ZShsYW5ndWFnZSwgXCJ0ZXh0QmFja2VuZFwiLCBtb2R1bGU/LmxvY2F0aW9uKVxuXG4gICAgICByZXR1cm4gY29uc3RydWN0QXJ0aWZhY3RTZXQoYmFja2VuZCh7ZmlsZW5hbWUsIGxhbmd1YWdlLCBtb2R1bGUsIHNvdXJjZXN9KSlcbiAgICB9XG4gICAgY29uc3QgYXJ0aWZhY3QgPSBnZW5lcmF0ZUFydGlmYWN0U291cmNlKHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgbGFuZ3VhZ2U6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGxhbmd1YWdlKSxcbiAgICAgIG1hcERpcmVjdGl2ZSxcbiAgICAgIG1vZHVsZSxcbiAgICAgIHNvdXJjZU1hcEZpbGVuYW1lLFxuICAgICAgc291cmNlc1xuICAgIH0pXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNldEFydGlmYWN0W119ICovXG4gICAgY29uc3QgYXJ0aWZhY3RzID0gW3tcbiAgICAgIGNvbnRlbnQ6IGFydGlmYWN0LmNvZGUsXG4gICAgICBjb250ZW50S2luZDogXCJ0ZXh0XCIsXG4gICAgICBtZWRpYVR5cGU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVjb3JkLm1lZGlhVHlwZSksXG4gICAgICBvd25lcnNoaXA6IFwiZ2VuZXJhdGVkXCIsXG4gICAgICBwYXRoOiBhcnRpZmFjdC5maWxlbmFtZSxcbiAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAga2luZDogXCJ0ZXh0XCIsXG4gICAgICAgIG1hcHBpbmc6IGFydGlmYWN0Lm1hcHBpbmcsXG4gICAgICAgIHNvdXJjZU1hcDogYXJ0aWZhY3Quc291cmNlTWFwLFxuICAgICAgICBzb3VyY2VNYXBGaWxlbmFtZTogYXJ0aWZhY3Quc291cmNlTWFwRmlsZW5hbWVcbiAgICAgIH0sXG4gICAgICByb2xlOiBcImVudHJ5XCJcbiAgICB9XVxuXG4gICAgaWYgKG1hcERpcmVjdGl2ZSA9PSBcImV4dGVybmFsXCIpIHtcbiAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgY29udGVudDogYCR7SlNPTi5zdHJpbmdpZnkoYXJ0aWZhY3Quc291cmNlTWFwKX1cXG5gLFxuICAgICAgICBjb250ZW50S2luZDogXCJ0ZXh0XCIsXG4gICAgICAgIG1lZGlhVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIG93bmVyc2hpcDogXCJnZW5lcmF0ZWRcIixcbiAgICAgICAgcGF0aDogYXJ0aWZhY3Quc291cmNlTWFwRmlsZW5hbWUsXG4gICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICBraW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgICAgIHJlYXNvbjogXCJTZXJpYWxpemVkIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBlbnRyeSBhcnRpZmFjdC5cIixcbiAgICAgICAgICByZWxhdGVkT3JpZ2luczogW11cbiAgICAgICAgfSxcbiAgICAgICAgcm9sZTogXCJtYXBwaW5nXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnN0cnVjdEFydGlmYWN0U2V0KHtcbiAgICAgIGFydGlmYWN0cyxcbiAgICAgIHRhcmdldDogbGFuZ3VhZ2VcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlSb2xlID0gcm9sZSA9PSBcImJpbmFyeVwiID8gXCJiaW5hcnlCYWNrZW5kXCIgOiBcImFwcGxpY2F0aW9uQmFja2VuZFwiXG4gIGNvbnN0IGJhY2tlbmQgPSBsYW5ndWFnZVJlZ2lzdHJ5LnJlc29sdmUobGFuZ3VhZ2UsIHJlZ2lzdHJ5Um9sZSwgbW9kdWxlPy5sb2NhdGlvbilcblxuICByZXR1cm4gY29uc3RydWN0QXJ0aWZhY3RTZXQoYmFja2VuZCh7ZmlsZW5hbWUsIGxhbmd1YWdlLCBtb2R1bGUsIHNvdXJjZXN9KSlcbn1cbiJdfQ==
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsMEJBQTBCLElBQUksb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUUzRCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO0FBRXZFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxDQUFBO0FBQzlCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ25GLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQzdELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQ2pHLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3RHLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3ZELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBQ25GLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQTtBQUM1RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixvQkFBb0IsRUFD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UUFBUSxDQUFDLENBQUE7SUFFbEYsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUE7QUFDN0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3BhcnNlU291cmNlfSBmcm9tIFwiLi9zcmMvZnJvbnRlbmRzL2luZGV4LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVBcnRpZmFjdFNvdXJjZSwgZ2VuZXJhdGVTb3VyY2V9IGZyb20gXCIuL3NyYy9iYWNrZW5kcy9pbmRleC5qc1wiXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0IGFzIGNvbnN0cnVjdEFydGlmYWN0U2V0fSBmcm9tIFwiLi9zcmMvYXJ0aWZhY3RzLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9zcmMvZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2xhbmd1YWdlUmVnaXN0cnl9IGZyb20gXCIuL3NyYy9sYW5ndWFnZS1yZWdpc3RyeS5qc1wiXG5cbmNvbnN0IGFydGlmYWN0QmFja2VuZFJvbGVzID0gbmV3IFNldChbXCJ0ZXh0XCIsIFwiYmluYXJ5XCIsIFwiYXBwbGljYXRpb25cIl0pXG5cbmV4cG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfVxuZXhwb3J0IHtsYW5ndWFnZUNhcGFiaWxpdGllcywgc3VwcG9ydGVkTGFuZ3VhZ2VzfSBmcm9tIFwiLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanNcIlxuZXhwb3J0IHtjcmVhdGVHZW5lcmF0ZWRBcnRpZmFjdFNldH0gZnJvbSBcIi4vc3JjL2FydGlmYWN0cy5qc1wiXG5leHBvcnQge2NyZWF0ZUJ5dGVNYXBwaW5nLCBwYXJzZUJ5dGVNYXBwaW5nLCBzdHJpbmdpZnlCeXRlTWFwcGluZ30gZnJvbSBcIi4vc3JjL2JpbmFyeS1tYXBwaW5nLmpzXCJcbmV4cG9ydCB7Y2Fub25pY2FsVG9vbGNoYWlucywgZGlzY292ZXJDYW5vbmljYWxUb29sY2hhaW4sIGRpc2NvdmVyVG9vbGNoYWlufSBmcm9tIFwiLi9zcmMvdG9vbGNoYWlucy5qc1wiXG5leHBvcnQge3J1bkFjY2VwdGFuY2VTdGFnZXN9IGZyb20gXCIuL3NyYy9hY2NlcHRhbmNlLmpzXCJcbmV4cG9ydCB7Z2V0Tm9kZVByb3ZlbmFuY2UsIGdldFN5bWJvbFByb3ZlbmFuY2V9IGZyb20gXCIuL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcbmV4cG9ydCB7cHJpbWFyeUxvY2F0aW9ufSBmcm9tIFwiLi9zcmMvc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5leHBvcnQge1xuICBjb21wb3NlTWFwcGluZ3MsXG4gIGNvbXBvc2VTb3VyY2VNYXBzLFxuICBnZW5lcmF0ZWRQb3NpdGlvbkZvcixcbiAgbWFwcGluZ0Zyb21Tb3VyY2VNYXAsXG4gIG9yaWdpbmFsUG9zaXRpb25Gb3IsXG4gIHBhcnNlTWFwcGluZyxcbiAgcmVtYXBEaWFnbm9zdGljLFxuICByZW1hcExvY2F0aW9uLFxuICBzcGFuc0Zvck5vZGUsXG4gIHNwYW5zRm9yU3ltYm9sLFxuICBzdHJpbmdpZnlNYXBwaW5nLFxuICB0b1NvdXJjZU1hcFYzXG59IGZyb20gXCIuL3NyYy9tYXBwaW5nLmpzXCJcblxuLyoqXG4gKiBQYXJzZXMgc291cmNlIGludG8gU2VtYW50aWZvbGQncyBzaGFyZWQgc2VtYW50aWMgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQYXJzZSByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lIHVzZWQgaW4gZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGlucHV0Lmxhbmd1YWdlIC0gU291cmNlIGxhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LnNvdXJjZSAtIFNvdXJjZSB0ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpYyBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShpbnB1dCkge1xuICByZXR1cm4gcGFyc2VTb3VyY2UoaW5wdXQpXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRhcmdldC1sYW5ndWFnZSBzb3VyY2UgZnJvbSBhIHNoYXJlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBHZW5lcmF0aW9uIHJlcXVlc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGlucHV0Lmxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gaW5wdXQubW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gR2VuZXJhdGVkIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlKGlucHV0KSB7XG4gIHJldHVybiBnZW5lcmF0ZVNvdXJjZShpbnB1dClcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByZXVzYWJsZSBvdXRwdXQgYXJ0aWZhY3Qgd2l0aCByaWNoIGFuZCBTb3VyY2UgTWFwIHYzIG1hcHBpbmdzLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gR2VuZXJhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBpbnB1dC5sYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IGlucHV0Lm1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5wdXQuZmlsZW5hbWVdIC0gT3V0cHV0IGZpbGVuYW1lLlxuICogQHBhcmFtIHtcIm5vbmVcIiB8IFwiZXh0ZXJuYWxcIiB8IFwiaW5saW5lXCJ9IFtpbnB1dC5tYXBEaXJlY3RpdmVdIC0gSmF2YVNjcmlwdC1mYW1pbHkgbWFwIGRpcmVjdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5wdXQuc291cmNlTWFwRmlsZW5hbWVdIC0gRXh0ZXJuYWwgbWFwIGZpbGVuYW1lLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119IFtpbnB1dC5zb3VyY2VzXSAtIFNvdXJjZXMgZm9yIGNhbGxlci1hdXRob3JlZCBtb2R1bGVzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0fSBHZW5lcmF0ZWQgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFydGlmYWN0KGlucHV0KSB7XG4gIHJldHVybiBnZW5lcmF0ZUFydGlmYWN0U291cmNlKGlucHV0KVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGRldGVybWluaXN0aWMgYXJ0aWZhY3Qgc2V0IGZvciBvbmUgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gQXJ0aWZhY3Qtc2V0IGdlbmVyYXRpb24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5sYW5ndWFnZSAtIFJlZ2lzdGVyZWQgdGFyZ2V0IGxhbmd1YWdlIG9yIHBsYXRmb3JtIElELlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gaW5wdXQubW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtcInRleHRcIiB8IFwiYmluYXJ5XCIgfCBcImFwcGxpY2F0aW9uXCJ9IFtpbnB1dC5yb2xlXSAtIFJlcXVlc3RlZCBiYWNrZW5kIGFydGlmYWN0IHJvbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LmZpbGVuYW1lXSAtIFNhZmUgb3V0cHV0IHBhdGggZm9yIGEgdGV4dCB0YXJnZXQuXG4gKiBAcGFyYW0ge1wibm9uZVwiIHwgXCJleHRlcm5hbFwiIHwgXCJpbmxpbmVcIn0gW2lucHV0Lm1hcERpcmVjdGl2ZV0gLSBKYXZhU2NyaXB0LWZhbWlseSBtYXAgZGlyZWN0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5zb3VyY2VNYXBGaWxlbmFtZV0gLSBFeHRlcm5hbCBtYXAgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX0gW2lucHV0LnNvdXJjZXNdIC0gT3JpZ2luYWwgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldH0gQ29tcGxldGUgZ2VuZXJhdGVkIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQXJ0aWZhY3RTZXQoaW5wdXQpIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGlucHV0KSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5wdXQpICE9IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiSU5WQUxJRF9BUlRJRkFDVF9TRVRcIixcbiAgICAgIGxhbmd1YWdlOiBcImFydGlmYWN0XCIsXG4gICAgICBtZXNzYWdlOiBcIkFydGlmYWN0LXNldCBnZW5lcmF0aW9uIHJlcXVpcmVzIGEgcmVxdWVzdCBvYmplY3QuXCJcbiAgICB9KVxuICB9XG4gIGNvbnN0IHtmaWxlbmFtZSwgbGFuZ3VhZ2UsIG1hcERpcmVjdGl2ZSwgbW9kdWxlLCByb2xlID0gXCJ0ZXh0XCIsIHNvdXJjZU1hcEZpbGVuYW1lLCBzb3VyY2VzfSA9IGlucHV0XG5cbiAgaWYgKHR5cGVvZiBsYW5ndWFnZSAhPSBcInN0cmluZ1wiIHx8IGxhbmd1YWdlLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIklOVkFMSURfQVJUSUZBQ1RfU0VUXCIsXG4gICAgICBsYW5ndWFnZTogXCJhcnRpZmFjdFwiLFxuICAgICAgbWVzc2FnZTogXCJBcnRpZmFjdC1zZXQgZ2VuZXJhdGlvbiByZXF1aXJlcyBhIG5vbi1lbXB0eSBzdHJpbmcgbGFuZ3VhZ2Ugb3IgdGFyZ2V0IElELlwiXG4gICAgfSlcbiAgfVxuICBpZiAodHlwZW9mIHJvbGUgIT0gXCJzdHJpbmdcIiB8fCAhYXJ0aWZhY3RCYWNrZW5kUm9sZXMuaGFzKHJvbGUpKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIklOVkFMSURfQVJUSUZBQ1RfU0VUXCIsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIG1lc3NhZ2U6IFwiQXJ0aWZhY3QgYmFja2VuZCByb2xlIG11c3QgYmUgJ3RleHQnLCAnYmluYXJ5Jywgb3IgJ2FwcGxpY2F0aW9uJy5cIlxuICAgIH0pXG4gIH1cblxuICBpZiAocm9sZSA9PSBcInRleHRcIikge1xuICAgIGNvbnN0IHJlY29yZCA9IGxhbmd1YWdlUmVnaXN0cnkucmVjb3JkKGxhbmd1YWdlKVxuXG4gICAgaWYgKHJlY29yZC5hcnRpZmFjdE11bHRpcGxpY2l0eSA9PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgIGNvbnN0IGJhY2tlbmQgPSBsYW5ndWFnZVJlZ2lzdHJ5LnJlc29sdmUobGFuZ3VhZ2UsIFwidGV4dEJhY2tlbmRcIiwgbW9kdWxlPy5sb2NhdGlvbilcblxuICAgICAgcmV0dXJuIGNvbnN0cnVjdEFydGlmYWN0U2V0KGJhY2tlbmQoe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbWFwRGlyZWN0aXZlLCBtb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lLCBzb3VyY2VzfSkpXG4gICAgfVxuICAgIGNvbnN0IGFydGlmYWN0ID0gZ2VuZXJhdGVBcnRpZmFjdFNvdXJjZSh7XG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGxhbmd1YWdlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9ICovIChsYW5ndWFnZSksXG4gICAgICBtYXBEaXJlY3RpdmUsXG4gICAgICBtb2R1bGUsXG4gICAgICBzb3VyY2VNYXBGaWxlbmFtZSxcbiAgICAgIHNvdXJjZXNcbiAgICB9KVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSAqL1xuICAgIGNvbnN0IGFydGlmYWN0cyA9IFt7XG4gICAgICBjb250ZW50OiBhcnRpZmFjdC5jb2RlLFxuICAgICAgY29udGVudEtpbmQ6IFwidGV4dFwiLFxuICAgICAgbWVkaWFUeXBlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlY29yZC5tZWRpYVR5cGUpLFxuICAgICAgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLFxuICAgICAgcGF0aDogYXJ0aWZhY3QuZmlsZW5hbWUsXG4gICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgIGtpbmQ6IFwidGV4dFwiLFxuICAgICAgICBtYXBwaW5nOiBhcnRpZmFjdC5tYXBwaW5nLFxuICAgICAgICBzb3VyY2VNYXA6IGFydGlmYWN0LnNvdXJjZU1hcCxcbiAgICAgICAgc291cmNlTWFwRmlsZW5hbWU6IGFydGlmYWN0LnNvdXJjZU1hcEZpbGVuYW1lXG4gICAgICB9LFxuICAgICAgcm9sZTogXCJlbnRyeVwiXG4gICAgfV1cblxuICAgIGlmIChtYXBEaXJlY3RpdmUgPT0gXCJleHRlcm5hbFwiKSB7XG4gICAgICBhcnRpZmFjdHMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IGAke0pTT04uc3RyaW5naWZ5KGFydGlmYWN0LnNvdXJjZU1hcCl9XFxuYCxcbiAgICAgICAgY29udGVudEtpbmQ6IFwidGV4dFwiLFxuICAgICAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBvd25lcnNoaXA6IFwiZ2VuZXJhdGVkXCIsXG4gICAgICAgIHBhdGg6IGFydGlmYWN0LnNvdXJjZU1hcEZpbGVuYW1lLFxuICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAga2luZDogXCJzeW50aGV0aWNcIixcbiAgICAgICAgICByZWFzb246IFwiU2VyaWFsaXplZCBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24gZm9yIHRoZSBnZW5lcmF0ZWQgZW50cnkgYXJ0aWZhY3QuXCIsXG4gICAgICAgICAgcmVsYXRlZE9yaWdpbnM6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIHJvbGU6IFwibWFwcGluZ1wiXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJ1Y3RBcnRpZmFjdFNldCh7XG4gICAgICBhcnRpZmFjdHMsXG4gICAgICB0YXJnZXQ6IGxhbmd1YWdlXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHJlZ2lzdHJ5Um9sZSA9IHJvbGUgPT0gXCJiaW5hcnlcIiA/IFwiYmluYXJ5QmFja2VuZFwiIDogXCJhcHBsaWNhdGlvbkJhY2tlbmRcIlxuICBjb25zdCBiYWNrZW5kID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZXNvbHZlKGxhbmd1YWdlLCByZWdpc3RyeVJvbGUsIG1vZHVsZT8ubG9jYXRpb24pXG5cbiAgcmV0dXJuIGNvbnN0cnVjdEFydGlmYWN0U2V0KGJhY2tlbmQoe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSkpXG59XG4iXX0=
@@ -1,3 +1,4 @@
1
+ import { rm } from "node:fs/promises";
1
2
  /**
2
3
  * Materializes one artifact set and runs ordered acceptance stages without a shell.
3
4
  * @param {object} input - Acceptance request.
@@ -19,4 +20,13 @@ export declare function runAcceptanceStages(input: {
19
20
  target: string;
20
21
  timeoutMs?: number;
21
22
  }): Promise<import("./semantic/types.js").AcceptanceResult>;
23
+ /**
24
+ * Creates an acceptance runner with instance-owned cleanup behavior.
25
+ * @param {object} dependencies - Internal runner dependencies.
26
+ * @param {typeof rm} dependencies.removeDirectory - Isolated-directory removal operation.
27
+ * @returns {typeof runAcceptanceStages} Acceptance runner.
28
+ */
29
+ export declare function createAcceptanceRunner({ removeDirectory }: {
30
+ removeDirectory: typeof rm;
31
+ }): typeof runAcceptanceStages;
22
32
  //# sourceMappingURL=acceptance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/acceptance.js"],"names":[],"mappings":"AAmBA;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAP5C;IAAkE,SAAS,EAAnE,OAAO,qBAAqB,EAAE,oBAAoB,CAC1D;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsJ,MAAM,EAApJ;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,qBAAqB,EAAE,eAAe,CAAC;QAAC,IAAI,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,CAAA;KAAC,EAAE,CAC9I;IAAsB,MAAM,EAApB,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;CAE4C,GAFlC,OAAO,CAAC,OAAO,qBAAqB,EAAE,gBAAgB,CAAC,CAwEnE"}
1
+ {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/acceptance.js"],"names":[],"mappings":"AAEA,OAAO,EAAiB,EAAE,EAAY,MAAM,kBAAkB,CAAA;AAiB9D;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAP5C;IAAkE,SAAS,EAAnE,OAAO,qBAAqB,EAAE,oBAAoB,CAC1D;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsJ,MAAM,EAApJ;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,qBAAqB,EAAE,eAAe,CAAC;QAAC,IAAI,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,CAAA;KAAC,EAAE,CAC9I;IAAsB,MAAM,EAApB,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;CAE4C,GAFlC,OAAO,CAAC,OAAO,qBAAqB,EAAE,gBAAgB,CAAC,CAInE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EAAC,eAAe,EAAC,EAHrD;IAAgC,eAAe,EAAvC,OAAO,EAAE,CACjB;CAEqD,GAF3C,OAAO,mBAAmB,CAItC"}
@@ -12,7 +12,7 @@ const acceptanceMaxBuffer = 16 * 1024 * 1024;
12
12
  const launchErrorCodes = new Set([
13
13
  "E2BIG", "EACCES", "EAGAIN", "ELOOP", "EMFILE", "ENAMETOOLONG", "ENFILE", "ENOENT", "ENOEXEC", "ENOMEM", "ENOTDIR", "ENOTSUP", "EPERM", "ETXTBSY"
14
14
  ]);
15
- const orderedStages = Object.freeze(["parse", "generate", "compile", "link", "validate", "instantiate", "execute"]);
15
+ const orderedStages = Object.freeze(["parse", "generate", "restore", "compile", "link", "validate", "instantiate", "execute"]);
16
16
  const stageIndexes = new Map(orderedStages.map((stage, index) => [stage, index]));
17
17
  /**
18
18
  * Materializes one artifact set and runs ordered acceptance stages without a shell.
@@ -25,6 +25,24 @@ const stageIndexes = new Map(orderedStages.map((stage, index) => [stage, index])
25
25
  * @returns {Promise<import("./semantic/types.js").AcceptanceResult>} Captured results after cleanup.
26
26
  */
27
27
  export async function runAcceptanceStages(input) {
28
+ return await runAcceptanceStagesWithDependencies(input, rm);
29
+ }
30
+ /**
31
+ * Creates an acceptance runner with instance-owned cleanup behavior.
32
+ * @param {object} dependencies - Internal runner dependencies.
33
+ * @param {typeof rm} dependencies.removeDirectory - Isolated-directory removal operation.
34
+ * @returns {typeof runAcceptanceStages} Acceptance runner.
35
+ */
36
+ export function createAcceptanceRunner({ removeDirectory }) {
37
+ return async (input) => await runAcceptanceStagesWithDependencies(input, removeDirectory);
38
+ }
39
+ /**
40
+ * Runs acceptance with exact instance-owned dependencies.
41
+ * @param {Parameters<typeof runAcceptanceStages>[0]} input - Acceptance request.
42
+ * @param {typeof rm} removeDirectory - Isolated-directory removal operation.
43
+ * @returns {ReturnType<typeof runAcceptanceStages>} Captured results after cleanup.
44
+ */
45
+ async function runAcceptanceStagesWithDependencies(input, removeDirectory) {
28
46
  if (!isPlainObject(input))
29
47
  invalidRunner("Acceptance requires a request object.", "acceptance");
30
48
  const artifacts = /** @type {import("./semantic/types.js").GeneratedArtifactSet} */ (input.artifacts);
@@ -76,7 +94,7 @@ export async function runAcceptanceStages(input) {
76
94
  let cleanupFailure;
77
95
  let cleanupFailed = false;
78
96
  try {
79
- await removeAcceptanceDirectory(directory, request.target);
97
+ await removeAcceptanceDirectory(directory, request.target, removeDirectory);
80
98
  }
81
99
  catch (error) {
82
100
  cleanupFailed = true;
@@ -279,11 +297,12 @@ function isPlainObject(value) {
279
297
  * Removes the isolated acceptance directory with a normalized failure.
280
298
  * @param {string} directory - Exact temporary directory.
281
299
  * @param {string} target - Acceptance target.
300
+ * @param {typeof rm} removeDirectory - Instance-owned removal operation.
282
301
  * @returns {Promise<void>} Cleanup completion.
283
302
  */
284
- async function removeAcceptanceDirectory(directory, target) {
303
+ async function removeAcceptanceDirectory(directory, target, removeDirectory) {
285
304
  try {
286
- await rm(directory, { force: true, recursive: true });
305
+ await removeDirectory(directory, { force: true, recursive: true });
287
306
  }
288
307
  catch (error) {
289
308
  throw new SemantifoldDiagnostic({
@@ -336,4 +355,4 @@ async function materializeArtifacts(artifacts, directory, target) {
336
355
  }
337
356
  }
338
357
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXB0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2NlcHRhbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDOUQsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ3ZDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzlFLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUV4RCxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVM7Q0FDbEosQ0FBQyxDQUFBO0FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFNB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SUFBSSxJQUFJO2FBQ3hFLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge21rZGlyLCBta2R0ZW1wLCBybSwgd3JpdGVGaWxlfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtjcmVhdGVHZW5lcmF0ZWRBcnRpZmFjdFNldH0gZnJvbSBcIi4vYXJ0aWZhY3RzLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcbmltcG9ydCB7ZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50fSBmcm9tIFwiLi90b29sY2hhaW5zLmpzXCJcblxuY29uc3QgYWNjZXB0YW5jZU1heEJ1ZmZlciA9IDE2ICogMTAyNCAqIDEwMjRcbmNvbnN0IGxhdW5jaEVycm9yQ29kZXMgPSBuZXcgU2V0KFtcbiAgXCJFMkJJR1wiLCBcIkVBQ0NFU1wiLCBcIkVBR0FJTlwiLCBcIkVMT09QXCIsIFwiRU1GSUxFXCIsIFwiRU5BTUVUT09MT05HXCIsIFwiRU5GSUxFXCIsIFwiRU5PRU5UXCIsIFwiRU5PRVhFQ1wiLCBcIkVOT01FTVwiLCBcIkVOT1RESVJcIiwgXCJFTk9UU1VQXCIsIFwiRVBFUk1cIiwgXCJFVFhUQlNZXCJcbl0pXG5jb25zdCBvcmRlcmVkU3RhZ2VzID0gT2JqZWN0LmZyZWV6ZShbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXSlcbmNvbnN0IHN0YWdlSW5kZXhlcyA9IG5ldyBNYXAob3JkZXJlZFN0YWdlcy5tYXAoKHN0YWdlLCBpbmRleCkgPT4gW3N0YWdlLCBpbmRleF0pKVxuXG4vKipcbiAqIE1hdGVyaWFsaXplcyBvbmUgYXJ0aWZhY3Qgc2V0IGFuZCBydW5zIG9yZGVyZWQgYWNjZXB0YW5jZSBzdGFnZXMgd2l0aG91dCBhIHNoZWxsLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gQWNjZXB0YW5jZSByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBpbnB1dC5hcnRpZmFjdHMgLSBDb21wbGV0ZSBpbnB1dCBhcnRpZmFjdHMuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBbaW5wdXQuZW52aXJvbm1lbnRdIC0gRXhwbGljaXQgcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7e2FyZ3VtZW50czogc3RyaW5nW10sIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZSwgdG9vbDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWlufVtdfSBpbnB1dC5zdGFnZXMgLSBPcmRlcmVkIHN0YWdlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC50YXJnZXQgLSBUYXJnZXQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2lucHV0LnRpbWVvdXRNc10gLSBQZXItc3RhZ2UgdGltZW91dC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVJlc3VsdD59IENhcHR1cmVkIHJlc3VsdHMgYWZ0ZXIgY2xlYW51cC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFjY2VwdGFuY2VTdGFnZXMoaW5wdXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0KSkgaW52YWxpZFJ1bm5lcihcIkFjY2VwdGFuY2UgcmVxdWlyZXMgYSByZXF1ZXN0IG9iamVjdC5cIiwgXCJhY2NlcHRhbmNlXCIpXG4gIGNvbnN0IGFydGlmYWN0cyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldH0gKi8gKGlucHV0LmFydGlmYWN0cylcbiAgY29uc3QgZW52aXJvbm1lbnQgPSAvKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSAqLyAoXG4gICAgaW5wdXQuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCA/IHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfSA6IGlucHV0LmVudmlyb25tZW50KVxuICBjb25zdCBzdGFnZXMgPSAvKiogQHR5cGUge3thcmd1bWVudHM6IHN0cmluZ1tdLCBzdGFnZTogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2UsIHRvb2w6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbn1bXX0gKi8gKGlucHV0LnN0YWdlcylcbiAgY29uc3QgdGFyZ2V0ID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpbnB1dC50YXJnZXQpXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoaW5wdXQudGltZW91dE1zID09PSB1bmRlZmluZWQgPyAxMF8wMDAgOiBpbnB1dC50aW1lb3V0TXMpXG4gIGNvbnN0IHJlcXVlc3QgPSB2YWxpZGF0ZVJlcXVlc3Qoe2FydGlmYWN0cywgZW52aXJvbm1lbnQsIHN0YWdlcywgdGFyZ2V0LCB0aW1lb3V0TXN9KVxuICBjb25zdCBkaXJlY3RvcnkgPSBhd2FpdCBjcmVhdGVBY2NlcHRhbmNlRGlyZWN0b3J5KHJlcXVlc3QudGFyZ2V0KVxuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGxldCBwcmltYXJ5RmFpbHVyZVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVJlc3VsdCB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHJlc3VsdFxuICBsZXQgcHJpbWFyeUZhaWxlZCA9IGZhbHNlXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBtYXRlcmlhbGl6ZUFydGlmYWN0cyhyZXF1ZXN0LmFydGlmYWN0cywgZGlyZWN0b3J5LCByZXF1ZXN0LnRhcmdldClcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VSZXN1bHRbXX0gKi9cbiAgICBjb25zdCByZXN1bHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgcmVxdWVzdC5zdGFnZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgICAgICBhcmd1bWVudHM6IHN0YWdlLmFyZ3VtZW50cyxcbiAgICAgICAgICBjd2Q6IGRpcmVjdG9yeSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogcmVxdWVzdC5lbnZpcm9ubWVudCxcbiAgICAgICAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgICAgICAgbWF4QnVmZmVyOiBhY2NlcHRhbmNlTWF4QnVmZmVyLFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxdWVzdC50aW1lb3V0TXNcbiAgICAgICAgfSlcblxuICAgICAgICByZXN1bHRzLnB1c2goT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgYXJndW1lbnRzOiBPYmplY3QuZnJlZXplKFsuLi5zdGFnZS5hcmd1bWVudHNdKSxcbiAgICAgICAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgICAgICAgc3RhZ2U6IHN0YWdlLnN0YWdlLFxuICAgICAgICAgIHN0ZGVycjogcmVzdWx0LnN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgdmVyc2lvbjogc3RhZ2UudG9vbC52ZXJzaW9uXG4gICAgICAgIH0pKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgcHJvY2Vzc0RpYWdub3N0aWMoZXJyb3IsIHN0YWdlLCByZXF1ZXN0LnRhcmdldCwgcmVxdWVzdC50aW1lb3V0TXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0ID0gT2JqZWN0LmZyZWV6ZSh7ZGlyZWN0b3J5LCBzdGFnZXM6IE9iamVjdC5mcmVlemUocmVzdWx0cyksIHRhcmdldDogcmVxdWVzdC50YXJnZXR9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW1hcnlGYWlsZWQgPSB0cnVlXG4gICAgcHJpbWFyeUZhaWx1cmUgPSBlcnJvclxuICB9XG5cbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBsZXQgY2xlYW51cEZhaWx1cmVcbiAgbGV0IGNsZWFudXBGYWlsZWQgPSBmYWxzZVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVtb3ZlQWNjZXB0YW5jZURpcmVjdG9yeShkaXJlY3RvcnksIHJlcXVlc3QudGFyZ2V0KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsZWFudXBGYWlsZWQgPSB0cnVlXG4gICAgY2xlYW51cEZhaWx1cmUgPSBlcnJvclxuICB9XG5cbiAgaWYgKHByaW1hcnlGYWlsZWQgJiYgY2xlYW51cEZhaWxlZCAmJiBwcmltYXJ5RmFpbHVyZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcHJlc2VydmVQcmltYXJ5RmFpbHVyZShwcmltYXJ5RmFpbHVyZSwgY2xlYW51cEZhaWx1cmUsIHJlcXVlc3QudGFyZ2V0KVxuICB9XG4gIGlmIChwcmltYXJ5RmFpbGVkKSB0aHJvdyBwcmltYXJ5RmFpbHVyZVxuICBpZiAoY2xlYW51cEZhaWxlZCkgdGhyb3cgY2xlYW51cEZhaWx1cmVcblxuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VSZXN1bHR9ICovIChyZXN1bHQpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBkZXRhY2hlcyBhIHN0YWdlZCBhY2NlcHRhbmNlIHJlcXVlc3QgYmVmb3JlIGZpbGVzeXN0ZW0gbXV0YXRpb24uXG4gKiBAcGFyYW0ge3tcbiAqICAgYXJ0aWZhY3RzOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0LFxuICogICBlbnZpcm9ubWVudDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sXG4gKiAgIHN0YWdlczoge2FyZ3VtZW50czogc3RyaW5nW10sIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZSwgdG9vbDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWlufVtdLFxuICogICB0YXJnZXQ6IHN0cmluZyxcbiAqICAgdGltZW91dE1zOiBudW1iZXJcbiAqIH19IGlucHV0IC0gQ2FuZGlkYXRlIHJlcXVlc3QuXG4gKiBAcmV0dXJucyB7e1xuICogICBhcnRpZmFjdHM6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RTZXQsXG4gKiAgIGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAqICAgc3RhZ2VzOiB7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlLCB0b29sOiBSZWFkb25seTx7ZXhlY3V0YWJsZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn1bXSxcbiAqICAgdGFyZ2V0OiBzdHJpbmcsXG4gKiAgIHRpbWVvdXRNczogbnVtYmVyXG4gKiB9fSBWYWxpZGF0ZWQgcmVxdWVzdC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXF1ZXN0KGlucHV0KSB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC50YXJnZXQgIT0gXCJzdHJpbmdcIiB8fCBpbnB1dC50YXJnZXQubGVuZ3RoID09IDAgfHwgIWlzU3VwcG9ydGVkVGltZW91dE1zKGlucHV0LnRpbWVvdXRNcykgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkoaW5wdXQuc3RhZ2VzKSB8fCBpbnB1dC5zdGFnZXMubGVuZ3RoID09IDApIHtcbiAgICAgIGludmFsaWRSdW5uZXIoYEFjY2VwdGFuY2UgcmVxdWlyZXMgYSB0YXJnZXQsIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLCBhbmQgbm9uLWVtcHR5IG9yZGVyZWQgc3RhZ2VzLmAsIGlucHV0LnRhcmdldClcbiAgICB9XG4gICAgY29uc3QgYXJ0aWZhY3RzID0gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoaW5wdXQuYXJ0aWZhY3RzKVxuXG4gICAgaWYgKGFydGlmYWN0cy50YXJnZXQgIT0gaW5wdXQudGFyZ2V0KSBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSB0YXJnZXQgbXVzdCBtYXRjaCB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0LXNldCB0YXJnZXQuXCIsIGlucHV0LnRhcmdldClcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IGRldGVybWluaXN0aWNFbnZpcm9ubWVudChpbnB1dC5lbnZpcm9ubWVudClcbiAgICBsZXQgcHJldmlvdXNJbmRleCA9IC0xXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7e2FyZ3VtZW50czogc3RyaW5nW10sIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZSwgdG9vbDogUmVhZG9ubHk8e2V4ZWN1dGFibGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59W119ICovXG4gICAgY29uc3Qgc3RhZ2VzID0gW11cblxuICAgIGZvciAobGV0IHN0YWdlUG9zaXRpb24gPSAwOyBzdGFnZVBvc2l0aW9uIDwgaW5wdXQuc3RhZ2VzLmxlbmd0aDsgc3RhZ2VQb3NpdGlvbiArPSAxKSB7XG4gICAgICBjb25zdCBzdGFnZSA9IGlucHV0LnN0YWdlc1tzdGFnZVBvc2l0aW9uXVxuXG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc3RhZ2UpKSBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSBzdGFnZXMgbXVzdCBiZSBkaXN0aW5jdCBrbm93biBzdGFnZSByZWNvcmRzLlwiLCBpbnB1dC50YXJnZXQpXG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSBzdGFnZS5zdGFnZVxuXG4gICAgICBpZiAodHlwZW9mIHN0YWdlTmFtZSAhPSBcInN0cmluZ1wiIHx8ICFzdGFnZUluZGV4ZXMuaGFzKHN0YWdlTmFtZSkgfHwgc2Vlbi5oYXMoc3RhZ2VOYW1lKSkge1xuICAgICAgICBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSBzdGFnZXMgbXVzdCBiZSBkaXN0aW5jdCBrbm93biBzdGFnZSByZWNvcmRzLlwiLCBpbnB1dC50YXJnZXQpXG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoc3RhZ2VJbmRleGVzLmdldChzdGFnZU5hbWUpKVxuXG4gICAgICBpZiAoaW5kZXggPCBwcmV2aW91c0luZGV4KSBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSBzdGFnZXMgbXVzdCBmb2xsb3cgcGFyc2UtdG8tZXhlY3V0ZSBvcmRlci5cIiwgaW5wdXQudGFyZ2V0KVxuICAgICAgcHJldmlvdXNJbmRleCA9IGluZGV4XG4gICAgICBzZWVuLmFkZChzdGFnZU5hbWUpXG4gICAgICBjb25zdCBhcmd1bWVudENhbmRpZGF0ZSA9IHN0YWdlLmFyZ3VtZW50c1xuICAgICAgY29uc3Qgc3RhZ2VBcmd1bWVudHMgPSBpc0RlbnNlQXJyYXkoYXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLmFyZ3VtZW50Q2FuZGlkYXRlXSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgdG9vbENhbmRpZGF0ZSA9IHN0YWdlLnRvb2xcbiAgICAgIGNvbnN0IHRvb2wgPSBpc1BsYWluT2JqZWN0KHRvb2xDYW5kaWRhdGUpID8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGV4ZWN1dGFibGU6IHRvb2xDYW5kaWRhdGUuZXhlY3V0YWJsZSxcbiAgICAgICAgaWQ6IHRvb2xDYW5kaWRhdGUuaWQsXG4gICAgICAgIHNvdXJjZTogdG9vbENhbmRpZGF0ZS5zb3VyY2UsXG4gICAgICAgIHZlcnNpb246IHRvb2xDYW5kaWRhdGUudmVyc2lvblxuICAgICAgfSkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHN0YWdlQXJndW1lbnRzID09IHVuZGVmaW5lZCB8fCAhc3RhZ2VBcmd1bWVudHMuZXZlcnkoKGFyZ3VtZW50KSA9PiB0eXBlb2YgYXJndW1lbnQgPT0gXCJzdHJpbmdcIiAmJiAhYXJndW1lbnQuaW5jbHVkZXMoXCJcXDBcIikpIHx8XG4gICAgICAgICFpc1Rvb2wodG9vbCkpIGludmFsaWRSdW5uZXIoYEFjY2VwdGFuY2Ugc3RhZ2UgJyR7c3RhZ2VOYW1lfScgaGFzIGFuIGludmFsaWQgdG9vbCBvciBhcmd1bWVudCBhcnJheS5gLCBpbnB1dC50YXJnZXQpXG5cbiAgICAgIHN0YWdlcy5wdXNoKE9iamVjdC5mcmVlemUoe2FyZ3VtZW50czogc3RhZ2VBcmd1bWVudHMsIHN0YWdlOiBzdGFnZU5hbWUsIHRvb2x9KSlcbiAgICB9XG5cbiAgICByZXR1cm4ge2FydGlmYWN0cywgZW52aXJvbm1lbnQsIHN0YWdlcywgdGFyZ2V0OiBpbnB1dC50YXJnZXQsIHRpbWVvdXRNczogaW5wdXQudGltZW91dE1zfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYyAmJiBlcnJvci5jb2RlID09IFwiSU5WQUxJRF9BQ0NFUFRBTkNFX1JVTk5FUlwiKSB0aHJvdyBlcnJvclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYykge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgY29kZTogXCJJTlZBTElEX0FDQ0VQVEFOQ0VfUlVOTkVSXCIsXG4gICAgICAgIGxhbmd1YWdlOiB0eXBlb2YgaW5wdXQudGFyZ2V0ID09IFwic3RyaW5nXCIgPyBpbnB1dC50YXJnZXQgOiBcImFjY2VwdGFuY2VcIixcbiAgICAgICAgbWVzc2FnZTogYEFjY2VwdGFuY2UgcnVubmVyIGlucHV0IGlzIGludmFsaWQ6ICR7ZXJyb3IuZGV0YWlsfWBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGludmFsaWRSdW5uZXIoXCJBY2NlcHRhbmNlIHJ1bm5lciBpbnB1dCBpcyBpbnZhbGlkLlwiLCB0eXBlb2YgaW5wdXQudGFyZ2V0ID09IFwic3RyaW5nXCIgPyBpbnB1dC50YXJnZXQgOiBcImFjY2VwdGFuY2VcIiwgZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc3VicHJvY2VzcyBmYWlsdXJlIHdpdGggZXhhY3Qgc3RhZ2UgYW5kIHRvb2xjaGFpbiBjb250ZXh0LlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFN1YnByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHBhcmFtIHt7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IHN0cmluZywgdG9vbDogUmVhZG9ubHk8e2V4ZWN1dGFibGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59fSBzdGFnZSAtIEZhaWxlZCBzdGFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBY2NlcHRhbmNlIHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgLSBDb25maWd1cmVkIHN0YWdlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBOb3JtYWxpemVkIGZhaWx1cmUuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NEaWFnbm9zdGljKGVycm9yLCBzdGFnZSwgdGFyZ2V0LCB0aW1lb3V0TXMpIHtcbiAgY29uc3QgZmllbGRzID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICBjb25zdCBvdXRwdXRMaW1pdGVkID0gZmllbGRzLm5hdGl2ZUNvZGUgPT0gXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIlxuICBjb25zdCB0aW1lZE91dCA9ICFvdXRwdXRMaW1pdGVkICYmIGV4Y2VlZGVkT3duZWREZWFkbGluZShlcnJvcilcbiAgY29uc3QgbGF1bmNoRmFpbHVyZSA9IGZpZWxkcy5uYXRpdmVDb2RlICE9IHVuZGVmaW5lZCAmJiBsYXVuY2hFcnJvckNvZGVzLmhhcyhmaWVsZHMubmF0aXZlQ29kZSlcbiAgY29uc3Qgc2lnbmFsZWQgPSAhb3V0cHV0TGltaXRlZCAmJiAhdGltZWRPdXQgJiYgZmllbGRzLnNpZ25hbCAhPSB1bmRlZmluZWRcbiAgY29uc3QgY29kZSA9IG91dHB1dExpbWl0ZWQgPyBcIkFDQ0VQVEFOQ0VfT1VUUFVUX0xJTUlUXCIgOiB0aW1lZE91dCA/IFwiQUNDRVBUQU5DRV9USU1FT1VUXCIgOiBsYXVuY2hGYWlsdXJlID8gXCJBQ0NFUFRBTkNFX0xBVU5DSF9GQUlMVVJFXCIgOiBzaWduYWxlZFxuICAgID8gXCJBQ0NFUFRBTkNFX1NJR05BTFwiXG4gICAgOiBcIkFDQ0VQVEFOQ0VfTk9OWkVST19FWElUXCJcbiAgY29uc3QgcmVhc29uID0gb3V0cHV0TGltaXRlZCA/IGBleGNlZWRlZCB0aGUgJHthY2NlcHRhbmNlTWF4QnVmZmVyfS1ieXRlIG91dHB1dCBjYXB0dXJlIGxpbWl0ICgke2ZpZWxkcy5uYXRpdmVDb2RlfSlgIDogdGltZWRPdXRcbiAgICA/IGB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgIDogbGF1bmNoRmFpbHVyZVxuICAgID8gYGNvdWxkIG5vdCBsYXVuY2ggKCR7ZmllbGRzLm5hdGl2ZUNvZGV9KWBcbiAgICA6IHNpZ25hbGVkID8gYHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZmllbGRzLnNpZ25hbH1gXG4gICAgOiBmaWVsZHMuZXhpdENvZGUgIT0gdW5kZWZpbmVkID8gYGV4aXRlZCBub256ZXJvICgke2ZpZWxkcy5leGl0Q29kZX0pYFxuICAgIDogYGZhaWxlZCBhZnRlciBsYXVuY2ggKCR7ZmllbGRzLm5hdGl2ZUNvZGUgPz8gXCJ1bmtub3duXCJ9KWBcblxuICByZXR1cm4gbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2U6IG91dHB1dExpbWl0ZWQgPyB1bmRlZmluZWQgOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgY29kZSxcbiAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgZXhpdENvZGU6IGZpZWxkcy5leGl0Q29kZSxcbiAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgIG1lc3NhZ2U6IGBBY2NlcHRhbmNlIHN0YWdlICcke3N0YWdlLnN0YWdlfScgJHtyZWFzb259IHVzaW5nICcke3N0YWdlLnRvb2wuZXhlY3V0YWJsZX0nICgke3N0YWdlLnRvb2wudmVyc2lvbn0pLmAsXG4gICAgc2lnbmFsOiBmaWVsZHMuc2lnbmFsLFxuICAgIHN0YWdlOiBzdGFnZS5zdGFnZSxcbiAgICBzdGRlcnI6IGZpZWxkcy5zdGRlcnIsXG4gICAgc3Rkb3V0OiBmaWVsZHMuc3Rkb3V0LFxuICAgIHZlcnNpb246IHN0YWdlLnRvb2wudmVyc2lvblxuICB9KVxufVxuXG4vKipcbiAqIE5hcnJvd3MgdGhlIHN0YWJsZSBmaWVsZHMgb2YgYW4gb3BhcXVlIGNoaWxkLXByb2Nlc3MgZmFpbHVyZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgbmF0aXZlQ29kZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaWduYWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfX0gU3RhYmxlIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKSB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9IFwib2JqZWN0XCIpIHJldHVybiB7ZXhpdENvZGU6IHVuZGVmaW5lZCwgbmF0aXZlQ29kZTogdW5kZWZpbmVkLCBzaWduYWw6IHVuZGVmaW5lZCwgc3RkZXJyOiBcIlwiLCBzdGRvdXQ6IFwiXCJ9XG4gIGNvbnN0IHZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGVycm9yKVxuICBjb25zdCBuYXRpdmVDb2RlID0gdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWRcbiAgY29uc3Qgb3V0cHV0TGltaXRlZCA9IG5hdGl2ZUNvZGUgPT0gXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIlxuXG4gIHJldHVybiB7XG4gICAgZXhpdENvZGU6IHR5cGVvZiB2YWx1ZS5jb2RlID09IFwibnVtYmVyXCIgPyB2YWx1ZS5jb2RlIDogdW5kZWZpbmVkLFxuICAgIG5hdGl2ZUNvZGUsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiAhb3V0cHV0TGltaXRlZCAmJiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogIW91dHB1dExpbWl0ZWQgJiYgdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBkaXNjb3ZlcmVkLXRvb2wgZmllbGRzIGNvbnN1bWVkIGJ5IHRoZSBydW5uZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHRvb2wuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWlufSBXaGV0aGVyIHRoZSB0b29sIGNvbnRyYWN0IGlzIHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGlzVG9vbCh2YWx1ZSkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLmlkID09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLmV4ZWN1dGFibGUgPT0gXCJzdHJpbmdcIiAmJiBwYXRoLmlzQWJzb2x1dGUodmFsdWUuZXhlY3V0YWJsZSkgJiZcbiAgICAhdmFsdWUuZXhlY3V0YWJsZS5pbmNsdWRlcyhcIlxcMFwiKSAmJiB0eXBlb2YgdmFsdWUudmVyc2lvbiA9PSBcInN0cmluZ1wiICYmIHZhbHVlLnZlcnNpb24ubGVuZ3RoID4gMCAmJlxuICAgICh2YWx1ZS5zb3VyY2UgPT0gXCJjYW5vbmljYWxcIiB8fCB2YWx1ZS5zb3VyY2UgPT0gXCJvdmVycmlkZVwiKVxufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcmltYXJ5IGFjY2VwdGFuY2UgZXJyb3Igd2hpbGUgcmVjb3JkaW5nIGJvdW5kZWQgY2xlYW51cCBldmlkZW5jZSBpbiBpdHMgY2F1c2UgY2hhaW4uXG4gKiBAcGFyYW0ge0Vycm9yfSBwcmltYXJ5RmFpbHVyZSAtIE9yaWdpbmFsIG1hdGVyaWFsaXphdGlvbiBvciBzdGFnZSBmYWlsdXJlLlxuICogQHBhcmFtIHt1bmtub3dufSBjbGVhbnVwRmFpbHVyZSAtIENsZWFudXAgcmVqZWN0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFjY2VwdGFuY2UgdGFyZ2V0LlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgb3JpZ2luYWwgcHJpbWFyeSBlcnJvciB3aXRoIHN0cnVjdHVyZWQgY2xlYW51cCBldmlkZW5jZS5cbiAqL1xuZnVuY3Rpb24gcHJlc2VydmVQcmltYXJ5RmFpbHVyZShwcmltYXJ5RmFpbHVyZSwgY2xlYW51cEZhaWx1cmUsIHRhcmdldCkge1xuICBjb25zdCBjbGVhbnVwRXZpZGVuY2UgPSBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjb2RlOiBcIkFDQ0VQVEFOQ0VfQ0xFQU5VUF9GQUlMVVJFXCIsXG4gICAgbGFuZ3VhZ2U6IGNsZWFudXBGYWlsdXJlIGluc3RhbmNlb2YgU2VtYW50aWZvbGREaWFnbm9zdGljID8gY2xlYW51cEZhaWx1cmUubGFuZ3VhZ2UgOiB0YXJnZXQsXG4gICAgbWVzc2FnZTogXCJJc29sYXRlZCBhY2NlcHRhbmNlLWRpcmVjdG9yeSBjbGVhbnVwIGZhaWxlZCBhZnRlciB0aGUgcHJpbWFyeSBhY2NlcHRhbmNlIGZhaWx1cmUuXCJcbiAgfSlcbiAgY29uc3QgY2F1c2VzID0gcHJpbWFyeUZhaWx1cmUuY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IFtwcmltYXJ5RmFpbHVyZS5jYXVzZSwgY2xlYW51cEV2aWRlbmNlXSA6IFtjbGVhbnVwRXZpZGVuY2VdXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByaW1hcnlGYWlsdXJlLCBcImNhdXNlXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IG5ldyBBZ2dyZWdhdGVFcnJvcihjYXVzZXMsIFwiQWNjZXB0YW5jZSBmYWlsZWQgYW5kIGlzb2xhdGVkLWRpcmVjdG9yeSBjbGVhbnVwIGFsc28gZmFpbGVkLlwiKSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxuXG4gIHJldHVybiBwcmltYXJ5RmFpbHVyZVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcnVubmVyLWNvbmZpZ3VyYXRpb24gZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3Vua25vd259IHRhcmdldCAtIENhbmRpZGF0ZSB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3Vua25vd259IFtlcnJvcl0gLSBQcmVzZXJ2ZWQgY2F1c2UuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRSdW5uZXIobWVzc2FnZSwgdGFyZ2V0LCBlcnJvcikge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgIGNvZGU6IFwiSU5WQUxJRF9BQ0NFUFRBTkNFX1JVTk5FUlwiLFxuICAgIGxhbmd1YWdlOiB0eXBlb2YgdGFyZ2V0ID09IFwic3RyaW5nXCIgJiYgdGFyZ2V0Lmxlbmd0aCA+IDAgPyB0YXJnZXQgOiBcImFjY2VwdGFuY2VcIixcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciBhbiBvcmRpbmFyeSBzdHJpbmcta2V5ZWQgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGlzb2xhdGVkIGFjY2VwdGFuY2UgZGlyZWN0b3J5IHdpdGggYSBub3JtYWxpemVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0b3J5IC0gRXhhY3QgdGVtcG9yYXJ5IGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBY2NlcHRhbmNlIHRhcmdldC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDbGVhbnVwIGNvbXBsZXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFjY2VwdGFuY2VEaXJlY3RvcnkoZGlyZWN0b3J5LCB0YXJnZXQpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBybShkaXJlY3RvcnksIHtmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICBjb2RlOiBcIkFDQ0VQVEFOQ0VfQ0xFQU5VUF9GQUlMVVJFXCIsXG4gICAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byByZW1vdmUgaXNvbGF0ZWQgYWNjZXB0YW5jZSBkaXJlY3RvcnkgJyR7ZGlyZWN0b3J5fScuYFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBpc29sYXRlZCBhY2NlcHRhbmNlIGRpcmVjdG9yeSB3aXRoIGEgbm9ybWFsaXplZCBzZXR1cCBmYWlsdXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFjY2VwdGFuY2UgdGFyZ2V0LlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRXhhY3QgdGVtcG9yYXJ5IGRpcmVjdG9yeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWNjZXB0YW5jZURpcmVjdG9yeSh0YXJnZXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwic2VtYW50aWZvbGQtYWNjZXB0YW5jZS1cIikpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogXCJBQ0NFUFRBTkNFX1NFVFVQX0ZBSUxVUkVcIixcbiAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBjcmVhdGUgYW4gaXNvbGF0ZWQgYWNjZXB0YW5jZSBkaXJlY3RvcnkuXCJcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIG9ubHkgdGhlIGFscmVhZHktdmFsaWRhdGVkIGdlbmVyYXRlZCBhcnRpZmFjdHMgaW50byB0aGUgaXNvbGF0ZWQgZGlyZWN0b3J5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBhcnRpZmFjdHMgLSBDb21wbGV0ZSB2YWxpZGF0ZWQgc2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIEV4YWN0IHRlbXBvcmFyeSBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQWNjZXB0YW5jZSB0YXJnZXQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gTWF0ZXJpYWxpemF0aW9uIGNvbXBsZXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplQXJ0aWZhY3RzKGFydGlmYWN0cywgZGlyZWN0b3J5LCB0YXJnZXQpIHtcbiAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhcnRpZmFjdHMuYXJ0aWZhY3RzKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCAuLi5hcnRpZmFjdC5wYXRoLnNwbGl0KFwiL1wiKSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZmlsZW5hbWUpLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlbmFtZSwgYXJ0aWZhY3QuY29udGVudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvZGU6IFwiQUNDRVBUQU5DRV9NQVRFUklBTElaQVRJT05fRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIG1hdGVyaWFsaXplIGdlbmVyYXRlZCBhcnRpZmFjdCAnJHthcnRpZmFjdC5wYXRofScuYFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXB0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2NlcHRhbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDOUQsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ3ZDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzlFLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUV4RCxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVM7Q0FDbEosQ0FBQyxDQUFBO0FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGFB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U0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDdEQsTUFBTSxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQztnQkFDOUIsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDakQsSUFBSSxFQUFFLG9DQUFvQztnQkFDMUMsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSw2Q0FBNkMsUUFBUSxDQUFDLElBQUksSUFBSTthQUN4RSxDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtta2RpciwgbWtkdGVtcCwgcm0sIHdyaXRlRmlsZX0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7Y3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGZyb20gXCIuL2FydGlmYWN0cy5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2V4Y2VlZGVkT3duZWREZWFkbGluZSwgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmV9IGZyb20gXCIuL3N1YnByb2Nlc3MuanNcIlxuaW1wb3J0IHtpc1N1cHBvcnRlZFRpbWVvdXRNcywgbWF4aW11bVRpbWVvdXRNc30gZnJvbSBcIi4vdGltZW91dC5qc1wiXG5pbXBvcnQge2RldGVybWluaXN0aWNFbnZpcm9ubWVudH0gZnJvbSBcIi4vdG9vbGNoYWlucy5qc1wiXG5cbmNvbnN0IGFjY2VwdGFuY2VNYXhCdWZmZXIgPSAxNiAqIDEwMjQgKiAxMDI0XG5jb25zdCBsYXVuY2hFcnJvckNvZGVzID0gbmV3IFNldChbXG4gIFwiRTJCSUdcIiwgXCJFQUNDRVNcIiwgXCJFQUdBSU5cIiwgXCJFTE9PUFwiLCBcIkVNRklMRVwiLCBcIkVOQU1FVE9PTE9OR1wiLCBcIkVORklMRVwiLCBcIkVOT0VOVFwiLCBcIkVOT0VYRUNcIiwgXCJFTk9NRU1cIiwgXCJFTk9URElSXCIsIFwiRU5PVFNVUFwiLCBcIkVQRVJNXCIsIFwiRVRYVEJTWVwiXG5dKVxuY29uc3Qgb3JkZXJlZFN0YWdlcyA9IE9iamVjdC5mcmVlemUoW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcInJlc3RvcmVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdKVxuY29uc3Qgc3RhZ2VJbmRleGVzID0gbmV3IE1hcChvcmRlcmVkU3RhZ2VzLm1hcCgoc3RhZ2UsIGluZGV4KSA9PiBbc3RhZ2UsIGluZGV4XSkpXG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIG9uZSBhcnRpZmFjdCBzZXQgYW5kIHJ1bnMgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcyB3aXRob3V0IGEgc2hlbGwuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBBY2NlcHRhbmNlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGlucHV0LmFydGlmYWN0cyAtIENvbXBsZXRlIGlucHV0IGFydGlmYWN0cy5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFtpbnB1dC5lbnZpcm9ubWVudF0gLSBFeHBsaWNpdCBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHt7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlLCB0b29sOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW59W119IGlucHV0LnN0YWdlcyAtIE9yZGVyZWQgc3RhZ2VzLlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LnRhcmdldCAtIFRhcmdldCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5wdXQudGltZW91dE1zXSAtIFBlci1zdGFnZSB0aW1lb3V0LlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlUmVzdWx0Pn0gQ2FwdHVyZWQgcmVzdWx0cyBhZnRlciBjbGVhbnVwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWNjZXB0YW5jZVN0YWdlcyhpbnB1dCkge1xuICByZXR1cm4gYXdhaXQgcnVuQWNjZXB0YW5jZVN0YWdlc1dpdGhEZXBlbmRlbmNpZXMoaW5wdXQsIHJtKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYWNjZXB0YW5jZSBydW5uZXIgd2l0aCBpbnN0YW5jZS1vd25lZCBjbGVhbnVwIGJlaGF2aW9yLlxuICogQHBhcmFtIHtvYmplY3R9IGRlcGVuZGVuY2llcyAtIEludGVybmFsIHJ1bm5lciBkZXBlbmRlbmNpZXMuXG4gKiBAcGFyYW0ge3R5cGVvZiBybX0gZGVwZW5kZW5jaWVzLnJlbW92ZURpcmVjdG9yeSAtIElzb2xhdGVkLWRpcmVjdG9yeSByZW1vdmFsIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHt0eXBlb2YgcnVuQWNjZXB0YW5jZVN0YWdlc30gQWNjZXB0YW5jZSBydW5uZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBY2NlcHRhbmNlUnVubmVyKHtyZW1vdmVEaXJlY3Rvcnl9KSB7XG4gIHJldHVybiBhc3luYyAoaW5wdXQpID0+IGF3YWl0IHJ1bkFjY2VwdGFuY2VTdGFnZXNXaXRoRGVwZW5kZW5jaWVzKGlucHV0LCByZW1vdmVEaXJlY3RvcnkpXG59XG5cbi8qKlxuICogUnVucyBhY2NlcHRhbmNlIHdpdGggZXhhY3QgaW5zdGFuY2Utb3duZWQgZGVwZW5kZW5jaWVzLlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBydW5BY2NlcHRhbmNlU3RhZ2VzPlswXX0gaW5wdXQgLSBBY2NlcHRhbmNlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge3R5cGVvZiBybX0gcmVtb3ZlRGlyZWN0b3J5IC0gSXNvbGF0ZWQtZGlyZWN0b3J5IHJlbW92YWwgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIHJ1bkFjY2VwdGFuY2VTdGFnZXM+fSBDYXB0dXJlZCByZXN1bHRzIGFmdGVyIGNsZWFudXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkFjY2VwdGFuY2VTdGFnZXNXaXRoRGVwZW5kZW5jaWVzKGlucHV0LCByZW1vdmVEaXJlY3RvcnkpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0KSkgaW52YWxpZFJ1bm5lcihcIkFjY2VwdGFuY2UgcmVxdWlyZXMgYSByZXF1ZXN0IG9iamVjdC5cIiwgXCJhY2NlcHRhbmNlXCIpXG4gIGNvbnN0IGFydGlmYWN0cyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldH0gKi8gKGlucHV0LmFydGlmYWN0cylcbiAgY29uc3QgZW52aXJvbm1lbnQgPSAvKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSAqLyAoXG4gICAgaW5wdXQuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCA/IHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfSA6IGlucHV0LmVudmlyb25tZW50KVxuICBjb25zdCBzdGFnZXMgPSAvKiogQHR5cGUge3thcmd1bWVudHM6IHN0cmluZ1tdLCBzdGFnZTogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2UsIHRvb2w6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbn1bXX0gKi8gKGlucHV0LnN0YWdlcylcbiAgY29uc3QgdGFyZ2V0ID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpbnB1dC50YXJnZXQpXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoaW5wdXQudGltZW91dE1zID09PSB1bmRlZmluZWQgPyAxMF8wMDAgOiBpbnB1dC50aW1lb3V0TXMpXG4gIGNvbnN0IHJlcXVlc3QgPSB2YWxpZGF0ZVJlcXVlc3Qoe2FydGlmYWN0cywgZW52aXJvbm1lbnQsIHN0YWdlcywgdGFyZ2V0LCB0aW1lb3V0TXN9KVxuICBjb25zdCBkaXJlY3RvcnkgPSBhd2FpdCBjcmVhdGVBY2NlcHRhbmNlRGlyZWN0b3J5KHJlcXVlc3QudGFyZ2V0KVxuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGxldCBwcmltYXJ5RmFpbHVyZVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVJlc3VsdCB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHJlc3VsdFxuICBsZXQgcHJpbWFyeUZhaWxlZCA9IGZhbHNlXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBtYXRlcmlhbGl6ZUFydGlmYWN0cyhyZXF1ZXN0LmFydGlmYWN0cywgZGlyZWN0b3J5LCByZXF1ZXN0LnRhcmdldClcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VSZXN1bHRbXX0gKi9cbiAgICBjb25zdCByZXN1bHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgcmVxdWVzdC5zdGFnZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgICAgICBhcmd1bWVudHM6IHN0YWdlLmFyZ3VtZW50cyxcbiAgICAgICAgICBjd2Q6IGRpcmVjdG9yeSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogcmVxdWVzdC5lbnZpcm9ubWVudCxcbiAgICAgICAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgICAgICAgbWF4QnVmZmVyOiBhY2NlcHRhbmNlTWF4QnVmZmVyLFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxdWVzdC50aW1lb3V0TXNcbiAgICAgICAgfSlcblxuICAgICAgICByZXN1bHRzLnB1c2goT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgYXJndW1lbnRzOiBPYmplY3QuZnJlZXplKFsuLi5zdGFnZS5hcmd1bWVudHNdKSxcbiAgICAgICAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgICAgICAgc3RhZ2U6IHN0YWdlLnN0YWdlLFxuICAgICAgICAgIHN0ZGVycjogcmVzdWx0LnN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgdmVyc2lvbjogc3RhZ2UudG9vbC52ZXJzaW9uXG4gICAgICAgIH0pKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgcHJvY2Vzc0RpYWdub3N0aWMoZXJyb3IsIHN0YWdlLCByZXF1ZXN0LnRhcmdldCwgcmVxdWVzdC50aW1lb3V0TXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0ID0gT2JqZWN0LmZyZWV6ZSh7ZGlyZWN0b3J5LCBzdGFnZXM6IE9iamVjdC5mcmVlemUocmVzdWx0cyksIHRhcmdldDogcmVxdWVzdC50YXJnZXR9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW1hcnlGYWlsZWQgPSB0cnVlXG4gICAgcHJpbWFyeUZhaWx1cmUgPSBlcnJvclxuICB9XG5cbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBsZXQgY2xlYW51cEZhaWx1cmVcbiAgbGV0IGNsZWFudXBGYWlsZWQgPSBmYWxzZVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVtb3ZlQWNjZXB0YW5jZURpcmVjdG9yeShkaXJlY3RvcnksIHJlcXVlc3QudGFyZ2V0LCByZW1vdmVEaXJlY3RvcnkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2xlYW51cEZhaWxlZCA9IHRydWVcbiAgICBjbGVhbnVwRmFpbHVyZSA9IGVycm9yXG4gIH1cblxuICBpZiAocHJpbWFyeUZhaWxlZCAmJiBjbGVhbnVwRmFpbGVkICYmIHByaW1hcnlGYWlsdXJlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBwcmVzZXJ2ZVByaW1hcnlGYWlsdXJlKHByaW1hcnlGYWlsdXJlLCBjbGVhbnVwRmFpbHVyZSwgcmVxdWVzdC50YXJnZXQpXG4gIH1cbiAgaWYgKHByaW1hcnlGYWlsZWQpIHRocm93IHByaW1hcnlGYWlsdXJlXG4gIGlmIChjbGVhbnVwRmFpbGVkKSB0aHJvdyBjbGVhbnVwRmFpbHVyZVxuXG4gIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVJlc3VsdH0gKi8gKHJlc3VsdClcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIGRldGFjaGVzIGEgc3RhZ2VkIGFjY2VwdGFuY2UgcmVxdWVzdCBiZWZvcmUgZmlsZXN5c3RlbSBtdXRhdGlvbi5cbiAqIEBwYXJhbSB7e1xuICogICBhcnRpZmFjdHM6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RTZXQsXG4gKiAgIGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PixcbiAqICAgc3RhZ2VzOiB7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlLCB0b29sOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW59W10sXG4gKiAgIHRhcmdldDogc3RyaW5nLFxuICogICB0aW1lb3V0TXM6IG51bWJlclxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGFydGlmYWN0czogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldCxcbiAqICAgZW52aXJvbm1lbnQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICogICBzdGFnZXM6IHthcmd1bWVudHM6IHN0cmluZ1tdLCBzdGFnZTogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2UsIHRvb2w6IFJlYWRvbmx5PHtleGVjdXRhYmxlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+fVtdLFxuICogICB0YXJnZXQ6IHN0cmluZyxcbiAqICAgdGltZW91dE1zOiBudW1iZXJcbiAqIH19IFZhbGlkYXRlZCByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlcXVlc3QoaW5wdXQpIHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGlucHV0LnRhcmdldCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LnRhcmdldC5sZW5ndGggPT0gMCB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgICAgIWlzRGVuc2VBcnJheShpbnB1dC5zdGFnZXMpIHx8IGlucHV0LnN0YWdlcy5sZW5ndGggPT0gMCkge1xuICAgICAgaW52YWxpZFJ1bm5lcihgQWNjZXB0YW5jZSByZXF1aXJlcyBhIHRhcmdldCwgdGltZW91dCBmcm9tIDEgdGhyb3VnaCAke21heGltdW1UaW1lb3V0TXN9bXMsIGFuZCBub24tZW1wdHkgb3JkZXJlZCBzdGFnZXMuYCwgaW5wdXQudGFyZ2V0KVxuICAgIH1cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBjcmVhdGVHZW5lcmF0ZWRBcnRpZmFjdFNldChpbnB1dC5hcnRpZmFjdHMpXG5cbiAgICBpZiAoYXJ0aWZhY3RzLnRhcmdldCAhPSBpbnB1dC50YXJnZXQpIGludmFsaWRSdW5uZXIoXCJBY2NlcHRhbmNlIHRhcmdldCBtdXN0IG1hdGNoIHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3Qtc2V0IHRhcmdldC5cIiwgaW5wdXQudGFyZ2V0KVxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KVxuICAgIGxldCBwcmV2aW91c0luZGV4ID0gLTFcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHt7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlLCB0b29sOiBSZWFkb25seTx7ZXhlY3V0YWJsZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn1bXX0gKi9cbiAgICBjb25zdCBzdGFnZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgc3RhZ2VQb3NpdGlvbiA9IDA7IHN0YWdlUG9zaXRpb24gPCBpbnB1dC5zdGFnZXMubGVuZ3RoOyBzdGFnZVBvc2l0aW9uICs9IDEpIHtcbiAgICAgIGNvbnN0IHN0YWdlID0gaW5wdXQuc3RhZ2VzW3N0YWdlUG9zaXRpb25dXG5cbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChzdGFnZSkpIGludmFsaWRSdW5uZXIoXCJBY2NlcHRhbmNlIHN0YWdlcyBtdXN0IGJlIGRpc3RpbmN0IGtub3duIHN0YWdlIHJlY29yZHMuXCIsIGlucHV0LnRhcmdldClcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9IHN0YWdlLnN0YWdlXG5cbiAgICAgIGlmICh0eXBlb2Ygc3RhZ2VOYW1lICE9IFwic3RyaW5nXCIgfHwgIXN0YWdlSW5kZXhlcy5oYXMoc3RhZ2VOYW1lKSB8fCBzZWVuLmhhcyhzdGFnZU5hbWUpKSB7XG4gICAgICAgIGludmFsaWRSdW5uZXIoXCJBY2NlcHRhbmNlIHN0YWdlcyBtdXN0IGJlIGRpc3RpbmN0IGtub3duIHN0YWdlIHJlY29yZHMuXCIsIGlucHV0LnRhcmdldClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChzdGFnZUluZGV4ZXMuZ2V0KHN0YWdlTmFtZSkpXG5cbiAgICAgIGlmIChpbmRleCA8IHByZXZpb3VzSW5kZXgpIGludmFsaWRSdW5uZXIoXCJBY2NlcHRhbmNlIHN0YWdlcyBtdXN0IGZvbGxvdyBwYXJzZS10by1leGVjdXRlIG9yZGVyLlwiLCBpbnB1dC50YXJnZXQpXG4gICAgICBwcmV2aW91c0luZGV4ID0gaW5kZXhcbiAgICAgIHNlZW4uYWRkKHN0YWdlTmFtZSlcbiAgICAgIGNvbnN0IGFyZ3VtZW50Q2FuZGlkYXRlID0gc3RhZ2UuYXJndW1lbnRzXG4gICAgICBjb25zdCBzdGFnZUFyZ3VtZW50cyA9IGlzRGVuc2VBcnJheShhcmd1bWVudENhbmRpZGF0ZSkgPyBbLi4uYXJndW1lbnRDYW5kaWRhdGVdIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCB0b29sQ2FuZGlkYXRlID0gc3RhZ2UudG9vbFxuICAgICAgY29uc3QgdG9vbCA9IGlzUGxhaW5PYmplY3QodG9vbENhbmRpZGF0ZSkgPyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgZXhlY3V0YWJsZTogdG9vbENhbmRpZGF0ZS5leGVjdXRhYmxlLFxuICAgICAgICBpZDogdG9vbENhbmRpZGF0ZS5pZCxcbiAgICAgICAgc291cmNlOiB0b29sQ2FuZGlkYXRlLnNvdXJjZSxcbiAgICAgICAgdmVyc2lvbjogdG9vbENhbmRpZGF0ZS52ZXJzaW9uXG4gICAgICB9KSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoc3RhZ2VBcmd1bWVudHMgPT0gdW5kZWZpbmVkIHx8ICFzdGFnZUFyZ3VtZW50cy5ldmVyeSgoYXJndW1lbnQpID0+IHR5cGVvZiBhcmd1bWVudCA9PSBcInN0cmluZ1wiICYmICFhcmd1bWVudC5pbmNsdWRlcyhcIlxcMFwiKSkgfHxcbiAgICAgICAgIWlzVG9vbCh0b29sKSkgaW52YWxpZFJ1bm5lcihgQWNjZXB0YW5jZSBzdGFnZSAnJHtzdGFnZU5hbWV9JyBoYXMgYW4gaW52YWxpZCB0b29sIG9yIGFyZ3VtZW50IGFycmF5LmAsIGlucHV0LnRhcmdldClcblxuICAgICAgc3RhZ2VzLnB1c2goT2JqZWN0LmZyZWV6ZSh7YXJndW1lbnRzOiBzdGFnZUFyZ3VtZW50cywgc3RhZ2U6IHN0YWdlTmFtZSwgdG9vbH0pKVxuICAgIH1cblxuICAgIHJldHVybiB7YXJ0aWZhY3RzLCBlbnZpcm9ubWVudCwgc3RhZ2VzLCB0YXJnZXQ6IGlucHV0LnRhcmdldCwgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0TXN9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VtYW50aWZvbGREaWFnbm9zdGljICYmIGVycm9yLmNvZGUgPT0gXCJJTlZBTElEX0FDQ0VQVEFOQ0VfUlVOTkVSXCIpIHRocm93IGVycm9yXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VtYW50aWZvbGREaWFnbm9zdGljKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICBjb2RlOiBcIklOVkFMSURfQUNDRVBUQU5DRV9SVU5ORVJcIixcbiAgICAgICAgbGFuZ3VhZ2U6IHR5cGVvZiBpbnB1dC50YXJnZXQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LnRhcmdldCA6IFwiYWNjZXB0YW5jZVwiLFxuICAgICAgICBtZXNzYWdlOiBgQWNjZXB0YW5jZSBydW5uZXIgaW5wdXQgaXMgaW52YWxpZDogJHtlcnJvci5kZXRhaWx9YFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW52YWxpZFJ1bm5lcihcIkFjY2VwdGFuY2UgcnVubmVyIGlucHV0IGlzIGludmFsaWQuXCIsIHR5cGVvZiBpbnB1dC50YXJnZXQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LnRhcmdldCA6IFwiYWNjZXB0YW5jZVwiLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzdWJwcm9jZXNzIGZhaWx1cmUgd2l0aCBleGFjdCBzdGFnZSBhbmQgdG9vbGNoYWluIGNvbnRleHQuXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIC0gU3VicHJvY2VzcyByZWplY3Rpb24uXG4gKiBAcGFyYW0ge3thcmd1bWVudHM6IHN0cmluZ1tdLCBzdGFnZTogc3RyaW5nLCB0b29sOiBSZWFkb25seTx7ZXhlY3V0YWJsZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn19IHN0YWdlIC0gRmFpbGVkIHN0YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFjY2VwdGFuY2UgdGFyZ2V0LlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRNcyAtIENvbmZpZ3VyZWQgc3RhZ2UgdGltZW91dC5cbiAqIEByZXR1cm5zIHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IE5vcm1hbGl6ZWQgZmFpbHVyZS5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0RpYWdub3N0aWMoZXJyb3IsIHN0YWdlLCB0YXJnZXQsIHRpbWVvdXRNcykge1xuICBjb25zdCBmaWVsZHMgPSBwcm9jZXNzRXJyb3JGaWVsZHMoZXJyb3IpXG4gIGNvbnN0IG91dHB1dExpbWl0ZWQgPSBmaWVsZHMubmF0aXZlQ29kZSA9PSBcIkVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUlwiXG4gIGNvbnN0IHRpbWVkT3V0ID0gIW91dHB1dExpbWl0ZWQgJiYgZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKVxuICBjb25zdCBsYXVuY2hGYWlsdXJlID0gZmllbGRzLm5hdGl2ZUNvZGUgIT0gdW5kZWZpbmVkICYmIGxhdW5jaEVycm9yQ29kZXMuaGFzKGZpZWxkcy5uYXRpdmVDb2RlKVxuICBjb25zdCBzaWduYWxlZCA9ICFvdXRwdXRMaW1pdGVkICYmICF0aW1lZE91dCAmJiBmaWVsZHMuc2lnbmFsICE9IHVuZGVmaW5lZFxuICBjb25zdCBjb2RlID0gb3V0cHV0TGltaXRlZCA/IFwiQUNDRVBUQU5DRV9PVVRQVVRfTElNSVRcIiA6IHRpbWVkT3V0ID8gXCJBQ0NFUFRBTkNFX1RJTUVPVVRcIiA6IGxhdW5jaEZhaWx1cmUgPyBcIkFDQ0VQVEFOQ0VfTEFVTkNIX0ZBSUxVUkVcIiA6IHNpZ25hbGVkXG4gICAgPyBcIkFDQ0VQVEFOQ0VfU0lHTkFMXCJcbiAgICA6IFwiQUNDRVBUQU5DRV9OT05aRVJPX0VYSVRcIlxuICBjb25zdCByZWFzb24gPSBvdXRwdXRMaW1pdGVkID8gYGV4Y2VlZGVkIHRoZSAke2FjY2VwdGFuY2VNYXhCdWZmZXJ9LWJ5dGUgb3V0cHV0IGNhcHR1cmUgbGltaXQgKCR7ZmllbGRzLm5hdGl2ZUNvZGV9KWAgOiB0aW1lZE91dFxuICAgID8gYHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRNc31tc2AgOiBsYXVuY2hGYWlsdXJlXG4gICAgPyBgY291bGQgbm90IGxhdW5jaCAoJHtmaWVsZHMubmF0aXZlQ29kZX0pYFxuICAgIDogc2lnbmFsZWQgPyBgdGVybWluYXRlZCBieSBzaWduYWwgJHtmaWVsZHMuc2lnbmFsfWBcbiAgICA6IGZpZWxkcy5leGl0Q29kZSAhPSB1bmRlZmluZWQgPyBgZXhpdGVkIG5vbnplcm8gKCR7ZmllbGRzLmV4aXRDb2RlfSlgXG4gICAgOiBgZmFpbGVkIGFmdGVyIGxhdW5jaCAoJHtmaWVsZHMubmF0aXZlQ29kZSA/PyBcInVua25vd25cIn0pYFxuXG4gIHJldHVybiBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogb3V0cHV0TGltaXRlZCA/IHVuZGVmaW5lZCA6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICBjb2RlLFxuICAgIGV4ZWN1dGFibGU6IHN0YWdlLnRvb2wuZXhlY3V0YWJsZSxcbiAgICBleGl0Q29kZTogZmllbGRzLmV4aXRDb2RlLFxuICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgbWVzc2FnZTogYEFjY2VwdGFuY2Ugc3RhZ2UgJyR7c3RhZ2Uuc3RhZ2V9JyAke3JlYXNvbn0gdXNpbmcgJyR7c3RhZ2UudG9vbC5leGVjdXRhYmxlfScgKCR7c3RhZ2UudG9vbC52ZXJzaW9ufSkuYCxcbiAgICBzaWduYWw6IGZpZWxkcy5zaWduYWwsXG4gICAgc3RhZ2U6IHN0YWdlLnN0YWdlLFxuICAgIHN0ZGVycjogZmllbGRzLnN0ZGVycixcbiAgICBzdGRvdXQ6IGZpZWxkcy5zdGRvdXQsXG4gICAgdmVyc2lvbjogc3RhZ2UudG9vbC52ZXJzaW9uXG4gIH0pXG59XG5cbi8qKlxuICogTmFycm93cyB0aGUgc3RhYmxlIGZpZWxkcyBvZiBhbiBvcGFxdWUgY2hpbGQtcHJvY2VzcyBmYWlsdXJlLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHJldHVybnMge3tleGl0Q29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBuYXRpdmVDb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNpZ25hbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGRlcnI6IHN0cmluZywgc3Rkb3V0OiBzdHJpbmd9fSBTdGFibGUgZmllbGRzLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzRXJyb3JGaWVsZHMoZXJyb3IpIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT0gXCJvYmplY3RcIikgcmV0dXJuIHtleGl0Q29kZTogdW5kZWZpbmVkLCBuYXRpdmVDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG4gIGNvbnN0IG5hdGl2ZUNvZGUgPSB0eXBlb2YgdmFsdWUuY29kZSA9PSBcInN0cmluZ1wiID8gdmFsdWUuY29kZSA6IHVuZGVmaW5lZFxuICBjb25zdCBvdXRwdXRMaW1pdGVkID0gbmF0aXZlQ29kZSA9PSBcIkVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUlwiXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgbmF0aXZlQ29kZSxcbiAgICBzaWduYWw6IHR5cGVvZiB2YWx1ZS5zaWduYWwgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNpZ25hbCA6IHVuZGVmaW5lZCxcbiAgICBzdGRlcnI6ICFvdXRwdXRMaW1pdGVkICYmIHR5cGVvZiB2YWx1ZS5zdGRlcnIgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnN0ZGVyciA6IFwiXCIsXG4gICAgc3Rkb3V0OiAhb3V0cHV0TGltaXRlZCAmJiB0eXBlb2YgdmFsdWUuc3Rkb3V0ID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRvdXQgOiBcIlwiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGRpc2NvdmVyZWQtdG9vbCBmaWVsZHMgY29uc3VtZWQgYnkgdGhlIHJ1bm5lci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdG9vbC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW59IFdoZXRoZXIgdGhlIHRvb2wgY29udHJhY3QgaXMgcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gaXNUb29sKHZhbHVlKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUuaWQgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUuZXhlY3V0YWJsZSA9PSBcInN0cmluZ1wiICYmIHBhdGguaXNBYnNvbHV0ZSh2YWx1ZS5leGVjdXRhYmxlKSAmJlxuICAgICF2YWx1ZS5leGVjdXRhYmxlLmluY2x1ZGVzKFwiXFwwXCIpICYmIHR5cGVvZiB2YWx1ZS52ZXJzaW9uID09IFwic3RyaW5nXCIgJiYgdmFsdWUudmVyc2lvbi5sZW5ndGggPiAwICYmXG4gICAgKHZhbHVlLnNvdXJjZSA9PSBcImNhbm9uaWNhbFwiIHx8IHZhbHVlLnNvdXJjZSA9PSBcIm92ZXJyaWRlXCIpXG59XG5cbi8qKlxuICogS2VlcHMgdGhlIHByaW1hcnkgYWNjZXB0YW5jZSBlcnJvciB3aGlsZSByZWNvcmRpbmcgYm91bmRlZCBjbGVhbnVwIGV2aWRlbmNlIGluIGl0cyBjYXVzZSBjaGFpbi5cbiAqIEBwYXJhbSB7RXJyb3J9IHByaW1hcnlGYWlsdXJlIC0gT3JpZ2luYWwgbWF0ZXJpYWxpemF0aW9uIG9yIHN0YWdlIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3Vua25vd259IGNsZWFudXBGYWlsdXJlIC0gQ2xlYW51cCByZWplY3Rpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQWNjZXB0YW5jZSB0YXJnZXQuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBvcmlnaW5hbCBwcmltYXJ5IGVycm9yIHdpdGggc3RydWN0dXJlZCBjbGVhbnVwIGV2aWRlbmNlLlxuICovXG5mdW5jdGlvbiBwcmVzZXJ2ZVByaW1hcnlGYWlsdXJlKHByaW1hcnlGYWlsdXJlLCBjbGVhbnVwRmFpbHVyZSwgdGFyZ2V0KSB7XG4gIGNvbnN0IGNsZWFudXBFdmlkZW5jZSA9IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiQUNDRVBUQU5DRV9DTEVBTlVQX0ZBSUxVUkVcIixcbiAgICBsYW5ndWFnZTogY2xlYW51cEZhaWx1cmUgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMgPyBjbGVhbnVwRmFpbHVyZS5sYW5ndWFnZSA6IHRhcmdldCxcbiAgICBtZXNzYWdlOiBcIklzb2xhdGVkIGFjY2VwdGFuY2UtZGlyZWN0b3J5IGNsZWFudXAgZmFpbGVkIGFmdGVyIHRoZSBwcmltYXJ5IGFjY2VwdGFuY2UgZmFpbHVyZS5cIlxuICB9KVxuICBjb25zdCBjYXVzZXMgPSBwcmltYXJ5RmFpbHVyZS5jYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gW3ByaW1hcnlGYWlsdXJlLmNhdXNlLCBjbGVhbnVwRXZpZGVuY2VdIDogW2NsZWFudXBFdmlkZW5jZV1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJpbWFyeUZhaWx1cmUsIFwiY2F1c2VcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogbmV3IEFnZ3JlZ2F0ZUVycm9yKGNhdXNlcywgXCJBY2NlcHRhbmNlIGZhaWxlZCBhbmQgaXNvbGF0ZWQtZGlyZWN0b3J5IGNsZWFudXAgYWxzbyBmYWlsZWQuXCIpLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pXG5cbiAgcmV0dXJuIHByaW1hcnlGYWlsdXJlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBydW5uZXItY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGFyZ2V0IC0gQ2FuZGlkYXRlIHRhcmdldCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gW2Vycm9yXSAtIFByZXNlcnZlZCBjYXVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFJ1bm5lcihtZXNzYWdlLCB0YXJnZXQsIGVycm9yKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgY29kZTogXCJJTlZBTElEX0FDQ0VQVEFOQ0VfUlVOTkVSXCIsXG4gICAgbGFuZ3VhZ2U6IHR5cGVvZiB0YXJnZXQgPT0gXCJzdHJpbmdcIiAmJiB0YXJnZXQubGVuZ3RoID4gMCA/IHRhcmdldCA6IFwiYWNjZXB0YW5jZVwiLFxuICAgIG1lc3NhZ2VcbiAgfSlcbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgaXNvbGF0ZWQgYWNjZXB0YW5jZSBkaXJlY3Rvcnkgd2l0aCBhIG5vcm1hbGl6ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJlY3RvcnkgLSBFeGFjdCB0ZW1wb3JhcnkgZGlyZWN0b3J5LlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFjY2VwdGFuY2UgdGFyZ2V0LlxuICogQHBhcmFtIHt0eXBlb2Ygcm19IHJlbW92ZURpcmVjdG9yeSAtIEluc3RhbmNlLW93bmVkIHJlbW92YWwgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENsZWFudXAgY29tcGxldGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQWNjZXB0YW5jZURpcmVjdG9yeShkaXJlY3RvcnksIHRhcmdldCwgcmVtb3ZlRGlyZWN0b3J5KSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeSwge2ZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWV9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY2F1c2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgIGNvZGU6IFwiQUNDRVBUQU5DRV9DTEVBTlVQX0ZBSUxVUkVcIixcbiAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHJlbW92ZSBpc29sYXRlZCBhY2NlcHRhbmNlIGRpcmVjdG9yeSAnJHtkaXJlY3Rvcnl9Jy5gXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgb25lIGlzb2xhdGVkIGFjY2VwdGFuY2UgZGlyZWN0b3J5IHdpdGggYSBub3JtYWxpemVkIHNldHVwIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQWNjZXB0YW5jZSB0YXJnZXQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBFeGFjdCB0ZW1wb3JhcnkgZGlyZWN0b3J5LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBY2NlcHRhbmNlRGlyZWN0b3J5KHRhcmdldCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJzZW1hbnRpZm9sZC1hY2NlcHRhbmNlLVwiKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICBjb2RlOiBcIkFDQ0VQVEFOQ0VfU0VUVVBfRkFJTFVSRVwiLFxuICAgICAgbGFuZ3VhZ2U6IHRhcmdldCxcbiAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIGNyZWF0ZSBhbiBpc29sYXRlZCBhY2NlcHRhbmNlIGRpcmVjdG9yeS5cIlxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgb25seSB0aGUgYWxyZWFkeS12YWxpZGF0ZWQgZ2VuZXJhdGVkIGFydGlmYWN0cyBpbnRvIHRoZSBpc29sYXRlZCBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGFydGlmYWN0cyAtIENvbXBsZXRlIHZhbGlkYXRlZCBzZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0b3J5IC0gRXhhY3QgdGVtcG9yYXJ5IGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBY2NlcHRhbmNlIHRhcmdldC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBNYXRlcmlhbGl6YXRpb24gY29tcGxldGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWF0ZXJpYWxpemVBcnRpZmFjdHMoYXJ0aWZhY3RzLCBkaXJlY3RvcnksIHRhcmdldCkge1xuICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGFydGlmYWN0cy5hcnRpZmFjdHMpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihkaXJlY3RvcnksIC4uLmFydGlmYWN0LnBhdGguc3BsaXQoXCIvXCIpKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShmaWxlbmFtZSksIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVuYW1lLCBhcnRpZmFjdC5jb250ZW50KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY2F1c2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29kZTogXCJBQ0NFUFRBTkNFX01BVEVSSUFMSVpBVElPTl9GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gbWF0ZXJpYWxpemUgZ2VuZXJhdGVkIGFydGlmYWN0ICcke2FydGlmYWN0LnBhdGh9Jy5gXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ /** Canonical C17 support header; native ownership never enters semantic IR. */
2
+ export declare const cRuntimeHeader = "#ifndef SEMANTIFOLD_RUNTIME_H\n#define SEMANTIFOLD_RUNTIME_H\n\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <limits.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n_Static_assert(CHAR_BIT == 8, \"Semantifold requires eight-bit bytes\");\n_Static_assert(sizeof(int64_t) == 8, \"Semantifold requires exact int64_t\");\n_Static_assert(sizeof(size_t) == 8 && PTRDIFF_MAX == INT64_MAX, \"Semantifold requires the qualified 64-bit ABI\");\n\ntypedef struct {\n const unsigned char *data;\n size_t length;\n} SemantifoldString;\n\n#define SEMANTIFOLD_STRING(literal) ((SemantifoldString){(const unsigned char *)(literal), sizeof(literal) - 1})\n\ntypedef struct SemantifoldAllocation {\n struct SemantifoldAllocation *next;\n unsigned char data[];\n} SemantifoldAllocation;\n\n_Static_assert(sizeof(SemantifoldAllocation) == 8, \"Semantifold requires the qualified arena metadata size\");\n\nstatic SemantifoldAllocation *semantifold_arena = NULL;\nstatic size_t semantifold_arena_bytes = 0;\n\nstatic inline void semantifold_cleanup(void) {\n while (semantifold_arena != NULL) {\n SemantifoldAllocation *allocation = semantifold_arena;\n semantifold_arena = allocation->next;\n free(allocation);\n }\n semantifold_arena_bytes = 0;\n}\n\n_Noreturn static inline void semantifold_fatal(const char *message, size_t length) {\n semantifold_cleanup();\n (void)fwrite(message, 1, length, stderr);\n exit(70);\n}\n\nstatic inline int64_t semantifold_integer_add(int64_t left, int64_t right) {\n int64_t result;\n if (__builtin_add_overflow(left, right, &result)) {\n semantifold_fatal(\"semantifold: integer overflow\\n\", sizeof(\"semantifold: integer overflow\\n\") - 1);\n }\n return result;\n}\n\nstatic inline int64_t semantifold_integer_subtract(int64_t left, int64_t right) {\n int64_t result;\n if (__builtin_sub_overflow(left, right, &result)) {\n semantifold_fatal(\"semantifold: integer overflow\\n\", sizeof(\"semantifold: integer overflow\\n\") - 1);\n }\n return result;\n}\n\nstatic inline int64_t semantifold_integer_multiply(int64_t left, int64_t right) {\n int64_t result;\n if (__builtin_mul_overflow(left, right, &result)) {\n semantifold_fatal(\"semantifold: integer overflow\\n\", sizeof(\"semantifold: integer overflow\\n\") - 1);\n }\n return result;\n}\n\nstatic inline int64_t semantifold_integer_negate(int64_t value) {\n return semantifold_integer_subtract(INT64_C(0), value);\n}\n\nstatic inline size_t semantifold_allocation_size(size_t left, size_t right) {\n const size_t maximum = (size_t)PTRDIFF_MAX;\n if (left > maximum || right > maximum - left ||\n left + right > maximum - sizeof(SemantifoldAllocation)) {\n semantifold_fatal(\"semantifold: allocation size\\n\", sizeof(\"semantifold: allocation size\\n\") - 1);\n }\n const size_t size = sizeof(SemantifoldAllocation) + left + right;\n if (semantifold_arena_bytes > maximum - size) {\n semantifold_fatal(\"semantifold: allocation size\\n\", sizeof(\"semantifold: allocation size\\n\") - 1);\n }\n return size;\n}\n\nstatic inline SemantifoldString semantifold_string_concat(SemantifoldString left, SemantifoldString right) {\n const size_t size = semantifold_allocation_size(left.length, right.length);\n SemantifoldAllocation *allocation = malloc(size);\n if (allocation == NULL) {\n semantifold_fatal(\"semantifold: allocation failure\\n\", sizeof(\"semantifold: allocation failure\\n\") - 1);\n }\n allocation->next = semantifold_arena;\n semantifold_arena = allocation;\n semantifold_arena_bytes += size;\n if (left.length != 0) (void)memcpy(allocation->data, left.data, left.length);\n if (right.length != 0) (void)memcpy(allocation->data + left.length, right.data, right.length);\n return (SemantifoldString){allocation->data, left.length + right.length};\n}\n\nstatic inline bool semantifold_string_equal(SemantifoldString left, SemantifoldString right) {\n return left.length == right.length && (left.length == 0 || memcmp(left.data, right.data, left.length) == 0);\n}\n\nstatic inline bool semantifold_string_not_equal(SemantifoldString left, SemantifoldString right) {\n return !semantifold_string_equal(left, right);\n}\n\nstatic inline void semantifold_write(const unsigned char *data, size_t length) {\n if (length != 0 && fwrite(data, 1, length, stdout) != length) {\n semantifold_fatal(\"semantifold: output failure\\n\", sizeof(\"semantifold: output failure\\n\") - 1);\n }\n}\n\nstatic inline void semantifold_newline(void) {\n semantifold_write((const unsigned char *)\"\\n\", 1);\n if (fflush(stdout) != 0) semantifold_fatal(\"semantifold: output failure\\n\", sizeof(\"semantifold: output failure\\n\") - 1);\n}\n\nstatic inline void semantifold_print_string(SemantifoldString value) {\n semantifold_write(value.data, value.length);\n semantifold_newline();\n}\n\nstatic inline void semantifold_print_boolean(bool value) {\n if (value) semantifold_write((const unsigned char *)\"true\", 4);\n else semantifold_write((const unsigned char *)\"false\", 5);\n semantifold_newline();\n}\n\nstatic inline void semantifold_print_integer(int64_t value) {\n unsigned char digits[20];\n size_t position = sizeof(digits);\n uint64_t magnitude = (uint64_t)value;\n if (value < 0) magnitude = UINT64_C(0) - magnitude;\n do {\n digits[--position] = (unsigned char)(UINT64_C(48) + magnitude % UINT64_C(10));\n magnitude /= UINT64_C(10);\n } while (magnitude != 0);\n if (value < 0) digits[--position] = (unsigned char)45;\n semantifold_write(digits + position, sizeof(digits) - position);\n semantifold_newline();\n}\n\n#endif\n";
3
+ //# sourceMappingURL=c-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c-runtime.d.ts","sourceRoot":"","sources":["../../../src/backends/c-runtime.js"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,eAAO,MAAM,cAAc,2sLAmJ1B,CAAA"}