circle-ir 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +200 -0
  3. package/configs/sinks/code_injection.yaml +672 -0
  4. package/configs/sinks/command.yaml +917 -0
  5. package/configs/sinks/deserialization.yaml +105 -0
  6. package/configs/sinks/ldap.yaml +136 -0
  7. package/configs/sinks/nodejs.json +629 -0
  8. package/configs/sinks/path.yaml +715 -0
  9. package/configs/sinks/python.json +501 -0
  10. package/configs/sinks/rust.json +339 -0
  11. package/configs/sinks/sql.yaml +233 -0
  12. package/configs/sinks/ssrf.yaml +160 -0
  13. package/configs/sinks/xpath.yaml +121 -0
  14. package/configs/sinks/xss.yaml +727 -0
  15. package/configs/sources/db_sources.yaml +90 -0
  16. package/configs/sources/env_sources.yaml +94 -0
  17. package/configs/sources/express.json +197 -0
  18. package/configs/sources/file_sources.yaml +164 -0
  19. package/configs/sources/http_sources.yaml +379 -0
  20. package/configs/sources/io_sources.yaml +519 -0
  21. package/configs/sources/network_sources.yaml +99 -0
  22. package/configs/sources/python.json +230 -0
  23. package/configs/sources/rust.json +286 -0
  24. package/configs/sources/spring.yaml +70 -0
  25. package/dist/analysis/advisory-db.d.ts +86 -0
  26. package/dist/analysis/advisory-db.js +104 -0
  27. package/dist/analysis/advisory-db.js.map +1 -0
  28. package/dist/analysis/cargo-parser.d.ts +42 -0
  29. package/dist/analysis/cargo-parser.js +102 -0
  30. package/dist/analysis/cargo-parser.js.map +1 -0
  31. package/dist/analysis/config-loader.d.ts +37 -0
  32. package/dist/analysis/config-loader.js +1561 -0
  33. package/dist/analysis/config-loader.js.map +1 -0
  34. package/dist/analysis/constant-propagation/ast-utils.d.ts +25 -0
  35. package/dist/analysis/constant-propagation/ast-utils.js +34 -0
  36. package/dist/analysis/constant-propagation/ast-utils.js.map +1 -0
  37. package/dist/analysis/constant-propagation/evaluator.d.ts +32 -0
  38. package/dist/analysis/constant-propagation/evaluator.js +296 -0
  39. package/dist/analysis/constant-propagation/evaluator.js.map +1 -0
  40. package/dist/analysis/constant-propagation/index.d.ts +62 -0
  41. package/dist/analysis/constant-propagation/index.js +152 -0
  42. package/dist/analysis/constant-propagation/index.js.map +1 -0
  43. package/dist/analysis/constant-propagation/patterns.d.ts +8 -0
  44. package/dist/analysis/constant-propagation/patterns.js +126 -0
  45. package/dist/analysis/constant-propagation/patterns.js.map +1 -0
  46. package/dist/analysis/constant-propagation/propagator.d.ts +180 -0
  47. package/dist/analysis/constant-propagation/propagator.js +1985 -0
  48. package/dist/analysis/constant-propagation/propagator.js.map +1 -0
  49. package/dist/analysis/constant-propagation/types.d.ts +63 -0
  50. package/dist/analysis/constant-propagation/types.js +5 -0
  51. package/dist/analysis/constant-propagation/types.js.map +1 -0
  52. package/dist/analysis/constant-propagation.d.ts +9 -0
  53. package/dist/analysis/constant-propagation.js +18 -0
  54. package/dist/analysis/constant-propagation.js.map +1 -0
  55. package/dist/analysis/dependency-scanner.d.ts +79 -0
  56. package/dist/analysis/dependency-scanner.js +122 -0
  57. package/dist/analysis/dependency-scanner.js.map +1 -0
  58. package/dist/analysis/dfg-verifier.d.ts +116 -0
  59. package/dist/analysis/dfg-verifier.js +399 -0
  60. package/dist/analysis/dfg-verifier.js.map +1 -0
  61. package/dist/analysis/findings.d.ts +11 -0
  62. package/dist/analysis/findings.js +228 -0
  63. package/dist/analysis/findings.js.map +1 -0
  64. package/dist/analysis/index.d.ts +16 -0
  65. package/dist/analysis/index.js +18 -0
  66. package/dist/analysis/index.js.map +1 -0
  67. package/dist/analysis/interprocedural.d.ts +99 -0
  68. package/dist/analysis/interprocedural.js +526 -0
  69. package/dist/analysis/interprocedural.js.map +1 -0
  70. package/dist/analysis/path-finder.d.ts +133 -0
  71. package/dist/analysis/path-finder.js +354 -0
  72. package/dist/analysis/path-finder.js.map +1 -0
  73. package/dist/analysis/rules.d.ts +75 -0
  74. package/dist/analysis/rules.js +332 -0
  75. package/dist/analysis/rules.js.map +1 -0
  76. package/dist/analysis/semver.d.ts +27 -0
  77. package/dist/analysis/semver.js +127 -0
  78. package/dist/analysis/semver.js.map +1 -0
  79. package/dist/analysis/taint-matcher.d.ts +15 -0
  80. package/dist/analysis/taint-matcher.js +634 -0
  81. package/dist/analysis/taint-matcher.js.map +1 -0
  82. package/dist/analysis/taint-propagation.d.ts +67 -0
  83. package/dist/analysis/taint-propagation.js +298 -0
  84. package/dist/analysis/taint-propagation.js.map +1 -0
  85. package/dist/analysis/unresolved.d.ts +14 -0
  86. package/dist/analysis/unresolved.js +202 -0
  87. package/dist/analysis/unresolved.js.map +1 -0
  88. package/dist/analyzer.d.ts +43 -0
  89. package/dist/analyzer.js +1010 -0
  90. package/dist/analyzer.js.map +1 -0
  91. package/dist/browser/circle-ir.js +16576 -0
  92. package/dist/browser.d.ts +38 -0
  93. package/dist/browser.js +38 -0
  94. package/dist/browser.js.map +1 -0
  95. package/dist/core/circle-ir-core.cjs +13626 -0
  96. package/dist/core/circle-ir-core.d.ts +59 -0
  97. package/dist/core/circle-ir-core.js +13591 -0
  98. package/dist/core/extractors/calls.d.ts +13 -0
  99. package/dist/core/extractors/calls.js +1429 -0
  100. package/dist/core/extractors/calls.js.map +1 -0
  101. package/dist/core/extractors/cfg.d.ts +9 -0
  102. package/dist/core/extractors/cfg.js +519 -0
  103. package/dist/core/extractors/cfg.js.map +1 -0
  104. package/dist/core/extractors/dfg.d.ts +12 -0
  105. package/dist/core/extractors/dfg.js +1081 -0
  106. package/dist/core/extractors/dfg.js.map +1 -0
  107. package/dist/core/extractors/exports.d.ts +14 -0
  108. package/dist/core/extractors/exports.js +80 -0
  109. package/dist/core/extractors/exports.js.map +1 -0
  110. package/dist/core/extractors/imports.d.ts +9 -0
  111. package/dist/core/extractors/imports.js +739 -0
  112. package/dist/core/extractors/imports.js.map +1 -0
  113. package/dist/core/extractors/index.d.ts +10 -0
  114. package/dist/core/extractors/index.js +11 -0
  115. package/dist/core/extractors/index.js.map +1 -0
  116. package/dist/core/extractors/meta.d.ts +10 -0
  117. package/dist/core/extractors/meta.js +109 -0
  118. package/dist/core/extractors/meta.js.map +1 -0
  119. package/dist/core/extractors/types.d.ts +10 -0
  120. package/dist/core/extractors/types.js +1479 -0
  121. package/dist/core/extractors/types.js.map +1 -0
  122. package/dist/core/index.d.ts +5 -0
  123. package/dist/core/index.js +8 -0
  124. package/dist/core/index.js.map +1 -0
  125. package/dist/core/parser.d.ts +84 -0
  126. package/dist/core/parser.js +250 -0
  127. package/dist/core/parser.js.map +1 -0
  128. package/dist/core-lib.d.ts +59 -0
  129. package/dist/core-lib.js +62 -0
  130. package/dist/core-lib.js.map +1 -0
  131. package/dist/index.d.ts +15 -0
  132. package/dist/index.js +20 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/languages/index.d.ts +11 -0
  135. package/dist/languages/index.js +14 -0
  136. package/dist/languages/index.js.map +1 -0
  137. package/dist/languages/plugins/base.d.ts +44 -0
  138. package/dist/languages/plugins/base.js +82 -0
  139. package/dist/languages/plugins/base.js.map +1 -0
  140. package/dist/languages/plugins/index.d.ts +14 -0
  141. package/dist/languages/plugins/index.js +25 -0
  142. package/dist/languages/plugins/index.js.map +1 -0
  143. package/dist/languages/plugins/java.d.ts +49 -0
  144. package/dist/languages/plugins/java.js +402 -0
  145. package/dist/languages/plugins/java.js.map +1 -0
  146. package/dist/languages/plugins/javascript.d.ts +48 -0
  147. package/dist/languages/plugins/javascript.js +445 -0
  148. package/dist/languages/plugins/javascript.js.map +1 -0
  149. package/dist/languages/plugins/python.d.ts +47 -0
  150. package/dist/languages/plugins/python.js +480 -0
  151. package/dist/languages/plugins/python.js.map +1 -0
  152. package/dist/languages/plugins/rust.d.ts +47 -0
  153. package/dist/languages/plugins/rust.js +405 -0
  154. package/dist/languages/plugins/rust.js.map +1 -0
  155. package/dist/languages/registry.d.ts +30 -0
  156. package/dist/languages/registry.js +80 -0
  157. package/dist/languages/registry.js.map +1 -0
  158. package/dist/languages/types.d.ts +184 -0
  159. package/dist/languages/types.js +8 -0
  160. package/dist/languages/types.js.map +1 -0
  161. package/dist/resolution/cross-file.d.ts +146 -0
  162. package/dist/resolution/cross-file.js +439 -0
  163. package/dist/resolution/cross-file.js.map +1 -0
  164. package/dist/resolution/index.d.ts +12 -0
  165. package/dist/resolution/index.js +10 -0
  166. package/dist/resolution/index.js.map +1 -0
  167. package/dist/resolution/symbol-table.d.ts +136 -0
  168. package/dist/resolution/symbol-table.js +336 -0
  169. package/dist/resolution/symbol-table.js.map +1 -0
  170. package/dist/resolution/type-hierarchy.d.ts +124 -0
  171. package/dist/resolution/type-hierarchy.js +515 -0
  172. package/dist/resolution/type-hierarchy.js.map +1 -0
  173. package/dist/types/config.d.ts +45 -0
  174. package/dist/types/config.js +5 -0
  175. package/dist/types/config.js.map +1 -0
  176. package/dist/types/index.d.ts +392 -0
  177. package/dist/types/index.js +7 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/utils/logger.d.ts +85 -0
  180. package/dist/utils/logger.js +198 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/wasm/tree-sitter-java.wasm +0 -0
  183. package/dist/wasm/tree-sitter-javascript.wasm +0 -0
  184. package/dist/wasm/tree-sitter-python.wasm +0 -0
  185. package/dist/wasm/tree-sitter-rust.wasm +0 -0
  186. package/dist/wasm/web-tree-sitter.wasm +0 -0
  187. package/docs/SPEC.md +1021 -0
  188. package/examples/browser-example.html +610 -0
  189. package/examples/node-example.ts +215 -0
  190. package/package.json +107 -0
  191. package/wasm/tree-sitter-java.wasm +0 -0
  192. package/wasm/tree-sitter-javascript.wasm +0 -0
  193. package/wasm/tree-sitter-python.wasm +0 -0
  194. package/wasm/tree-sitter-rust.wasm +0 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Language Plugin System
3
+ *
4
+ * Provides multi-language support through a plugin architecture.
5
+ * Each language (Java, JavaScript, Python, Rust) has its own plugin
6
+ * that handles AST node types, taint patterns, and framework detection.
7
+ */
8
+ export type { SupportedLanguage, LanguageNodeTypes, LanguagePlugin, LanguageRegistry, ExtractionContext, FrameworkInfo, TaintSourcePattern, TaintSinkPattern, } from './types.js';
9
+ export { getLanguageRegistry, registerLanguage, getLanguagePlugin, getLanguageForFile, detectLanguage, isLanguageSupported, } from './registry.js';
10
+ export { JavaPlugin, JavaScriptPlugin, PythonPlugin, RustPlugin, registerBuiltinPlugins, } from './plugins/index.js';
11
+ export { BaseLanguagePlugin } from './plugins/base.js';
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Language Plugin System
3
+ *
4
+ * Provides multi-language support through a plugin architecture.
5
+ * Each language (Java, JavaScript, Python, Rust) has its own plugin
6
+ * that handles AST node types, taint patterns, and framework detection.
7
+ */
8
+ // Registry functions
9
+ export { getLanguageRegistry, registerLanguage, getLanguagePlugin, getLanguageForFile, detectLanguage, isLanguageSupported, } from './registry.js';
10
+ // Concrete plugins
11
+ export { JavaPlugin, JavaScriptPlugin, PythonPlugin, RustPlugin, registerBuiltinPlugins, } from './plugins/index.js';
12
+ // Base class for custom plugins
13
+ export { BaseLanguagePlugin } from './plugins/base.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/languages/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,qBAAqB;AACrB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,gCAAgC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Base Language Plugin
3
+ *
4
+ * Provides common functionality for all language plugins.
5
+ */
6
+ import type { Parser, Node as SyntaxNode } from 'web-tree-sitter';
7
+ import type { TypeInfo, CallInfo, ImportInfo } from '../../types/index.js';
8
+ import type { LanguagePlugin, LanguageNodeTypes, ExtractionContext, FrameworkInfo, TaintSourcePattern, TaintSinkPattern, SupportedLanguage } from '../types.js';
9
+ /**
10
+ * Abstract base class for language plugins.
11
+ * Provides default implementations for common methods.
12
+ */
13
+ export declare abstract class BaseLanguagePlugin implements LanguagePlugin {
14
+ abstract readonly id: SupportedLanguage;
15
+ abstract readonly name: string;
16
+ abstract readonly extensions: string[];
17
+ abstract readonly wasmPath: string;
18
+ abstract readonly nodeTypes: LanguageNodeTypes;
19
+ protected parser: Parser | null;
20
+ initialize(parser: Parser): Promise<void>;
21
+ canHandle(filePath: string): boolean;
22
+ abstract extractTypes(context: ExtractionContext): TypeInfo[];
23
+ abstract extractCalls(context: ExtractionContext): CallInfo[];
24
+ abstract extractImports(context: ExtractionContext): ImportInfo[];
25
+ abstract extractPackage(context: ExtractionContext): string | undefined;
26
+ abstract getBuiltinSources(): TaintSourcePattern[];
27
+ abstract getBuiltinSinks(): TaintSinkPattern[];
28
+ detectFramework(context: ExtractionContext): FrameworkInfo | undefined;
29
+ getReceiverType(node: SyntaxNode, context: ExtractionContext): string | undefined;
30
+ isStringLiteral(node: SyntaxNode): boolean;
31
+ getStringValue(node: SyntaxNode): string | undefined;
32
+ /**
33
+ * Helper to get text from a node
34
+ */
35
+ protected getNodeText(node: SyntaxNode): string;
36
+ /**
37
+ * Helper to find all nodes of a given type
38
+ */
39
+ protected findNodes(root: SyntaxNode, type: string): SyntaxNode[];
40
+ /**
41
+ * Helper to find first child of given type
42
+ */
43
+ protected findChildByType(node: SyntaxNode, type: string): SyntaxNode | null;
44
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Base Language Plugin
3
+ *
4
+ * Provides common functionality for all language plugins.
5
+ */
6
+ /**
7
+ * Abstract base class for language plugins.
8
+ * Provides default implementations for common methods.
9
+ */
10
+ export class BaseLanguagePlugin {
11
+ parser = null;
12
+ async initialize(parser) {
13
+ this.parser = parser;
14
+ }
15
+ canHandle(filePath) {
16
+ const lowerPath = filePath.toLowerCase();
17
+ return this.extensions.some(ext => {
18
+ const normalizedExt = ext.startsWith('.') ? ext : `.${ext}`;
19
+ return lowerPath.endsWith(normalizedExt);
20
+ });
21
+ }
22
+ // Default implementations for optional methods
23
+ detectFramework(context) {
24
+ return undefined;
25
+ }
26
+ getReceiverType(node, context) {
27
+ return undefined;
28
+ }
29
+ isStringLiteral(node) {
30
+ return node.type === 'string_literal' || node.type === 'string';
31
+ }
32
+ getStringValue(node) {
33
+ if (!this.isStringLiteral(node))
34
+ return undefined;
35
+ const text = node.text;
36
+ // Remove quotes
37
+ if ((text.startsWith('"') && text.endsWith('"')) ||
38
+ (text.startsWith("'") && text.endsWith("'"))) {
39
+ return text.slice(1, -1);
40
+ }
41
+ return text;
42
+ }
43
+ /**
44
+ * Helper to get text from a node
45
+ */
46
+ getNodeText(node) {
47
+ return node.text;
48
+ }
49
+ /**
50
+ * Helper to find all nodes of a given type
51
+ */
52
+ findNodes(root, type) {
53
+ const nodes = [];
54
+ const cursor = root.walk();
55
+ const visit = () => {
56
+ if (cursor.nodeType === type) {
57
+ nodes.push(cursor.currentNode);
58
+ }
59
+ if (cursor.gotoFirstChild()) {
60
+ do {
61
+ visit();
62
+ } while (cursor.gotoNextSibling());
63
+ cursor.gotoParent();
64
+ }
65
+ };
66
+ visit();
67
+ return nodes;
68
+ }
69
+ /**
70
+ * Helper to find first child of given type
71
+ */
72
+ findChildByType(node, type) {
73
+ for (let i = 0; i < node.childCount; i++) {
74
+ const child = node.child(i);
75
+ if (child?.type === type) {
76
+ return child;
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+ }
82
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/languages/plugins/base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH;;;GAGG;AACH,MAAM,OAAgB,kBAAkB;IAO5B,MAAM,GAAkB,IAAI,CAAC;IAEvC,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAChC,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YAC5D,OAAO,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAUD,+CAA+C;IAC/C,eAAe,CAAC,OAA0B;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,IAAgB,EAAE,OAA0B;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,IAAgB;QAC9B,OAAO,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;IAClE,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,gBAAgB;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACO,WAAW,CAAC,IAAgB;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACO,SAAS,CAAC,IAAgB,EAAE,IAAY;QAChD,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE3B,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC5B,GAAG,CAAC;oBACF,KAAK,EAAE,CAAC;gBACV,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;gBACnC,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,EAAE,CAAC;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACO,eAAe,CAAC,IAAgB,EAAE,IAAY;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Language Plugins - Concrete implementations
3
+ *
4
+ * Exports all language plugins and provides initialization helpers.
5
+ */
6
+ export { JavaPlugin } from './java.js';
7
+ export { JavaScriptPlugin } from './javascript.js';
8
+ export { PythonPlugin } from './python.js';
9
+ export { RustPlugin } from './rust.js';
10
+ /**
11
+ * Register all built-in language plugins with the global registry.
12
+ * Call this during analyzer initialization.
13
+ */
14
+ export declare function registerBuiltinPlugins(): void;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Language Plugins - Concrete implementations
3
+ *
4
+ * Exports all language plugins and provides initialization helpers.
5
+ */
6
+ export { JavaPlugin } from './java.js';
7
+ export { JavaScriptPlugin } from './javascript.js';
8
+ export { PythonPlugin } from './python.js';
9
+ export { RustPlugin } from './rust.js';
10
+ import { registerLanguage } from '../registry.js';
11
+ import { JavaPlugin } from './java.js';
12
+ import { JavaScriptPlugin } from './javascript.js';
13
+ import { PythonPlugin } from './python.js';
14
+ import { RustPlugin } from './rust.js';
15
+ /**
16
+ * Register all built-in language plugins with the global registry.
17
+ * Call this during analyzer initialization.
18
+ */
19
+ export function registerBuiltinPlugins() {
20
+ registerLanguage(new JavaPlugin());
21
+ registerLanguage(new JavaScriptPlugin());
22
+ registerLanguage(new PythonPlugin());
23
+ registerLanguage(new RustPlugin());
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/languages/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,gBAAgB,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;IACnC,gBAAgB,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;IACzC,gBAAgB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;IACrC,gBAAgB,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Java Language Plugin
3
+ *
4
+ * Provides Java-specific AST handling, taint patterns, and framework detection.
5
+ */
6
+ import type { Node as SyntaxNode } from 'web-tree-sitter';
7
+ import type { TypeInfo, CallInfo, ImportInfo } from '../../types/index.js';
8
+ import type { LanguageNodeTypes, ExtractionContext, FrameworkInfo, TaintSourcePattern, TaintSinkPattern } from '../types.js';
9
+ import { BaseLanguagePlugin } from './base.js';
10
+ /**
11
+ * Java language plugin implementation.
12
+ */
13
+ export declare class JavaPlugin extends BaseLanguagePlugin {
14
+ readonly id: "java";
15
+ readonly name = "Java";
16
+ readonly extensions: string[];
17
+ readonly wasmPath = "tree-sitter-java.wasm";
18
+ readonly nodeTypes: LanguageNodeTypes;
19
+ /**
20
+ * Detect Java frameworks from imports and annotations.
21
+ */
22
+ detectFramework(context: ExtractionContext): FrameworkInfo | undefined;
23
+ /**
24
+ * Java-specific taint source patterns.
25
+ * These supplement the YAML configuration.
26
+ */
27
+ getBuiltinSources(): TaintSourcePattern[];
28
+ /**
29
+ * Java-specific taint sink patterns.
30
+ * These supplement the YAML configuration.
31
+ */
32
+ getBuiltinSinks(): TaintSinkPattern[];
33
+ /**
34
+ * Get receiver type from a method invocation node.
35
+ */
36
+ getReceiverType(node: SyntaxNode, context: ExtractionContext): string | undefined;
37
+ /**
38
+ * Check if node is a Java string literal.
39
+ */
40
+ isStringLiteral(node: SyntaxNode): boolean;
41
+ /**
42
+ * Get string value from Java string literal.
43
+ */
44
+ getStringValue(node: SyntaxNode): string | undefined;
45
+ extractTypes(context: ExtractionContext): TypeInfo[];
46
+ extractCalls(context: ExtractionContext): CallInfo[];
47
+ extractImports(context: ExtractionContext): ImportInfo[];
48
+ extractPackage(context: ExtractionContext): string | undefined;
49
+ }
@@ -0,0 +1,402 @@
1
+ /**
2
+ * Java Language Plugin
3
+ *
4
+ * Provides Java-specific AST handling, taint patterns, and framework detection.
5
+ */
6
+ import { BaseLanguagePlugin } from './base.js';
7
+ /**
8
+ * Java language plugin implementation.
9
+ */
10
+ export class JavaPlugin extends BaseLanguagePlugin {
11
+ id = 'java';
12
+ name = 'Java';
13
+ extensions = ['.java'];
14
+ wasmPath = 'tree-sitter-java.wasm';
15
+ nodeTypes = {
16
+ // Type declarations
17
+ classDeclaration: ['class_declaration'],
18
+ interfaceDeclaration: ['interface_declaration'],
19
+ enumDeclaration: ['enum_declaration'],
20
+ functionDeclaration: [],
21
+ methodDeclaration: ['method_declaration', 'constructor_declaration'],
22
+ // Expressions
23
+ methodCall: ['method_invocation'],
24
+ functionCall: [],
25
+ assignment: ['assignment_expression'],
26
+ variableDeclaration: ['local_variable_declaration', 'field_declaration'],
27
+ // Parameters and arguments
28
+ parameter: ['formal_parameter', 'spread_parameter'],
29
+ argument: ['argument_list'],
30
+ // Annotations/decorators
31
+ annotation: ['marker_annotation', 'annotation'],
32
+ decorator: [],
33
+ // Imports
34
+ importStatement: ['import_declaration'],
35
+ // Control flow
36
+ ifStatement: ['if_statement'],
37
+ forStatement: ['for_statement', 'enhanced_for_statement'],
38
+ whileStatement: ['while_statement'],
39
+ tryStatement: ['try_statement', 'try_with_resources_statement'],
40
+ returnStatement: ['return_statement'],
41
+ };
42
+ /**
43
+ * Detect Java frameworks from imports and annotations.
44
+ */
45
+ detectFramework(context) {
46
+ const indicators = [];
47
+ let framework;
48
+ let confidence = 0;
49
+ // Check imports for framework patterns
50
+ for (const imp of context.imports) {
51
+ const path = imp.from_package || imp.imported_name;
52
+ // Spring Framework
53
+ if (path.startsWith('org.springframework')) {
54
+ framework = 'spring';
55
+ confidence = Math.max(confidence, 0.9);
56
+ indicators.push(`import: ${path}`);
57
+ }
58
+ // Jakarta EE / Java EE
59
+ if (path.startsWith('jakarta.') || path.startsWith('javax.')) {
60
+ if (path.includes('servlet')) {
61
+ framework = framework || 'servlet';
62
+ confidence = Math.max(confidence, 0.8);
63
+ indicators.push(`import: ${path}`);
64
+ }
65
+ if (path.includes('ws.rs')) {
66
+ framework = 'jax-rs';
67
+ confidence = Math.max(confidence, 0.85);
68
+ indicators.push(`import: ${path}`);
69
+ }
70
+ }
71
+ // Struts
72
+ if (path.startsWith('org.apache.struts')) {
73
+ framework = 'struts';
74
+ confidence = Math.max(confidence, 0.85);
75
+ indicators.push(`import: ${path}`);
76
+ }
77
+ // Quarkus
78
+ if (path.startsWith('io.quarkus')) {
79
+ framework = 'quarkus';
80
+ confidence = Math.max(confidence, 0.85);
81
+ indicators.push(`import: ${path}`);
82
+ }
83
+ }
84
+ if (framework) {
85
+ return { name: framework, confidence, indicators };
86
+ }
87
+ return undefined;
88
+ }
89
+ /**
90
+ * Java-specific taint source patterns.
91
+ * These supplement the YAML configuration.
92
+ */
93
+ getBuiltinSources() {
94
+ return [
95
+ // Spring MVC annotations
96
+ {
97
+ annotation: 'RequestParam',
98
+ type: 'http_param',
99
+ severity: 'high',
100
+ confidence: 0.95,
101
+ returnTainted: true,
102
+ },
103
+ {
104
+ annotation: 'RequestBody',
105
+ type: 'http_body',
106
+ severity: 'high',
107
+ confidence: 0.95,
108
+ returnTainted: true,
109
+ },
110
+ {
111
+ annotation: 'PathVariable',
112
+ type: 'http_path',
113
+ severity: 'high',
114
+ confidence: 0.95,
115
+ returnTainted: true,
116
+ },
117
+ {
118
+ annotation: 'RequestHeader',
119
+ type: 'http_header',
120
+ severity: 'high',
121
+ confidence: 0.9,
122
+ returnTainted: true,
123
+ },
124
+ {
125
+ annotation: 'CookieValue',
126
+ type: 'http_cookie',
127
+ severity: 'high',
128
+ confidence: 0.9,
129
+ returnTainted: true,
130
+ },
131
+ {
132
+ annotation: 'MatrixVariable',
133
+ type: 'http_param',
134
+ severity: 'high',
135
+ confidence: 0.85,
136
+ returnTainted: true,
137
+ },
138
+ // JAX-RS annotations
139
+ {
140
+ annotation: 'QueryParam',
141
+ type: 'http_param',
142
+ severity: 'high',
143
+ confidence: 0.95,
144
+ returnTainted: true,
145
+ },
146
+ {
147
+ annotation: 'PathParam',
148
+ type: 'http_path',
149
+ severity: 'high',
150
+ confidence: 0.95,
151
+ returnTainted: true,
152
+ },
153
+ {
154
+ annotation: 'FormParam',
155
+ type: 'http_body',
156
+ severity: 'high',
157
+ confidence: 0.95,
158
+ returnTainted: true,
159
+ },
160
+ {
161
+ annotation: 'HeaderParam',
162
+ type: 'http_header',
163
+ severity: 'high',
164
+ confidence: 0.9,
165
+ returnTainted: true,
166
+ },
167
+ // Servlet API
168
+ {
169
+ method: 'getParameter',
170
+ class: 'HttpServletRequest',
171
+ type: 'http_param',
172
+ severity: 'high',
173
+ confidence: 0.95,
174
+ returnTainted: true,
175
+ },
176
+ {
177
+ method: 'getParameterValues',
178
+ class: 'HttpServletRequest',
179
+ type: 'http_param',
180
+ severity: 'high',
181
+ confidence: 0.95,
182
+ returnTainted: true,
183
+ },
184
+ {
185
+ method: 'getHeader',
186
+ class: 'HttpServletRequest',
187
+ type: 'http_header',
188
+ severity: 'high',
189
+ confidence: 0.9,
190
+ returnTainted: true,
191
+ },
192
+ {
193
+ method: 'getCookies',
194
+ class: 'HttpServletRequest',
195
+ type: 'http_cookie',
196
+ severity: 'high',
197
+ confidence: 0.9,
198
+ returnTainted: true,
199
+ },
200
+ {
201
+ method: 'getInputStream',
202
+ class: 'HttpServletRequest',
203
+ type: 'http_body',
204
+ severity: 'high',
205
+ confidence: 0.85,
206
+ returnTainted: true,
207
+ },
208
+ {
209
+ method: 'getReader',
210
+ class: 'HttpServletRequest',
211
+ type: 'http_body',
212
+ severity: 'high',
213
+ confidence: 0.85,
214
+ returnTainted: true,
215
+ },
216
+ ];
217
+ }
218
+ /**
219
+ * Java-specific taint sink patterns.
220
+ * These supplement the YAML configuration.
221
+ */
222
+ getBuiltinSinks() {
223
+ return [
224
+ // SQL Injection
225
+ {
226
+ method: 'executeQuery',
227
+ class: 'Statement',
228
+ type: 'sql_injection',
229
+ cwe: 'CWE-89',
230
+ severity: 'critical',
231
+ argPositions: [0],
232
+ },
233
+ {
234
+ method: 'executeUpdate',
235
+ class: 'Statement',
236
+ type: 'sql_injection',
237
+ cwe: 'CWE-89',
238
+ severity: 'critical',
239
+ argPositions: [0],
240
+ },
241
+ {
242
+ method: 'execute',
243
+ class: 'Statement',
244
+ type: 'sql_injection',
245
+ cwe: 'CWE-89',
246
+ severity: 'critical',
247
+ argPositions: [0],
248
+ },
249
+ // Command Injection
250
+ {
251
+ method: 'exec',
252
+ class: 'Runtime',
253
+ type: 'command_injection',
254
+ cwe: 'CWE-78',
255
+ severity: 'critical',
256
+ argPositions: [0],
257
+ },
258
+ {
259
+ method: 'start',
260
+ class: 'ProcessBuilder',
261
+ type: 'command_injection',
262
+ cwe: 'CWE-78',
263
+ severity: 'critical',
264
+ argPositions: [], // Constructor args are dangerous
265
+ },
266
+ // Path Traversal
267
+ {
268
+ method: 'FileInputStream',
269
+ type: 'path_traversal',
270
+ cwe: 'CWE-22',
271
+ severity: 'high',
272
+ argPositions: [0],
273
+ },
274
+ {
275
+ method: 'FileOutputStream',
276
+ type: 'path_traversal',
277
+ cwe: 'CWE-22',
278
+ severity: 'high',
279
+ argPositions: [0],
280
+ },
281
+ // XSS
282
+ {
283
+ method: 'write',
284
+ class: 'PrintWriter',
285
+ type: 'xss',
286
+ cwe: 'CWE-79',
287
+ severity: 'high',
288
+ argPositions: [0],
289
+ },
290
+ {
291
+ method: 'println',
292
+ class: 'PrintWriter',
293
+ type: 'xss',
294
+ cwe: 'CWE-79',
295
+ severity: 'high',
296
+ argPositions: [0],
297
+ },
298
+ // LDAP Injection
299
+ {
300
+ method: 'search',
301
+ class: 'DirContext',
302
+ type: 'ldap_injection',
303
+ cwe: 'CWE-90',
304
+ severity: 'high',
305
+ argPositions: [0, 1],
306
+ },
307
+ // XPath Injection
308
+ {
309
+ method: 'evaluate',
310
+ class: 'XPath',
311
+ type: 'xpath_injection',
312
+ cwe: 'CWE-643',
313
+ severity: 'high',
314
+ argPositions: [0],
315
+ },
316
+ // Deserialization
317
+ {
318
+ method: 'readObject',
319
+ class: 'ObjectInputStream',
320
+ type: 'deserialization',
321
+ cwe: 'CWE-502',
322
+ severity: 'critical',
323
+ argPositions: [],
324
+ },
325
+ ];
326
+ }
327
+ /**
328
+ * Get receiver type from a method invocation node.
329
+ */
330
+ getReceiverType(node, context) {
331
+ if (node.type !== 'method_invocation')
332
+ return undefined;
333
+ const receiver = node.childForFieldName('object');
334
+ if (!receiver)
335
+ return undefined;
336
+ // If receiver is an identifier, look up its type
337
+ if (receiver.type === 'identifier') {
338
+ const name = receiver.text;
339
+ // Try to find variable declaration to get type
340
+ // This is a simplified lookup - full implementation would use scope analysis
341
+ return undefined; // TODO: Implement type resolution
342
+ }
343
+ // If receiver is a field access, return the field type
344
+ if (receiver.type === 'field_access') {
345
+ return receiver.text;
346
+ }
347
+ return undefined;
348
+ }
349
+ /**
350
+ * Check if node is a Java string literal.
351
+ */
352
+ isStringLiteral(node) {
353
+ return node.type === 'string_literal';
354
+ }
355
+ /**
356
+ * Get string value from Java string literal.
357
+ */
358
+ getStringValue(node) {
359
+ if (node.type !== 'string_literal')
360
+ return undefined;
361
+ const text = node.text;
362
+ // Remove surrounding quotes
363
+ if (text.startsWith('"') && text.endsWith('"')) {
364
+ return text.slice(1, -1);
365
+ }
366
+ return text;
367
+ }
368
+ // Extraction methods - delegate to existing extractors for now
369
+ // These will be migrated into the plugin in future iterations
370
+ extractTypes(context) {
371
+ // Delegated to existing extractor
372
+ return [];
373
+ }
374
+ extractCalls(context) {
375
+ // Delegated to existing extractor
376
+ return [];
377
+ }
378
+ extractImports(context) {
379
+ // Delegated to existing extractor
380
+ return [];
381
+ }
382
+ extractPackage(context) {
383
+ // Find package declaration in tree
384
+ const packages = this.findNodes(context.tree.rootNode, 'package_declaration');
385
+ if (packages.length === 0)
386
+ return undefined;
387
+ const pkgDecl = packages[0];
388
+ const nameNode = pkgDecl.childForFieldName('name');
389
+ if (nameNode) {
390
+ return this.getNodeText(nameNode);
391
+ }
392
+ // Fallback: find scoped_identifier or identifier
393
+ for (let i = 0; i < pkgDecl.childCount; i++) {
394
+ const child = pkgDecl.child(i);
395
+ if (child && (child.type === 'scoped_identifier' || child.type === 'identifier')) {
396
+ return this.getNodeText(child);
397
+ }
398
+ }
399
+ return undefined;
400
+ }
401
+ }
402
+ //# sourceMappingURL=java.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.js","sourceRoot":"","sources":["../../../src/languages/plugins/java.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,kBAAkB;IACvC,EAAE,GAAG,MAAe,CAAC;IACrB,IAAI,GAAG,MAAM,CAAC;IACd,UAAU,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,QAAQ,GAAG,uBAAuB,CAAC;IAEnC,SAAS,GAAsB;QACtC,oBAAoB;QACpB,gBAAgB,EAAE,CAAC,mBAAmB,CAAC;QACvC,oBAAoB,EAAE,CAAC,uBAAuB,CAAC;QAC/C,eAAe,EAAE,CAAC,kBAAkB,CAAC;QACrC,mBAAmB,EAAE,EAAE;QACvB,iBAAiB,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;QAEpE,cAAc;QACd,UAAU,EAAE,CAAC,mBAAmB,CAAC;QACjC,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,CAAC,uBAAuB,CAAC;QACrC,mBAAmB,EAAE,CAAC,4BAA4B,EAAE,mBAAmB,CAAC;QAExE,2BAA2B;QAC3B,SAAS,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;QACnD,QAAQ,EAAE,CAAC,eAAe,CAAC;QAE3B,yBAAyB;QACzB,UAAU,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;QAC/C,SAAS,EAAE,EAAE;QAEb,UAAU;QACV,eAAe,EAAE,CAAC,oBAAoB,CAAC;QAEvC,eAAe;QACf,WAAW,EAAE,CAAC,cAAc,CAAC;QAC7B,YAAY,EAAE,CAAC,eAAe,EAAE,wBAAwB,CAAC;QACzD,cAAc,EAAE,CAAC,iBAAiB,CAAC;QACnC,YAAY,EAAE,CAAC,eAAe,EAAE,8BAA8B,CAAC;QAC/D,eAAe,EAAE,CAAC,kBAAkB,CAAC;KACtC,CAAC;IAEF;;OAEG;IACH,eAAe,CAAC,OAA0B;QACxC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,SAA6B,CAAC;QAClC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,uCAAuC;QACvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,aAAa,CAAC;YAEnD,mBAAmB;YACnB,IAAI,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC3C,SAAS,GAAG,QAAQ,CAAC;gBACrB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBACvC,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;YAED,uBAAuB;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,SAAS,GAAG,SAAS,IAAI,SAAS,CAAC;oBACnC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;oBACvC,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,SAAS,GAAG,QAAQ,CAAC;oBACrB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxC,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,SAAS;YACT,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACzC,SAAS,GAAG,QAAQ,CAAC;gBACrB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACxC,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;YAED,UAAU;YACV,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClC,SAAS,GAAG,SAAS,CAAC;gBACtB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACxC,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;QACrD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,OAAO;YACL,yBAAyB;YACzB;gBACE,UAAU,EAAE,cAAc;gBAC1B,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,aAAa;gBACzB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,cAAc;gBAC1B,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,eAAe;gBAC3B,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,aAAa;gBACzB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,gBAAgB;gBAC5B,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YAED,qBAAqB;YACrB;gBACE,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,WAAW;gBACvB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,WAAW;gBACvB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,UAAU,EAAE,aAAa;gBACzB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,IAAI;aACpB;YAED,cAAc;YACd;gBACE,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,MAAM,EAAE,oBAAoB;gBAC5B,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,MAAM,EAAE,gBAAgB;gBACxB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD;gBACE,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO;YACL,gBAAgB;YAChB;gBACE,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YACD;gBACE,MAAM,EAAE,eAAe;gBACvB,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YACD;gBACE,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YAED,oBAAoB;YACpB;gBACE,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,mBAAmB;gBACzB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YACD;gBACE,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,mBAAmB;gBACzB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,EAAE,EAAG,iCAAiC;aACrD;YAED,iBAAiB;YACjB;gBACE,MAAM,EAAE,iBAAiB;gBACzB,IAAI,EAAE,gBAAgB;gBACtB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YACD;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,gBAAgB;gBACtB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YAED,MAAM;YACN;gBACE,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YACD;gBACE,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YAED,iBAAiB;YACjB;gBACE,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;aACrB;YAED,kBAAkB;YAClB;gBACE,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,iBAAiB;gBACvB,GAAG,EAAE,SAAS;gBACd,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE,CAAC,CAAC,CAAC;aAClB;YAED,kBAAkB;YAClB;gBACE,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,iBAAiB;gBACvB,GAAG,EAAE,SAAS;gBACd,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAgB,EAAE,OAA0B;QAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB;YAAE,OAAO,SAAS,CAAC;QAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,iDAAiD;QACjD,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,+CAA+C;YAC/C,6EAA6E;YAC7E,OAAO,SAAS,CAAC,CAAE,kCAAkC;QACvD,CAAC;QAED,uDAAuD;QACvD,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAgB;QAC9B,OAAO,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAgB;QAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;YAAE,OAAO,SAAS,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,4BAA4B;QAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+DAA+D;IAC/D,8DAA8D;IAE9D,YAAY,CAAC,OAA0B;QACrC,kCAAkC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,YAAY,CAAC,OAA0B;QACrC,kCAAkC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,cAAc,CAAC,OAA0B;QACvC,kCAAkC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,cAAc,CAAC,OAA0B;QACvC,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE5C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,iDAAiD;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;gBACjF,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}