@behavioral-contracts/verify-cli 1.0.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 (80) hide show
  1. package/LICENSE +119 -0
  2. package/README.md +694 -0
  3. package/dist/analyze-results.js +253 -0
  4. package/dist/analyzer.d.ts +366 -0
  5. package/dist/analyzer.d.ts.map +1 -0
  6. package/dist/analyzer.js +2592 -0
  7. package/dist/analyzer.js.map +1 -0
  8. package/dist/analyzers/async-error-analyzer.d.ts +72 -0
  9. package/dist/analyzers/async-error-analyzer.d.ts.map +1 -0
  10. package/dist/analyzers/async-error-analyzer.js +243 -0
  11. package/dist/analyzers/async-error-analyzer.js.map +1 -0
  12. package/dist/analyzers/event-listener-analyzer.d.ts +102 -0
  13. package/dist/analyzers/event-listener-analyzer.d.ts.map +1 -0
  14. package/dist/analyzers/event-listener-analyzer.js +253 -0
  15. package/dist/analyzers/event-listener-analyzer.js.map +1 -0
  16. package/dist/analyzers/react-query-analyzer.d.ts +66 -0
  17. package/dist/analyzers/react-query-analyzer.d.ts.map +1 -0
  18. package/dist/analyzers/react-query-analyzer.js +341 -0
  19. package/dist/analyzers/react-query-analyzer.js.map +1 -0
  20. package/dist/analyzers/return-value-analyzer.d.ts +61 -0
  21. package/dist/analyzers/return-value-analyzer.d.ts.map +1 -0
  22. package/dist/analyzers/return-value-analyzer.js +225 -0
  23. package/dist/analyzers/return-value-analyzer.js.map +1 -0
  24. package/dist/code-snippet.d.ts +48 -0
  25. package/dist/code-snippet.d.ts.map +1 -0
  26. package/dist/code-snippet.js +84 -0
  27. package/dist/code-snippet.js.map +1 -0
  28. package/dist/corpus-loader.d.ts +33 -0
  29. package/dist/corpus-loader.d.ts.map +1 -0
  30. package/dist/corpus-loader.js +155 -0
  31. package/dist/corpus-loader.js.map +1 -0
  32. package/dist/fixture-tester.d.ts +28 -0
  33. package/dist/fixture-tester.d.ts.map +1 -0
  34. package/dist/fixture-tester.js +176 -0
  35. package/dist/fixture-tester.js.map +1 -0
  36. package/dist/index.d.ts +6 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +375 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/package-discovery.d.ts +62 -0
  41. package/dist/package-discovery.d.ts.map +1 -0
  42. package/dist/package-discovery.js +299 -0
  43. package/dist/package-discovery.js.map +1 -0
  44. package/dist/reporter.d.ts +43 -0
  45. package/dist/reporter.d.ts.map +1 -0
  46. package/dist/reporter.js +347 -0
  47. package/dist/reporter.js.map +1 -0
  48. package/dist/reporters/benchmarking.d.ts +70 -0
  49. package/dist/reporters/benchmarking.d.ts.map +1 -0
  50. package/dist/reporters/benchmarking.js +191 -0
  51. package/dist/reporters/benchmarking.js.map +1 -0
  52. package/dist/reporters/d3-visualizer.d.ts +40 -0
  53. package/dist/reporters/d3-visualizer.d.ts.map +1 -0
  54. package/dist/reporters/d3-visualizer.js +803 -0
  55. package/dist/reporters/d3-visualizer.js.map +1 -0
  56. package/dist/reporters/health-score.d.ts +33 -0
  57. package/dist/reporters/health-score.d.ts.map +1 -0
  58. package/dist/reporters/health-score.js +149 -0
  59. package/dist/reporters/health-score.js.map +1 -0
  60. package/dist/reporters/index.d.ts +11 -0
  61. package/dist/reporters/index.d.ts.map +1 -0
  62. package/dist/reporters/index.js +11 -0
  63. package/dist/reporters/index.js.map +1 -0
  64. package/dist/reporters/package-breakdown.d.ts +48 -0
  65. package/dist/reporters/package-breakdown.d.ts.map +1 -0
  66. package/dist/reporters/package-breakdown.js +185 -0
  67. package/dist/reporters/package-breakdown.js.map +1 -0
  68. package/dist/reporters/positive-evidence.d.ts +42 -0
  69. package/dist/reporters/positive-evidence.d.ts.map +1 -0
  70. package/dist/reporters/positive-evidence.js +436 -0
  71. package/dist/reporters/positive-evidence.js.map +1 -0
  72. package/dist/tsconfig-generator.d.ts +17 -0
  73. package/dist/tsconfig-generator.d.ts.map +1 -0
  74. package/dist/tsconfig-generator.js +107 -0
  75. package/dist/tsconfig-generator.js.map +1 -0
  76. package/dist/types.d.ts +298 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +5 -0
  79. package/dist/types.js.map +1 -0
  80. package/package.json +59 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Package Discovery Module
3
+ *
4
+ * Scans a project to discover all packages used, check which have contracts,
5
+ * and provide coverage statistics.
6
+ */
7
+ import { PackageDiscoveryResult, PackageContract } from './types.js';
8
+ export declare class PackageDiscovery {
9
+ private corpusContracts;
10
+ private pathAliases;
11
+ constructor(corpusContracts: Map<string, PackageContract>);
12
+ /**
13
+ * Discover all packages used in a project
14
+ */
15
+ discoverPackages(projectRoot: string, tsconfigPath: string): Promise<PackageDiscoveryResult>;
16
+ /**
17
+ * Read dependencies from package.json
18
+ */
19
+ private readPackageJson;
20
+ /**
21
+ * Scan TypeScript source files for import statements
22
+ */
23
+ private scanImports;
24
+ /**
25
+ * Extract path aliases from tsconfig to filter them out
26
+ *
27
+ * Examples:
28
+ * - "@/*" -> "@"
29
+ * - "@/components/*" -> "@/components"
30
+ * - "~/*" -> "~"
31
+ */
32
+ private extractPathAliases;
33
+ /**
34
+ * Extract import statements from a TypeScript source file
35
+ */
36
+ private extractImportsFromFile;
37
+ /**
38
+ * Extract the package name from an import path
39
+ *
40
+ * Examples:
41
+ * - 'axios' -> 'axios'
42
+ * - '@prisma/client' -> '@prisma/client'
43
+ * - 'axios/lib/core' -> 'axios'
44
+ * - './local' -> null
45
+ * - '../relative' -> null
46
+ * - '@/components' -> null (path alias)
47
+ */
48
+ private extractPackageName;
49
+ /**
50
+ * Merge packages from package.json and actual imports
51
+ */
52
+ private mergePackages;
53
+ /**
54
+ * Check which packages have contracts in the corpus
55
+ */
56
+ private checkContracts;
57
+ /**
58
+ * Generate a coverage report
59
+ */
60
+ generateCoverageReport(discovery: PackageDiscoveryResult): string;
61
+ }
62
+ //# sourceMappingURL=package-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-discovery.d.ts","sourceRoot":"","sources":["../src/package-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAqB,sBAAsB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExF,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,eAAe;IAHzB,OAAO,CAAC,WAAW,CAA0B;gBAGnC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAGvD;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAyBlG;;OAEG;YACW,eAAe;IAqB7B;;OAEG;YACW,WAAW;IAgCzB;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4C9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkCrB;;OAEG;IACH,OAAO,CAAC,cAAc;IA6BtB;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,sBAAsB,GAAG,MAAM;CAyClE"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Package Discovery Module
3
+ *
4
+ * Scans a project to discover all packages used, check which have contracts,
5
+ * and provide coverage statistics.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import * as ts from 'typescript';
10
+ export class PackageDiscovery {
11
+ corpusContracts;
12
+ pathAliases = new Set();
13
+ constructor(corpusContracts) {
14
+ this.corpusContracts = corpusContracts;
15
+ }
16
+ /**
17
+ * Discover all packages used in a project
18
+ */
19
+ async discoverPackages(projectRoot, tsconfigPath) {
20
+ // Step 1: Read package.json dependencies
21
+ const packageJsonDeps = await this.readPackageJson(projectRoot);
22
+ // Step 2: Scan source files for actual imports
23
+ const importedPackages = await this.scanImports(tsconfigPath);
24
+ // Step 3: Merge and dedupe
25
+ const allPackages = this.mergePackages(packageJsonDeps, importedPackages);
26
+ // Step 4: Check which have contracts
27
+ const packagesWithContracts = this.checkContracts(allPackages);
28
+ // Step 5: Calculate statistics
29
+ const withContracts = packagesWithContracts.filter(p => p.hasContract).length;
30
+ const withoutContracts = packagesWithContracts.length - withContracts;
31
+ return {
32
+ total: packagesWithContracts.length,
33
+ withContracts,
34
+ withoutContracts,
35
+ packages: packagesWithContracts,
36
+ };
37
+ }
38
+ /**
39
+ * Read dependencies from package.json
40
+ */
41
+ async readPackageJson(projectRoot) {
42
+ const packages = new Map();
43
+ try {
44
+ const packageJsonPath = path.join(projectRoot, 'package.json');
45
+ const content = await fs.readFile(packageJsonPath, 'utf-8');
46
+ const packageJson = JSON.parse(content);
47
+ // Collect dependencies and devDependencies
48
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
49
+ for (const [name, version] of Object.entries(deps)) {
50
+ packages.set(name, { version: version });
51
+ }
52
+ }
53
+ catch (error) {
54
+ console.warn('Could not read package.json:', error);
55
+ }
56
+ return packages;
57
+ }
58
+ /**
59
+ * Scan TypeScript source files for import statements
60
+ */
61
+ async scanImports(tsconfigPath) {
62
+ const imports = new Map(); // packageName -> Set<fileName>
63
+ try {
64
+ // Load tsconfig
65
+ const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
66
+ const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(tsconfigPath));
67
+ // Extract path aliases to filter them out
68
+ this.extractPathAliases(configFile.config, tsconfigPath);
69
+ // Create program
70
+ const program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);
71
+ // Scan each source file
72
+ for (const sourceFile of program.getSourceFiles()) {
73
+ if (sourceFile.isDeclarationFile)
74
+ continue;
75
+ if (sourceFile.fileName.includes('node_modules'))
76
+ continue;
77
+ this.extractImportsFromFile(sourceFile, imports);
78
+ }
79
+ }
80
+ catch (error) {
81
+ console.warn('Could not scan imports:', error);
82
+ }
83
+ return imports;
84
+ }
85
+ /**
86
+ * Extract path aliases from tsconfig to filter them out
87
+ *
88
+ * Examples:
89
+ * - "@/*" -> "@"
90
+ * - "@/components/*" -> "@/components"
91
+ * - "~/*" -> "~"
92
+ */
93
+ extractPathAliases(config, tsconfigPath) {
94
+ this.pathAliases.clear();
95
+ // Check current config
96
+ const paths = config.compilerOptions?.paths;
97
+ if (paths) {
98
+ for (const alias of Object.keys(paths)) {
99
+ // Extract the base alias (remove /* suffix)
100
+ const baseAlias = alias.replace(/\/\*$/, '');
101
+ this.pathAliases.add(baseAlias);
102
+ }
103
+ }
104
+ // Check extends (recursively load parent tsconfig)
105
+ if (config.extends) {
106
+ try {
107
+ const extendsPath = path.resolve(path.dirname(tsconfigPath), config.extends);
108
+ const parentConfig = ts.readConfigFile(extendsPath, ts.sys.readFile);
109
+ if (parentConfig.config) {
110
+ this.extractPathAliases(parentConfig.config, extendsPath);
111
+ }
112
+ }
113
+ catch {
114
+ // Ignore errors loading parent config
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * Extract import statements from a TypeScript source file
120
+ */
121
+ extractImportsFromFile(sourceFile, imports) {
122
+ const visit = (node) => {
123
+ // Handle: import { x } from 'package'
124
+ if (ts.isImportDeclaration(node)) {
125
+ const moduleSpecifier = node.moduleSpecifier;
126
+ if (ts.isStringLiteral(moduleSpecifier)) {
127
+ const packageName = this.extractPackageName(moduleSpecifier.text);
128
+ if (packageName) {
129
+ if (!imports.has(packageName)) {
130
+ imports.set(packageName, new Set());
131
+ }
132
+ imports.get(packageName).add(sourceFile.fileName);
133
+ }
134
+ }
135
+ }
136
+ // Handle: require('package')
137
+ if (ts.isCallExpression(node)) {
138
+ if (node.expression.kind === ts.SyntaxKind.Identifier) {
139
+ const identifier = node.expression;
140
+ if (identifier.text === 'require' && node.arguments.length > 0) {
141
+ const arg = node.arguments[0];
142
+ if (ts.isStringLiteral(arg)) {
143
+ const packageName = this.extractPackageName(arg.text);
144
+ if (packageName) {
145
+ if (!imports.has(packageName)) {
146
+ imports.set(packageName, new Set());
147
+ }
148
+ imports.get(packageName).add(sourceFile.fileName);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ ts.forEachChild(node, visit);
155
+ };
156
+ visit(sourceFile);
157
+ }
158
+ /**
159
+ * Extract the package name from an import path
160
+ *
161
+ * Examples:
162
+ * - 'axios' -> 'axios'
163
+ * - '@prisma/client' -> '@prisma/client'
164
+ * - 'axios/lib/core' -> 'axios'
165
+ * - './local' -> null
166
+ * - '../relative' -> null
167
+ * - '@/components' -> null (path alias)
168
+ */
169
+ extractPackageName(importPath) {
170
+ // Ignore relative imports
171
+ if (importPath.startsWith('.')) {
172
+ return null;
173
+ }
174
+ // Ignore path aliases (e.g., @/*, ~/* from tsconfig.json)
175
+ for (const alias of this.pathAliases) {
176
+ if (importPath === alias || importPath.startsWith(alias + '/')) {
177
+ return null;
178
+ }
179
+ }
180
+ // Ignore Node.js built-ins
181
+ const builtins = [
182
+ 'fs', 'path', 'crypto', 'http', 'https', 'os', 'util', 'events',
183
+ 'stream', 'buffer', 'child_process', 'url', 'querystring', 'net',
184
+ 'zlib', 'assert', 'readline', 'process', 'fs/promises'
185
+ ];
186
+ if (builtins.includes(importPath)) {
187
+ return null;
188
+ }
189
+ // Handle scoped packages: @scope/package or @scope/package/subpath
190
+ if (importPath.startsWith('@')) {
191
+ const parts = importPath.split('/');
192
+ if (parts.length >= 2) {
193
+ return `${parts[0]}/${parts[1]}`;
194
+ }
195
+ return null;
196
+ }
197
+ // Handle regular packages: package or package/subpath
198
+ const parts = importPath.split('/');
199
+ return parts[0];
200
+ }
201
+ /**
202
+ * Merge packages from package.json and actual imports
203
+ */
204
+ mergePackages(packageJsonDeps, importedPackages) {
205
+ const merged = new Map();
206
+ // Add all package.json dependencies
207
+ for (const [name, { version }] of packageJsonDeps) {
208
+ merged.set(name, {
209
+ version,
210
+ source: 'package.json',
211
+ usedIn: [],
212
+ });
213
+ }
214
+ // Add/update with actual imports
215
+ for (const [name, files] of importedPackages) {
216
+ if (merged.has(name)) {
217
+ const existing = merged.get(name);
218
+ existing.source = 'both';
219
+ existing.usedIn = Array.from(files);
220
+ }
221
+ else {
222
+ // Package is imported but not in package.json (might be transitive)
223
+ merged.set(name, {
224
+ version: 'unknown',
225
+ source: 'import',
226
+ usedIn: Array.from(files),
227
+ });
228
+ }
229
+ }
230
+ return merged;
231
+ }
232
+ /**
233
+ * Check which packages have contracts in the corpus
234
+ */
235
+ checkContracts(packages) {
236
+ const result = [];
237
+ for (const [name, { version, source, usedIn }] of packages) {
238
+ const contract = this.corpusContracts.get(name);
239
+ result.push({
240
+ name,
241
+ version,
242
+ source,
243
+ hasContract: contract !== undefined,
244
+ contractVersion: contract?.contract_version,
245
+ usedIn,
246
+ });
247
+ }
248
+ // Sort by: contracts first, then alphabetically
249
+ result.sort((a, b) => {
250
+ if (a.hasContract !== b.hasContract) {
251
+ return a.hasContract ? -1 : 1;
252
+ }
253
+ return a.name.localeCompare(b.name);
254
+ });
255
+ return result;
256
+ }
257
+ /**
258
+ * Generate a coverage report
259
+ */
260
+ generateCoverageReport(discovery) {
261
+ const lines = [];
262
+ const coveragePercent = discovery.total > 0
263
+ ? ((discovery.withContracts / discovery.total) * 100).toFixed(1)
264
+ : '0.0';
265
+ lines.push('');
266
+ lines.push('════════════════════════════════════════════════════════════════');
267
+ lines.push('Package Discovery & Coverage');
268
+ lines.push('════════════════════════════════════════════════════════════════');
269
+ lines.push('');
270
+ lines.push(`Total packages: ${discovery.total}`);
271
+ lines.push(`Packages with contracts: ${discovery.withContracts} (${coveragePercent}%)`);
272
+ lines.push(`Packages without contracts: ${discovery.withoutContracts}`);
273
+ lines.push('');
274
+ if (discovery.withContracts > 0) {
275
+ lines.push('✓ Packages with contracts:');
276
+ for (const pkg of discovery.packages.filter(p => p.hasContract)) {
277
+ lines.push(` ${pkg.name}@${pkg.version} (contract v${pkg.contractVersion})`);
278
+ }
279
+ lines.push('');
280
+ }
281
+ if (discovery.withoutContracts > 0 && discovery.withoutContracts <= 20) {
282
+ lines.push('⚠ Packages without contracts:');
283
+ for (const pkg of discovery.packages.filter(p => !p.hasContract)) {
284
+ lines.push(` ${pkg.name}@${pkg.version}`);
285
+ }
286
+ lines.push('');
287
+ }
288
+ else if (discovery.withoutContracts > 20) {
289
+ lines.push(`⚠ ${discovery.withoutContracts} packages without contracts (showing top 20):`);
290
+ for (const pkg of discovery.packages.filter(p => !p.hasContract).slice(0, 20)) {
291
+ lines.push(` ${pkg.name}@${pkg.version}`);
292
+ }
293
+ lines.push(` ... and ${discovery.withoutContracts - 20} more`);
294
+ lines.push('');
295
+ }
296
+ return lines.join('\n');
297
+ }
298
+ }
299
+ //# sourceMappingURL=package-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-discovery.js","sourceRoot":"","sources":["../src/package-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Reporter - generates audit records and terminal output
3
+ */
4
+ import type { AuditRecord, Violation, EnhancedAuditRecord, PackageDiscoveryResult } from './types.js';
5
+ /**
6
+ * Enriches violations with code snippets
7
+ */
8
+ export declare function enrichViolationsWithSnippets(violations: Violation[]): Promise<Violation[]>;
9
+ /**
10
+ * Generates an audit record from violations
11
+ */
12
+ export declare function generateAuditRecord(violations: Violation[], config: {
13
+ tsconfigPath: string;
14
+ packagesAnalyzed: string[];
15
+ contractsApplied: number;
16
+ filesAnalyzed: number;
17
+ corpusVersion: string;
18
+ }): Promise<AuditRecord>;
19
+ /**
20
+ * Writes audit record to JSON file
21
+ */
22
+ export declare function writeAuditRecord(record: AuditRecord, outputPath: string): void;
23
+ /**
24
+ * Prints violations to terminal in human-readable format
25
+ */
26
+ export declare function printTerminalReport(record: AuditRecord): void;
27
+ /**
28
+ * Prints corpus loading errors
29
+ */
30
+ export declare function printCorpusErrors(errors: string[]): void;
31
+ /**
32
+ * Generates an enhanced audit record with package discovery
33
+ */
34
+ export declare function generateEnhancedAuditRecord(baseRecord: AuditRecord, packageDiscovery: PackageDiscoveryResult): EnhancedAuditRecord;
35
+ /**
36
+ * Prints package discovery report
37
+ */
38
+ export declare function printPackageDiscoveryReport(discovery: PackageDiscoveryResult): void;
39
+ /**
40
+ * Prints enhanced terminal report with violations grouped by package
41
+ */
42
+ export declare function printEnhancedTerminalReport(record: EnhancedAuditRecord): void;
43
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAuB,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAM3H;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,SAAS,EAAE,CAAC,CAiBtB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE;IACN,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAyCD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAG9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CA0D7D;AA8ED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAMxD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,WAAW,EACvB,gBAAgB,EAAE,sBAAsB,GACvC,mBAAmB,CAmCrB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAkCnF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CA2D7E"}