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.
- package/README.md +37 -12
- package/build/index.js +2 -2
- package/build/src/acceptance.d.ts +10 -0
- package/build/src/acceptance.d.ts.map +1 -1
- package/build/src/acceptance.js +24 -5
- package/build/src/backends/c-runtime.d.ts +3 -0
- package/build/src/backends/c-runtime.d.ts.map +1 -0
- package/build/src/backends/c-runtime.js +151 -0
- package/build/src/backends/c-validation.d.ts +12 -0
- package/build/src/backends/c-validation.d.ts.map +1 -0
- package/build/src/backends/c-validation.js +85 -0
- package/build/src/backends/c.d.ts +31 -0
- package/build/src/backends/c.d.ts.map +1 -0
- package/build/src/backends/c.js +308 -0
- package/build/src/backends/cpp-runtime.d.ts +3 -0
- package/build/src/backends/cpp-runtime.d.ts.map +1 -0
- package/build/src/backends/cpp-runtime.js +99 -0
- package/build/src/backends/cpp-validation.d.ts +9 -0
- package/build/src/backends/cpp-validation.d.ts.map +1 -0
- package/build/src/backends/cpp-validation.js +74 -0
- package/build/src/backends/cpp.d.ts +16 -0
- package/build/src/backends/cpp.d.ts.map +1 -0
- package/build/src/backends/cpp.js +285 -0
- package/build/src/backends/csharp.d.ts +20 -0
- package/build/src/backends/csharp.d.ts.map +1 -0
- package/build/src/backends/csharp.js +259 -0
- package/build/src/backends/go.d.ts +20 -0
- package/build/src/backends/go.d.ts.map +1 -0
- package/build/src/backends/go.js +374 -0
- package/build/src/backends/identifiers.d.ts +12 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +71 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +9 -1
- package/build/src/backends/native-validation.d.ts +9 -0
- package/build/src/backends/native-validation.d.ts.map +1 -0
- package/build/src/backends/native-validation.js +59 -0
- package/build/src/backends/ordered-expressions.d.ts +74 -0
- package/build/src/backends/ordered-expressions.d.ts.map +1 -0
- package/build/src/backends/ordered-expressions.js +159 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +7 -2
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +59 -14
- package/build/src/frontends/c-parser.d.ts +20 -0
- package/build/src/frontends/c-parser.d.ts.map +1 -0
- package/build/src/frontends/c-parser.js +14 -0
- package/build/src/frontends/c.d.ts +220 -0
- package/build/src/frontends/c.d.ts.map +1 -0
- package/build/src/frontends/c.js +750 -0
- package/build/src/frontends/cpp-parser.d.ts +11 -0
- package/build/src/frontends/cpp-parser.d.ts.map +1 -0
- package/build/src/frontends/cpp-parser.js +15 -0
- package/build/src/frontends/cpp.d.ts +227 -0
- package/build/src/frontends/cpp.d.ts.map +1 -0
- package/build/src/frontends/cpp.js +784 -0
- package/build/src/frontends/csharp.d.ts +14 -0
- package/build/src/frontends/csharp.d.ts.map +1 -0
- package/build/src/frontends/csharp.js +708 -0
- package/build/src/frontends/go.d.ts +15 -0
- package/build/src/frontends/go.d.ts.map +1 -0
- package/build/src/frontends/go.js +712 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +16 -1
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +51 -2
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +4 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +3 -3
- package/build/src/subprocess.d.ts +10 -1
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +29 -3
- package/build/src/toolchains.d.ts +24 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +6 -2
- package/docs/architecture.md +20 -6
- package/docs/c.md +60 -0
- package/docs/cpp.md +61 -0
- package/docs/goals.md +4 -2
- package/docs/language-support.md +27 -8
- package/docs/parser-qualification.md +153 -4
- package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
- package/docs/source-maps.md +11 -5
- package/docs/standard-library-portability.md +190 -0
- package/docs/testing.md +113 -4
- package/index.js +1 -1
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7250 -0
- package/node_modules/node-addon-api/napi.h +3463 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +481 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +88 -0
- package/node_modules/tree-sitter/index.js +950 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +105 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +332 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +425 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +21 -5
- package/src/acceptance.js +25 -4
- package/src/backends/c-runtime.js +151 -0
- package/src/backends/c-validation.js +83 -0
- package/src/backends/c.js +308 -0
- package/src/backends/cpp-runtime.js +99 -0
- package/src/backends/cpp-validation.js +70 -0
- package/src/backends/cpp.js +285 -0
- package/src/backends/csharp.js +270 -0
- package/src/backends/go.js +383 -0
- package/src/backends/identifiers.js +72 -1
- package/src/backends/index.js +7 -0
- package/src/backends/native-validation.js +64 -0
- package/src/backends/ordered-expressions.js +161 -0
- package/src/backends/scalars.js +7 -1
- package/src/backends/shared.js +56 -12
- package/src/frontends/c-parser.js +17 -0
- package/src/frontends/c.js +780 -0
- package/src/frontends/cpp-parser.js +18 -0
- package/src/frontends/cpp.js +816 -0
- package/src/frontends/csharp.js +759 -0
- package/src/frontends/go.js +770 -0
- package/src/frontends/scalars.js +15 -0
- package/src/language-registry.js +52 -1
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +2 -2
- package/src/subprocess.js +31 -2
- package/src/toolchains.js +5 -1
package/build/src/subprocess.js
CHANGED
|
@@ -15,7 +15,25 @@ const deadlineFailures = new WeakSet();
|
|
|
15
15
|
* @param {number} input.timeoutMs - Deadline before termination begins.
|
|
16
16
|
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
17
17
|
*/
|
|
18
|
-
export function executeFileWithDeadline(
|
|
18
|
+
export function executeFileWithDeadline(input) {
|
|
19
|
+
return executeFileWithDeadlineUsing(input, registerChildSpawn);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates an executor whose spawn observation belongs only to that executor instance.
|
|
23
|
+
* @param {object} dependencies - Internal lifecycle dependencies.
|
|
24
|
+
* @param {(child: import("node:child_process").ChildProcess, listener: () => void) => void} dependencies.registerSpawnListener - Registers deadline initialization.
|
|
25
|
+
* @returns {typeof executeFileWithDeadline} Owned subprocess executor.
|
|
26
|
+
*/
|
|
27
|
+
export function createExecuteFileWithDeadline({ registerSpawnListener }) {
|
|
28
|
+
return (input) => executeFileWithDeadlineUsing(input, registerSpawnListener);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Executes with exact instance-owned spawn observation.
|
|
32
|
+
* @param {Parameters<typeof executeFileWithDeadline>[0]} input - Process request.
|
|
33
|
+
* @param {(child: import("node:child_process").ChildProcess, listener: () => void) => void} registerSpawnListener - Registers deadline initialization.
|
|
34
|
+
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
35
|
+
*/
|
|
36
|
+
function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, environment, executable, maxBuffer, timeoutMs }, registerSpawnListener) {
|
|
19
37
|
if (process.platform == "win32") {
|
|
20
38
|
return Promise.reject(Object.assign(new Error("Owned process-tree termination is unavailable on this platform."), {
|
|
21
39
|
code: "ENOTSUP",
|
|
@@ -49,7 +67,7 @@ export function executeFileWithDeadline({ arguments: processArguments, cwd, envi
|
|
|
49
67
|
child.once("error", (error) => {
|
|
50
68
|
launchError = error;
|
|
51
69
|
});
|
|
52
|
-
child
|
|
70
|
+
registerSpawnListener(child, () => {
|
|
53
71
|
if (processGroupId == undefined || !verifyOwnedProcessGroup(processGroupId)) {
|
|
54
72
|
launchError = Object.assign(new Error("Spawned subprocess did not establish its required process group."), { code: "ENOTSUP" });
|
|
55
73
|
child.kill("SIGKILL");
|
|
@@ -134,6 +152,14 @@ export function executeFileWithDeadline({ arguments: processArguments, cwd, envi
|
|
|
134
152
|
}
|
|
135
153
|
});
|
|
136
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Registers production deadline initialization on the child's real spawn event.
|
|
157
|
+
* @param {import("node:child_process").ChildProcess} child - Exact spawned child.
|
|
158
|
+
* @param {() => void} listener - Deadline initialization.
|
|
159
|
+
*/
|
|
160
|
+
function registerChildSpawn(child, listener) {
|
|
161
|
+
child.once("spawn", listener);
|
|
162
|
+
}
|
|
137
163
|
/**
|
|
138
164
|
* Creates one byte-bounded UTF-8 stream capture.
|
|
139
165
|
* @param {number} maximumBytes - Maximum captured bytes.
|
|
@@ -204,4 +230,4 @@ function signalOwnedProcessGroup(processGroupId, signal) {
|
|
|
204
230
|
export function exceededOwnedDeadline(error) {
|
|
205
231
|
return typeof error == "object" && error != null && deadlineFailures.has(error);
|
|
206
232
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUM7SUFDdkgsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyx3REFBd0Q7UUFDeEQsSUFBSSxhQUFhLENBQUE7UUFDakIsd0RBQXdEO1FBQ3hELElBQUksVUFBVSxDQUFBO1FBQ2Qsd0RBQXdEO1FBQ3hELElBQUksU0FBUyxDQUFBO1FBQ2IsZ0NBQWdDO1FBQ2hDLElBQUksV0FBVyxDQUFBO1FBQ2YsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFDNUIsSUFBSSxjQUFjLEdB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QkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDakYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3NwYXdufSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCB7U3RyaW5nRGVjb2Rlcn0gZnJvbSBcIm5vZGU6c3RyaW5nX2RlY29kZXJcIlxuXG5jb25zdCBmb3JjZWRUZXJtaW5hdGlvbkdyYWNlTXMgPSAyNTBcbmNvbnN0IHJldGFpbmVkUGlwZUdyYWNlTXMgPSAyNTBcbmNvbnN0IGRlYWRsaW5lRmFpbHVyZXMgPSBuZXcgV2Vha1NldCgpXG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGV4YWN0IGZpbGUgd2hpbGUgb3duaW5nIGl0cyBjb21wbGV0ZSBib3VuZGVkIGxpZmVjeWNsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IGlucHV0LmFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5jd2RdIC0gV29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBpbnB1dC5lbnZpcm9ubWVudCAtIEV4YWN0IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHBhdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaW5wdXQubWF4QnVmZmVyIC0gTWF4aW11bSBieXRlcyBjYXB0dXJlZCBwZXIgb3V0cHV0IHN0cmVhbS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC50aW1lb3V0TXMgLSBEZWFkbGluZSBiZWZvcmUgdGVybWluYXRpb24gYmVnaW5zLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoe2FyZ3VtZW50czogcHJvY2Vzc0FyZ3VtZW50cywgY3dkLCBlbnZpcm9ubWVudCwgZXhlY3V0YWJsZSwgbWF4QnVmZmVyLCB0aW1lb3V0TXN9KSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZGVhZGxpbmVUaW1lclxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZvcmNlVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBwaXBlVGltZXJcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBsYXVuY2hFcnJvclxuICAgIGxldCBkZWFkbGluZUV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgb3V0cHV0RXhjZWVkZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIGNoaWxkLm9uY2UoXCJzcGF3blwiLCAoKSA9PiB7XG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgPT0gdW5kZWZpbmVkIHx8ICF2ZXJpZnlPd25lZFByb2Nlc3NHcm91cChwcm9jZXNzR3JvdXBJZCkpIHtcbiAgICAgICAgbGF1bmNoRXJyb3IgPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlNwYXduZWQgc3VicHJvY2VzcyBkaWQgbm90IGVzdGFibGlzaCBpdHMgcmVxdWlyZWQgcHJvY2VzcyBncm91cC5cIiksIHtjb2RlOiBcIkVOT1RTVVBcIn0pXG4gICAgICAgIGNoaWxkLmtpbGwoXCJTSUdLSUxMXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBkZWFkbGluZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgZGVhZGxpbmVFeGNlZWRlZCA9IHRydWVcbiAgICAgICAgYmVnaW5UZXJtaW5hdGlvbihwcm9jZXNzR3JvdXBJZClcbiAgICAgIH0sIHRpbWVvdXRNcylcbiAgICB9KVxuICAgIGNoaWxkLm9uY2UoXCJjbG9zZVwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgaWYgKGRlYWRsaW5lVGltZXIgIT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoZGVhZGxpbmVUaW1lcilcbiAgICAgIGlmIChmb3JjZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGZvcmNlVGltZXIpXG4gICAgICBpZiAocGlwZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHBpcGVUaW1lcilcbiAgICAgIGNvbnN0IGNhcHR1cmVkU3RkZXJyID0gc3RkZXJyLmZpbmlzaCgpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZG91dCA9IHN0ZG91dC5maW5pc2goKVxuXG4gICAgICBpZiAobGF1bmNoRXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obGF1bmNoRXJyb3IsIHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSkpXG4gICAgICB9IGVsc2UgaWYgKG91dHB1dEV4Y2VlZGVkKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgJHttYXhCdWZmZXJ9LWJ5dGUgb3V0cHV0IGNhcHR1cmUgbGltaXQuYCksIHtcbiAgICAgICAgICBjb2RlOiBcIkVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUlwiLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLFxuICAgICAgICAgIHN0ZG91dDogY2FwdHVyZWRTdGRvdXRcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2UgaWYgKGRlYWRsaW5lRXhjZWVkZWQpIHtcbiAgICAgICAgY29uc3QgdGltZW91dEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGV4Y2VlZGVkIGl0cyBvd25lZCBkZWFkbGluZS5cIiksIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLFxuICAgICAgICAgIHN0ZG91dDogY2FwdHVyZWRTdGRvdXRcbiAgICAgICAgfSlcblxuICAgICAgICBkZWFkbGluZUZhaWx1cmVzLmFkZCh0aW1lb3V0RXJyb3IpXG4gICAgICAgIHJlamVjdCh0aW1lb3V0RXJyb3IpXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgIT0gMCB8fCBzaWduYWwgIT0gbnVsbCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGZhaWxlZCBhZnRlciBsYXVuY2guXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHJlc29sdmUoe3N0ZGVycjogY2FwdHVyZWRTdGRlcnIsIHN0ZG91dDogY2FwdHVyZWRTdGRvdXR9KVxuICAgIH0pXG5cbiAgICAvKiogQmVnaW5zIGJvdW5kZWQgdGVybWluYXRpb24gYWZ0ZXIgb3V0cHV0IGNhcHR1cmUgY3Jvc3NlcyBpdHMgbGltaXQuICovXG4gICAgZnVuY3Rpb24gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSB7XG4gICAgICBpZiAob3V0cHV0RXhjZWVkZWQgfHwgc2V0dGxlZCkgcmV0dXJuXG4gICAgICBvdXRwdXRFeGNlZWRlZCA9IHRydWVcbiAgICAgIGlmIChwcm9jZXNzR3JvdXBJZCAhPSB1bmRlZmluZWQpIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2lnbmFscyB0aGUgb3duZWQgZ3JvdXAgbm93IGFuZCBlc2NhbGF0ZXMgaWYgaXRzIGluaGVyaXRlZCBwaXBlcyByZW1haW4gb3Blbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3duZWRHcm91cElkIC0gU3Bhd24tdmVyaWZpZWQgcHJvY2Vzcy1ncm91cCBpZGVudGl0eS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiZWdpblRlcm1pbmF0aW9uKG93bmVkR3JvdXBJZCkge1xuICAgICAgc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAob3duZWRHcm91cElkLCBcIlNJR1RFUk1cIilcbiAgICAgIGlmICghc2V0dGxlZCAmJiBmb3JjZVRpbWVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3JjZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdLSUxMXCIpXG4gICAgICAgICAgcGlwZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgICAgICBjaGlsZC5zdGRvdXQuZGVzdHJveSgpXG4gICAgICAgICAgICBjaGlsZC5zdGRlcnIuZGVzdHJveSgpXG4gICAgICAgICAgfSwgcmV0YWluZWRQaXBlR3JhY2VNcylcbiAgICAgICAgfSwgZm9yY2VkVGVybWluYXRpb25HcmFjZU1zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuIl19
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQUs7SUFDM0MsT0FBTyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxxQkFBcUIsRUFBQztJQUNuRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDRCQUE0QixDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsRUFBRSxxQkFBcUI7SUFDNUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxD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QixDQUFDLGNBQWMsRUFBRSxNQUFNO0lBQ3JELElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQTtJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBSztJQUN6QyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7c3Bhd259IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IHtTdHJpbmdEZWNvZGVyfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiXG5cbmNvbnN0IGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcyA9IDI1MFxuY29uc3QgcmV0YWluZWRQaXBlR3JhY2VNcyA9IDI1MFxuY29uc3QgZGVhZGxpbmVGYWlsdXJlcyA9IG5ldyBXZWFrU2V0KClcblxuLyoqXG4gKiBFeGVjdXRlcyBvbmUgZXhhY3QgZmlsZSB3aGlsZSBvd25pbmcgaXRzIGNvbXBsZXRlIGJvdW5kZWQgbGlmZWN5Y2xlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUHJvY2VzcyByZXF1ZXN0LlxuICogQHBhcmFtIHtyZWFkb25seSBzdHJpbmdbXX0gaW5wdXQuYXJndW1lbnRzIC0gRXhhY3QgYXJndW1lbnQgYXJyYXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LmN3ZF0gLSBXb3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IGlucHV0LmVudmlyb25tZW50IC0gRXhhY3QgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC5tYXhCdWZmZXIgLSBNYXhpbXVtIGJ5dGVzIGNhcHR1cmVkIHBlciBvdXRwdXQgc3RyZWFtLlxuICogQHBhcmFtIHtudW1iZXJ9IGlucHV0LnRpbWVvdXRNcyAtIERlYWRsaW5lIGJlZm9yZSB0ZXJtaW5hdGlvbiBiZWdpbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfT59IE91dHB1dCBhZnRlciB0aGUgb3duZWQgcHJvY2VzcyBncm91cCBjbG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZShpbnB1dCkge1xuICByZXR1cm4gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyhpbnB1dCwgcmVnaXN0ZXJDaGlsZFNwYXduKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXhlY3V0b3Igd2hvc2Ugc3Bhd24gb2JzZXJ2YXRpb24gYmVsb25ncyBvbmx5IHRvIHRoYXQgZXhlY3V0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gZGVwZW5kZW5jaWVzIC0gSW50ZXJuYWwgbGlmZWN5Y2xlIGRlcGVuZGVuY2llcy5cbiAqIEBwYXJhbSB7KGNoaWxkOiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdm9pZH0gZGVwZW5kZW5jaWVzLnJlZ2lzdGVyU3Bhd25MaXN0ZW5lciAtIFJlZ2lzdGVycyBkZWFkbGluZSBpbml0aWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIHt0eXBlb2YgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmV9IE93bmVkIHN1YnByb2Nlc3MgZXhlY3V0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRlRmlsZVdpdGhEZWFkbGluZSh7cmVnaXN0ZXJTcGF3bkxpc3RlbmVyfSkge1xuICByZXR1cm4gKGlucHV0KSA9PiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZVVzaW5nKGlucHV0LCByZWdpc3RlclNwYXduTGlzdGVuZXIpXG59XG5cbi8qKlxuICogRXhlY3V0ZXMgd2l0aCBleGFjdCBpbnN0YW5jZS1vd25lZCBzcGF3biBvYnNlcnZhdGlvbi5cbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmU+WzBdfSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7KGNoaWxkOiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdm9pZH0gcmVnaXN0ZXJTcGF3bkxpc3RlbmVyIC0gUmVnaXN0ZXJzIGRlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZVVzaW5nKHthcmd1bWVudHM6IHByb2Nlc3NBcmd1bWVudHMsIGN3ZCwgZW52aXJvbm1lbnQsIGV4ZWN1dGFibGUsIG1heEJ1ZmZlciwgdGltZW91dE1zfSwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZGVhZGxpbmVUaW1lclxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZvcmNlVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBwaXBlVGltZXJcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBsYXVuY2hFcnJvclxuICAgIGxldCBkZWFkbGluZUV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgb3V0cHV0RXhjZWVkZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIHJlZ2lzdGVyU3Bhd25MaXN0ZW5lcihjaGlsZCwgKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3NHcm91cElkID09IHVuZGVmaW5lZCB8fCAhdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpKSB7XG4gICAgICAgIGxhdW5jaEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTcGF3bmVkIHN1YnByb2Nlc3MgZGlkIG5vdCBlc3RhYmxpc2ggaXRzIHJlcXVpcmVkIHByb2Nlc3MgZ3JvdXAuXCIpLCB7Y29kZTogXCJFTk9UU1VQXCJ9KVxuICAgICAgICBjaGlsZC5raWxsKFwiU0lHS0lMTFwiKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZGVhZGxpbmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIGRlYWRsaW5lRXhjZWVkZWQgPSB0cnVlXG4gICAgICAgIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgICB9LCB0aW1lb3V0TXMpXG4gICAgfSlcbiAgICBjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgIGlmIChkZWFkbGluZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lVGltZXIpXG4gICAgICBpZiAoZm9yY2VUaW1lciAhPSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChmb3JjZVRpbWVyKVxuICAgICAgaWYgKHBpcGVUaW1lciAhPSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChwaXBlVGltZXIpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZGVyciA9IHN0ZGVyci5maW5pc2goKVxuICAgICAgY29uc3QgY2FwdHVyZWRTdGRvdXQgPSBzdGRvdXQuZmluaXNoKClcblxuICAgICAgaWYgKGxhdW5jaEVycm9yKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKGxhdW5jaEVycm9yLCB7c3RkZXJyOiBjYXB0dXJlZFN0ZGVyciwgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dH0pKVxuICAgICAgfSBlbHNlIGlmIChvdXRwdXRFeGNlZWRlZCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFN1YnByb2Nlc3MgZXhjZWVkZWQgaXRzICR7bWF4QnVmZmVyfS1ieXRlIG91dHB1dCBjYXB0dXJlIGxpbWl0LmApLCB7XG4gICAgICAgICAgY29kZTogXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIixcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIGlmIChkZWFkbGluZUV4Y2VlZGVkKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgb3duZWQgZGVhZGxpbmUuXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVhZGxpbmVGYWlsdXJlcy5hZGQodGltZW91dEVycm9yKVxuICAgICAgICByZWplY3QodGltZW91dEVycm9yKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9IDAgfHwgc2lnbmFsICE9IG51bGwpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiU3VicHJvY2VzcyBmYWlsZWQgYWZ0ZXIgbGF1bmNoLlwiKSwge1xuICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIHN0ZGVycjogY2FwdHVyZWRTdGRlcnIsXG4gICAgICAgICAgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dFxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSByZXNvbHZlKHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSlcbiAgICB9KVxuXG4gICAgLyoqIEJlZ2lucyBib3VuZGVkIHRlcm1pbmF0aW9uIGFmdGVyIG91dHB1dCBjYXB0dXJlIGNyb3NzZXMgaXRzIGxpbWl0LiAqL1xuICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZUZvck91dHB1dExpbWl0KCkge1xuICAgICAgaWYgKG91dHB1dEV4Y2VlZGVkIHx8IHNldHRsZWQpIHJldHVyblxuICAgICAgb3V0cHV0RXhjZWVkZWQgPSB0cnVlXG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgIT0gdW5kZWZpbmVkKSBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhlIG93bmVkIGdyb3VwIG5vdyBhbmQgZXNjYWxhdGVzIGlmIGl0cyBpbmhlcml0ZWQgcGlwZXMgcmVtYWluIG9wZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG93bmVkR3JvdXBJZCAtIFNwYXduLXZlcmlmaWVkIHByb2Nlc3MtZ3JvdXAgaWRlbnRpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVnaW5UZXJtaW5hdGlvbihvd25lZEdyb3VwSWQpIHtcbiAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdURVJNXCIpXG4gICAgICBpZiAoIXNldHRsZWQgJiYgZm9yY2VUaW1lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgICBzaWduYWxPd25lZFByb2Nlc3NHcm91cChvd25lZEdyb3VwSWQsIFwiU0lHS0lMTFwiKVxuICAgICAgICAgIHBpcGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LmRlc3Ryb3koKVxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyLmRlc3Ryb3koKVxuICAgICAgICAgIH0sIHJldGFpbmVkUGlwZUdyYWNlTXMpXG4gICAgICAgIH0sIGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2R1Y3Rpb24gZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24gb24gdGhlIGNoaWxkJ3MgcmVhbCBzcGF3biBldmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc30gY2hpbGQgLSBFeGFjdCBzcGF3bmVkIGNoaWxkLlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIERlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckNoaWxkU3Bhd24oY2hpbGQsIGxpc3RlbmVyKSB7XG4gIGNoaWxkLm9uY2UoXCJzcGF3blwiLCBsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuIl19
|
|
@@ -41,6 +41,30 @@ export declare const canonicalToolchains: {
|
|
|
41
41
|
supportedVersion: RegExp;
|
|
42
42
|
versionArguments: string[];
|
|
43
43
|
};
|
|
44
|
+
dotnet: {
|
|
45
|
+
canonicalCommand: string;
|
|
46
|
+
overrideEnvironmentVariable: string;
|
|
47
|
+
supportedVersion: RegExp;
|
|
48
|
+
versionArguments: string[];
|
|
49
|
+
};
|
|
50
|
+
go: {
|
|
51
|
+
canonicalCommand: string;
|
|
52
|
+
overrideEnvironmentVariable: string;
|
|
53
|
+
supportedVersion: RegExp;
|
|
54
|
+
versionArguments: string[];
|
|
55
|
+
};
|
|
56
|
+
clangpp: {
|
|
57
|
+
canonicalCommand: string;
|
|
58
|
+
overrideEnvironmentVariable: string;
|
|
59
|
+
supportedVersion: RegExp;
|
|
60
|
+
versionArguments: string[];
|
|
61
|
+
};
|
|
62
|
+
clang: {
|
|
63
|
+
canonicalCommand: string;
|
|
64
|
+
overrideEnvironmentVariable: string;
|
|
65
|
+
supportedVersion: RegExp;
|
|
66
|
+
versionArguments: string[];
|
|
67
|
+
};
|
|
44
68
|
};
|
|
45
69
|
/**
|
|
46
70
|
* Discovers one repository-declared canonical toolchain.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;
|
|
1
|
+
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;0BAsKA,MAAM;qCAA+B,MAAM;0BAAoB,MAAM;0BAAoB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA1J/H,CAAA;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAJxC,MAAM,OAAO,mBAI2B,EAAE,OAAO,AAHzD,CACA,EADQ;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAG5C,GAFpD,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CA+BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAT1C;IAAsB,gBAAgB,EAA9B,MAAM,CACd;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsB,EAAE,EAAhB,MAAM,CACd;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAAuB,gBAAgB,AAAvC,CACA,EADQ,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;IAAwB,gBAAgB,EAAhC,MAAM,EAAE,CAChB;CAE0C,GAFhC,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CAiGtE;AA+HD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAHzC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGqB,GAF9D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB5C"}
|
package/build/src/toolchains.js
CHANGED
|
@@ -14,7 +14,11 @@ export const canonicalToolchains = deepFreeze({
|
|
|
14
14
|
tsc: definition("tsc", "SEMANTIFOLD_TSC", ["--version"], /^Version 7\./u),
|
|
15
15
|
javac: definition("javac", "SEMANTIFOLD_JAVAC", ["-version"], /^javac (?:1[7-9]|2[0-9])\./u),
|
|
16
16
|
java: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^(?:openjdk|java) version "(?:1[7-9]|2[0-9])\./u),
|
|
17
|
-
python: definition("python3", "SEMANTIFOLD_PYTHON", ["--version"], /^Python 3\./u)
|
|
17
|
+
python: definition("python3", "SEMANTIFOLD_PYTHON", ["--version"], /^Python 3\./u),
|
|
18
|
+
dotnet: definition("dotnet", "SEMANTIFOLD_DOTNET", ["--version"], /^10\./u),
|
|
19
|
+
go: definition("go", "SEMANTIFOLD_GO", ["version"], /^go version go1\.26\.\d+ linux\/amd64$/u),
|
|
20
|
+
clangpp: definition("clang++", "SEMANTIFOLD_CLANGPP", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
|
|
21
|
+
clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u)
|
|
18
22
|
});
|
|
19
23
|
/**
|
|
20
24
|
* Discovers one repository-declared canonical toolchain.
|
|
@@ -410,4 +414,4 @@ function deepFreeze(value) {
|
|
|
410
414
|
deepFreeze(nested);
|
|
411
415
|
return Object.freeze(value);
|
|
412
416
|
}
|
|
413
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3pFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQ3pFLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFF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SCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQTtBQUMvSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQ25DLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxFQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7QUFDckYsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBSztJQUN2QixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTlFLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFN0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjb25zdGFudHMgYXMgZnNDb25zdGFudHN9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7YWNjZXNzLCByZWFscGF0aCwgc3RhdH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtleGNlZWRlZE93bmVkRGVhZGxpbmUsIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lfSBmcm9tIFwiLi9zdWJwcm9jZXNzLmpzXCJcbmltcG9ydCB7aXNTdXBwb3J0ZWRUaW1lb3V0TXMsIG1heGltdW1UaW1lb3V0TXN9IGZyb20gXCIuL3RpbWVvdXQuanNcIlxuXG5jb25zdCBkZWZhdWx0VGltZW91dE1zID0gMTBfMDAwXG5cbmV4cG9ydCBjb25zdCBjYW5vbmljYWxUb29sY2hhaW5zID0gZGVlcEZyZWV6ZSh7XG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBweXRob246IGRlZmluaXRpb24oXCJweXRob24zXCIsIFwiU0VNQU5USUZPTERfUFlUSE9OXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QeXRob24gM1xcLi91KVxufSlcblxuLyoqXG4gKiBEaXNjb3ZlcnMgb25lIHJlcG9zaXRvcnktZGVjbGFyZWQgY2Fub25pY2FsIHRvb2xjaGFpbi5cbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9IGlkIC0gQ2Fub25pY2FsIHRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7e2Vudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG92ZXJyaWRlPzogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBEaXNjb3Zlcnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IEV4YWN0IGV4ZWN1dGFibGUgYW5kIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbihpZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIElEIG11c3QgYmUgYSBub24tZW1wdHkgcHJpbWl0aXZlIHN0cmluZy5cIiwgXCJ0b29sY2hhaW5cIilcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3Qob3B0aW9ucykpIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuXCIsIGlkKVxuICBjb25zdCBkZWZpbml0aW9uID0gT2JqZWN0Lmhhc093bihjYW5vbmljYWxUb29sY2hhaW5zLCBpZClcbiAgICA/IGNhbm9uaWNhbFRvb2xjaGFpbnNbLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKGlkKV1cbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmICghZGVmaW5pdGlvbikgaW52YWxpZFRvb2xjaGFpbihgVW5rbm93biBjYW5vbmljYWwgdG9vbGNoYWluICcke2lkfScuYCwgaWQpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBzbmFwc2hvdEVudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQsIGlkKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA/PyBkZWZhdWx0RW52aXJvbm1lbnQoKVxuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9ucy5vdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgICAgPyBwcm9jZXNzLmVudltkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICAgIDogY29uZmlndXJhdGlvbkVudmlyb25tZW50W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgIDogb3B0aW9ucy5vdmVycmlkZVxuXG4gIHJldHVybiBkaXNjb3ZlclRvb2xjaGFpbih7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogZGVmaW5pdGlvbi5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50LFxuICAgIGlkLFxuICAgIG92ZXJyaWRlOiBjb25maWd1cmVkLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGRlZmluaXRpb24uc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IGRlZmluaXRpb24udmVyc2lvbkFyZ3VtZW50c1xuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2ZXJzaW9ucyBvbmUgY29uZmlndXJlZCBvciBjYW5vbmljYWwgZXhlY3V0YWJsZSB3aXRob3V0IGludm9raW5nIGEgc2hlbGwuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBEaXNjb3ZlcnkgcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5jYW5vbmljYWxDb21tYW5kIC0gQ2Fub25pY2FsIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFtpbnB1dC5lbnZpcm9ubWVudF0gLSBFeHBsaWNpdCBkaXNjb3ZlcnkgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0Lm92ZXJyaWRlXSAtIENvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHBhcmFtIHtSZWdFeHB9IFtpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uXSAtIEZ1bGwgY2FwdHVyZWQtb3V0cHV0IHZlcnNpb24gcG9saWN5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnB1dC50aW1lb3V0TXNdIC0gVmVyc2lvbiBjb21tYW5kIHRpbWVvdXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IERpc2NvdmVyZWQgdG9vbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyVG9vbGNoYWluKGlucHV0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dCkpIGludmFsaWRUb29sY2hhaW4oXCJUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgcmVxdWVzdCBvYmplY3QuXCIsIFwidG9vbGNoYWluXCIpXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSA9IGlucHV0LnZlcnNpb25Bcmd1bWVudHNcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50cyA9IGlzRGVuc2VBcnJheSh2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLnZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZV0gOiB1bmRlZmluZWRcbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGlucHV0LmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQ6IGlucHV0LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0RW52aXJvbm1lbnQoKSA6IGlucHV0LmVudmlyb25tZW50LFxuICAgIGlkOiBpbnB1dC5pZCxcbiAgICBvdmVycmlkZTogaW5wdXQub3ZlcnJpZGUsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogaW5wdXQuc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFRpbWVvdXRNcyA6IGlucHV0LnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzXG4gIH1cblxuICB2YWxpZGF0ZURpc2NvdmVyeShjYW5kaWRhdGUpXG4gIGNvbnN0IGNhbm9uaWNhbENvbW1hbmQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5jYW5vbmljYWxDb21tYW5kKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59ICovIChjYW5kaWRhdGUuZW52aXJvbm1lbnQpXG4gIGNvbnN0IGlkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuaWQpXG4gIGNvbnN0IG92ZXJyaWRlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovIChjYW5kaWRhdGUub3ZlcnJpZGUpXG4gIGNvbnN0IHN1cHBvcnRlZFZlcnNpb24gPSBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgID8gbmV3IFJlZ0V4cChjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5zb3VyY2UsIGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLmZsYWdzKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLnRpbWVvdXRNcylcbiAgY29uc3QgdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChjYW5kaWRhdGUudmVyc2lvbkFyZ3VtZW50cylcbiAgY29uc3Qgbm9ybWFsaXplZEVudmlyb25tZW50ID0gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGVudmlyb25tZW50KVxuICBjb25zdCB7ZXhlY3V0YWJsZSwgc291cmNlfSA9IG92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGF3YWl0IHJlc29sdmVDYW5vbmljYWwoaWQsIGNhbm9uaWNhbENvbW1hbmQsIG5vcm1hbGl6ZWRFbnZpcm9ubWVudC5QQVRIID8/IFwiXCIpXG4gICAgOiB7ZXhlY3V0YWJsZTogYXdhaXQgcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY2Fub25pY2FsQ29tbWFuZCksIHNvdXJjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwib3ZlcnJpZGVcIil9XG4gIC8qKiBAdHlwZSB7e3N0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZ319ICovXG4gIGxldCByZXN1bHRcblxuICB0cnkge1xuICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgIGFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICAgIGVudmlyb25tZW50OiBub3JtYWxpemVkRW52aXJvbm1lbnQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXRNc1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICAgIGNvbnN0IHRpbWVkT3V0ID0gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAuLi5wcm9jZXNzRXJyb3IsXG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogdGltZWRPdXQgPyBcIlRPT0xfVkVSU0lPTl9USU1FT1VUXCIgOiBcIlRPT0xfVkVSU0lPTl9GQUlMVVJFXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IHRpbWVkT3V0XG4gICAgICAgID8gYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGV4Y2VlZGVkICR7dGltZW91dE1zfW1zLmBcbiAgICAgICAgOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZmFpbGVkLmAsXG4gICAgICBzdGRlcnI6IHByb2Nlc3NFcnJvci5zdGRlcnIsXG4gICAgICBzdGRvdXQ6IHByb2Nlc3NFcnJvci5zdGRvdXRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qge3N0ZGVyciwgc3Rkb3V0fSA9IHJlc3VsdFxuICBjb25zdCB2ZXJzaW9uT3V0cHV0ID0gW3N0ZG91dCwgc3RkZXJyXS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5sZW5ndGggPiAwKS5qb2luKFwiXFxuXCIpLnRyaW0oKVxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk91dHB1dC5zcGxpdCgvXFxyP1xcbi91KVswXSA/PyBcIlwiXG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIHJldHVybmVkIG5vIHZlcnNpb24gb3V0cHV0LmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXRcbiAgICB9KVxuICB9XG4gIGlmIChzdXBwb3J0ZWRWZXJzaW9uICYmICFzdXBwb3J0ZWRWZXJzaW9uLnRlc3QodmVyc2lvbk91dHB1dCkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9VTlNVUFBPUlRFRF9WRVJTSU9OXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBFeGVjdXRhYmxlICcke2V4ZWN1dGFibGV9JyByZXBvcnRlZCB1bnN1cHBvcnRlZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0LFxuICAgICAgdmVyc2lvblxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICBleGVjdXRhYmxlLFxuICAgIGlkLFxuICAgIHNvdXJjZSxcbiAgICB2ZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgdmVyc2lvbk91dHB1dFxuICB9KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgY2Fub25pY2FsIGltbXV0YWJsZSB0b29sY2hhaW4gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY2Fub25pY2FsQ29tbWFuZCAtIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUgLSBDb25maWd1cmVkIG92ZXJyaWRlIHZhcmlhYmxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWdFeHB9IHN1cHBvcnRlZFZlcnNpb24gLSBTdXBwb3J0ZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcmV0dXJucyB7e2Nhbm9uaWNhbENvbW1hbmQ6IHN0cmluZywgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlOiBzdHJpbmcsIHN1cHBvcnRlZFZlcnNpb246IFJlZ0V4cCwgdmVyc2lvbkFyZ3VtZW50czogc3RyaW5nW119fSBEZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmaW5pdGlvbihjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHZlcnNpb25Bcmd1bWVudHMsIHN1cHBvcnRlZFZlcnNpb24pIHtcbiAgcmV0dXJuIHtjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHN1cHBvcnRlZFZlcnNpb24sIHZlcnNpb25Bcmd1bWVudHN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRvb2wgZGlzY292ZXJ5IGJlZm9yZSBmaWxlc3lzdGVtIG9yIHByb2Nlc3MgYWNjZXNzLlxuICogQHBhcmFtIHt7XG4gKiAgIGNhbm9uaWNhbENvbW1hbmQ6IHVua25vd24sXG4gKiAgIGVudmlyb25tZW50OiB1bmtub3duLFxuICogICBpZDogdW5rbm93bixcbiAqICAgb3ZlcnJpZGU6IHVua25vd24sXG4gKiAgIHN1cHBvcnRlZFZlcnNpb246IHVua25vd24sXG4gKiAgIHRpbWVvdXRNczogdW5rbm93bixcbiAqICAgdmVyc2lvbkFyZ3VtZW50czogdW5rbm93blxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgZGlzY292ZXJ5IGZpZWxkcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpc2NvdmVyeShpbnB1dCkge1xuICBpZiAodHlwZW9mIGlucHV0LmlkICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuaWQubGVuZ3RoID09IDAgfHxcbiAgICB0eXBlb2YgaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQubGVuZ3RoID09IDAgfHxcbiAgICBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiL1wiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWlzRGVuc2VBcnJheShpbnB1dC52ZXJzaW9uQXJndW1lbnRzKSB8fCAhaW5wdXQudmVyc2lvbkFyZ3VtZW50cy5ldmVyeSh2YWxpZEFyZ3VtZW50KSB8fFxuICAgICFpc0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KSB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgIChpbnB1dC5vdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgaW5wdXQub3ZlcnJpZGUgIT0gXCJzdHJpbmdcIiB8fCAhcGF0aC5pc0Fic29sdXRlKGlucHV0Lm92ZXJyaWRlKSB8fCBpbnB1dC5vdmVycmlkZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHx8XG4gICAgKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAoIShpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLmdsb2JhbCB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLnN0aWNreSkpKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihgVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIGNhbm9uaWNhbCBiYXNlbmFtZSwgYWJzb2x1dGUgb3ZlcnJpZGUsIGFyZ3VtZW50IGFycmF5LCBlbnZpcm9ubWVudCwgYW5kIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLmAsXG4gICAgICB0eXBlb2YgaW5wdXQuaWQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LmlkIDogXCJ0b29sY2hhaW5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSB1bmFtYmlndW91cyBjYW5vbmljYWwgY29tbWFuZCBmcm9tIGFuIGV4cGxpY2l0IFBBVEguXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhWYWx1ZSAtIEV4cGxpY2l0IFBBVEguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7ZXhlY3V0YWJsZTogc3RyaW5nLCBzb3VyY2U6IFwiY2Fub25pY2FsXCJ9Pn0gRXhhY3QgZXhlY3V0YWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhbm9uaWNhbChpZCwgY29tbWFuZCwgcGF0aFZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoVmFsdWUuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT0gMCB8fCAhcGF0aC5pc0Fic29sdXRlKGRpcmVjdG9yeSkpIGNvbnRpbnVlXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgY29tbWFuZClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIG1hdGNoZXMuc2V0KGV4YWN0LCBleGFjdClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgUEFUSCBjYW5kaWRhdGUgaXMgYWJzZW50IG9yIG5vbi1leGVjdXRhYmxlOyBkaXNjb3ZlcnkgY29udGludWVzIGRldGVybWluaXN0aWNhbGx5LlxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLnNpemUgPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgd2FzIG5vdCBmb3VuZCBhcyBhbiBleGVjdXRhYmxlIG9uIFBBVEguYFxuICAgIH0pXG4gIH1cbiAgaWYgKG1hdGNoZXMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9BTUJJR1VPVVNcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHJlc29sdmVzIHRvIG11bHRpcGxlIGV4ZWN1dGFibGVzOiAke1suLi5tYXRjaGVzLmtleXMoKV0uam9pbihcIiwgXCIpfS5gXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7ZXhlY3V0YWJsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChbLi4ubWF0Y2hlcy5rZXlzKCldWzBdKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJjYW5vbmljYWxcIil9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZSAtIEFic29sdXRlIG92ZXJyaWRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY29tbWFuZCkge1xuICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgY2F1c2VcblxuICB0cnkge1xuICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKG92ZXJyaWRlKVxuXG4gICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGV4YWN0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2F1c2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlLFxuICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICBjb21tYW5kLFxuICAgIGV4ZWN1dGFibGU6IG92ZXJyaWRlLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBtZXNzYWdlOiBgQ29uZmlndXJlZCBleGVjdXRhYmxlICcke292ZXJyaWRlfScgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZS5gXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNhbmRpZGF0ZSB0byBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59IEV4YWN0IHJlZ3VsYXIgZXhlY3V0YWJsZSwgaWYgdGhlIGZpbGUgdHlwZSBpcyB2YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSkge1xuICBjb25zdCBleGFjdCA9IGF3YWl0IHJlYWxwYXRoKGNhbmRpZGF0ZSlcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdChleGFjdClcblxuICBpZiAoIXN0YXR1cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBhd2FpdCBhY2Nlc3MoZXhhY3QsIGZzQ29uc3RhbnRzLlhfT0spXG5cbiAgcmV0dXJuIGV4YWN0XG59XG5cbi8qKlxuICogUHJvZHVjZXMgdGhlIG1pbmltYWwgZGV0ZXJtaW5pc3RpYyBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gZW52aXJvbm1lbnQgLSBFeHBsaWNpdCBpbnB1dHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52aXJvbm1lbnQoKSkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKGVudmlyb25tZW50KVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICghL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3Qoa2V5KSB8fCBrZXkuaW5jbHVkZXMoXCJcXDBcIikgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpKSB7XG4gICAgICBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBjb250YWlucyBhbiBpbnZhbGlkIGtleSBvciB2YWx1ZS5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZFtrZXldID0gdmFsdWVcbiAgfVxuICBub3JtYWxpemVkLkxBTkcgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLkxDX0FMTCA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuVFogPSBcIlVUQ1wiXG4gIG5vcm1hbGl6ZWQuUEFUSCA/Pz0gXCIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluXCJcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBleGVjdXRhYmxlIGxvb2t1cCBmcm9tIHRoZSBhbWJpZW50IGVudmlyb25tZW50LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBNaW5pbWFsIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbnZpcm9ubWVudCgpIHtcbiAgcmV0dXJuIHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfVxufVxuXG4vKipcbiAqIE5hcnJvd3Mgc3RhYmxlIGZpZWxkcyBmcm9tIGEgdmVyc2lvbiBzdWJwcm9jZXNzIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ319IFN0YWJsZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcikge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4ge2V4aXRDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzaGVsbC1mcmVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHNhZmUgdG8gcGFzcyBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBcmd1bWVudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGV4cGxpY2l0IHByb2Nlc3MtZW52aXJvbm1lbnQgdmFsdWVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gV2hldGhlciBlbnRyaWVzIGFyZSBzdHJpbmdzIG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNFbnZpcm9ubWVudCh2YWx1ZSkge1xuICByZXR1cm4gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSAhPSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBEZXRhY2hlcyBhbiBleHBsaWNpdCBlbnZpcm9ubWVudCBiZWZvcmUgY2Fub25pY2FsIG92ZXJyaWRlIGxvb2t1cCBjYW4geWllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gT3duZWQgZW52aXJvbm1lbnQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RFbnZpcm9ubWVudCh2YWx1ZSwgaWQpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyh2YWx1ZSlcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBpZClcbiAgfVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG4gIGNvbnN0IHNuYXBzaG90ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGVudHJpZXMpIHNuYXBzaG90W2tleV0gPSBlbnRyeVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHNuYXBzaG90KVxufVxuXG4vKipcbiAqIFJlYWRzIG9ubHkgZW51bWVyYWJsZSBvd24gZGF0YSBwcm9wZXJ0aWVzIGZyb20gYW4gb3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdIHwgdW5kZWZpbmVkfSBEZXRhY2hlZCBlbnRyaWVzIHdoZW4gdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpXG5cbiAgICAgIGlmIChkZXNjcmlwdG9yID09IHVuZGVmaW5lZCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8ICEoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIHx8XG4gICAgICAgIChkZXNjcmlwdG9yLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT0gXCJzdHJpbmdcIikpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBkZXNjcmlwdG9yLnZhbHVlXSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBkaXNjb3ZlcnktY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFRvb2xjaGFpbihtZXNzYWdlLCBpZCkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfVE9PTENIQUlOXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyBhbmQgZGlzY292ZXJ5IHJlc3VsdHMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFRvb2xjaGFpbi1vd25lZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
|
|
417
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3pFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQ3pFLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFF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LENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjb25zdGFudHMgYXMgZnNDb25zdGFudHN9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7YWNjZXNzLCByZWFscGF0aCwgc3RhdH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtleGNlZWRlZE93bmVkRGVhZGxpbmUsIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lfSBmcm9tIFwiLi9zdWJwcm9jZXNzLmpzXCJcbmltcG9ydCB7aXNTdXBwb3J0ZWRUaW1lb3V0TXMsIG1heGltdW1UaW1lb3V0TXN9IGZyb20gXCIuL3RpbWVvdXQuanNcIlxuXG5jb25zdCBkZWZhdWx0VGltZW91dE1zID0gMTBfMDAwXG5cbmV4cG9ydCBjb25zdCBjYW5vbmljYWxUb29sY2hhaW5zID0gZGVlcEZyZWV6ZSh7XG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBweXRob246IGRlZmluaXRpb24oXCJweXRob24zXCIsIFwiU0VNQU5USUZPTERfUFlUSE9OXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QeXRob24gM1xcLi91KSxcbiAgZG90bmV0OiBkZWZpbml0aW9uKFwiZG90bmV0XCIsIFwiU0VNQU5USUZPTERfRE9UTkVUXCIsIFtcIi0tdmVyc2lvblwiXSwgL14xMFxcLi91KSxcbiAgZ286IGRlZmluaXRpb24oXCJnb1wiLCBcIlNFTUFOVElGT0xEX0dPXCIsIFtcInZlcnNpb25cIl0sIC9eZ28gdmVyc2lvbiBnbzFcXC4yNlxcLlxcZCsgbGludXhcXC9hbWQ2NCQvdSksXG4gIGNsYW5ncHA6IGRlZmluaXRpb24oXCJjbGFuZysrXCIsIFwiU0VNQU5USUZPTERfQ0xBTkdQUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eVWJ1bnR1IGNsYW5nIHZlcnNpb24gMjFcXC4xXFwuOCBbXlxcbl0rXFxuVGFyZ2V0OiB4ODZfNjQtcGMtbGludXgtZ251XFxuL3UpLFxuICBjbGFuZzogZGVmaW5pdGlvbihcImNsYW5nXCIsIFwiU0VNQU5USUZPTERfQ0xBTkdcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KVxufSlcblxuLyoqXG4gKiBEaXNjb3ZlcnMgb25lIHJlcG9zaXRvcnktZGVjbGFyZWQgY2Fub25pY2FsIHRvb2xjaGFpbi5cbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9IGlkIC0gQ2Fub25pY2FsIHRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7e2Vudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG92ZXJyaWRlPzogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBEaXNjb3Zlcnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IEV4YWN0IGV4ZWN1dGFibGUgYW5kIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbihpZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIElEIG11c3QgYmUgYSBub24tZW1wdHkgcHJpbWl0aXZlIHN0cmluZy5cIiwgXCJ0b29sY2hhaW5cIilcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3Qob3B0aW9ucykpIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuXCIsIGlkKVxuICBjb25zdCBkZWZpbml0aW9uID0gT2JqZWN0Lmhhc093bihjYW5vbmljYWxUb29sY2hhaW5zLCBpZClcbiAgICA/IGNhbm9uaWNhbFRvb2xjaGFpbnNbLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKGlkKV1cbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmICghZGVmaW5pdGlvbikgaW52YWxpZFRvb2xjaGFpbihgVW5rbm93biBjYW5vbmljYWwgdG9vbGNoYWluICcke2lkfScuYCwgaWQpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBzbmFwc2hvdEVudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQsIGlkKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA/PyBkZWZhdWx0RW52aXJvbm1lbnQoKVxuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9ucy5vdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgICAgPyBwcm9jZXNzLmVudltkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICAgIDogY29uZmlndXJhdGlvbkVudmlyb25tZW50W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgIDogb3B0aW9ucy5vdmVycmlkZVxuXG4gIHJldHVybiBkaXNjb3ZlclRvb2xjaGFpbih7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogZGVmaW5pdGlvbi5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50LFxuICAgIGlkLFxuICAgIG92ZXJyaWRlOiBjb25maWd1cmVkLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGRlZmluaXRpb24uc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IGRlZmluaXRpb24udmVyc2lvbkFyZ3VtZW50c1xuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2ZXJzaW9ucyBvbmUgY29uZmlndXJlZCBvciBjYW5vbmljYWwgZXhlY3V0YWJsZSB3aXRob3V0IGludm9raW5nIGEgc2hlbGwuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBEaXNjb3ZlcnkgcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5jYW5vbmljYWxDb21tYW5kIC0gQ2Fub25pY2FsIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFtpbnB1dC5lbnZpcm9ubWVudF0gLSBFeHBsaWNpdCBkaXNjb3ZlcnkgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0Lm92ZXJyaWRlXSAtIENvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHBhcmFtIHtSZWdFeHB9IFtpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uXSAtIEZ1bGwgY2FwdHVyZWQtb3V0cHV0IHZlcnNpb24gcG9saWN5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnB1dC50aW1lb3V0TXNdIC0gVmVyc2lvbiBjb21tYW5kIHRpbWVvdXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IERpc2NvdmVyZWQgdG9vbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyVG9vbGNoYWluKGlucHV0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dCkpIGludmFsaWRUb29sY2hhaW4oXCJUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgcmVxdWVzdCBvYmplY3QuXCIsIFwidG9vbGNoYWluXCIpXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSA9IGlucHV0LnZlcnNpb25Bcmd1bWVudHNcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50cyA9IGlzRGVuc2VBcnJheSh2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLnZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZV0gOiB1bmRlZmluZWRcbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGlucHV0LmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQ6IGlucHV0LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0RW52aXJvbm1lbnQoKSA6IGlucHV0LmVudmlyb25tZW50LFxuICAgIGlkOiBpbnB1dC5pZCxcbiAgICBvdmVycmlkZTogaW5wdXQub3ZlcnJpZGUsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogaW5wdXQuc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFRpbWVvdXRNcyA6IGlucHV0LnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzXG4gIH1cblxuICB2YWxpZGF0ZURpc2NvdmVyeShjYW5kaWRhdGUpXG4gIGNvbnN0IGNhbm9uaWNhbENvbW1hbmQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5jYW5vbmljYWxDb21tYW5kKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59ICovIChjYW5kaWRhdGUuZW52aXJvbm1lbnQpXG4gIGNvbnN0IGlkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuaWQpXG4gIGNvbnN0IG92ZXJyaWRlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovIChjYW5kaWRhdGUub3ZlcnJpZGUpXG4gIGNvbnN0IHN1cHBvcnRlZFZlcnNpb24gPSBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgID8gbmV3IFJlZ0V4cChjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5zb3VyY2UsIGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLmZsYWdzKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLnRpbWVvdXRNcylcbiAgY29uc3QgdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChjYW5kaWRhdGUudmVyc2lvbkFyZ3VtZW50cylcbiAgY29uc3Qgbm9ybWFsaXplZEVudmlyb25tZW50ID0gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGVudmlyb25tZW50KVxuICBjb25zdCB7ZXhlY3V0YWJsZSwgc291cmNlfSA9IG92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGF3YWl0IHJlc29sdmVDYW5vbmljYWwoaWQsIGNhbm9uaWNhbENvbW1hbmQsIG5vcm1hbGl6ZWRFbnZpcm9ubWVudC5QQVRIID8/IFwiXCIpXG4gICAgOiB7ZXhlY3V0YWJsZTogYXdhaXQgcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY2Fub25pY2FsQ29tbWFuZCksIHNvdXJjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwib3ZlcnJpZGVcIil9XG4gIC8qKiBAdHlwZSB7e3N0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZ319ICovXG4gIGxldCByZXN1bHRcblxuICB0cnkge1xuICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgIGFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICAgIGVudmlyb25tZW50OiBub3JtYWxpemVkRW52aXJvbm1lbnQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXRNc1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICAgIGNvbnN0IHRpbWVkT3V0ID0gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAuLi5wcm9jZXNzRXJyb3IsXG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogdGltZWRPdXQgPyBcIlRPT0xfVkVSU0lPTl9USU1FT1VUXCIgOiBcIlRPT0xfVkVSU0lPTl9GQUlMVVJFXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IHRpbWVkT3V0XG4gICAgICAgID8gYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGV4Y2VlZGVkICR7dGltZW91dE1zfW1zLmBcbiAgICAgICAgOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZmFpbGVkLmAsXG4gICAgICBzdGRlcnI6IHByb2Nlc3NFcnJvci5zdGRlcnIsXG4gICAgICBzdGRvdXQ6IHByb2Nlc3NFcnJvci5zdGRvdXRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qge3N0ZGVyciwgc3Rkb3V0fSA9IHJlc3VsdFxuICBjb25zdCB2ZXJzaW9uT3V0cHV0ID0gW3N0ZG91dCwgc3RkZXJyXS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5sZW5ndGggPiAwKS5qb2luKFwiXFxuXCIpLnRyaW0oKVxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk91dHB1dC5zcGxpdCgvXFxyP1xcbi91KVswXSA/PyBcIlwiXG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIHJldHVybmVkIG5vIHZlcnNpb24gb3V0cHV0LmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXRcbiAgICB9KVxuICB9XG4gIGlmIChzdXBwb3J0ZWRWZXJzaW9uICYmICFzdXBwb3J0ZWRWZXJzaW9uLnRlc3QodmVyc2lvbk91dHB1dCkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9VTlNVUFBPUlRFRF9WRVJTSU9OXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBFeGVjdXRhYmxlICcke2V4ZWN1dGFibGV9JyByZXBvcnRlZCB1bnN1cHBvcnRlZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0LFxuICAgICAgdmVyc2lvblxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICBleGVjdXRhYmxlLFxuICAgIGlkLFxuICAgIHNvdXJjZSxcbiAgICB2ZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgdmVyc2lvbk91dHB1dFxuICB9KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgY2Fub25pY2FsIGltbXV0YWJsZSB0b29sY2hhaW4gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY2Fub25pY2FsQ29tbWFuZCAtIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUgLSBDb25maWd1cmVkIG92ZXJyaWRlIHZhcmlhYmxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWdFeHB9IHN1cHBvcnRlZFZlcnNpb24gLSBTdXBwb3J0ZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcmV0dXJucyB7e2Nhbm9uaWNhbENvbW1hbmQ6IHN0cmluZywgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlOiBzdHJpbmcsIHN1cHBvcnRlZFZlcnNpb246IFJlZ0V4cCwgdmVyc2lvbkFyZ3VtZW50czogc3RyaW5nW119fSBEZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmaW5pdGlvbihjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHZlcnNpb25Bcmd1bWVudHMsIHN1cHBvcnRlZFZlcnNpb24pIHtcbiAgcmV0dXJuIHtjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHN1cHBvcnRlZFZlcnNpb24sIHZlcnNpb25Bcmd1bWVudHN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRvb2wgZGlzY292ZXJ5IGJlZm9yZSBmaWxlc3lzdGVtIG9yIHByb2Nlc3MgYWNjZXNzLlxuICogQHBhcmFtIHt7XG4gKiAgIGNhbm9uaWNhbENvbW1hbmQ6IHVua25vd24sXG4gKiAgIGVudmlyb25tZW50OiB1bmtub3duLFxuICogICBpZDogdW5rbm93bixcbiAqICAgb3ZlcnJpZGU6IHVua25vd24sXG4gKiAgIHN1cHBvcnRlZFZlcnNpb246IHVua25vd24sXG4gKiAgIHRpbWVvdXRNczogdW5rbm93bixcbiAqICAgdmVyc2lvbkFyZ3VtZW50czogdW5rbm93blxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgZGlzY292ZXJ5IGZpZWxkcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpc2NvdmVyeShpbnB1dCkge1xuICBpZiAodHlwZW9mIGlucHV0LmlkICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuaWQubGVuZ3RoID09IDAgfHxcbiAgICB0eXBlb2YgaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQubGVuZ3RoID09IDAgfHxcbiAgICBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiL1wiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWlzRGVuc2VBcnJheShpbnB1dC52ZXJzaW9uQXJndW1lbnRzKSB8fCAhaW5wdXQudmVyc2lvbkFyZ3VtZW50cy5ldmVyeSh2YWxpZEFyZ3VtZW50KSB8fFxuICAgICFpc0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KSB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgIChpbnB1dC5vdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgaW5wdXQub3ZlcnJpZGUgIT0gXCJzdHJpbmdcIiB8fCAhcGF0aC5pc0Fic29sdXRlKGlucHV0Lm92ZXJyaWRlKSB8fCBpbnB1dC5vdmVycmlkZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHx8XG4gICAgKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAoIShpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLmdsb2JhbCB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLnN0aWNreSkpKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihgVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIGNhbm9uaWNhbCBiYXNlbmFtZSwgYWJzb2x1dGUgb3ZlcnJpZGUsIGFyZ3VtZW50IGFycmF5LCBlbnZpcm9ubWVudCwgYW5kIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLmAsXG4gICAgICB0eXBlb2YgaW5wdXQuaWQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LmlkIDogXCJ0b29sY2hhaW5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSB1bmFtYmlndW91cyBjYW5vbmljYWwgY29tbWFuZCBmcm9tIGFuIGV4cGxpY2l0IFBBVEguXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhWYWx1ZSAtIEV4cGxpY2l0IFBBVEguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7ZXhlY3V0YWJsZTogc3RyaW5nLCBzb3VyY2U6IFwiY2Fub25pY2FsXCJ9Pn0gRXhhY3QgZXhlY3V0YWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhbm9uaWNhbChpZCwgY29tbWFuZCwgcGF0aFZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoVmFsdWUuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT0gMCB8fCAhcGF0aC5pc0Fic29sdXRlKGRpcmVjdG9yeSkpIGNvbnRpbnVlXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgY29tbWFuZClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIG1hdGNoZXMuc2V0KGV4YWN0LCBleGFjdClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgUEFUSCBjYW5kaWRhdGUgaXMgYWJzZW50IG9yIG5vbi1leGVjdXRhYmxlOyBkaXNjb3ZlcnkgY29udGludWVzIGRldGVybWluaXN0aWNhbGx5LlxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLnNpemUgPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgd2FzIG5vdCBmb3VuZCBhcyBhbiBleGVjdXRhYmxlIG9uIFBBVEguYFxuICAgIH0pXG4gIH1cbiAgaWYgKG1hdGNoZXMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9BTUJJR1VPVVNcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHJlc29sdmVzIHRvIG11bHRpcGxlIGV4ZWN1dGFibGVzOiAke1suLi5tYXRjaGVzLmtleXMoKV0uam9pbihcIiwgXCIpfS5gXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7ZXhlY3V0YWJsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChbLi4ubWF0Y2hlcy5rZXlzKCldWzBdKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJjYW5vbmljYWxcIil9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZSAtIEFic29sdXRlIG92ZXJyaWRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY29tbWFuZCkge1xuICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgY2F1c2VcblxuICB0cnkge1xuICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKG92ZXJyaWRlKVxuXG4gICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGV4YWN0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2F1c2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlLFxuICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICBjb21tYW5kLFxuICAgIGV4ZWN1dGFibGU6IG92ZXJyaWRlLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBtZXNzYWdlOiBgQ29uZmlndXJlZCBleGVjdXRhYmxlICcke292ZXJyaWRlfScgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZS5gXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNhbmRpZGF0ZSB0byBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59IEV4YWN0IHJlZ3VsYXIgZXhlY3V0YWJsZSwgaWYgdGhlIGZpbGUgdHlwZSBpcyB2YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSkge1xuICBjb25zdCBleGFjdCA9IGF3YWl0IHJlYWxwYXRoKGNhbmRpZGF0ZSlcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdChleGFjdClcblxuICBpZiAoIXN0YXR1cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBhd2FpdCBhY2Nlc3MoZXhhY3QsIGZzQ29uc3RhbnRzLlhfT0spXG5cbiAgcmV0dXJuIGV4YWN0XG59XG5cbi8qKlxuICogUHJvZHVjZXMgdGhlIG1pbmltYWwgZGV0ZXJtaW5pc3RpYyBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gZW52aXJvbm1lbnQgLSBFeHBsaWNpdCBpbnB1dHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52aXJvbm1lbnQoKSkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKGVudmlyb25tZW50KVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICghL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3Qoa2V5KSB8fCBrZXkuaW5jbHVkZXMoXCJcXDBcIikgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpKSB7XG4gICAgICBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBjb250YWlucyBhbiBpbnZhbGlkIGtleSBvciB2YWx1ZS5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZFtrZXldID0gdmFsdWVcbiAgfVxuICBub3JtYWxpemVkLkxBTkcgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLkxDX0FMTCA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuVFogPSBcIlVUQ1wiXG4gIG5vcm1hbGl6ZWQuUEFUSCA/Pz0gXCIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluXCJcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBleGVjdXRhYmxlIGxvb2t1cCBmcm9tIHRoZSBhbWJpZW50IGVudmlyb25tZW50LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBNaW5pbWFsIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbnZpcm9ubWVudCgpIHtcbiAgcmV0dXJuIHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfVxufVxuXG4vKipcbiAqIE5hcnJvd3Mgc3RhYmxlIGZpZWxkcyBmcm9tIGEgdmVyc2lvbiBzdWJwcm9jZXNzIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ319IFN0YWJsZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcikge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4ge2V4aXRDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzaGVsbC1mcmVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHNhZmUgdG8gcGFzcyBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBcmd1bWVudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGV4cGxpY2l0IHByb2Nlc3MtZW52aXJvbm1lbnQgdmFsdWVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gV2hldGhlciBlbnRyaWVzIGFyZSBzdHJpbmdzIG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNFbnZpcm9ubWVudCh2YWx1ZSkge1xuICByZXR1cm4gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSAhPSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBEZXRhY2hlcyBhbiBleHBsaWNpdCBlbnZpcm9ubWVudCBiZWZvcmUgY2Fub25pY2FsIG92ZXJyaWRlIGxvb2t1cCBjYW4geWllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gT3duZWQgZW52aXJvbm1lbnQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RFbnZpcm9ubWVudCh2YWx1ZSwgaWQpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyh2YWx1ZSlcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBpZClcbiAgfVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG4gIGNvbnN0IHNuYXBzaG90ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGVudHJpZXMpIHNuYXBzaG90W2tleV0gPSBlbnRyeVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHNuYXBzaG90KVxufVxuXG4vKipcbiAqIFJlYWRzIG9ubHkgZW51bWVyYWJsZSBvd24gZGF0YSBwcm9wZXJ0aWVzIGZyb20gYW4gb3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdIHwgdW5kZWZpbmVkfSBEZXRhY2hlZCBlbnRyaWVzIHdoZW4gdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpXG5cbiAgICAgIGlmIChkZXNjcmlwdG9yID09IHVuZGVmaW5lZCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8ICEoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIHx8XG4gICAgICAgIChkZXNjcmlwdG9yLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT0gXCJzdHJpbmdcIikpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBkZXNjcmlwdG9yLnZhbHVlXSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBkaXNjb3ZlcnktY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFRvb2xjaGFpbihtZXNzYWdlLCBpZCkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfVE9PTENIQUlOXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyBhbmQgZGlzY292ZXJ5IHJlc3VsdHMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFRvb2xjaGFpbi1vd25lZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
|
package/docs/architecture.md
CHANGED
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
Semantifold has three explicit layers.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Task 018's C path follows these layers through the unchanged root-bundled private legacy CST boundary. `src/frontends/c.js` owns all C trees and exhaustive profile validation. `src/backends/native-validation.js` checks native graph/location limits and `c-validation.js` checks C memory limits; `ordered-expressions.js` plans occurrence-specific evaluation without modifying IR; `c.js` emits mapped `program.c`; and `c-runtime.js` supplies the synthetic immutable-slice/arena header. The C frontend reconstructs candidates only from complete CST regions, resolves them with the existing semantic validator, and compares the original whole CST against the re-parsed canonical backend plan before returning a module. This same-language validation keeps target generation free of parser objects. See the [C profile](c.md).
|
|
6
|
+
|
|
7
|
+
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and the exact official `tree-sitter` binding with the official Python, C#, or Go grammar owns those languages. Their AST/CST objects never appear in the public API. Adapters enumerate supported children and reject every other parser node; filtering syntax away is not a normalization strategy. Prism node offsets and comment byte ranges are converted from UTF-8 to JavaScript UTF-16 offsets before semantic location construction and metadata source slicing. The Node Tree-sitter binding feeds strings as UTF-16LE and exposes code-unit indexes; its adapters reject lone surrogates, exhaustively traverse named/anonymous/comment/directive/error/missing children, and verify boundaries through the shared UTF-8-byte-to-UTF-16 converter. The Go adapter additionally collapses only exact `package main`, optional `fmt`, ordered semantic functions, and a final zero-argument `func main()` into the shared module/entry shape; assignment occurrences, not Go's uniformly mutable `var` syntax, determine semantic local mutability.
|
|
6
8
|
2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects. Scalar types are exact `integer`, `boolean`, or `string` references. Literal nodes carry JavaScript-safe integer, primitive boolean, or parser-decoded Unicode scalar values. Unary and binary expressions carry a closed semantic `operation` and explicit result `type`, never a source operator symbol. Every function, entry point, consequent, and alternate owns a located `Block` containing ordered `Statement` nodes. Statements are local declarations, assignments, conditionals, explicit returns, or prints; an `IfStatement` has a Boolean condition, a consequent block, and an optional alternate block. Source-spelled `else if`, `elsif`, and `elseif` normalize to an alternate block containing one nested conditional.
|
|
7
|
-
3. Source backends in `src/backends/` validate their semantic capabilities before emitting target syntax. Shared validation owns recursive block shape, reachability and all-path return analysis, recursively complete expressions, exhaustive operation/type signatures, function signatures, lexical binding scopes, mutability, declaration-before-use, and strict condition/return/argument/initializer/assignment types. Target-specific validation adds identifier rules, entry-scaffolding name collisions, Java's signed 32-bit `int`
|
|
9
|
+
3. Source backends in `src/backends/` validate their semantic capabilities before emitting target syntax. Shared validation owns recursive block shape, reachability and all-path return analysis, recursively complete expressions, exhaustive operation/type signatures, function signatures, lexical binding scopes, mutability, declaration-before-use, and strict condition/return/argument/initializer/assignment types. Target-specific validation adds identifier rules, entry-scaffolding name collisions, Java's signed 32-bit `int` range, C#'s checked signed-64-bit operation range, Go's known signed-64-bit range and round-trip mutability rule, and target string escaping. Every emitter recursively writes blocks and statements through `SourceWriter`; semantic tokens, target anchors, and synthetic layout are mapped as they are emitted. The C# backend validates the complete module and all filename/map options first, writes mapped `Program.cs`, constructs fixed source-free `Semantifold.csproj`, and submits one ordered candidate set for transactional validation. The Go backend likewise validates before writing, then returns fixed synthetic `go.mod` followed by mapped, gofmt-stable `main.go`; manifest-first ordering lets native setup inspect configuration before source without exposing either artifact early. A backend either returns a complete executable program/project or raises `UNSUPPORTED_CAPABILITY`; it never silently drops nodes, exposes a partial artifact, or lets an emitter discover malformed shape through a `TypeError`.
|
|
8
10
|
|
|
9
11
|
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
|
|
10
12
|
|
|
11
|
-
`index.js` is the public boundary. `parse({language, filename, source})` resolves only the frontend role. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts. `generateArtifactSet(...)` is additive and is required for multi-artifact, binary, and application targets. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID without the requested role is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of the requested semantic content. `src/artifacts.js` owns transactional generated-file validation, `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
|
|
13
|
+
`index.js` is the public boundary. `parse({language, filename, source})` resolves only the frontend role. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, and C backends. `generateArtifactSet(...)` is additive and is required for C#, Go, C, and other multi-artifact, binary, and application targets. It forwards filename and mapping options to a multi backend so unsupported options cannot disappear. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID without the requested role is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of the requested semantic content. `src/artifacts.js` owns transactional generated-file validation, `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
|
|
14
|
+
|
|
15
|
+
`src/toolchains.js` resolves configured absolute overrides or one unambiguous canonical PATH executable, runs a bounded version command, and returns its exact real path and captured version. The `dotnet` contract accepts SDK major 10 through `SEMANTIFOLD_DOTNET` or canonical `dotnet`; the `go` contract accepts only Go 1.26.x on Linux/amd64 through `SEMANTIFOLD_GO` or canonical `go`, with `gofmt` taken from the same GOROOT. `src/acceptance.js` validates all artifacts and ordered stages—including the distinct `restore` stage between generation and compilation—before filesystem mutation, materializes only safe generated paths in a unique temporary directory, invokes exact executable/argument arrays without a shell, fixes `LANG`, `LC_ALL`, and `TZ`, captures output, distinguishes discovery/version/launch/timeout/nonzero failures, records the precise failed stage, and removes the directory. Go acceptance uses isolated caches with downloads, cgo, workspaces, and automatic toolchain selection disabled. The runner performs no network discovery, installation, or runtime download.
|
|
16
|
+
|
|
17
|
+
## Future standard-library portability
|
|
18
|
+
|
|
19
|
+
Standard-library portability is a planned extension of these layers, not current behavior. A frontend will substitute a source-language **language compatibility stdlib/facade** only after parser-backed module resolution proves the native library and symbol identity. The facade is portable executable source that enters the same frontend and semantic layers as application code. It calls a versioned **canonical Semantifold stdlib contract/capability**, never a target API or pair-specific bridge.
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
Artifact generation will compile the application and only its used compatibility modules, then link only the required **target host provider/native binding** modules. Providers implement canonical capabilities with the target's genuine native stdlib behind a protected host-native boundary unavailable to ordinary application and facade code; that isolation also prevents same-language generation from recursively selecting its own compatibility facade. Contract and target validation must finish before any artifact is exposed. Unsupported source identity, source APIs, target capabilities, or semantic mismatches produce located diagnostics rather than partial output.
|
|
22
|
+
|
|
23
|
+
Generated target code may preserve source API class or function names in a collision-safe compatibility namespace or import alias while using valid target syntax. A later backend may replace a facade/provider path with direct idiomatic lowering only when equivalence is proven; it is never the correctness baseline. Linking, tree-shaking, contract precision, namespace rules, and the full compile flow are defined in the [authoritative standard-library portability design](standard-library-portability.md).
|
|
14
24
|
|
|
15
25
|
## Round trips
|
|
16
26
|
|
|
@@ -28,7 +38,7 @@ Frontend source capabilities and backend target capabilities are intentionally s
|
|
|
28
38
|
|
|
29
39
|
Binary operands evaluate left to right. `BooleanAnd` and `BooleanOr` are short-circuit operations. Equality accepts only two operands of the same supported scalar type and means scalar value equality. Semantic integers are mathematical integers with one unsigned zero; IEEE-754 signed zero is not a distinct semantic value. Backends map meaning rather than copying syntax: PHP concatenation is `.`, Java string equality is `.equals`, JavaScript/TypeScript/PHP equality is strict, and other operations use their target's matching native construct. Because supported operations cannot otherwise distinguish signed zero, JavaScript and TypeScript canonically stringify observable scalar output when a module contains integer negation or multiplication. Their frontends unwrap that exact parser-native output scaffold during generated-source reparse, retaining the original operation tree without constant folding. Every emitted operation is conservatively parenthesized; generated-source reparsing reconstructs the same semantic tree.
|
|
30
40
|
|
|
31
|
-
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int
|
|
41
|
+
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee.
|
|
32
42
|
|
|
33
43
|
## Blocks, flow, and bindings
|
|
34
44
|
|
|
@@ -38,6 +48,10 @@ Binding identity is resolver-owned and exposed as deterministic module-local str
|
|
|
38
48
|
|
|
39
49
|
## Provenance and generated mappings
|
|
40
50
|
|
|
41
|
-
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python named
|
|
51
|
+
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
42
52
|
|
|
43
53
|
Each semantic node carries a JSON-safe source-provenance association through reorder, insertion, deletion, cloning, and serialization. Generation rebuilds canonical paths and node/symbol identities from current traversal and validates any serialized caller provenance before use; aggregate path/kind coincidence is never used to associate a different node. Shared caller objects receive deterministic occurrence records keyed by current JSON Pointer, so reused parameters, types, expressions, and valid statements do not collapse distinct emitted locations. Malformed caller registries, including empty source filenames, are discarded before canonical source fallback. This permits legacy and multi-source caller IR while preventing duplicate/stale IDs, mismatched source ownership, or out-of-bounds ranges from becoming semantic authority. The source-aware writer makes all output spans explicit, retains every contextual origin range across composition boundaries, and leaves no coarse legacy emitter path. Rich maps are frozen and indexed after validation; generated, original, node, and symbol queries include contextual related provenance without duplicate spans. See [source provenance and mappings](source-maps.md).
|
|
54
|
+
|
|
55
|
+
## Task019 CPP integration
|
|
56
|
+
|
|
57
|
+
`src/frontends/cpp.js` independently consumes official CPP snapshots and validates exact qualified types, condition clauses, inline support and CPP ordered regions. `src/backends/cpp.js` emits one mapped `program.cpp`; `cpp-runtime.js` owns fixed C++20 libstdc++ support and `cpp-validation.js` proves known owned-value sizes. C and CPP reuse `ordered-expressions.js` for occurrence planning/signatures and `native-validation.js` for bounded graphs, with the owning language preserved in diagnostics. The CPP frontend compares complete CPP CST structure against its canonical CPP output; it never calls the C frontend. The private runtime explicitly selects its official grammar and exports only frozen parser-neutral values. No semantic IR, standalone package identity, parser export, artifact contract or standard-library architecture is expanded. See the [CPP profile](cpp.md).
|
package/docs/c.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# C source and native target profile
|
|
2
|
+
|
|
3
|
+
Task 018 implements the existing Tasks 001–004 semantic subset as independent language `c`. Use `parse({language: "c", filename, source})` and `generateArtifactSet({language: "c", module})`. Generation returns mapped `program.c` first and synthetic support artifact `semantifold_runtime.h` second, with deterministic LF content. Only an omitted filename or exact `program.c` is accepted. Mapping filename/directive options are rejected. Single-artifact generation reports `UNSUPPORTED_ROLE`; C has no binary-backend, interoperability, project-graph, or FFI role.
|
|
4
|
+
|
|
5
|
+
## Scalars, arithmetic and lifetime
|
|
6
|
+
|
|
7
|
+
| Semantic value | Exact C representation | Rules |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `integer` | `int64_t` | Safe nonnegative decimal literal payloads; negative values are unary negation. Generated literals use `INT64_C`. |
|
|
10
|
+
| `boolean` | `bool` | Exact `true`/`false`; no integer conversion or truthiness. |
|
|
11
|
+
| `string` | `SemantifoldString` | Immutable `const unsigned char *data` plus `size_t length`, containing valid UTF-8 bytes including embedded NUL. |
|
|
12
|
+
|
|
13
|
+
The qualified ABI is Linux x86-64: eight-bit bytes, 64-bit `int64_t` and `size_t`, `PTRDIFF_MAX == INT64_MAX`, and eight bytes of arena metadata per allocation. Header static assertions enforce these assumptions at compilation. Caller identifiers begin with an ASCII letter and continue with ASCII letters, digits or underscores. C keywords, imported standard-header names/types/macros, implementation-reserved names, and the `semantifold_`, `SEMANTIFOLD_` and `Semantifold` namespaces are protected in both directions; generation never renames a collision.
|
|
14
|
+
|
|
15
|
+
Boolean literals must have exact lowercase `true`/`false` spelling. The frozen grammar also classifies `TRUE`/`FALSE` expression tokens as Booleans, so those uppercase spellings are rejected as both expressions and caller identifiers, including parameters, locals and functions. They are not aliases or implicit constants. The imported `<limits.h>` macro `MB_LEN_MAX` is also reserved in both directions; a target collision receives a located `UNSUPPORTED_CAPABILITY` before any artifact is returned.
|
|
16
|
+
|
|
17
|
+
Every add, subtract, multiply and negate uses a checked helper. Clang overflow builtins detect signed-64-bit overflow without evaluating undefined signed arithmetic; negation is checked subtraction from zero. Known literal arithmetic outside signed 64-bit is rejected with `UNSUPPORTED_CAPABILITY` before generation. Dynamic overflow cleans the arena, writes exactly `semantifold: integer overflow\n` to stderr and exits with status 70. This is a target failure boundary outside semantic user control; it does not add exceptions or wider portable integer guarantees to the IR. `INT64_MIN` prints correctly using unsigned magnitude conversion. A negative or negative-zero `IntegerLiteral` payload is rejected; unary negation remains a supported operation.
|
|
18
|
+
|
|
19
|
+
`SEMANTIFOLD_STRING("...")` borrows a static C string-literal array, excluding its terminating byte by `sizeof(literal) - 1`. The strict C17 profile limits each decoded literal to 4095 UTF-8 bytes; larger literal objects fail before artifacts. Runtime concatenations can exceed that literal translation limit. Generated tokens encode each UTF-8 byte with three-digit octal escapes, avoiding locale changes, escape munching and embedded-NUL truncation. The frontend decodes only parser-owned ordinary string content and valid simple/octal/hex byte escapes, then verifies complete UTF-8. Copies, parameter passing and returns copy only the descriptor. They do not allocate, mutate, transfer ownership, or end the underlying lifetime.
|
|
20
|
+
|
|
21
|
+
A hexadecimal escape must end at the same boundary in C and the parser. The frozen grammar consumes at most four hex digits per escape node, while C consumes every following hex digit. An escape followed immediately by a parser-owned content node starting with another hex digit is therefore rejected with located `UNSUPPORTED_SYNTAX`, even if its numeric value would fit in a byte. For example, `"\x000041"` is rejected rather than decoded as NUL plus `41`; native C produces `A`. Bounded byte escapes such as `"\x41"`, `"\x0041"` and `"\x43G"`, separate escaped UTF-8 bytes, octal escapes and embedded NUL remain supported. No source reparsing or dependency modification repairs a split escape.
|
|
22
|
+
|
|
23
|
+
Each concatenation allocates one arena node, including empty concatenations. The requested object contains the metadata plus exactly the two explicit byte lengths; it does not require a string terminator. Before allocation, the header checks each length, their sum, metadata addition and cumulative arena accounting against `PTRDIFF_MAX`. It then checks `malloc`, links the owned node and copies nonempty byte ranges. Known literal/local length growth and known allocation lower bounds receive corresponding preflight checks without rewriting the semantic IR. Unknown lengths remain checked at runtime. Size failure writes `semantifold: allocation size\n`; allocation failure writes `semantifold: allocation failure\n`. Both clean existing allocations and exit 70.
|
|
24
|
+
|
|
25
|
+
Canonical `main` calls `semantifold_cleanup()` once after semantic entry statements and returns zero. Cleanup frees each owned node and clears the arena. Returned slices and branch-local descriptor copies therefore remain valid until entry completion. The same cleanup runs before every generated fatal exit. No allocation hook, pointer operation, free, lifetime choice or ownership state is exposed to portable code. Printing uses `fwrite` with explicit lengths, canonical ASCII integer/boolean formatting and one LF. Output failure follows the same fatal policy with `semantifold: output failure\n`; stdout is flushed after each print.
|
|
26
|
+
|
|
27
|
+
## Accepted source and complete CST validation
|
|
28
|
+
|
|
29
|
+
The unchanged root-bundled private legacy boundary supplies recursively frozen C CST data from exact `tree-sitter@0.21.1` and `tree-sitter-c@0.23.2`. `src/frontends/c-parser.js` describes that private plain-data boundary; native handles and parser-specific objects never enter semantic values. Every child, field, anonymous token, extra, error, missing node and recovery flag is traversed before meaning is returned. Coordinates and token origins refer to the original UTF-16 source, including astral characters and CRLF. There is no parser-source scan, compiler-based interpretation, preprocessing fallback or source-text recovery.
|
|
30
|
+
|
|
31
|
+
Ordinary source contains the exact support-header include, at least one `static` semantic function with two named explicitly typed parameters, and final `int main(void)`. Functions return exact scalars. Bodies admit initialized single scalar locals, plain assignment, prints through the matching scalar helper, explicit returns and braced conditionals, including `else if`. `const` locals are immutable; other locals are mutable, and parameters are immutable. Main ends with the exact cleanup call and `return 0`. Raw calls must refer to a preceding or current function definition. Caller-authored forward calls requiring implicit C declarations are rejected; canonical generated prototypes support forward calls and recursion.
|
|
32
|
+
|
|
33
|
+
Only direct semantic calls and the exact scalar/literal/print helpers are recognized. Caller-authored calls nested in an operator operand or another call's argument are rejected because ordinary C does not establish the required semantic evaluation order. Trigraph preprocessing in parser-backed comments or string content is rejected. No user preprocessing, typedef substitution, global data, complex/multiple declarator, qualifier beyond local `const`, array, struct, union, enum, pointer, function pointer, cast, address/dereference, member access, ownership call, `sizeof`, comma/ternary, loop, switch, goto, update, compound operator, conversion or arbitrary external call is accepted.
|
|
34
|
+
|
|
35
|
+
The nested-call restriction includes every scalar helper: checked integer add/subtract/multiply/negate and string concat/equal/not-equal. Helper syntax does not prove ordering; allocation and checked-operation failures are observable. Only the exact `INT64_C` and `SEMANTIFOLD_STRING` literal macros are exempt. A helper can remain the root expression of an initializer, assignment, return, print or condition, with call-free operands or literal macros. Caller code must sequence helper results into locals before passing them to another helper/callee or using them inside unary/binary expressions. For example, `return semantifold_integer_add(left, right) + right;` is rejected at the helper call; `int64_t sum = semantifold_integer_add(left, right); return sum + right;` is supported.
|
|
36
|
+
|
|
37
|
+
Generated ordered regions remain supported because the backend emits each helper as a separate temporary initializer with already-sequenced operands. The frontend reconstructs nesting from those temporary references, then still validates the complete canonical CST. A marker does not exempt an actual nested helper call from the rejection boundary. This correction and its focused RED/GREEN evidence are recorded for [PR 20](https://github.com/kaspernj/semantifold/pull/20) in the [Task 018 delivery record](../todo/018-c-source-and-target.md).
|
|
38
|
+
|
|
39
|
+
Before discarding any parser-backed comment, the frontend rejects backslash-line-ending splices and line comments containing content after a lone CR. The pinned parser can otherwise hide text that native C executes, including a statement following `// comment` plus a bare CR or a block-comment terminator split by backslash-newline. This validation precedes semantic extraction and generated-region comparison. Ordinary line/block comments, exact generated markers, and normal CRLF remain supported and execute under the same strict compiler profile. A split comment opener that the grammar already rejects remains a located `PARSE_ERROR`; compiler output is never used to recover source meaning.
|
|
40
|
+
|
|
41
|
+
## Ordered expressions and exact reparse
|
|
42
|
+
|
|
43
|
+
After complete semantic/target validation and before creating a writer, the C backend plans each expression occurrence in semantic left-to-right order. It treats every call as potentially observable. Each call and enclosing nontrivial operation gets its exact scalar type and a consecutive six-digit name such as `semantifold_ordered_000001`. Eager left preludes precede right preludes. Short-circuit results receive a temporary initialized from the left value, an exact conditional RHS prelude and one final result write using the original `&&` or `||` operator. That token retains the original operator mapping; the generated conditional and temporary names are synthetic. The pure result then feeds the original local initializer, assignment, return, print or conditional test. Branches recursively contain their own regions. The public IR is never rewritten.
|
|
44
|
+
|
|
45
|
+
Every semantic statement is surrounded by exact paired comments:
|
|
46
|
+
|
|
47
|
+
```c
|
|
48
|
+
/* semantifold:ordered-expression:c:v1 begin 000001 <64 lowercase hex digits> */
|
|
49
|
+
/* semantifold:ordered-expression:c:v1 end 000001 <same digest> */
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The digest is SHA-256 over the closed consumer/expression signature implemented in `ordered-expressions.js`, excluding locations. It detects changed operators/consumers; it is not an authentication mechanism or a substitute for tree validation. Generated files start with exact `/* semantifold:program:c:v1 */`, followed by the include, matching ordered prototypes, semantic definitions and main. Exact generated `(void)name;` uses prevent warnings for unused functions, parameters and locals; they are accepted only at their canonical positions.
|
|
53
|
+
|
|
54
|
+
The frontend first reconstructs a private candidate from complete region child lists and direct temporary references, requiring each temporary to be consumed exactly once and rejecting duplicate declarations, extra reads and dead values before shared validation. The candidate must also meet the C graph/occurrence bounds. It then resolves semantic types, regenerates the canonical plan, parses that candidate C through the same CST boundary and compares the **entire original CST** against the canonical CST. Every significant node type, child count, field, token, marker, temporary type/number, initializer, dependency, conditional RHS, write, consumer, prototype and discard position must agree. Only ordinary comments and whitespace are ignored. No candidate module escapes before this comparison. Generated programs must use the complete canonical profile; isolated marker fragments or mixed ordinary/generated statements are rejected.
|
|
55
|
+
|
|
56
|
+
Missing, duplicated, reordered, forged or wrong-version markers; extra/dead/escaping temporaries; wrong types/operators/consumers; altered scaffold casts/prototypes; and malformed semantic content inside a generated region all report located `UNSUPPORTED_SYNTAX`. Parser recovery remains `PARSE_ERROR`. Backend malformed IR, collisions, invalid required locations, cycles, target bounds and unsupported options report `UNSUPPORTED_CAPABILITY`. The unchanged legacy parser accepts at most 32,767 UTF-16 code units per source input; a direct real-parser boundary test proves success at 32,767 and its native failure at 32,768. The C frontend gives a located size diagnostic, and the backend performs an exact output-length preflight before constructing the provenance writer or exposing artifacts. It rejects generated programs above that same limit. No buffer override, parser-payload change or source trimming bypasses this boundary. The bounded C plan also rejects semantic graph depth above 512 or more than 999,999 expanded graph occurrences before recursive validation/emission; occurrence names and statement IDs never widen or wrap.
|
|
57
|
+
|
|
58
|
+
Rich mappings and Source Map v3 retain original operator, call, literal, binding and final-consumer origins. All generated declarations/names/markers, prototypes, unused-binding uses, short-circuit control and cleanup are synthetic with related semantic origins. Shared IR objects receive distinct occurrence paths, temporary names and map records. The header is a synthetic artifact related to the module root.
|
|
59
|
+
|
|
60
|
+
See [testing](testing.md) for package pins, portable qualification commands, strict C17 flags, mandatory O0/O2 sanitizer execution, ownership instrumentation and original-five crossings. These changes neither publish a package nor extend the standard-library portability contract.
|