@zmdb/cli 1.0.0-beta.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 (207) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +19 -0
  3. package/dist/__fixtures__/http-client/src/contract.d.ts +38 -0
  4. package/dist/__fixtures__/http-client/src/contract.d.ts.map +1 -0
  5. package/dist/__fixtures__/http-client/src/contract.js +121 -0
  6. package/dist/__fixtures__/http-client/src/contract.js.map +1 -0
  7. package/dist/__fixtures__/http-client/src/models.d.ts +11 -0
  8. package/dist/__fixtures__/http-client/src/models.d.ts.map +1 -0
  9. package/dist/__fixtures__/http-client/src/models.js +2 -0
  10. package/dist/__fixtures__/http-client/src/models.js.map +1 -0
  11. package/dist/__fixtures__/http-client/src/schema.d.ts +4 -0
  12. package/dist/__fixtures__/http-client/src/schema.d.ts.map +1 -0
  13. package/dist/__fixtures__/http-client/src/schema.js +2 -0
  14. package/dist/__fixtures__/http-client/src/schema.js.map +1 -0
  15. package/dist/__fixtures__/http-client/src/unrelated.d.ts +2 -0
  16. package/dist/__fixtures__/http-client/src/unrelated.d.ts.map +1 -0
  17. package/dist/__fixtures__/http-client/src/unrelated.js +2 -0
  18. package/dist/__fixtures__/http-client/src/unrelated.js.map +1 -0
  19. package/dist/__fixtures__/http-client/zmdb.config.d.ts +16 -0
  20. package/dist/__fixtures__/http-client/zmdb.config.d.ts.map +1 -0
  21. package/dist/__fixtures__/http-client/zmdb.config.js +12 -0
  22. package/dist/__fixtures__/http-client/zmdb.config.js.map +1 -0
  23. package/dist/__fixtures__/project/src/schema.d.ts +6 -0
  24. package/dist/__fixtures__/project/src/schema.d.ts.map +1 -0
  25. package/dist/__fixtures__/project/src/schema.js +2 -0
  26. package/dist/__fixtures__/project/src/schema.js.map +1 -0
  27. package/dist/__fixtures__/project/zmdb.config.d.ts +22 -0
  28. package/dist/__fixtures__/project/zmdb.config.d.ts.map +1 -0
  29. package/dist/__fixtures__/project/zmdb.config.js +55 -0
  30. package/dist/__fixtures__/project/zmdb.config.js.map +1 -0
  31. package/dist/application-loader.d.ts +4 -0
  32. package/dist/application-loader.d.ts.map +1 -0
  33. package/dist/application-loader.js +102 -0
  34. package/dist/application-loader.js.map +1 -0
  35. package/dist/args.d.ts +23 -0
  36. package/dist/args.d.ts.map +1 -0
  37. package/dist/args.js +353 -0
  38. package/dist/args.js.map +1 -0
  39. package/dist/atomic.d.ts +13 -0
  40. package/dist/atomic.d.ts.map +1 -0
  41. package/dist/atomic.js +28 -0
  42. package/dist/atomic.js.map +1 -0
  43. package/dist/bin.d.ts +3 -0
  44. package/dist/bin.d.ts.map +1 -0
  45. package/dist/bin.js +4 -0
  46. package/dist/bin.js.map +1 -0
  47. package/dist/commands/check.d.ts +5 -0
  48. package/dist/commands/check.d.ts.map +1 -0
  49. package/dist/commands/check.js +7 -0
  50. package/dist/commands/check.js.map +1 -0
  51. package/dist/commands/client.d.ts +38 -0
  52. package/dist/commands/client.d.ts.map +1 -0
  53. package/dist/commands/client.js +347 -0
  54. package/dist/commands/client.js.map +1 -0
  55. package/dist/commands/codegen.d.ts +9 -0
  56. package/dist/commands/codegen.d.ts.map +1 -0
  57. package/dist/commands/codegen.js +56 -0
  58. package/dist/commands/codegen.js.map +1 -0
  59. package/dist/commands/embed.d.ts +8 -0
  60. package/dist/commands/embed.d.ts.map +1 -0
  61. package/dist/commands/embed.js +17 -0
  62. package/dist/commands/embed.js.map +1 -0
  63. package/dist/commands/export.d.ts +5 -0
  64. package/dist/commands/export.d.ts.map +1 -0
  65. package/dist/commands/export.js +6 -0
  66. package/dist/commands/export.js.map +1 -0
  67. package/dist/commands/generate.d.ts +5 -0
  68. package/dist/commands/generate.d.ts.map +1 -0
  69. package/dist/commands/generate.js +6 -0
  70. package/dist/commands/generate.js.map +1 -0
  71. package/dist/commands/migrate.d.ts +9 -0
  72. package/dist/commands/migrate.d.ts.map +1 -0
  73. package/dist/commands/migrate.js +18 -0
  74. package/dist/commands/migrate.js.map +1 -0
  75. package/dist/commands/new.d.ts +4 -0
  76. package/dist/commands/new.d.ts.map +1 -0
  77. package/dist/commands/new.js +35 -0
  78. package/dist/commands/new.js.map +1 -0
  79. package/dist/commands/pull.d.ts +5 -0
  80. package/dist/commands/pull.d.ts.map +1 -0
  81. package/dist/commands/pull.js +14 -0
  82. package/dist/commands/pull.js.map +1 -0
  83. package/dist/commands/push.d.ts +6 -0
  84. package/dist/commands/push.d.ts.map +1 -0
  85. package/dist/commands/push.js +11 -0
  86. package/dist/commands/push.js.map +1 -0
  87. package/dist/commands/studio.d.ts +31 -0
  88. package/dist/commands/studio.d.ts.map +1 -0
  89. package/dist/commands/studio.js +154 -0
  90. package/dist/commands/studio.js.map +1 -0
  91. package/dist/commands/upgrade.d.ts +5 -0
  92. package/dist/commands/upgrade.d.ts.map +1 -0
  93. package/dist/commands/upgrade.js +11 -0
  94. package/dist/commands/upgrade.js.map +1 -0
  95. package/dist/database.d.ts +4 -0
  96. package/dist/database.d.ts.map +1 -0
  97. package/dist/database.js +8 -0
  98. package/dist/database.js.map +1 -0
  99. package/dist/errors.d.ts +7 -0
  100. package/dist/errors.d.ts.map +1 -0
  101. package/dist/errors.js +20 -0
  102. package/dist/errors.js.map +1 -0
  103. package/dist/index.d.ts +34 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +626 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/lifecycle.d.ts +6 -0
  108. package/dist/lifecycle.d.ts.map +1 -0
  109. package/dist/lifecycle.js +75 -0
  110. package/dist/lifecycle.js.map +1 -0
  111. package/dist/migration-project.d.ts +14 -0
  112. package/dist/migration-project.d.ts.map +1 -0
  113. package/dist/migration-project.js +74 -0
  114. package/dist/migration-project.js.map +1 -0
  115. package/dist/output.d.ts +27 -0
  116. package/dist/output.d.ts.map +1 -0
  117. package/dist/output.js +60 -0
  118. package/dist/output.js.map +1 -0
  119. package/dist/repl.d.ts +48 -0
  120. package/dist/repl.d.ts.map +1 -0
  121. package/dist/repl.js +265 -0
  122. package/dist/repl.js.map +1 -0
  123. package/dist/scaffold.d.ts +28 -0
  124. package/dist/scaffold.d.ts.map +1 -0
  125. package/dist/scaffold.js +414 -0
  126. package/dist/scaffold.js.map +1 -0
  127. package/dist/studio/index.d.ts +20 -0
  128. package/dist/studio/index.d.ts.map +1 -0
  129. package/dist/studio/index.js +607 -0
  130. package/dist/studio/index.js.map +1 -0
  131. package/dist/templates/command.d.ts +3 -0
  132. package/dist/templates/command.d.ts.map +1 -0
  133. package/dist/templates/command.js +65 -0
  134. package/dist/templates/command.js.map +1 -0
  135. package/dist/templates/controller.d.ts +3 -0
  136. package/dist/templates/controller.d.ts.map +1 -0
  137. package/dist/templates/controller.js +41 -0
  138. package/dist/templates/controller.js.map +1 -0
  139. package/dist/templates/index.d.ts +4 -0
  140. package/dist/templates/index.d.ts.map +1 -0
  141. package/dist/templates/index.js +18 -0
  142. package/dist/templates/index.js.map +1 -0
  143. package/dist/templates/module.d.ts +3 -0
  144. package/dist/templates/module.d.ts.map +1 -0
  145. package/dist/templates/module.js +41 -0
  146. package/dist/templates/module.js.map +1 -0
  147. package/dist/templates/project.d.ts +3 -0
  148. package/dist/templates/project.d.ts.map +1 -0
  149. package/dist/templates/project.js +280 -0
  150. package/dist/templates/project.js.map +1 -0
  151. package/dist/templates/repository.d.ts +3 -0
  152. package/dist/templates/repository.d.ts.map +1 -0
  153. package/dist/templates/repository.js +66 -0
  154. package/dist/templates/repository.js.map +1 -0
  155. package/dist/templates/schema.d.ts +3 -0
  156. package/dist/templates/schema.d.ts.map +1 -0
  157. package/dist/templates/schema.js +36 -0
  158. package/dist/templates/schema.js.map +1 -0
  159. package/dist/templates/types.d.ts +25 -0
  160. package/dist/templates/types.d.ts.map +1 -0
  161. package/dist/templates/types.js +17 -0
  162. package/dist/templates/types.js.map +1 -0
  163. package/package.json +72 -0
  164. package/src/__fixtures__/http-client/package.json +5 -0
  165. package/src/__fixtures__/http-client/src/contract.ts +85 -0
  166. package/src/__fixtures__/http-client/src/models.ts +12 -0
  167. package/src/__fixtures__/http-client/src/schema.ts +3 -0
  168. package/src/__fixtures__/http-client/src/unrelated.ts +1 -0
  169. package/src/__fixtures__/http-client/tsconfig.json +17 -0
  170. package/src/__fixtures__/http-client/zmdb.config.ts +12 -0
  171. package/src/__fixtures__/project/package.json +5 -0
  172. package/src/__fixtures__/project/src/schema.ts +6 -0
  173. package/src/__fixtures__/project/tsconfig.json +24 -0
  174. package/src/__fixtures__/project/zmdb.config.ts +57 -0
  175. package/src/application-loader.ts +108 -0
  176. package/src/args.ts +391 -0
  177. package/src/atomic.ts +43 -0
  178. package/src/bin.ts +5 -0
  179. package/src/commands/check.ts +11 -0
  180. package/src/commands/client.ts +415 -0
  181. package/src/commands/codegen.ts +73 -0
  182. package/src/commands/embed.ts +36 -0
  183. package/src/commands/export.ts +10 -0
  184. package/src/commands/generate.ts +14 -0
  185. package/src/commands/migrate.ts +38 -0
  186. package/src/commands/new.ts +48 -0
  187. package/src/commands/pull.ts +32 -0
  188. package/src/commands/push.ts +21 -0
  189. package/src/commands/studio.ts +200 -0
  190. package/src/commands/upgrade.ts +14 -0
  191. package/src/database.ts +9 -0
  192. package/src/errors.ts +19 -0
  193. package/src/index.ts +710 -0
  194. package/src/lifecycle.ts +73 -0
  195. package/src/migration-project.ts +91 -0
  196. package/src/output.ts +77 -0
  197. package/src/repl.ts +328 -0
  198. package/src/scaffold.ts +485 -0
  199. package/src/studio/index.ts +674 -0
  200. package/src/templates/command.ts +66 -0
  201. package/src/templates/controller.ts +42 -0
  202. package/src/templates/index.ts +29 -0
  203. package/src/templates/module.ts +42 -0
  204. package/src/templates/project.ts +281 -0
  205. package/src/templates/repository.ts +67 -0
  206. package/src/templates/schema.ts +37 -0
  207. package/src/templates/types.ts +46 -0
package/dist/repl.js ADDED
@@ -0,0 +1,265 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
5
+ import { start } from 'node:repl';
6
+ import { moduleDefOf } from '@zmdb/app/modules';
7
+ import { createApp } from '@zmdb/web/app';
8
+ import { describeGraph, renderTree } from '@zmdb/web/devtools';
9
+ /**
10
+ * Boot the real application and start a local, stream-only Node REPL.
11
+ *
12
+ * No socket or adapter is created. The caller owns the returned async resource;
13
+ * disposing it closes the prompt and runs the application's normal shutdown
14
+ * lifecycle.
15
+ */
16
+ export async function createReplSession(rootModule, options) {
17
+ const input = options.input ?? process.stdin;
18
+ const output = options.output ?? process.stdout;
19
+ const stderr = options.stderr ?? (text => process.stderr.write(text));
20
+ const cwd = options.cwd ?? process.cwd();
21
+ const graph = describeGraph(rootModule);
22
+ const tokenRecords = providerTokensOf(rootModule);
23
+ const app = createApp(rootModule);
24
+ try {
25
+ await app.init();
26
+ }
27
+ catch (error) {
28
+ try {
29
+ await app[Symbol.asyncDispose]();
30
+ }
31
+ catch (cleanupError) {
32
+ throw new SuppressedError(cleanupError, error, 'REPL operation and application cleanup failed');
33
+ }
34
+ throw error;
35
+ }
36
+ let server;
37
+ try {
38
+ const scope = replScope(app, graph, tokenRecords);
39
+ stderr([
40
+ 'zmdb repl — development shell with the application container',
41
+ `config: ${options.configPath}`,
42
+ 'dialect: application-owned (the application does not read zmdb.config.ts)',
43
+ 'database: application-owned (provider values are not inspected or printed)',
44
+ `module: ${options.moduleSpec} (${rootModule.name || '<anonymous>'})`,
45
+ 'scope: app, container, get(tokenOrDescription), tokens, describe(), request(req), load(name)',
46
+ `tokens: ${scope.tokens.length === 0 ? '(none)' : scope.tokens.join(', ')}`,
47
+ `history: ${options.historyPath === null ? 'disabled' : (options.historyPath ?? 'disabled')}`,
48
+ '',
49
+ ].join('\n'));
50
+ server = start({
51
+ prompt: 'zmdb> ',
52
+ input,
53
+ output,
54
+ terminal: options.terminal,
55
+ ignoreUndefined: true,
56
+ });
57
+ const activeServer = server;
58
+ let closed = false;
59
+ const enteredLines = [];
60
+ if (options.historyPath !== null && options.historyPath !== undefined) {
61
+ activeServer.on('line', line => {
62
+ if (line.length > 0 && line !== '.exit') {
63
+ enteredLines.unshift(line);
64
+ }
65
+ });
66
+ }
67
+ const historyReady = Promise.withResolvers();
68
+ const whenClosed = new Promise((resolveClosed, rejectClosed) => {
69
+ activeServer.once('exit', () => {
70
+ closed = true;
71
+ void historyReady.promise.then(flush => flush()).then(resolveClosed, rejectClosed);
72
+ });
73
+ });
74
+ Object.assign(activeServer.context, scope);
75
+ try {
76
+ const flushHistory = options.historyPath === null || options.historyPath === undefined
77
+ ? async () => { }
78
+ : await configureHistory(activeServer, options.historyPath, cwd, enteredLines);
79
+ historyReady.resolve(flushHistory);
80
+ }
81
+ catch (error) {
82
+ historyReady.resolve(async () => { });
83
+ throw error;
84
+ }
85
+ let disposed = false;
86
+ return {
87
+ app,
88
+ graph,
89
+ scope,
90
+ server: activeServer,
91
+ closed: whenClosed,
92
+ evaluate: source => evaluate(activeServer, source),
93
+ [Symbol.asyncDispose]: async () => {
94
+ if (disposed) {
95
+ return;
96
+ }
97
+ disposed = true;
98
+ if (!closed) {
99
+ activeServer.close();
100
+ }
101
+ let outcome;
102
+ try {
103
+ await whenClosed;
104
+ outcome = { ok: true };
105
+ }
106
+ catch (error) {
107
+ outcome = { ok: false, error };
108
+ }
109
+ try {
110
+ await app[Symbol.asyncDispose]();
111
+ }
112
+ catch (cleanupError) {
113
+ if (!outcome.ok)
114
+ throw new SuppressedError(cleanupError, outcome.error, 'REPL close and application cleanup failed');
115
+ throw cleanupError;
116
+ }
117
+ if (!outcome.ok)
118
+ throw outcome.error;
119
+ },
120
+ };
121
+ }
122
+ catch (error) {
123
+ server?.close();
124
+ try {
125
+ await app[Symbol.asyncDispose]();
126
+ }
127
+ catch (cleanupError) {
128
+ throw new SuppressedError(cleanupError, error, 'REPL operation and application cleanup failed');
129
+ }
130
+ throw error;
131
+ }
132
+ }
133
+ /** Resolve the default history path without ever making it relative to the project. */
134
+ export function replHistoryPath(environment = process.env, homeDirectory = homedir()) {
135
+ const configured = environment['ZMDB_REPL_HISTORY'];
136
+ if (configured === undefined || configured.length === 0) {
137
+ return resolve(homeDirectory, '.zmdb_repl_history');
138
+ }
139
+ return isAbsolute(configured) ? configured : resolve(homeDirectory, configured);
140
+ }
141
+ function replScope(app, graph, records) {
142
+ const get = createGet(app, records);
143
+ const tokens = graph.providers.map(provider => provider.token).toSorted();
144
+ return {
145
+ app,
146
+ container: app.container,
147
+ get,
148
+ tokens,
149
+ describe: () => renderTree(graph, graph.providers.length <= 50 ? { providers: true } : undefined),
150
+ request: request => {
151
+ const input = typeof request === 'string' ? { method: 'GET', path: request, headers: {} } : request;
152
+ return app.handle(input);
153
+ },
154
+ load: async (name) => {
155
+ const matches = app.lazy.filter(handle => handle.name === name);
156
+ if (matches.length === 0) {
157
+ throw new Error(`zmdb repl: no lazy module named "${name}"`);
158
+ }
159
+ if (matches.length > 1) {
160
+ throw new Error(`zmdb repl: lazy module name "${name}" is ambiguous (${String(matches.length)} handles)`);
161
+ }
162
+ await matches[0]?.load();
163
+ },
164
+ };
165
+ }
166
+ function createGet(app, records) {
167
+ return (tokenOrDescription) => {
168
+ if (typeof tokenOrDescription !== 'string') {
169
+ return app.container.resolve(tokenOrDescription);
170
+ }
171
+ const matches = records.filter(record => record.description === tokenOrDescription);
172
+ if (matches.length === 0) {
173
+ throw new Error(`zmdb repl: no provider token is described as "${tokenOrDescription}"`);
174
+ }
175
+ if (matches.length > 1) {
176
+ throw new Error(`zmdb repl: token description "${tokenOrDescription}" is ambiguous (${String(matches.length)} distinct tokens)`);
177
+ }
178
+ const record = matches[0];
179
+ if (record === undefined) {
180
+ throw new Error(`zmdb repl: no provider token is described as "${tokenOrDescription}"`);
181
+ }
182
+ return app.container.resolve(record.token);
183
+ };
184
+ }
185
+ function providerTokensOf(rootModule) {
186
+ const seenModules = new Set();
187
+ const seenTokens = new Set();
188
+ const records = [];
189
+ const visit = (moduleClass) => {
190
+ if (seenModules.has(moduleClass)) {
191
+ return;
192
+ }
193
+ seenModules.add(moduleClass);
194
+ const definition = moduleDefOf(moduleClass);
195
+ for (const provider of definition?.providers ?? []) {
196
+ if (!seenTokens.has(provider.token)) {
197
+ seenTokens.add(provider.token);
198
+ records.push({ token: provider.token, description: provider.token.description });
199
+ }
200
+ }
201
+ for (const imported of definition?.imports ?? []) {
202
+ visit(typeof imported === 'function' ? imported : imported.module);
203
+ }
204
+ };
205
+ visit(rootModule);
206
+ return records;
207
+ }
208
+ async function configureHistory(server, historyPath, cwd, enteredLines) {
209
+ if (isWithin(projectRootOf(cwd), historyPath)) {
210
+ throw new Error(`zmdb repl: history path "${historyPath}" must be outside the project tree`);
211
+ }
212
+ await mkdir(dirname(historyPath), { recursive: true, mode: 0o700 });
213
+ let existing = '';
214
+ try {
215
+ existing = await readFile(historyPath, 'utf8');
216
+ }
217
+ catch (error) {
218
+ if (!isNotFound(error)) {
219
+ throw error;
220
+ }
221
+ }
222
+ await writeFile(historyPath, existing, { encoding: 'utf8', mode: 0o600 });
223
+ await chmod(historyPath, 0o600);
224
+ const existingLines = existing.split(/\r?\n/).filter(line => line.length > 0);
225
+ Reflect.set(server, 'history', existingLines);
226
+ return async () => {
227
+ const lines = [...enteredLines, ...existingLines];
228
+ await writeFile(historyPath, lines.join('\n'), { encoding: 'utf8', mode: 0o600 });
229
+ await chmod(historyPath, 0o600);
230
+ };
231
+ }
232
+ function projectRootOf(cwd) {
233
+ let current = resolve(cwd);
234
+ while (true) {
235
+ if (existsSync(resolve(current, 'package.json'))) {
236
+ return current;
237
+ }
238
+ const parent = dirname(current);
239
+ if (parent === current) {
240
+ return resolve(cwd);
241
+ }
242
+ current = parent;
243
+ }
244
+ }
245
+ function isWithin(base, target) {
246
+ const path = relative(resolve(base), resolve(target));
247
+ return path === '' || (!path.startsWith(`..${sep}`) && path !== '..' && !isAbsolute(path));
248
+ }
249
+ function isNotFound(error) {
250
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
251
+ }
252
+ function evaluate(server, source) {
253
+ const command = source.endsWith('\n') ? source : `${source}\n`;
254
+ return new Promise((resolveResult, rejectResult) => {
255
+ server.eval(command, server.context, 'zmdb-repl', (error, result) => {
256
+ if (error === null) {
257
+ resolveResult(result);
258
+ }
259
+ else {
260
+ rejectResult(error);
261
+ }
262
+ });
263
+ });
264
+ }
265
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type ScaffoldKind, type ScaffoldName } from './templates/index.js';
2
+ export interface ScaffoldOptions {
3
+ readonly cwd: string;
4
+ readonly kind: string;
5
+ readonly name: string;
6
+ readonly package?: string;
7
+ readonly dryRun?: boolean;
8
+ }
9
+ export interface ScaffoldFile {
10
+ readonly path: string;
11
+ readonly source: string;
12
+ }
13
+ export interface ScaffoldResult {
14
+ readonly kind: ScaffoldKind;
15
+ readonly name: ScaffoldName;
16
+ readonly target: string;
17
+ readonly files: readonly ScaffoldFile[];
18
+ readonly instructions: readonly string[];
19
+ readonly dryRun: boolean;
20
+ }
21
+ export declare class ScaffoldUsageError extends Error {
22
+ }
23
+ export declare class ScaffoldConflictError extends Error {
24
+ }
25
+ /** Resolve, format and write one scaffold without ever editing an existing file. */
26
+ export declare function scaffold(options: ScaffoldOptions): Promise<ScaffoldResult>;
27
+ export declare function renderScaffold(result: ScaffoldResult): string;
28
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,YAAY,EAGlB,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAkBD,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,qBAAa,qBAAsB,SAAQ,KAAK;CAAG;AAEnD,oFAAoF;AACpF,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAgDhF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAO7D"}