@objectstack/cli 6.7.1 → 6.8.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 (39) hide show
  1. package/README.md +24 -1
  2. package/dist/commands/dev.d.ts +1 -1
  3. package/dist/commands/dev.d.ts.map +1 -1
  4. package/dist/commands/dev.js +8 -3
  5. package/dist/commands/dev.js.map +1 -1
  6. package/dist/commands/package/publish.d.ts.map +1 -1
  7. package/dist/commands/package/publish.js +124 -15
  8. package/dist/commands/package/publish.js.map +1 -1
  9. package/dist/commands/serve.d.ts +1 -1
  10. package/dist/commands/serve.d.ts.map +1 -1
  11. package/dist/commands/serve.js +42 -66
  12. package/dist/commands/serve.js.map +1 -1
  13. package/dist/commands/start.d.ts +19 -10
  14. package/dist/commands/start.d.ts.map +1 -1
  15. package/dist/commands/start.js +87 -24
  16. package/dist/commands/start.js.map +1 -1
  17. package/dist/utils/account.d.ts +1 -1
  18. package/dist/utils/account.js +1 -1
  19. package/dist/utils/console.d.ts +1 -1
  20. package/dist/utils/console.js +6 -6
  21. package/dist/utils/console.js.map +1 -1
  22. package/dist/utils/format.d.ts +0 -1
  23. package/dist/utils/format.d.ts.map +1 -1
  24. package/dist/utils/format.js +0 -3
  25. package/dist/utils/format.js.map +1 -1
  26. package/dist/utils/plugin-detection.js +1 -1
  27. package/package.json +37 -38
  28. package/dist/commands/studio.d.ts +0 -19
  29. package/dist/commands/studio.d.ts.map +0 -1
  30. package/dist/commands/studio.js +0 -43
  31. package/dist/commands/studio.js.map +0 -1
  32. package/dist/utils/studio-field-patch.d.ts +0 -43
  33. package/dist/utils/studio-field-patch.d.ts.map +0 -1
  34. package/dist/utils/studio-field-patch.js +0 -336
  35. package/dist/utils/studio-field-patch.js.map +0 -1
  36. package/dist/utils/studio.d.ts +0 -63
  37. package/dist/utils/studio.d.ts.map +0 -1
  38. package/dist/utils/studio.js +0 -430
  39. package/dist/utils/studio.js.map +0 -1
@@ -1,43 +0,0 @@
1
- export interface FieldPatch {
2
- label?: string | null;
3
- description?: string | null;
4
- required?: boolean | null;
5
- }
6
- export type PatchResult = {
7
- ok: true;
8
- } | {
9
- ok: false;
10
- error: string;
11
- };
12
- /**
13
- * Locate the field's inner object-literal and apply the patch.
14
- * Writes the file in place when successful.
15
- */
16
- export declare function patchObjectFieldFile(absPath: string, fieldKey: string, patch: FieldPatch): Promise<PatchResult>;
17
- /**
18
- * Append a new field to the `fields: { ... }` object literal. The
19
- * `initializer` is the raw TS source that goes on the right-hand side
20
- * of `<fieldName>: …` — typically an object literal but may be any
21
- * expression (e.g. `Field.text({ ... })`).
22
- *
23
- * Refuses to overwrite an existing field — callers must surface a
24
- * conflict to the user.
25
- */
26
- export declare function addObjectField(absPath: string, fieldName: string, initializer: string): Promise<PatchResult>;
27
- /**
28
- * Re-order the properties inside the `fields: { ... }` object literal
29
- * to match `order[]`. Field names absent from `order` are appended at
30
- * the end in their existing relative order — keeps the operation safe
31
- * if the UI has a stale snapshot.
32
- *
33
- * Implementation: slice each property's source range out of the file
34
- * (including any leading whitespace / blank-line / comment trivia and
35
- * the trailing `,`), then concatenate the slices in the new order. By
36
- * working on the raw source, indentation, trailing commas, blank-line
37
- * separators and inline comments are all preserved verbatim. The only
38
- * cost: a hanging blank line that previously sat *between* two props
39
- * follows whichever property it precedes after the reorder, which is
40
- * the natural and least-surprising behaviour.
41
- */
42
- export declare function reorderObjectFields(absPath: string, order: readonly string[]): Promise<PatchResult>;
43
- //# sourceMappingURL=studio-field-patch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio-field-patch.d.ts","sourceRoot":"","sources":["../../src/utils/studio-field-patch.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAiEtB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,WAAW,CAAC,CAiEtB"}
@@ -1,336 +0,0 @@
1
- // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
- /**
3
- * Studio field-patch — ts-morph powered surgery on a single field
4
- * inside an `ObjectSchema.create({...})` or `defineObject({...})` call.
5
- *
6
- * Supported field shapes:
7
- * account_number: Field.autonumber({ ...props }) // CallExpression
8
- * owner: Field.lookup('user', { ...props }) // CallExpression with second-arg object
9
- * custom: { ...props } // bare ObjectLiteral
10
- *
11
- * Properties we know how to update: `label`, `description`, `required`.
12
- * Falsy values (`null`, `''`, `false`) are interpreted as "remove this
13
- * property" so the source stays minimal.
14
- */
15
- import { Project, SyntaxKind, } from 'ts-morph';
16
- /**
17
- * Locate the field's inner object-literal and apply the patch.
18
- * Writes the file in place when successful.
19
- */
20
- export async function patchObjectFieldFile(absPath, fieldKey, patch) {
21
- return withFieldsObj(absPath, async (fieldsObj) => {
22
- const fieldProp = fieldsObj.getProperty(fieldKey);
23
- if (!fieldProp || !fieldProp.isKind(SyntaxKind.PropertyAssignment)) {
24
- return { ok: false, error: `field \`${fieldKey}\` not found in fields` };
25
- }
26
- const innerObj = resolveInnerObjectLiteral(fieldProp.getInitializer());
27
- if (!innerObj) {
28
- return { ok: false, error: `field \`${fieldKey}\` initializer has no editable object literal` };
29
- }
30
- if ('label' in patch)
31
- applyStringProp(innerObj, 'label', patch.label);
32
- if ('description' in patch)
33
- applyStringProp(innerObj, 'description', patch.description);
34
- if ('required' in patch)
35
- applyBooleanProp(innerObj, 'required', patch.required);
36
- return { ok: true };
37
- });
38
- }
39
- /**
40
- * Append a new field to the `fields: { ... }` object literal. The
41
- * `initializer` is the raw TS source that goes on the right-hand side
42
- * of `<fieldName>: …` — typically an object literal but may be any
43
- * expression (e.g. `Field.text({ ... })`).
44
- *
45
- * Refuses to overwrite an existing field — callers must surface a
46
- * conflict to the user.
47
- */
48
- export async function addObjectField(absPath, fieldName, initializer) {
49
- if (!/^[a-z_][a-z0-9_]*$/.test(fieldName)) {
50
- return { ok: false, error: `invalid field name \`${fieldName}\` (must be snake_case)` };
51
- }
52
- return withFieldsObj(absPath, async (fieldsObj) => {
53
- if (fieldsObj.getProperty(fieldName)) {
54
- return { ok: false, error: `field \`${fieldName}\` already exists` };
55
- }
56
- try {
57
- // Append by raw-text insertion so we match the file's existing
58
- // indentation / line-break conventions instead of forcing ts-morph
59
- // defaults (which produced 6-space indent and a flush-left closing
60
- // brace inside a 4-space-indented body).
61
- const openBrace = fieldsObj.getFirstChildByKind(SyntaxKind.OpenBraceToken);
62
- const closeBrace = fieldsObj.getLastChildByKind(SyntaxKind.CloseBraceToken);
63
- if (!openBrace || !closeBrace) {
64
- return { ok: false, error: 'malformed object literal (missing braces)' };
65
- }
66
- const sf = fieldsObj.getSourceFile();
67
- const fullText = sf.getFullText();
68
- const bodyStart = openBrace.getEnd();
69
- const bodyEnd = closeBrace.getStart();
70
- // Detect existing indentation by sniffing the original source:
71
- // propIndent — leading whitespace before the first existing prop
72
- // closeIndent — leading whitespace before the existing close brace
73
- // Both are read verbatim so the new prop and the close brace land at
74
- // the exact columns the file already uses (handles 2-space, 4-space,
75
- // tabs, or anything else without guessing the indent step).
76
- const sniffIndent = (pos) => {
77
- let i = pos - 1;
78
- while (i >= 0 && (fullText[i] === ' ' || fullText[i] === '\t'))
79
- i--;
80
- return fullText.slice(i + 1, pos);
81
- };
82
- const firstProp = fieldsObj.getProperties()[0];
83
- const closeIndent = sniffIndent(closeBrace.getStart());
84
- let propIndent;
85
- if (firstProp && firstProp.isKind(SyntaxKind.PropertyAssignment)) {
86
- propIndent = sniffIndent(firstProp.getStart());
87
- }
88
- else {
89
- // Empty `{}` — give the new prop one step beyond the close brace.
90
- // Default to two spaces; if the close-brace indent looks tab-based,
91
- // use a tab.
92
- propIndent = closeIndent + (closeIndent.includes('\t') ? '\t' : ' ');
93
- }
94
- // Body region between braces; rebuild with the new prop appended,
95
- // ensuring trailing comma + newline + indent before the new prop and
96
- // a newline + closing indent before the close brace.
97
- const body = fullText.slice(bodyStart, bodyEnd);
98
- let trimmed = body.replace(/\s+$/, '');
99
- if (trimmed && !trimmed.endsWith(','))
100
- trimmed += ',';
101
- const isEmpty = trimmed.length === 0;
102
- const newBody = isEmpty
103
- ? `\n${propIndent}${fieldName}: ${initializer},\n${closeIndent}`
104
- : `${trimmed}\n${propIndent}${fieldName}: ${initializer},\n${closeIndent}`;
105
- // Use raw SourceFile.replaceText to avoid ts-morph auto-reindenting
106
- // every line inside the literal (replaceWithText on an ObjectLiteral
107
- // re-indents by manipulation settings, shifting unchanged lines).
108
- sf.replaceText([bodyStart, bodyEnd], newBody);
109
- return { ok: true };
110
- }
111
- catch (err) {
112
- return { ok: false, error: `add failed: ${err?.message ?? String(err)}` };
113
- }
114
- });
115
- }
116
- /**
117
- * Re-order the properties inside the `fields: { ... }` object literal
118
- * to match `order[]`. Field names absent from `order` are appended at
119
- * the end in their existing relative order — keeps the operation safe
120
- * if the UI has a stale snapshot.
121
- *
122
- * Implementation: slice each property's source range out of the file
123
- * (including any leading whitespace / blank-line / comment trivia and
124
- * the trailing `,`), then concatenate the slices in the new order. By
125
- * working on the raw source, indentation, trailing commas, blank-line
126
- * separators and inline comments are all preserved verbatim. The only
127
- * cost: a hanging blank line that previously sat *between* two props
128
- * follows whichever property it precedes after the reorder, which is
129
- * the natural and least-surprising behaviour.
130
- */
131
- export async function reorderObjectFields(absPath, order) {
132
- if (!Array.isArray(order)) {
133
- return { ok: false, error: 'order must be an array of field names' };
134
- }
135
- return withFieldsObj(absPath, async (fieldsObj) => {
136
- const props = fieldsObj.getProperties();
137
- const openBrace = fieldsObj.getFirstChildByKind(SyntaxKind.OpenBraceToken);
138
- const closeBrace = fieldsObj.getLastChildByKind(SyntaxKind.CloseBraceToken);
139
- if (!openBrace || !closeBrace) {
140
- return { ok: false, error: 'malformed object literal (missing braces)' };
141
- }
142
- const sf = fieldsObj.getSourceFile();
143
- const fullText = sf.getFullText();
144
- const bodyStart = openBrace.getEnd();
145
- const bodyEnd = closeBrace.getStart();
146
- // For each property: capture the slice from "just after previous prop's
147
- // trailing comma" (or bodyStart for the first prop) up to and including
148
- // this prop's own trailing comma (skipping inline whitespace up to it).
149
- // Leading whitespace / blank lines / comments that precede a prop stay
150
- // with that prop, so they travel together when reordered.
151
- const slices = new Map();
152
- let cursor = bodyStart;
153
- for (let i = 0; i < props.length; i++) {
154
- const p = props[i];
155
- if (!p.isKind(SyntaxKind.PropertyAssignment) && !p.isKind(SyntaxKind.ShorthandPropertyAssignment)) {
156
- continue;
157
- }
158
- const name = p.getName();
159
- // Find end-of-slice: skip whitespace after the prop, swallow one comma if present.
160
- let end = p.getEnd();
161
- while (end < bodyEnd && /[ \t]/.test(fullText[end]))
162
- end++;
163
- if (fullText[end] === ',')
164
- end++;
165
- slices.set(name, fullText.slice(cursor, end));
166
- cursor = end;
167
- }
168
- // Anything between the last prop's comma and the close brace (typically
169
- // a trailing newline + indentation) becomes the new "tail".
170
- const tail = fullText.slice(cursor, bodyEnd);
171
- if (slices.size === 0) {
172
- return { ok: false, error: '`fields` is empty — nothing to reorder' };
173
- }
174
- const seen = new Set();
175
- const ordered = [];
176
- for (const name of order) {
177
- const slice = slices.get(name);
178
- if (slice !== undefined) {
179
- ordered.push(slice);
180
- seen.add(name);
181
- }
182
- }
183
- // Append anything the UI didn't know about so we never drop fields.
184
- for (const [name, slice] of slices) {
185
- if (!seen.has(name))
186
- ordered.push(slice);
187
- }
188
- const newBody = ordered.join('') + tail;
189
- try {
190
- // sf.replaceText avoids re-indenting unchanged lines, which is what
191
- // makes fieldsObj.replaceWithText destroy formatting.
192
- sf.replaceText([bodyStart, bodyEnd], newBody);
193
- return { ok: true };
194
- }
195
- catch (err) {
196
- return { ok: false, error: `reorder failed: ${err?.message ?? String(err)}` };
197
- }
198
- });
199
- }
200
- /**
201
- * Shared entry: open the file, drill into the `fields` literal, run
202
- * `mutate(...)`, persist on success. Centralizes the schema-call /
203
- * fields-literal lookup that every operation needs.
204
- */
205
- async function withFieldsObj(absPath, mutate) {
206
- const project = new Project({ useInMemoryFileSystem: false, skipAddingFilesFromTsConfig: true });
207
- let sf;
208
- try {
209
- sf = project.addSourceFileAtPath(absPath);
210
- }
211
- catch (err) {
212
- return { ok: false, error: `parse failed: ${err?.message ?? String(err)}` };
213
- }
214
- const schemaCall = findSchemaCall(sf);
215
- if (!schemaCall) {
216
- return { ok: false, error: 'no ObjectSchema.create / defineObject call found in file' };
217
- }
218
- const schemaArg = schemaCall.getArguments()[0];
219
- if (!schemaArg || !schemaArg.isKind(SyntaxKind.ObjectLiteralExpression)) {
220
- return { ok: false, error: 'schema call argument is not an object literal' };
221
- }
222
- const fieldsProp = schemaArg.getProperty('fields');
223
- if (!fieldsProp || !fieldsProp.isKind(SyntaxKind.PropertyAssignment)) {
224
- return { ok: false, error: 'schema object has no `fields` property' };
225
- }
226
- const fieldsInit = fieldsProp.getInitializer();
227
- if (!fieldsInit || !fieldsInit.isKind(SyntaxKind.ObjectLiteralExpression)) {
228
- return { ok: false, error: '`fields` initializer is not an object literal' };
229
- }
230
- const result = await mutate(fieldsInit);
231
- if (!result.ok)
232
- return result;
233
- try {
234
- await sf.save();
235
- return { ok: true };
236
- }
237
- catch (err) {
238
- return { ok: false, error: `write failed: ${err?.message ?? String(err)}` };
239
- }
240
- }
241
- // ─── helpers ────────────────────────────────────────────────────────
242
- function findSchemaCall(sf) {
243
- const calls = sf.getDescendantsOfKind(SyntaxKind.CallExpression);
244
- for (const call of calls) {
245
- const expr = call.getExpression().getText();
246
- if (expr === 'ObjectSchema.create' || expr === 'defineObject') {
247
- return call;
248
- }
249
- }
250
- return null;
251
- }
252
- /**
253
- * Given a property initializer, return the inner ObjectLiteralExpression
254
- * we should patch.
255
- * - `{ ... }` → that literal
256
- * - `Field.X({ ... })` → first arg if object literal
257
- * - `Field.X('rel', { ... })` → second arg
258
- * - `Field.X({ ... }, { ... })` → first arg (defensive)
259
- */
260
- function resolveInnerObjectLiteral(init) {
261
- if (!init)
262
- return null;
263
- if (init.isKind(SyntaxKind.ObjectLiteralExpression)) {
264
- return init;
265
- }
266
- if (init.isKind(SyntaxKind.CallExpression)) {
267
- const args = init.getArguments();
268
- for (const arg of args) {
269
- if (arg.isKind(SyntaxKind.ObjectLiteralExpression)) {
270
- return arg;
271
- }
272
- }
273
- }
274
- return null;
275
- }
276
- function applyStringProp(obj, key, value) {
277
- const existing = obj.getProperty(key);
278
- if (value == null || value === '') {
279
- if (existing)
280
- existing.remove();
281
- return;
282
- }
283
- const literal = renderStringLiteral(obj, value);
284
- if (existing && existing.isKind(SyntaxKind.PropertyAssignment)) {
285
- existing.setInitializer(literal);
286
- }
287
- else {
288
- obj.addPropertyAssignment({ name: key, initializer: literal });
289
- }
290
- }
291
- /**
292
- * Render `value` as a TS string literal, preferring whichever quote
293
- * style (single vs double) the surrounding object already uses for
294
- * existing string props. Falls back to single quotes — the dominant
295
- * convention across the codebase — when there's no signal.
296
- */
297
- function renderStringLiteral(obj, value) {
298
- let single = 0;
299
- let double = 0;
300
- for (const p of obj.getProperties()) {
301
- if (!p.isKind(SyntaxKind.PropertyAssignment))
302
- continue;
303
- const init = p.getInitializer();
304
- if (!init || !init.isKind(SyntaxKind.StringLiteral))
305
- continue;
306
- const raw = init.getText();
307
- if (raw.startsWith("'"))
308
- single++;
309
- else if (raw.startsWith('"'))
310
- double++;
311
- }
312
- const useDouble = double > single;
313
- if (useDouble || value.includes("'")) {
314
- // JSON.stringify gives us proper escaping for `"` and control chars.
315
- return JSON.stringify(value);
316
- }
317
- // Single-quoted: escape only single quotes and backslashes.
318
- return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
319
- }
320
- function applyBooleanProp(obj, key, value) {
321
- const existing = obj.getProperty(key);
322
- // Default for `required` is false, so we omit the property when false
323
- // to keep the source minimal — matches what authors hand-write.
324
- if (value !== true) {
325
- if (existing)
326
- existing.remove();
327
- return;
328
- }
329
- if (existing && existing.isKind(SyntaxKind.PropertyAssignment)) {
330
- existing.setInitializer('true');
331
- }
332
- else {
333
- obj.addPropertyAssignment({ name: key, initializer: 'true' });
334
- }
335
- }
336
- //# sourceMappingURL=studio-field-patch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio-field-patch.js","sourceRoot":"","sources":["../../src/utils/studio-field-patch.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- /** URL mount path for the Studio designer inside the ObjectStack server */
2
- export declare const STUDIO_PATH = "/_studio";
3
- /**
4
- * Resolve the filesystem path to the `@object-ui/studio` package.
5
- *
6
- * Resolution order (mirrors `resolveConsolePath`):
7
- * 1. `require.resolve` from the consumer cwd (typical app install).
8
- * 2. `require.resolve` from this CLI's own location (pnpm workspace).
9
- * 3. Direct `<cwd>/node_modules/@object-ui/studio` filesystem check.
10
- * 4. Sibling-repo dev fallback — `../objectui/apps/studio` — so the
11
- * framework monorepo can be developed against an in-tree checkout
12
- * of objectui without publishing every change. Matched by checking
13
- * `package.json.name === "@object-ui/studio"`.
14
- */
15
- export declare function resolveStudioPath(): string | null;
16
- /**
17
- * Check whether the Studio package has a pre-built `dist/` directory.
18
- */
19
- export declare function hasStudioDist(studioPath: string): boolean;
20
- /**
21
- * Create a lightweight kernel plugin that serves the pre-built Studio
22
- * static files at `/_studio/*`. Used in production mode.
23
- *
24
- * Uses Node.js built-in fs for static file serving to avoid external
25
- * bundling dependencies.
26
- */
27
- export declare function createStudioStaticPlugin(distPath: string, options?: {
28
- isDev?: boolean;
29
- rootRedirect?: boolean;
30
- }): {
31
- name: string;
32
- init: () => Promise<void>;
33
- start: (ctx: any) => Promise<void>;
34
- };
35
- /**
36
- * Dev-only plugin that exposes a tiny write API at
37
- * `/_studio/api/metadata/*` so Studio's "Create" dialogs can scaffold
38
- * real `.ts` files instead of asking the user to paste a snippet.
39
- *
40
- * Security posture: enabled ONLY when `isDev === true`. All file paths
41
- * must live under `<cwd>`, contain a `/src/` segment, and carry an
42
- * approved extension. Path traversal (`..`) and absolute paths are
43
- * rejected outright. Existing files are NEVER overwritten unless the
44
- * caller passes `mode: 'overwrite'`.
45
- *
46
- * Endpoints:
47
- * GET /_studio/api/metadata/layout?package=<id>
48
- * 200: { srcRoot: string } relative to cwd, e.g. "src" or "packages/<id>/src"
49
- *
50
- * POST /_studio/api/metadata/file
51
- * body: { path: string, content: string, mode?: 'create' | 'overwrite' }
52
- * 200: { ok: true, path: string }
53
- * 409: { ok: false, error: 'exists' }
54
- * 400: { ok: false, error: ... }
55
- */
56
- export declare function createStudioWriteApiPlugin(cwd: string, options?: {
57
- isDev: boolean;
58
- }): {
59
- name: string;
60
- init: () => Promise<void>;
61
- start: (ctx: any) => Promise<void>;
62
- };
63
- //# sourceMappingURL=studio.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"AAmBA,2EAA2E;AAC3E,eAAO,MAAM,WAAW,aAAa,CAAC;AAOtC;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAiDjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE;;;iBAMzF,GAAG;EA2FzB;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAqB;;;iBAM/E,GAAG;EAmMzB"}