@nahisaho/musubix-codegraph 2.3.2 → 2.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +200 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pr/git-operations.d.ts +186 -0
- package/dist/pr/git-operations.d.ts.map +1 -0
- package/dist/pr/git-operations.js +441 -0
- package/dist/pr/git-operations.js.map +1 -0
- package/dist/pr/github-adapter.d.ts +163 -0
- package/dist/pr/github-adapter.d.ts.map +1 -0
- package/dist/pr/github-adapter.js +467 -0
- package/dist/pr/github-adapter.js.map +1 -0
- package/dist/pr/index.d.ts +19 -0
- package/dist/pr/index.d.ts.map +1 -0
- package/dist/pr/index.js +24 -0
- package/dist/pr/index.js.map +1 -0
- package/dist/pr/pr-creator.d.ts +135 -0
- package/dist/pr/pr-creator.d.ts.map +1 -0
- package/dist/pr/pr-creator.js +387 -0
- package/dist/pr/pr-creator.js.map +1 -0
- package/dist/pr/pr-template.d.ts +105 -0
- package/dist/pr/pr-template.d.ts.map +1 -0
- package/dist/pr/pr-template.js +273 -0
- package/dist/pr/pr-template.js.map +1 -0
- package/dist/pr/refactoring-applier.d.ts +143 -0
- package/dist/pr/refactoring-applier.d.ts.map +1 -0
- package/dist/pr/refactoring-applier.js +412 -0
- package/dist/pr/refactoring-applier.js.map +1 -0
- package/dist/pr/types.d.ts +362 -0
- package/dist/pr/types.d.ts.map +1 -0
- package/dist/pr/types.js +63 -0
- package/dist/pr/types.js.map +1 -0
- package/package.json +11 -2
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/musubix-codegraph - PR Template Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates PR body content from refactoring suggestions
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module @nahisaho/musubix-codegraph/pr
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-CG-PR-006 - PR Body Generation
|
|
10
|
+
* @see DES-CG-PR-006 - PR Body Template
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Severity emoji mapping
|
|
14
|
+
*/
|
|
15
|
+
const SEVERITY_EMOJI = {
|
|
16
|
+
critical: '🔴',
|
|
17
|
+
high: '🟠',
|
|
18
|
+
medium: '🟡',
|
|
19
|
+
low: '🟢',
|
|
20
|
+
info: '🔵',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Refactoring type labels
|
|
24
|
+
*/
|
|
25
|
+
const TYPE_LABELS = {
|
|
26
|
+
extract_interface: 'Interface Extraction',
|
|
27
|
+
extract_method: 'Method Extraction',
|
|
28
|
+
extract_class: 'Class Extraction',
|
|
29
|
+
inline: 'Inline Refactoring',
|
|
30
|
+
rename: 'Rename',
|
|
31
|
+
move: 'Move',
|
|
32
|
+
security_fix: 'Security Fix',
|
|
33
|
+
performance: 'Performance Improvement',
|
|
34
|
+
simplify: 'Code Simplification',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* PR Template Generator
|
|
38
|
+
*
|
|
39
|
+
* Generates well-formatted PR bodies from refactoring suggestions.
|
|
40
|
+
*
|
|
41
|
+
* @see DES-CG-PR-006
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const generator = new PRTemplateGenerator();
|
|
45
|
+
* const body = generator.generate(suggestion, diffs);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export class PRTemplateGenerator {
|
|
49
|
+
options;
|
|
50
|
+
/**
|
|
51
|
+
* Create a new PRTemplateGenerator
|
|
52
|
+
* @param options - Template options
|
|
53
|
+
*/
|
|
54
|
+
constructor(options = {}) {
|
|
55
|
+
this.options = {
|
|
56
|
+
includeDiffs: options.includeDiffs ?? true,
|
|
57
|
+
maxDiffLines: options.maxDiffLines ?? 50,
|
|
58
|
+
includeChecklist: options.includeChecklist ?? true,
|
|
59
|
+
checklistItems: options.checklistItems,
|
|
60
|
+
includeRelatedIssues: options.includeRelatedIssues ?? false,
|
|
61
|
+
relatedIssues: options.relatedIssues ?? [],
|
|
62
|
+
footer: options.footer,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generate PR body
|
|
67
|
+
* @see REQ-CG-PR-006
|
|
68
|
+
*/
|
|
69
|
+
generate(suggestion, diffs) {
|
|
70
|
+
const sections = [];
|
|
71
|
+
// Header
|
|
72
|
+
sections.push(this.generateHeader(suggestion));
|
|
73
|
+
// Summary
|
|
74
|
+
sections.push(this.generateSummary(suggestion));
|
|
75
|
+
// Changes
|
|
76
|
+
sections.push(this.generateChangesSection(suggestion));
|
|
77
|
+
// Diffs
|
|
78
|
+
if (this.options.includeDiffs && diffs && diffs.length > 0) {
|
|
79
|
+
sections.push(this.generateDiffsSection(diffs));
|
|
80
|
+
}
|
|
81
|
+
// Impact Analysis
|
|
82
|
+
sections.push(this.generateImpactSection(suggestion));
|
|
83
|
+
// Checklist
|
|
84
|
+
if (this.options.includeChecklist) {
|
|
85
|
+
sections.push(this.generateChecklist(suggestion));
|
|
86
|
+
}
|
|
87
|
+
// Related Issues
|
|
88
|
+
if (this.options.includeRelatedIssues && this.options.relatedIssues && this.options.relatedIssues.length > 0) {
|
|
89
|
+
sections.push(this.generateRelatedIssues());
|
|
90
|
+
}
|
|
91
|
+
// Footer
|
|
92
|
+
sections.push(this.generateFooter(suggestion));
|
|
93
|
+
return sections.filter(s => s.length > 0).join('\n\n');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate PR title
|
|
97
|
+
*/
|
|
98
|
+
generateTitle(suggestion) {
|
|
99
|
+
const typeLabel = TYPE_LABELS[suggestion.type] || suggestion.type;
|
|
100
|
+
return `${typeLabel}: ${suggestion.title}`;
|
|
101
|
+
}
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// Section Generators
|
|
104
|
+
// ============================================================================
|
|
105
|
+
/**
|
|
106
|
+
* Generate header section
|
|
107
|
+
*/
|
|
108
|
+
generateHeader(suggestion) {
|
|
109
|
+
const severity = SEVERITY_EMOJI[suggestion.severity];
|
|
110
|
+
const typeLabel = TYPE_LABELS[suggestion.type] || suggestion.type;
|
|
111
|
+
return `## ${severity} ${typeLabel}
|
|
112
|
+
|
|
113
|
+
> 🤖 This PR was automatically generated by **MUSUBIX CodeGraph v2.3.3**`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Generate summary section
|
|
117
|
+
*/
|
|
118
|
+
generateSummary(suggestion) {
|
|
119
|
+
const lines = ['### Summary', ''];
|
|
120
|
+
lines.push(suggestion.description);
|
|
121
|
+
lines.push('');
|
|
122
|
+
lines.push(`**Target Entity:** \`${suggestion.entityId}\``);
|
|
123
|
+
lines.push(`**Confidence:** ${Math.round(suggestion.confidence * 100)}%`);
|
|
124
|
+
if (suggestion.cwe) {
|
|
125
|
+
lines.push(`**Security Reference:** [${suggestion.cwe}](https://cwe.mitre.org/data/definitions/${suggestion.cwe.replace('CWE-', '')}.html)`);
|
|
126
|
+
}
|
|
127
|
+
return lines.join('\n');
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Generate reason section
|
|
131
|
+
*/
|
|
132
|
+
generateChangesSection(suggestion) {
|
|
133
|
+
const lines = ['### Reason for Change', ''];
|
|
134
|
+
lines.push(suggestion.reason);
|
|
135
|
+
lines.push('');
|
|
136
|
+
lines.push('### Files Changed');
|
|
137
|
+
lines.push('');
|
|
138
|
+
// Group by file
|
|
139
|
+
const fileChanges = new Map();
|
|
140
|
+
for (const change of suggestion.changes) {
|
|
141
|
+
const existing = fileChanges.get(change.filePath) ?? [];
|
|
142
|
+
existing.push(change);
|
|
143
|
+
fileChanges.set(change.filePath, existing);
|
|
144
|
+
}
|
|
145
|
+
for (const [filePath, changes] of fileChanges) {
|
|
146
|
+
lines.push(`- \`${filePath}\``);
|
|
147
|
+
for (const change of changes) {
|
|
148
|
+
lines.push(` - Lines ${change.startLine}-${change.endLine}: ${change.description}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return lines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Generate diffs section
|
|
155
|
+
*/
|
|
156
|
+
generateDiffsSection(diffs) {
|
|
157
|
+
const lines = ['### Code Changes', ''];
|
|
158
|
+
for (const diff of diffs) {
|
|
159
|
+
const icon = diff.changeType === 'added' ? '➕' :
|
|
160
|
+
diff.changeType === 'deleted' ? '➖' : '📝';
|
|
161
|
+
lines.push(`<details>`);
|
|
162
|
+
lines.push(`<summary>${icon} <code>${diff.filePath}</code> (+${diff.additions}/-${diff.deletions})</summary>`);
|
|
163
|
+
lines.push('');
|
|
164
|
+
// Truncate long diffs
|
|
165
|
+
const diffLines = diff.diff.split('\n');
|
|
166
|
+
if (diffLines.length > this.options.maxDiffLines) {
|
|
167
|
+
const truncated = diffLines.slice(0, this.options.maxDiffLines).join('\n');
|
|
168
|
+
lines.push('```diff');
|
|
169
|
+
lines.push(truncated);
|
|
170
|
+
lines.push(`... (${diffLines.length - this.options.maxDiffLines} more lines)`);
|
|
171
|
+
lines.push('```');
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
lines.push('```diff');
|
|
175
|
+
lines.push(diff.diff);
|
|
176
|
+
lines.push('```');
|
|
177
|
+
}
|
|
178
|
+
lines.push('</details>');
|
|
179
|
+
lines.push('');
|
|
180
|
+
}
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Generate impact analysis section
|
|
185
|
+
*/
|
|
186
|
+
generateImpactSection(suggestion) {
|
|
187
|
+
const lines = ['### Impact Analysis', ''];
|
|
188
|
+
lines.push(`| Metric | Value |`);
|
|
189
|
+
lines.push(`|--------|-------|`);
|
|
190
|
+
lines.push(`| Files Affected | ${suggestion.impact.filesAffected} |`);
|
|
191
|
+
lines.push(`| Lines Changed | ${suggestion.impact.linesChanged} |`);
|
|
192
|
+
lines.push(`| Dependencies | ${suggestion.impact.dependencies.length} |`);
|
|
193
|
+
if (suggestion.impact.dependencies.length > 0) {
|
|
194
|
+
lines.push('');
|
|
195
|
+
lines.push('**Affected Dependencies:**');
|
|
196
|
+
for (const dep of suggestion.impact.dependencies.slice(0, 10)) {
|
|
197
|
+
lines.push(`- \`${dep}\``);
|
|
198
|
+
}
|
|
199
|
+
if (suggestion.impact.dependencies.length > 10) {
|
|
200
|
+
lines.push(`- ... and ${suggestion.impact.dependencies.length - 10} more`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return lines.join('\n');
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Generate checklist section
|
|
207
|
+
*/
|
|
208
|
+
generateChecklist(suggestion) {
|
|
209
|
+
const lines = ['### Checklist', ''];
|
|
210
|
+
const defaultItems = [
|
|
211
|
+
'Code compiles without errors',
|
|
212
|
+
'All existing tests pass',
|
|
213
|
+
'New tests added for changed functionality',
|
|
214
|
+
'Documentation updated if necessary',
|
|
215
|
+
'No breaking changes introduced',
|
|
216
|
+
];
|
|
217
|
+
// Add security-specific items
|
|
218
|
+
if (suggestion.type === 'security_fix') {
|
|
219
|
+
defaultItems.push('Security vulnerability is fully addressed');
|
|
220
|
+
defaultItems.push('No new security issues introduced');
|
|
221
|
+
}
|
|
222
|
+
const items = this.options.checklistItems ?? defaultItems;
|
|
223
|
+
for (const item of items) {
|
|
224
|
+
lines.push(`- [ ] ${item}`);
|
|
225
|
+
}
|
|
226
|
+
return lines.join('\n');
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Generate related issues section
|
|
230
|
+
*/
|
|
231
|
+
generateRelatedIssues() {
|
|
232
|
+
const lines = ['### Related Issues', ''];
|
|
233
|
+
for (const issue of this.options.relatedIssues) {
|
|
234
|
+
lines.push(`- Closes #${issue}`);
|
|
235
|
+
}
|
|
236
|
+
return lines.join('\n');
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Generate footer section
|
|
240
|
+
*/
|
|
241
|
+
generateFooter(suggestion) {
|
|
242
|
+
const lines = ['---', ''];
|
|
243
|
+
if (this.options.footer) {
|
|
244
|
+
lines.push(this.options.footer);
|
|
245
|
+
lines.push('');
|
|
246
|
+
}
|
|
247
|
+
lines.push(`📋 **Suggestion ID:** \`${suggestion.id}\``);
|
|
248
|
+
lines.push(`🕐 **Generated:** ${new Date().toISOString()}`);
|
|
249
|
+
lines.push(`🔧 **Tool:** MUSUBIX CodeGraph v2.3.3`);
|
|
250
|
+
return lines.join('\n');
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Create a PR template generator
|
|
255
|
+
*/
|
|
256
|
+
export function createPRTemplateGenerator(options) {
|
|
257
|
+
return new PRTemplateGenerator(options);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Generate a simple PR body without advanced options
|
|
261
|
+
*/
|
|
262
|
+
export function generateSimplePRBody(suggestion) {
|
|
263
|
+
const generator = new PRTemplateGenerator({ includeDiffs: false });
|
|
264
|
+
return generator.generate(suggestion);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Generate PR title from suggestion
|
|
268
|
+
*/
|
|
269
|
+
export function generatePRTitle(suggestion) {
|
|
270
|
+
const generator = new PRTemplateGenerator();
|
|
271
|
+
return generator.generateTitle(suggestion);
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=pr-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-template.js","sourceRoot":"","sources":["../../src/pr/pr-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/musubix-codegraph - Refactoring Applier
|
|
3
|
+
*
|
|
4
|
+
* Applies refactoring suggestions to source files
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module @nahisaho/musubix-codegraph/pr
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-CG-PR-002 - Auto Apply Refactoring
|
|
10
|
+
* @see DES-CG-PR-004 - Class Design
|
|
11
|
+
*/
|
|
12
|
+
import type { RefactoringSuggestion, CodeChange, FileDiff } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Result of applying a single change
|
|
15
|
+
*/
|
|
16
|
+
export interface ApplyChangeResult {
|
|
17
|
+
/** Whether the change was applied successfully */
|
|
18
|
+
success: boolean;
|
|
19
|
+
/** File path */
|
|
20
|
+
filePath: string;
|
|
21
|
+
/** Error message if failed */
|
|
22
|
+
error?: string;
|
|
23
|
+
/** Backup path if backup was created */
|
|
24
|
+
backupPath?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result of applying all changes in a suggestion
|
|
28
|
+
*/
|
|
29
|
+
export interface ApplyResult {
|
|
30
|
+
/** Overall success status */
|
|
31
|
+
success: boolean;
|
|
32
|
+
/** Files modified */
|
|
33
|
+
filesModified: string[];
|
|
34
|
+
/** Files created */
|
|
35
|
+
filesCreated: string[];
|
|
36
|
+
/** Files deleted */
|
|
37
|
+
filesDeleted: string[];
|
|
38
|
+
/** Individual change results */
|
|
39
|
+
changeResults: ApplyChangeResult[];
|
|
40
|
+
/** Overall error if failed */
|
|
41
|
+
error?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Options for applying refactoring
|
|
45
|
+
*/
|
|
46
|
+
export interface ApplyOptions {
|
|
47
|
+
/** Repository root path */
|
|
48
|
+
repoPath: string;
|
|
49
|
+
/** Create backups before modifying */
|
|
50
|
+
createBackups?: boolean;
|
|
51
|
+
/** Backup directory (default: .musubix-backup) */
|
|
52
|
+
backupDir?: string;
|
|
53
|
+
/** Validate changes before applying */
|
|
54
|
+
validate?: boolean;
|
|
55
|
+
/** Dry run - don't actually modify files */
|
|
56
|
+
dryRun?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Refactoring Applier
|
|
60
|
+
*
|
|
61
|
+
* Applies code changes from refactoring suggestions to source files.
|
|
62
|
+
* Supports validation, backup, and rollback.
|
|
63
|
+
*
|
|
64
|
+
* @see DES-CG-PR-004
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const applier = new RefactoringApplier({ repoPath: '/path/to/repo' });
|
|
68
|
+
* const result = await applier.apply(suggestion);
|
|
69
|
+
* if (!result.success) {
|
|
70
|
+
* await applier.rollback();
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare class RefactoringApplier {
|
|
75
|
+
private readonly repoPath;
|
|
76
|
+
private readonly createBackups;
|
|
77
|
+
private readonly backupDir;
|
|
78
|
+
private readonly validate;
|
|
79
|
+
private appliedChanges;
|
|
80
|
+
/**
|
|
81
|
+
* Create a new RefactoringApplier
|
|
82
|
+
* @param options - Apply options
|
|
83
|
+
*/
|
|
84
|
+
constructor(options: ApplyOptions);
|
|
85
|
+
/**
|
|
86
|
+
* Apply a refactoring suggestion
|
|
87
|
+
* @see REQ-CG-PR-002
|
|
88
|
+
*/
|
|
89
|
+
apply(suggestion: RefactoringSuggestion): ApplyResult;
|
|
90
|
+
/**
|
|
91
|
+
* Preview changes without applying
|
|
92
|
+
* @see REQ-CG-PR-007
|
|
93
|
+
*/
|
|
94
|
+
preview(suggestion: RefactoringSuggestion): FileDiff[];
|
|
95
|
+
/**
|
|
96
|
+
* Rollback applied changes
|
|
97
|
+
*/
|
|
98
|
+
rollback(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Validate changes can be applied
|
|
101
|
+
*/
|
|
102
|
+
validateChanges(changes: CodeChange[]): string | null;
|
|
103
|
+
/**
|
|
104
|
+
* Check if a suggestion can be applied
|
|
105
|
+
*/
|
|
106
|
+
canApply(suggestion: RefactoringSuggestion): {
|
|
107
|
+
canApply: boolean;
|
|
108
|
+
reason?: string;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Group changes by file
|
|
112
|
+
*/
|
|
113
|
+
private groupChangesByFile;
|
|
114
|
+
/**
|
|
115
|
+
* Apply changes to a single file
|
|
116
|
+
*/
|
|
117
|
+
private applyChangesToFile;
|
|
118
|
+
/**
|
|
119
|
+
* Apply changes to content string
|
|
120
|
+
*/
|
|
121
|
+
private applyChangesToContent;
|
|
122
|
+
/**
|
|
123
|
+
* Create a backup of a file
|
|
124
|
+
*/
|
|
125
|
+
private createBackup;
|
|
126
|
+
/**
|
|
127
|
+
* Normalize whitespace for comparison
|
|
128
|
+
*/
|
|
129
|
+
private normalizeWhitespace;
|
|
130
|
+
/**
|
|
131
|
+
* Generate unified diff format
|
|
132
|
+
*/
|
|
133
|
+
private generateUnifiedDiff;
|
|
134
|
+
/**
|
|
135
|
+
* Calculate diff statistics
|
|
136
|
+
*/
|
|
137
|
+
private calculateDiffStats;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a RefactoringApplier instance
|
|
141
|
+
*/
|
|
142
|
+
export declare function createRefactoringApplier(repoPath: string, options?: Partial<ApplyOptions>): RefactoringApplier;
|
|
143
|
+
//# sourceMappingURL=refactoring-applier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refactoring-applier.d.ts","sourceRoot":"","sources":["../../src/pr/refactoring-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EACV,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oBAAoB;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gCAAgC;IAChC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,cAAc,CAAkC;IAExD;;;OAGG;gBACS,OAAO,EAAE,YAAY;IAWjC;;;OAGG;IACH,KAAK,CAAC,UAAU,EAAE,qBAAqB,GAAG,WAAW;IAsErD;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,qBAAqB,GAAG,QAAQ,EAAE;IAqCtD;;OAEG;IACH,QAAQ,IAAI,IAAI;IAiBhB;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IA2CrD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAYnF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiD1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2D3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAqB3B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAK9G"}
|