@su-record/vibe 2.5.21 → 2.6.1

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 (81) hide show
  1. package/CLAUDE.md +154 -2
  2. package/README.md +132 -2
  3. package/commands/vibe.run.md +69 -44
  4. package/commands/vibe.spec.md +83 -0
  5. package/commands/vibe.trace.md +161 -0
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +5 -3
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/lib/IterationTracker.d.ts +3 -1
  10. package/dist/lib/IterationTracker.d.ts.map +1 -1
  11. package/dist/lib/IterationTracker.js +2 -1
  12. package/dist/lib/IterationTracker.js.map +1 -1
  13. package/dist/lib/constants.d.ts +14 -0
  14. package/dist/lib/constants.d.ts.map +1 -1
  15. package/dist/lib/constants.js +26 -0
  16. package/dist/lib/constants.js.map +1 -1
  17. package/dist/orchestrator/BackgroundManager.d.ts +109 -0
  18. package/dist/orchestrator/BackgroundManager.d.ts.map +1 -0
  19. package/dist/orchestrator/BackgroundManager.js +456 -0
  20. package/dist/orchestrator/BackgroundManager.js.map +1 -0
  21. package/dist/orchestrator/BackgroundManager.test.d.ts +6 -0
  22. package/dist/orchestrator/BackgroundManager.test.d.ts.map +1 -0
  23. package/dist/orchestrator/BackgroundManager.test.js +162 -0
  24. package/dist/orchestrator/BackgroundManager.test.js.map +1 -0
  25. package/dist/orchestrator/PhasePipeline.d.ts +106 -0
  26. package/dist/orchestrator/PhasePipeline.d.ts.map +1 -0
  27. package/dist/orchestrator/PhasePipeline.js +279 -0
  28. package/dist/orchestrator/PhasePipeline.js.map +1 -0
  29. package/dist/orchestrator/backgroundAgent.d.ts +2 -0
  30. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  31. package/dist/orchestrator/backgroundAgent.js +2 -0
  32. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  33. package/dist/orchestrator/index.d.ts +4 -1
  34. package/dist/orchestrator/index.d.ts.map +1 -1
  35. package/dist/orchestrator/index.js +5 -1
  36. package/dist/orchestrator/index.js.map +1 -1
  37. package/dist/tools/index.d.ts +4 -0
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +14 -0
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/interaction/askUser.d.ts +115 -0
  42. package/dist/tools/interaction/askUser.d.ts.map +1 -0
  43. package/dist/tools/interaction/askUser.js +504 -0
  44. package/dist/tools/interaction/askUser.js.map +1 -0
  45. package/dist/tools/interaction/index.d.ts +8 -0
  46. package/dist/tools/interaction/index.d.ts.map +1 -0
  47. package/dist/tools/interaction/index.js +17 -0
  48. package/dist/tools/interaction/index.js.map +1 -0
  49. package/dist/tools/spec/index.d.ts +14 -0
  50. package/dist/tools/spec/index.d.ts.map +1 -0
  51. package/dist/tools/spec/index.js +15 -0
  52. package/dist/tools/spec/index.js.map +1 -0
  53. package/dist/tools/spec/prdParser.d.ts +43 -0
  54. package/dist/tools/spec/prdParser.d.ts.map +1 -0
  55. package/dist/tools/spec/prdParser.js +291 -0
  56. package/dist/tools/spec/prdParser.js.map +1 -0
  57. package/dist/tools/spec/prdParser.test.d.ts +6 -0
  58. package/dist/tools/spec/prdParser.test.d.ts.map +1 -0
  59. package/dist/tools/spec/prdParser.test.js +332 -0
  60. package/dist/tools/spec/prdParser.test.js.map +1 -0
  61. package/dist/tools/spec/requirementId.d.ts +65 -0
  62. package/dist/tools/spec/requirementId.d.ts.map +1 -0
  63. package/dist/tools/spec/requirementId.js +161 -0
  64. package/dist/tools/spec/requirementId.js.map +1 -0
  65. package/dist/tools/spec/specGenerator.d.ts +39 -0
  66. package/dist/tools/spec/specGenerator.d.ts.map +1 -0
  67. package/dist/tools/spec/specGenerator.js +426 -0
  68. package/dist/tools/spec/specGenerator.js.map +1 -0
  69. package/dist/tools/spec/specVersioning.d.ts +77 -0
  70. package/dist/tools/spec/specVersioning.d.ts.map +1 -0
  71. package/dist/tools/spec/specVersioning.js +237 -0
  72. package/dist/tools/spec/specVersioning.js.map +1 -0
  73. package/dist/tools/spec/traceabilityMatrix.d.ts +55 -0
  74. package/dist/tools/spec/traceabilityMatrix.d.ts.map +1 -0
  75. package/dist/tools/spec/traceabilityMatrix.js +396 -0
  76. package/dist/tools/spec/traceabilityMatrix.js.map +1 -0
  77. package/dist/tools/spec/traceabilityMatrix.test.d.ts +6 -0
  78. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +1 -0
  79. package/dist/tools/spec/traceabilityMatrix.test.js +340 -0
  80. package/dist/tools/spec/traceabilityMatrix.test.js.map +1 -0
  81. package/package.json +2 -1
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Traceability Matrix - 요구사항 추적 매트릭스 자동 생성
3
+ * v2.6.0: RTM (Requirements Traceability Matrix) 자동화
4
+ *
5
+ * 매핑: REQ → SPEC → Feature → Test
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ // ============================================
10
+ // Main Functions
11
+ // ============================================
12
+ /**
13
+ * 추적 매트릭스 생성 (메인 함수)
14
+ */
15
+ export function generateTraceabilityMatrix(featureName, options = {}) {
16
+ const { projectPath = process.cwd(), specPath = `.claude/vibe/specs/${featureName}.md`, featurePath = `.claude/vibe/features/${featureName}.feature`, testPath, } = options;
17
+ const items = [];
18
+ const warnings = [];
19
+ // SPEC 파일 파싱
20
+ const specContent = readFileSafe(path.join(projectPath, specPath));
21
+ const specRequirements = specContent ? extractRequirementsFromSpec(specContent) : [];
22
+ // Feature 파일 파싱
23
+ const featureContent = readFileSafe(path.join(projectPath, featurePath));
24
+ const featureScenarios = featureContent ? extractScenariosFromFeature(featureContent) : [];
25
+ // 테스트 파일 파싱 (있으면)
26
+ const testFiles = testPath
27
+ ? findTestFiles(path.join(projectPath, testPath))
28
+ : findTestFilesForFeature(projectPath, featureName);
29
+ const testMappings = extractTestMappings(testFiles);
30
+ // 매트릭스 구축
31
+ for (const req of specRequirements) {
32
+ const item = {
33
+ requirementId: req.id,
34
+ requirementDesc: req.description,
35
+ specSection: req.section,
36
+ specFile: specPath,
37
+ coverage: 'none',
38
+ };
39
+ // Feature 시나리오 매핑
40
+ const matchingScenario = findMatchingScenario(req.id, req.description, featureScenarios);
41
+ if (matchingScenario) {
42
+ item.featureScenario = matchingScenario.name;
43
+ item.featureFile = featurePath;
44
+ item.coverage = 'partial';
45
+ }
46
+ // 테스트 매핑
47
+ const matchingTest = findMatchingTest(req.id, req.description, testMappings);
48
+ if (matchingTest) {
49
+ item.testFile = matchingTest.file;
50
+ item.testName = matchingTest.name;
51
+ item.coverage = item.featureScenario ? 'full' : 'partial';
52
+ }
53
+ items.push(item);
54
+ }
55
+ // 요약 계산
56
+ const summary = calculateSummary(items);
57
+ return {
58
+ featureName,
59
+ items,
60
+ summary,
61
+ generatedAt: new Date().toISOString(),
62
+ };
63
+ }
64
+ /**
65
+ * 매트릭스를 Markdown 테이블로 출력
66
+ */
67
+ export function formatMatrixAsMarkdown(matrix) {
68
+ let output = `# Requirements Traceability Matrix: ${matrix.featureName}\n\n`;
69
+ output += `Generated: ${matrix.generatedAt}\n\n`;
70
+ // 요약
71
+ output += `## Summary\n\n`;
72
+ output += `| Metric | Value |\n`;
73
+ output += `|--------|-------|\n`;
74
+ output += `| Total Requirements | ${matrix.summary.totalRequirements} |\n`;
75
+ output += `| SPEC Coverage | ${matrix.summary.specCovered}/${matrix.summary.totalRequirements} |\n`;
76
+ output += `| Feature Coverage | ${matrix.summary.featureCovered}/${matrix.summary.totalRequirements} |\n`;
77
+ output += `| Test Coverage | ${matrix.summary.testCovered}/${matrix.summary.totalRequirements} |\n`;
78
+ output += `| **Overall Coverage** | **${matrix.summary.coveragePercent}%** |\n\n`;
79
+ // 매트릭스 테이블
80
+ output += `## Traceability Matrix\n\n`;
81
+ output += `| Requirement | SPEC | Feature | Test | Coverage |\n`;
82
+ output += `|-------------|------|---------|------|----------|\n`;
83
+ for (const item of matrix.items) {
84
+ const reqCell = `${item.requirementId}`;
85
+ const specCell = item.specSection ? `✅ ${item.specSection}` : '❌';
86
+ const featureCell = item.featureScenario ? `✅ ${truncate(item.featureScenario, 30)}` : '❌';
87
+ const testCell = item.testName ? `✅ ${truncate(item.testName, 30)}` : '❌';
88
+ const coverageIcon = getCoverageIcon(item.coverage);
89
+ output += `| ${reqCell} | ${specCell} | ${featureCell} | ${testCell} | ${coverageIcon} |\n`;
90
+ }
91
+ // 미커버리지 항목
92
+ if (matrix.summary.uncoveredRequirements.length > 0) {
93
+ output += `\n## Uncovered Requirements\n\n`;
94
+ output += `The following requirements lack full coverage:\n\n`;
95
+ for (const reqId of matrix.summary.uncoveredRequirements) {
96
+ const item = matrix.items.find(i => i.requirementId === reqId);
97
+ output += `- **${reqId}**: ${item?.requirementDesc || 'Unknown'}\n`;
98
+ }
99
+ }
100
+ // 권장사항
101
+ output += `\n## Recommendations\n\n`;
102
+ if (matrix.summary.coveragePercent >= 100) {
103
+ output += `✅ All requirements are fully covered!\n`;
104
+ }
105
+ else {
106
+ output += `⚠️ Coverage is at ${matrix.summary.coveragePercent}%. Consider:\n`;
107
+ if (matrix.summary.featureCovered < matrix.summary.totalRequirements) {
108
+ output += `- Add Feature scenarios for uncovered requirements\n`;
109
+ }
110
+ if (matrix.summary.testCovered < matrix.summary.totalRequirements) {
111
+ output += `- Add test cases for uncovered requirements\n`;
112
+ }
113
+ }
114
+ return output;
115
+ }
116
+ /**
117
+ * 매트릭스를 HTML로 출력
118
+ */
119
+ export function formatMatrixAsHtml(matrix) {
120
+ let html = `<!DOCTYPE html>
121
+ <html>
122
+ <head>
123
+ <title>RTM: ${matrix.featureName}</title>
124
+ <style>
125
+ body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; margin: 2rem; }
126
+ table { border-collapse: collapse; width: 100%; }
127
+ th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
128
+ th { background: #f5f5f5; }
129
+ .full { background: #d4edda; }
130
+ .partial { background: #fff3cd; }
131
+ .none { background: #f8d7da; }
132
+ .summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin: 1rem 0; }
133
+ .summary-card { padding: 1rem; border-radius: 8px; background: #f5f5f5; }
134
+ .coverage-bar { height: 20px; background: #e0e0e0; border-radius: 4px; overflow: hidden; }
135
+ .coverage-fill { height: 100%; background: #4caf50; }
136
+ </style>
137
+ </head>
138
+ <body>
139
+ <h1>RTM: ${matrix.featureName}</h1>
140
+ <p>Generated: ${matrix.generatedAt}</p>
141
+
142
+ <div class="summary">
143
+ <div class="summary-card">
144
+ <strong>Requirements</strong><br>${matrix.summary.totalRequirements}
145
+ </div>
146
+ <div class="summary-card">
147
+ <strong>Feature Coverage</strong><br>${matrix.summary.featureCovered}/${matrix.summary.totalRequirements}
148
+ </div>
149
+ <div class="summary-card">
150
+ <strong>Test Coverage</strong><br>${matrix.summary.testCovered}/${matrix.summary.totalRequirements}
151
+ </div>
152
+ <div class="summary-card">
153
+ <strong>Overall</strong><br>
154
+ <div class="coverage-bar">
155
+ <div class="coverage-fill" style="width: ${matrix.summary.coveragePercent}%"></div>
156
+ </div>
157
+ ${matrix.summary.coveragePercent}%
158
+ </div>
159
+ </div>
160
+
161
+ <table>
162
+ <thead>
163
+ <tr>
164
+ <th>Requirement</th>
165
+ <th>Description</th>
166
+ <th>SPEC</th>
167
+ <th>Feature</th>
168
+ <th>Test</th>
169
+ <th>Coverage</th>
170
+ </tr>
171
+ </thead>
172
+ <tbody>
173
+ `;
174
+ for (const item of matrix.items) {
175
+ html += ` <tr class="${item.coverage}">
176
+ <td>${item.requirementId}</td>
177
+ <td>${escapeHtml(truncate(item.requirementDesc, 50))}</td>
178
+ <td>${item.specSection ? '✅' : '❌'}</td>
179
+ <td>${item.featureScenario ? '✅' : '❌'}</td>
180
+ <td>${item.testName ? '✅' : '❌'}</td>
181
+ <td>${getCoverageIcon(item.coverage)}</td>
182
+ </tr>
183
+ `;
184
+ }
185
+ html += ` </tbody>
186
+ </table>
187
+ </body>
188
+ </html>`;
189
+ return html;
190
+ }
191
+ // ============================================
192
+ // Parsing Functions
193
+ // ============================================
194
+ /**
195
+ * SPEC에서 요구사항 추출
196
+ */
197
+ function extractRequirementsFromSpec(content) {
198
+ const requirements = [];
199
+ // REQ-xxx-xxx 패턴 찾기
200
+ const reqPattern = /\b(REQ-[a-z0-9-]+-\d{3})[:\s]*([^\n]+)/gi;
201
+ let match;
202
+ while ((match = reqPattern.exec(content)) !== null) {
203
+ requirements.push({
204
+ id: match[1],
205
+ description: match[2].trim(),
206
+ section: findSection(content, match.index),
207
+ });
208
+ }
209
+ // AC 섹션에서도 추출
210
+ const acPattern = /###\s*([^\n]+)\n(?:[\s\S]*?)- \[ \] (.+)/g;
211
+ while ((match = acPattern.exec(content)) !== null) {
212
+ const id = match[1].match(/REQ-[a-z0-9-]+-\d{3}/)?.[0];
213
+ if (id && !requirements.find(r => r.id === id)) {
214
+ requirements.push({
215
+ id,
216
+ description: match[2].trim(),
217
+ section: 'Acceptance Criteria',
218
+ });
219
+ }
220
+ }
221
+ return requirements;
222
+ }
223
+ /**
224
+ * Feature 파일에서 시나리오 추출
225
+ */
226
+ function extractScenariosFromFeature(content) {
227
+ const scenarios = [];
228
+ const scenarioPattern = /###\s*Scenario\s*\d*[:\s]*([^\n]+)[\s\S]*?(?:\*\*Verification\*\*[:\s]*([^\n]+))?/gi;
229
+ let match;
230
+ while ((match = scenarioPattern.exec(content)) !== null) {
231
+ scenarios.push({
232
+ name: match[1].trim(),
233
+ verification: match[2]?.trim(),
234
+ });
235
+ }
236
+ return scenarios;
237
+ }
238
+ /**
239
+ * 테스트 파일에서 매핑 추출
240
+ */
241
+ function extractTestMappings(testFiles) {
242
+ const mappings = [];
243
+ for (const file of testFiles) {
244
+ const content = readFileSafe(file);
245
+ if (!content)
246
+ continue;
247
+ // describe/it/test 패턴
248
+ const testPattern = /(?:describe|it|test)\s*\(\s*['"`]([^'"`]+)['"`]/g;
249
+ let match;
250
+ while ((match = testPattern.exec(content)) !== null) {
251
+ const name = match[1];
252
+ const reqId = name.match(/REQ-[a-z0-9-]+-\d{3}/)?.[0];
253
+ mappings.push({
254
+ file: path.basename(file),
255
+ name,
256
+ reqId,
257
+ });
258
+ }
259
+ }
260
+ return mappings;
261
+ }
262
+ // ============================================
263
+ // Helper Functions
264
+ // ============================================
265
+ function readFileSafe(filePath) {
266
+ try {
267
+ return fs.readFileSync(filePath, 'utf-8');
268
+ }
269
+ catch {
270
+ return null;
271
+ }
272
+ }
273
+ function findSection(content, index) {
274
+ const before = content.slice(0, index);
275
+ const sectionMatch = before.match(/###\s*([^\n]+)/g);
276
+ return sectionMatch ? sectionMatch[sectionMatch.length - 1].replace(/^###\s*/, '') : 'Unknown';
277
+ }
278
+ function findMatchingScenario(reqId, reqDesc, scenarios) {
279
+ // ID로 매칭
280
+ for (const scenario of scenarios) {
281
+ if (scenario.verification?.includes(reqId)) {
282
+ return scenario;
283
+ }
284
+ }
285
+ // 설명 유사도로 매칭 (간단한 매칭)
286
+ const keywords = reqDesc.toLowerCase().split(/\s+/).filter(w => w.length > 4);
287
+ for (const scenario of scenarios) {
288
+ const scenarioLower = scenario.name.toLowerCase();
289
+ const matchCount = keywords.filter(k => scenarioLower.includes(k)).length;
290
+ if (matchCount >= 2) {
291
+ return scenario;
292
+ }
293
+ }
294
+ return null;
295
+ }
296
+ function findMatchingTest(reqId, reqDesc, tests) {
297
+ // ID로 매칭
298
+ for (const test of tests) {
299
+ if (test.reqId === reqId) {
300
+ return test;
301
+ }
302
+ }
303
+ // 설명 유사도로 매칭
304
+ const keywords = reqDesc.toLowerCase().split(/\s+/).filter(w => w.length > 4);
305
+ for (const test of tests) {
306
+ const testLower = test.name.toLowerCase();
307
+ const matchCount = keywords.filter(k => testLower.includes(k)).length;
308
+ if (matchCount >= 2) {
309
+ return test;
310
+ }
311
+ }
312
+ return null;
313
+ }
314
+ function findTestFiles(basePath) {
315
+ const files = [];
316
+ try {
317
+ const entries = fs.readdirSync(basePath, { withFileTypes: true });
318
+ for (const entry of entries) {
319
+ const fullPath = path.join(basePath, entry.name);
320
+ if (entry.isDirectory()) {
321
+ files.push(...findTestFiles(fullPath));
322
+ }
323
+ else if (entry.name.match(/\.(test|spec)\.(ts|js|tsx|jsx)$/)) {
324
+ files.push(fullPath);
325
+ }
326
+ }
327
+ }
328
+ catch {
329
+ // Directory doesn't exist
330
+ }
331
+ return files;
332
+ }
333
+ function findTestFilesForFeature(projectPath, featureName) {
334
+ const possiblePaths = [
335
+ path.join(projectPath, 'src', '__tests__'),
336
+ path.join(projectPath, 'src', 'tests'),
337
+ path.join(projectPath, 'tests'),
338
+ path.join(projectPath, '__tests__'),
339
+ path.join(projectPath, 'test'),
340
+ ];
341
+ const files = [];
342
+ for (const basePath of possiblePaths) {
343
+ files.push(...findTestFiles(basePath));
344
+ }
345
+ // Feature 이름과 관련된 파일 필터링
346
+ const normalized = featureName.toLowerCase().replace(/[^a-z0-9]/g, '');
347
+ return files.filter(f => {
348
+ const basename = path.basename(f).toLowerCase().replace(/[^a-z0-9]/g, '');
349
+ return basename.includes(normalized) || normalized.includes(basename.replace(/testspec/g, ''));
350
+ });
351
+ }
352
+ function calculateSummary(items) {
353
+ const totalRequirements = items.length;
354
+ const specCovered = items.filter(i => i.specSection).length;
355
+ const featureCovered = items.filter(i => i.featureScenario).length;
356
+ const testCovered = items.filter(i => i.testName).length;
357
+ const fullCovered = items.filter(i => i.coverage === 'full').length;
358
+ const coveragePercent = totalRequirements > 0
359
+ ? Math.round((fullCovered / totalRequirements) * 100)
360
+ : 0;
361
+ const uncoveredRequirements = items
362
+ .filter(i => i.coverage === 'none')
363
+ .map(i => i.requirementId);
364
+ const partialRequirements = items
365
+ .filter(i => i.coverage === 'partial')
366
+ .map(i => i.requirementId);
367
+ return {
368
+ totalRequirements,
369
+ specCovered,
370
+ featureCovered,
371
+ testCovered,
372
+ coveragePercent,
373
+ uncoveredRequirements,
374
+ partialRequirements,
375
+ };
376
+ }
377
+ function getCoverageIcon(coverage) {
378
+ switch (coverage) {
379
+ case 'full': return '✅ Full';
380
+ case 'partial': return '⚠️ Partial';
381
+ case 'none': return '❌ None';
382
+ }
383
+ }
384
+ function truncate(text, maxLength) {
385
+ if (text.length <= maxLength)
386
+ return text;
387
+ return text.slice(0, maxLength - 3) + '...';
388
+ }
389
+ function escapeHtml(text) {
390
+ return text
391
+ .replace(/&/g, '&amp;')
392
+ .replace(/</g, '&lt;')
393
+ .replace(/>/g, '&gt;')
394
+ .replace(/"/g, '&quot;');
395
+ }
396
+ //# sourceMappingURL=traceabilityMatrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceabilityMatrix.js","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AA8C7B,+CAA+C;AAC/C,iBAAiB;AACjB,+CAA+C;AAE/C;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAmB,EACnB,UAA8B,EAAE;IAEhC,MAAM,EACJ,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,EAC3B,QAAQ,GAAG,sBAAsB,WAAW,KAAK,EACjD,WAAW,GAAG,yBAAyB,WAAW,UAAU,EAC5D,QAAQ,GACT,GAAG,OAAO,CAAC;IAEZ,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,aAAa;IACb,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErF,gBAAgB;IAChB,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IACzE,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3F,kBAAkB;IAClB,MAAM,SAAS,GAAG,QAAQ;QACxB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEpD,UAAU;IACV,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,GAAG,CAAC,EAAE;YACrB,eAAe,EAAE,GAAG,CAAC,WAAW;YAChC,WAAW,EAAE,GAAG,CAAC,OAAO;YACxB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,MAAM;SACjB,CAAC;QAEF,kBAAkB;QAClB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACzF,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,SAAS;QACT,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC;YAClC,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC;YAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,QAAQ;IACR,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAExC,OAAO;QACL,WAAW;QACX,KAAK;QACL,OAAO;QACP,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA0B;IAC/D,IAAI,MAAM,GAAG,uCAAuC,MAAM,CAAC,WAAW,MAAM,CAAC;IAC7E,MAAM,IAAI,cAAc,MAAM,CAAC,WAAW,MAAM,CAAC;IAEjD,KAAK;IACL,MAAM,IAAI,gBAAgB,CAAC;IAC3B,MAAM,IAAI,sBAAsB,CAAC;IACjC,MAAM,IAAI,sBAAsB,CAAC;IACjC,MAAM,IAAI,0BAA0B,MAAM,CAAC,OAAO,CAAC,iBAAiB,MAAM,CAAC;IAC3E,MAAM,IAAI,qBAAqB,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,MAAM,CAAC;IACpG,MAAM,IAAI,wBAAwB,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,MAAM,CAAC;IAC1G,MAAM,IAAI,qBAAqB,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,MAAM,CAAC;IACpG,MAAM,IAAI,8BAA8B,MAAM,CAAC,OAAO,CAAC,eAAe,WAAW,CAAC;IAElF,WAAW;IACX,MAAM,IAAI,4BAA4B,CAAC;IACvC,MAAM,IAAI,sDAAsD,CAAC;IACjE,MAAM,IAAI,sDAAsD,CAAC;IAEjE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1E,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpD,MAAM,IAAI,KAAK,OAAO,MAAM,QAAQ,MAAM,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,CAAC;IAC9F,CAAC;IAED,WAAW;IACX,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,iCAAiC,CAAC;QAC5C,MAAM,IAAI,oDAAoD,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC;YAC/D,MAAM,IAAI,OAAO,KAAK,OAAO,IAAI,EAAE,eAAe,IAAI,SAAS,IAAI,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO;IACP,MAAM,IAAI,0BAA0B,CAAC;IACrC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,IAAI,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,yCAAyC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,qBAAqB,MAAM,CAAC,OAAO,CAAC,eAAe,gBAAgB,CAAC;QAC9E,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACrE,MAAM,IAAI,sDAAsD,CAAC;QACnE,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAClE,MAAM,IAAI,+CAA+C,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,IAAI,IAAI,GAAG;;;gBAGG,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;aAgBrB,MAAM,CAAC,WAAW;kBACb,MAAM,CAAC,WAAW;;;;yCAIK,MAAM,CAAC,OAAO,CAAC,iBAAiB;;;6CAG5B,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB;;;0CAGpE,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB;;;;;mDAKrD,MAAM,CAAC,OAAO,CAAC,eAAe;;QAEzE,MAAM,CAAC,OAAO,CAAC,eAAe;;;;;;;;;;;;;;;;CAgBrC,CAAC;IAEA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,oBAAoB,IAAI,CAAC,QAAQ;cAC/B,IAAI,CAAC,aAAa;cAClB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;cAC9C,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;cAC5B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;cAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;cACzB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;;CAE3C,CAAC;IACA,CAAC;IAED,IAAI,IAAI;;;QAGF,CAAC;IAEP,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAE/C;;GAEG;AACH,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,YAAY,GAA2D,EAAE,CAAC;IAEhF,oBAAoB;IACpB,MAAM,UAAU,GAAG,0CAA0C,CAAC;IAC9D,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,YAAY,CAAC,IAAI,CAAC;YAChB,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;YACZ,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC5B,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,cAAc;IACd,MAAM,SAAS,GAAG,2CAA2C,CAAC;IAC9D,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC/C,YAAY,CAAC,IAAI,CAAC;gBAChB,EAAE;gBACF,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC5B,OAAO,EAAE,qBAAqB;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,SAAS,GAA8C,EAAE,CAAC;IAChE,MAAM,eAAe,GAAG,qFAAqF,CAAC;IAC9G,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACrB,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,SAAmB;IAC9C,MAAM,QAAQ,GAAqD,EAAE,CAAC;IAEtE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,sBAAsB;QACtB,MAAM,WAAW,GAAG,kDAAkD,CAAC;QACvE,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACzB,IAAI;gBACJ,KAAK;aACN,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAE/C,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,KAAa;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrD,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAa,EACb,OAAe,EACf,SAAoD;IAEpD,SAAS;IACT,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1E,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAa,EACb,OAAe,EACf,KAAuD;IAEvD,SAAS;IACT,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACtE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAmB,EAAE,WAAmB;IACvE,MAAM,aAAa,GAAG;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;KAC/B,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB;IAC1C,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAEpE,MAAM,eAAe,GAAG,iBAAiB,GAAG,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,iBAAiB,CAAC,GAAG,GAAG,CAAC;QACrD,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,qBAAqB,GAAG,KAAK;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAE7B,MAAM,mBAAmB,GAAG,KAAK;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAE7B,OAAO;QACL,iBAAiB;QACjB,WAAW;QACX,cAAc;QACd,WAAW;QACX,eAAe;QACf,qBAAqB;QACrB,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAA+B;IACtD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC7B,KAAK,SAAS,CAAC,CAAC,OAAO,YAAY,CAAC;QACpC,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Traceability Matrix Tests
3
+ * RTM generation, coverage calculation, output formatting
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=traceabilityMatrix.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceabilityMatrix.test.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}