@millstone/synapse-cli 0.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.
- package/README.md +135 -0
- package/bin/synapse.js +3 -0
- package/dist/commands/eject.d.ts +19 -0
- package/dist/commands/eject.d.ts.map +1 -0
- package/dist/commands/eject.js +146 -0
- package/dist/commands/eject.js.map +1 -0
- package/dist/commands/fetch-reference.d.ts +19 -0
- package/dist/commands/fetch-reference.d.ts.map +1 -0
- package/dist/commands/fetch-reference.js +93 -0
- package/dist/commands/fetch-reference.js.map +1 -0
- package/dist/commands/format.d.ts +26 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +126 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/generate-pdf.d.ts +19 -0
- package/dist/commands/generate-pdf.d.ts.map +1 -0
- package/dist/commands/generate-pdf.js +140 -0
- package/dist/commands/generate-pdf.js.map +1 -0
- package/dist/commands/index.d.ts +17 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +26 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +58 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +234 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +29 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +297 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/scaffold.d.ts +24 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +244 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/update.d.ts +25 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +253 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +37 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +526 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +277 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bodyRules.d.ts +70 -0
- package/dist/lib/bodyRules.d.ts.map +1 -0
- package/dist/lib/bodyRules.js +711 -0
- package/dist/lib/bodyRules.js.map +1 -0
- package/dist/lib/config.d.ts +49 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +91 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/git.d.ts +99 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +266 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/graph.d.ts +6 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +6 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/homepage.d.ts +10 -0
- package/dist/lib/homepage.d.ts.map +1 -0
- package/dist/lib/homepage.js +172 -0
- package/dist/lib/homepage.js.map +1 -0
- package/dist/lib/markdown.d.ts +107 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +318 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/mode-detection.d.ts +10 -0
- package/dist/lib/mode-detection.d.ts.map +1 -0
- package/dist/lib/mode-detection.js +29 -0
- package/dist/lib/mode-detection.js.map +1 -0
- package/dist/lib/naming.d.ts +47 -0
- package/dist/lib/naming.d.ts.map +1 -0
- package/dist/lib/naming.js +403 -0
- package/dist/lib/naming.js.map +1 -0
- package/dist/lib/schemas.d.ts +38 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +248 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/templateLint.d.ts +21 -0
- package/dist/lib/templateLint.d.ts.map +1 -0
- package/dist/lib/templateLint.js +243 -0
- package/dist/lib/templateLint.js.map +1 -0
- package/dist/lib/templates.d.ts +53 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +128 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/tracking.d.ts +52 -0
- package/dist/lib/tracking.d.ts.map +1 -0
- package/dist/lib/tracking.js +135 -0
- package/dist/lib/tracking.js.map +1 -0
- package/dist/lib/types.generated.d.ts +54 -0
- package/dist/lib/types.generated.d.ts.map +1 -0
- package/dist/lib/types.generated.js +144 -0
- package/dist/lib/types.generated.js.map +1 -0
- package/dist/lib/validate-plugins.d.ts +22 -0
- package/dist/lib/validate-plugins.d.ts.map +1 -0
- package/dist/lib/validate-plugins.js +851 -0
- package/dist/lib/validate-plugins.js.map +1 -0
- package/package.json +85 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { validateCommand } from "./commands/validate.js";
|
|
3
|
+
import { formatCommand } from "./commands/format.js";
|
|
4
|
+
import { indexCommand } from "./commands/index.js";
|
|
5
|
+
import { scaffoldCommand } from "./commands/scaffold.js";
|
|
6
|
+
import { generatePdfCommand } from "./commands/generate-pdf.js";
|
|
7
|
+
import { initCommand } from "./commands/init.js";
|
|
8
|
+
import { updateCommand } from "./commands/update.js";
|
|
9
|
+
import { ejectCommand } from "./commands/eject.js";
|
|
10
|
+
import { fetchReferenceCommand } from "./commands/fetch-reference.js";
|
|
11
|
+
import { migrateCommand } from "./commands/migrate.js";
|
|
12
|
+
import { DOC_TYPES } from "./lib/types.generated.js";
|
|
13
|
+
import { detectInstallMode } from "./lib/mode-detection.js";
|
|
14
|
+
// Parse command line arguments
|
|
15
|
+
const [, , command, ...args] = process.argv;
|
|
16
|
+
// Simple argument parser
|
|
17
|
+
function parseArgs(args) {
|
|
18
|
+
const parsed = {};
|
|
19
|
+
let i = 0;
|
|
20
|
+
// Helper to convert kebab-case to camelCase
|
|
21
|
+
const toCamelCase = (str) => {
|
|
22
|
+
return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
23
|
+
};
|
|
24
|
+
while (i < args.length) {
|
|
25
|
+
const arg = args[i];
|
|
26
|
+
if (arg.startsWith("--")) {
|
|
27
|
+
const key = arg.slice(2);
|
|
28
|
+
// Handle --no-* flags
|
|
29
|
+
if (key.startsWith("no-")) {
|
|
30
|
+
const actualKey = toCamelCase(key.slice(3));
|
|
31
|
+
parsed[actualKey] = false;
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const nextArg = args[i + 1];
|
|
36
|
+
const camelKey = toCamelCase(key);
|
|
37
|
+
// Check if this is a boolean flag or has a value
|
|
38
|
+
if (!nextArg || nextArg.startsWith("--")) {
|
|
39
|
+
parsed[camelKey] = true;
|
|
40
|
+
i++;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
parsed[camelKey] = nextArg;
|
|
44
|
+
i += 2;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (arg.startsWith("-")) {
|
|
49
|
+
// Short flags
|
|
50
|
+
const key = arg.slice(1);
|
|
51
|
+
parsed[key] = true;
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Positional arguments
|
|
56
|
+
if (!parsed._) {
|
|
57
|
+
parsed._ = [];
|
|
58
|
+
}
|
|
59
|
+
parsed._.push(arg);
|
|
60
|
+
i++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
// Show help message
|
|
66
|
+
function showHelp() {
|
|
67
|
+
const availableTypes = DOC_TYPES.join(", ");
|
|
68
|
+
const mode = detectInstallMode();
|
|
69
|
+
const isNpm = mode === 'npm';
|
|
70
|
+
console.log(`
|
|
71
|
+
Synapse Documentation Framework CLI${isNpm ? ' (npm mode)' : mode === 'fork' ? ' (fork mode)' : ''}
|
|
72
|
+
|
|
73
|
+
Usage:
|
|
74
|
+
synapse <command> [options]
|
|
75
|
+
|
|
76
|
+
Commands:
|
|
77
|
+
validate Validate documentation files against schemas
|
|
78
|
+
format Format documentation files according to body grammar rules
|
|
79
|
+
index Generate the homepage index.md with navigation
|
|
80
|
+
scaffold Create a new document from a template
|
|
81
|
+
generate-pdf Generate a PDF from YAML data and template
|
|
82
|
+
fetch-reference Fetch and convert external URL to markdown${isNpm ? `
|
|
83
|
+
init Initialize forked repository configuration [deprecated in npm mode]
|
|
84
|
+
update Merge upstream changes from the framework [deprecated in npm mode]
|
|
85
|
+
eject Mark repository as independent from upstream [deprecated in npm mode]` : `
|
|
86
|
+
init Initialize forked repository configuration
|
|
87
|
+
update Merge upstream changes from the framework
|
|
88
|
+
eject Mark repository as independent from upstream`}
|
|
89
|
+
migrate Migrate from fork mode to npm dependency mode
|
|
90
|
+
|
|
91
|
+
Options:
|
|
92
|
+
--help Show this help message
|
|
93
|
+
|
|
94
|
+
Validate Command:
|
|
95
|
+
synapse validate [options]
|
|
96
|
+
|
|
97
|
+
Options:
|
|
98
|
+
--dir <path> Content directory to validate (default: content/)
|
|
99
|
+
--schema <path> Schema directory (default: content/schemas/)
|
|
100
|
+
--pattern <glob> Glob pattern to match files (default: **/*.md)
|
|
101
|
+
--format <format> Output format: pretty, json, compact (default: pretty)
|
|
102
|
+
--strict Enable strict mode for naming validation (default: true)
|
|
103
|
+
--no-strict Disable strict mode for naming validation
|
|
104
|
+
|
|
105
|
+
Format Command:
|
|
106
|
+
synapse format [options]
|
|
107
|
+
|
|
108
|
+
Options:
|
|
109
|
+
--dir <path> Content directory to format (default: content/)
|
|
110
|
+
--write Write changes to files (default: dry-run)
|
|
111
|
+
--pattern <glob> Glob pattern to match files (default: **/*.md)
|
|
112
|
+
--verbose Show all files, including unchanged
|
|
113
|
+
|
|
114
|
+
Index Command:
|
|
115
|
+
synapse index [options]
|
|
116
|
+
|
|
117
|
+
Options:
|
|
118
|
+
--dir <path> Content directory (default: content/)
|
|
119
|
+
--output <path> Output file path (default: content/index.md)
|
|
120
|
+
|
|
121
|
+
Scaffold Command:
|
|
122
|
+
synapse scaffold [options]
|
|
123
|
+
|
|
124
|
+
Options:
|
|
125
|
+
--type <type> Document type (required: ${availableTypes})
|
|
126
|
+
--template <type> Alias for --type (backward compatible)
|
|
127
|
+
--title <title> Document title (required)
|
|
128
|
+
--owner <owner> Document owner (optional)
|
|
129
|
+
--id <id> Custom document ID (default: auto-generated)
|
|
130
|
+
--target-dir <path> Output directory (default: content/{type folder})
|
|
131
|
+
--force Overwrite existing files
|
|
132
|
+
|
|
133
|
+
Generate PDF Command:
|
|
134
|
+
synapse generate-pdf [options]
|
|
135
|
+
|
|
136
|
+
Options:
|
|
137
|
+
--input <path> Input YAML data file (required)
|
|
138
|
+
--output <path> Output PDF file path (required)
|
|
139
|
+
--logo <path> Logo image path (optional)
|
|
140
|
+
--company <name> Company name for letterhead (optional)
|
|
141
|
+
--url <url> Company URL for letterhead (optional)
|
|
142
|
+
--no-validate Skip schema validation
|
|
143
|
+
|
|
144
|
+
Fetch Reference Command:
|
|
145
|
+
synapse fetch-reference <url>
|
|
146
|
+
|
|
147
|
+
Fetch external documentation and convert to markdown using Mozilla
|
|
148
|
+
Readability + Turndown. Outputs JSON with markdown content, title,
|
|
149
|
+
byline, and excerpt.
|
|
150
|
+
|
|
151
|
+
Init Command:
|
|
152
|
+
synapse init [options]
|
|
153
|
+
|
|
154
|
+
Options:
|
|
155
|
+
--site-name <name> Site name (default: prompted)
|
|
156
|
+
--display-name <name> Display name (default: site name)
|
|
157
|
+
--base-url <url> Base URL (default: prompted)
|
|
158
|
+
--primary-color <hex> Primary theme color (optional)
|
|
159
|
+
--upstream-remote <name> Git remote name (default: upstream)
|
|
160
|
+
--upstream-url <url> Upstream repository URL
|
|
161
|
+
--force Reinitialize if already initialized
|
|
162
|
+
--yes Skip interactive prompts
|
|
163
|
+
|
|
164
|
+
Update Command:
|
|
165
|
+
synapse update [options]
|
|
166
|
+
|
|
167
|
+
Options:
|
|
168
|
+
--continue Continue merge after manual conflict resolution
|
|
169
|
+
--accept-upstream Accept all upstream changes for conflicts
|
|
170
|
+
--accept-ours Keep all local changes for conflicts
|
|
171
|
+
--abort Abort in-progress merge
|
|
172
|
+
--remote <name> Git remote name (default: upstream)
|
|
173
|
+
--branch <name> Remote branch (default: main)
|
|
174
|
+
|
|
175
|
+
Eject Command:
|
|
176
|
+
synapse eject [options]
|
|
177
|
+
|
|
178
|
+
Options:
|
|
179
|
+
--remove-remote Remove upstream git remote
|
|
180
|
+
--remote <name> Git remote name (default: upstream)
|
|
181
|
+
--yes Skip confirmation prompt
|
|
182
|
+
|
|
183
|
+
Migrate Command:
|
|
184
|
+
synapse migrate [options]
|
|
185
|
+
|
|
186
|
+
Options:
|
|
187
|
+
--dry-run Show migration plan without making changes
|
|
188
|
+
--yes Skip confirmation prompts
|
|
189
|
+
|
|
190
|
+
Examples:
|
|
191
|
+
synapse validate
|
|
192
|
+
synapse validate --no-strict
|
|
193
|
+
synapse validate --pattern "70_Architecture/**/*.md"
|
|
194
|
+
synapse validate --pattern "**/ADRs/*.md" --format compact
|
|
195
|
+
synapse validate --format json > validation-results.json
|
|
196
|
+
synapse format
|
|
197
|
+
synapse format --write
|
|
198
|
+
synapse format --pattern "100_Products/**/*.md" --write
|
|
199
|
+
synapse index
|
|
200
|
+
synapse index --output site/content/index.md
|
|
201
|
+
synapse scaffold --type adr --title "Use React for Frontend"
|
|
202
|
+
synapse scaffold --type policy --title "Security Policy" --owner "Security Team"
|
|
203
|
+
synapse scaffold --type sop --title "Deployment Procedure" --id "SOP-042"
|
|
204
|
+
synapse generate-pdf --input data.yaml --output document.pdf --logo tools/pdf/logo.png --company "Your Company"
|
|
205
|
+
synapse init
|
|
206
|
+
synapse init --site-name "My Docs" --base-url "https://docs.example.com" --yes
|
|
207
|
+
synapse update
|
|
208
|
+
synapse update --accept-upstream
|
|
209
|
+
synapse update --continue
|
|
210
|
+
synapse eject
|
|
211
|
+
synapse migrate --dry-run
|
|
212
|
+
synapse migrate --yes
|
|
213
|
+
`);
|
|
214
|
+
}
|
|
215
|
+
// Main CLI handler
|
|
216
|
+
async function main() {
|
|
217
|
+
if (!command ||
|
|
218
|
+
command === "--help" ||
|
|
219
|
+
command === "-h" ||
|
|
220
|
+
command === "help") {
|
|
221
|
+
showHelp();
|
|
222
|
+
process.exit(0);
|
|
223
|
+
}
|
|
224
|
+
const parsedArgs = parseArgs(args);
|
|
225
|
+
try {
|
|
226
|
+
switch (command) {
|
|
227
|
+
case "validate":
|
|
228
|
+
await validateCommand(parsedArgs);
|
|
229
|
+
break;
|
|
230
|
+
case "format":
|
|
231
|
+
await formatCommand(parsedArgs);
|
|
232
|
+
break;
|
|
233
|
+
case "index":
|
|
234
|
+
await indexCommand(parsedArgs);
|
|
235
|
+
break;
|
|
236
|
+
case "scaffold":
|
|
237
|
+
await scaffoldCommand(parsedArgs);
|
|
238
|
+
break;
|
|
239
|
+
case "generate-pdf":
|
|
240
|
+
await generatePdfCommand(parsedArgs);
|
|
241
|
+
break;
|
|
242
|
+
case "init":
|
|
243
|
+
await initCommand(parsedArgs);
|
|
244
|
+
break;
|
|
245
|
+
case "update":
|
|
246
|
+
await updateCommand(parsedArgs);
|
|
247
|
+
break;
|
|
248
|
+
case "eject":
|
|
249
|
+
await ejectCommand(parsedArgs);
|
|
250
|
+
break;
|
|
251
|
+
case "migrate":
|
|
252
|
+
await migrateCommand(parsedArgs);
|
|
253
|
+
break;
|
|
254
|
+
case "fetch-reference":
|
|
255
|
+
// First positional arg is the URL
|
|
256
|
+
await fetchReferenceCommand({
|
|
257
|
+
url: parsedArgs._?.[0],
|
|
258
|
+
...parsedArgs,
|
|
259
|
+
});
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
console.error(`Unknown command: ${command}`);
|
|
263
|
+
console.log('Run "synapse --help" for usage information');
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
console.error("Error:", error);
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Run the CLI
|
|
273
|
+
main().catch((error) => {
|
|
274
|
+
console.error("Fatal error:", error);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
});
|
|
277
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Body validation rules for Synapse document types
|
|
3
|
+
* Implements AST-based validation of Markdown body structure
|
|
4
|
+
*/
|
|
5
|
+
import { DocType } from './types.generated.js';
|
|
6
|
+
export interface ValidationIssue {
|
|
7
|
+
notePath: string;
|
|
8
|
+
type: 'error';
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
sectionId?: string;
|
|
12
|
+
line?: number;
|
|
13
|
+
column?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface SectionRule {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
alternativeTitles?: string[];
|
|
19
|
+
required: boolean;
|
|
20
|
+
order: number;
|
|
21
|
+
shape: SectionShape;
|
|
22
|
+
}
|
|
23
|
+
export type SectionShape = {
|
|
24
|
+
type: 'paragraphs';
|
|
25
|
+
} | {
|
|
26
|
+
type: 'list';
|
|
27
|
+
ordered?: boolean;
|
|
28
|
+
maxDepth?: number;
|
|
29
|
+
minItems?: number;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'flow';
|
|
32
|
+
allowedNodes: string[];
|
|
33
|
+
} | {
|
|
34
|
+
type: 'table';
|
|
35
|
+
requiredHeaders?: string[];
|
|
36
|
+
minRows?: number;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'milestoneList';
|
|
39
|
+
requireH3: boolean;
|
|
40
|
+
requiredSubsections: string[];
|
|
41
|
+
requiredFields?: string[];
|
|
42
|
+
};
|
|
43
|
+
export interface BodyRules {
|
|
44
|
+
documentTypes: Record<string, {
|
|
45
|
+
displayName: string;
|
|
46
|
+
sections: SectionRule[];
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Loads body rules from the body-grammars directory
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadBodyRules(root?: string): Promise<BodyRules>;
|
|
53
|
+
/**
|
|
54
|
+
* Formats a document body according to grammar rules
|
|
55
|
+
* - Inserts missing required sections in canonical order
|
|
56
|
+
* - Normalizes section titles to match grammar
|
|
57
|
+
* - Normalizes heading levels (H2 for sections)
|
|
58
|
+
* - Normalizes list markers
|
|
59
|
+
* - Preserves existing content
|
|
60
|
+
* @param body - The original markdown body
|
|
61
|
+
* @param rules - Body grammar rules
|
|
62
|
+
* @param type - Document type
|
|
63
|
+
* @returns Formatted markdown body
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatBody(body: string, rules: BodyRules, type: DocType): string;
|
|
66
|
+
/**
|
|
67
|
+
* Validates markdown body against rules for a given document type
|
|
68
|
+
*/
|
|
69
|
+
export declare function validateBody(body: string, rules: BodyRules, type: DocType, notePath: string): ValidationIssue[];
|
|
70
|
+
//# sourceMappingURL=bodyRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bodyRules.d.ts","sourceRoot":"","sources":["../../src/lib/bodyRules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,OAAO,EAAa,MAAM,sBAAsB,CAAC;AAQ1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEN,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CACnB,MAAM,EACN;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;KACzB,CACF,CAAC;CACH;AAMD;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgDrE;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,OAAO,GACZ,MAAM,CAyER;AA2ID;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GACf,eAAe,EAAE,CA8EnB"}
|