@vertz/create-vertz-app 0.2.0 → 0.2.2

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.
@@ -1,237 +1,198 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { appTemplate, denoConfigTemplate, envExampleTemplate, envSrcTemplate, envTemplate, gitignoreTemplate, healthCheckSchemaTemplate, healthModuleDefTemplate, healthModuleTemplate, healthRouterTemplate, healthServiceTemplate, mainTemplate, packageJsonTemplate, requestIdMiddlewareTemplate, tsconfigTemplate, vertzConfigTemplate, } from '../index.js';
2
+ import { appComponentTemplate, clientTemplate, dbTemplate, entryClientTemplate, envExampleTemplate, envTemplate, gitignoreTemplate, homePageTemplate, packageJsonTemplate, schemaTemplate, serverTemplate, tasksEntityTemplate, themeTemplate, tsconfigTemplate, vertzConfigTemplate, } from '../index.js';
3
3
  describe('templates', () => {
4
4
  describe('packageJsonTemplate', () => {
5
5
  it('returns valid JSON', () => {
6
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'bun' });
6
+ const result = packageJsonTemplate('test-app');
7
7
  expect(() => JSON.parse(result)).not.toThrow();
8
8
  });
9
9
  it('includes project name', () => {
10
- const result = packageJsonTemplate({ projectName: 'my-app', runtime: 'bun' });
10
+ const result = packageJsonTemplate('my-app');
11
11
  const pkg = JSON.parse(result);
12
12
  expect(pkg.name).toBe('my-app');
13
13
  });
14
- it('includes @vertz/server dependency', () => {
15
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'bun' });
14
+ it('includes full-stack dependencies', () => {
15
+ const result = packageJsonTemplate('test-app');
16
16
  const pkg = JSON.parse(result);
17
17
  expect(pkg.dependencies['@vertz/server']).toBeDefined();
18
+ expect(pkg.dependencies['@vertz/db']).toBeDefined();
19
+ expect(pkg.dependencies['@vertz/ui']).toBeDefined();
20
+ expect(pkg.dependencies['@vertz/theme-shadcn']).toBeDefined();
18
21
  });
19
- it('includes @vertz/cli as dev dependency', () => {
20
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'bun' });
22
+ it('includes dev dependencies', () => {
23
+ const result = packageJsonTemplate('test-app');
21
24
  const pkg = JSON.parse(result);
22
25
  expect(pkg.devDependencies['@vertz/cli']).toBeDefined();
26
+ expect(pkg.devDependencies['@vertz/ui-compiler']).toBeDefined();
27
+ expect(pkg.devDependencies['bun-types']).toBeDefined();
23
28
  });
24
- it('includes required scripts', () => {
25
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'bun' });
29
+ it('includes #generated imports map', () => {
30
+ const result = packageJsonTemplate('test-app');
26
31
  const pkg = JSON.parse(result);
27
- expect(pkg.scripts.dev).toBeDefined();
28
- expect(pkg.scripts.build).toBeDefined();
29
- expect(pkg.scripts.check).toBeDefined();
32
+ expect(pkg.imports['#generated']).toBe('./.vertz/generated/client.ts');
33
+ expect(pkg.imports['#generated/types']).toBe('./.vertz/generated/types/index.ts');
30
34
  });
31
- it('uses bun scripts for bun runtime', () => {
32
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'bun' });
35
+ it('includes vertz dev/build/codegen scripts', () => {
36
+ const result = packageJsonTemplate('test-app');
33
37
  const pkg = JSON.parse(result);
34
- expect(pkg.scripts.dev).toContain('bun');
35
- });
36
- it('uses tsx for node runtime', () => {
37
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'node' });
38
- const pkg = JSON.parse(result);
39
- expect(pkg.scripts.dev).toContain('tsx');
40
- expect(pkg.dependencies.tsx).toBeDefined();
41
- });
42
- // Tests for runtime-specific type dependencies
43
- describe('runtime-specific type dependencies', () => {
44
- it('adds bun-types to devDependencies for bun runtime', () => {
45
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'bun' });
46
- const pkg = JSON.parse(result);
47
- expect(pkg.devDependencies['bun-types']).toBeDefined();
48
- expect(pkg.devDependencies['bun-types']).toMatch(/^\^1\./);
49
- });
50
- it('adds @types/node to devDependencies for node runtime', () => {
51
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'node' });
52
- const pkg = JSON.parse(result);
53
- expect(pkg.devDependencies['@types/node']).toBeDefined();
54
- expect(pkg.devDependencies['@types/node']).toMatch(/^\^20\./);
55
- });
56
- it('does not add type packages for deno runtime', () => {
57
- const result = packageJsonTemplate({ projectName: 'test-app', runtime: 'deno' });
58
- const pkg = JSON.parse(result);
59
- expect(pkg.devDependencies['bun-types']).toBeUndefined();
60
- expect(pkg.devDependencies['@types/node']).toBeUndefined();
61
- });
38
+ expect(pkg.scripts.dev).toBe('vertz dev');
39
+ expect(pkg.scripts.build).toBe('vertz build');
40
+ expect(pkg.scripts.codegen).toBe('vertz codegen');
62
41
  });
63
42
  });
64
43
  describe('tsconfigTemplate', () => {
65
44
  it('returns valid JSON', () => {
66
- const result = tsconfigTemplate('bun');
45
+ const result = tsconfigTemplate();
67
46
  expect(() => JSON.parse(result)).not.toThrow();
68
47
  });
69
48
  it('has strict mode enabled', () => {
70
- const result = tsconfigTemplate('bun');
49
+ const result = tsconfigTemplate();
71
50
  const tsconfig = JSON.parse(result);
72
51
  expect(tsconfig.compilerOptions.strict).toBe(true);
73
52
  });
74
- // Tests for runtime-specific types in tsconfig
75
- describe('runtime-specific types', () => {
76
- it('includes bun-types in tsconfig for bun runtime', () => {
77
- const result = tsconfigTemplate('bun');
78
- const tsconfig = JSON.parse(result);
79
- expect(tsconfig.compilerOptions.types).toContain('bun-types');
80
- });
81
- it('includes node types in tsconfig for node runtime', () => {
82
- const result = tsconfigTemplate('node');
83
- const tsconfig = JSON.parse(result);
84
- expect(tsconfig.compilerOptions.types).toContain('node');
85
- expect(tsconfig.compilerOptions.types).not.toContain('bun-types');
86
- });
87
- it('has empty types array for deno runtime', () => {
88
- const result = tsconfigTemplate('deno');
89
- const tsconfig = JSON.parse(result);
90
- // Deno has built-in types, so types should be empty or undefined
91
- expect(tsconfig.compilerOptions.types).toEqual([]);
92
- });
53
+ it('includes JSX config for @vertz/ui', () => {
54
+ const result = tsconfigTemplate();
55
+ const tsconfig = JSON.parse(result);
56
+ expect(tsconfig.compilerOptions.jsx).toBe('react-jsx');
57
+ expect(tsconfig.compilerOptions.jsxImportSource).toBe('@vertz/ui');
58
+ });
59
+ it('includes bun-types', () => {
60
+ const result = tsconfigTemplate();
61
+ const tsconfig = JSON.parse(result);
62
+ expect(tsconfig.compilerOptions.types).toContain('bun-types');
93
63
  });
94
64
  });
95
65
  describe('vertzConfigTemplate', () => {
96
- it('returns non-empty string', () => {
66
+ it('exports a default config with compiler entry', () => {
97
67
  const result = vertzConfigTemplate();
98
- expect(result.length).toBeGreaterThan(0);
68
+ expect(result).toContain('export default');
69
+ expect(result).toContain("entryFile: 'src/api/server.ts'");
99
70
  });
100
- it('exports a default config', () => {
71
+ it('exports codegen config', () => {
101
72
  const result = vertzConfigTemplate();
102
- expect(result).toContain('export default');
73
+ expect(result).toContain('export const codegen');
74
+ expect(result).toContain("generators: ['typescript']");
103
75
  });
104
76
  });
105
77
  describe('envTemplate', () => {
106
- it('returns non-empty string', () => {
107
- const result = envTemplate();
108
- expect(result.length).toBeGreaterThan(0);
109
- });
110
- it('includes DATABASE_URL placeholder', () => {
111
- const result = envTemplate();
112
- expect(result).toContain('DATABASE_URL=');
78
+ it('contains PORT=3000', () => {
79
+ expect(envTemplate()).toContain('PORT=3000');
113
80
  });
114
81
  });
115
82
  describe('envExampleTemplate', () => {
116
- it('returns non-empty string', () => {
117
- const result = envExampleTemplate();
118
- expect(result.length).toBeGreaterThan(0);
119
- });
120
- it('matches env template structure', () => {
121
- const result = envExampleTemplate();
122
- expect(result).toContain('DATABASE_URL=');
83
+ it('contains PORT=3000', () => {
84
+ expect(envExampleTemplate()).toContain('PORT=3000');
123
85
  });
124
86
  });
125
87
  describe('gitignoreTemplate', () => {
126
- it('returns non-empty string', () => {
127
- const result = gitignoreTemplate();
128
- expect(result.length).toBeGreaterThan(0);
129
- });
130
- it('includes node_modules', () => {
88
+ it('includes standard entries', () => {
131
89
  const result = gitignoreTemplate();
132
90
  expect(result).toContain('node_modules');
133
- });
134
- it('includes dist/', () => {
135
- const result = gitignoreTemplate();
136
91
  expect(result).toContain('dist/');
92
+ expect(result).toContain('.vertz/');
93
+ expect(result).toContain('*.db');
137
94
  });
138
95
  });
139
- describe('envSrcTemplate', () => {
140
- it('returns non-empty string', () => {
141
- const result = envSrcTemplate();
142
- expect(result.length).toBeGreaterThan(0);
143
- });
144
- it('uses envsafe for validation', () => {
145
- const result = envSrcTemplate();
146
- expect(result).toContain('envsafe');
96
+ describe('serverTemplate', () => {
97
+ it('uses createServer from @vertz/server', () => {
98
+ const result = serverTemplate();
99
+ expect(result).toContain("from '@vertz/server'");
100
+ expect(result).toContain('createServer');
147
101
  });
148
- });
149
- describe('appTemplate', () => {
150
- it('returns non-empty string', () => {
151
- const result = appTemplate(true);
152
- expect(result.length).toBeGreaterThan(0);
102
+ it('exports default app', () => {
103
+ expect(serverTemplate()).toContain('export default app');
153
104
  });
154
- it('exports createServer', () => {
155
- const result = appTemplate(false);
156
- expect(result).toContain('createServer');
105
+ it('includes import.meta.main guard', () => {
106
+ expect(serverTemplate()).toContain('import.meta.main');
157
107
  });
158
108
  });
159
- describe('mainTemplate', () => {
160
- it('returns non-empty string', () => {
161
- const result = mainTemplate();
162
- expect(result.length).toBeGreaterThan(0);
109
+ describe('schemaTemplate', () => {
110
+ it('defines tasks table with d.table', () => {
111
+ const result = schemaTemplate();
112
+ expect(result).toContain("d.table('tasks'");
113
+ expect(result).toContain('d.model(tasksTable)');
163
114
  });
164
- it('starts the app', () => {
165
- const result = mainTemplate();
166
- expect(result).toContain('app.start');
115
+ });
116
+ describe('dbTemplate', () => {
117
+ it('uses createSqliteAdapter', () => {
118
+ const result = dbTemplate();
119
+ expect(result).toContain('createSqliteAdapter');
120
+ expect(result).toContain('autoApply: true');
167
121
  });
168
122
  });
169
- describe('requestIdMiddlewareTemplate', () => {
170
- it('returns non-empty string', () => {
171
- const result = requestIdMiddlewareTemplate();
172
- expect(result.length).toBeGreaterThan(0);
123
+ describe('tasksEntityTemplate', () => {
124
+ it('defines tasks entity with model and access', () => {
125
+ const result = tasksEntityTemplate();
126
+ expect(result).toContain("entity('tasks'");
127
+ expect(result).toContain('tasksModel');
128
+ expect(result).toContain('list: () => true');
173
129
  });
174
- it('handles requestId', () => {
175
- const result = requestIdMiddlewareTemplate();
176
- expect(result).toContain('requestId');
130
+ });
131
+ describe('clientTemplate', () => {
132
+ it('uses #generated imports', () => {
133
+ const result = clientTemplate();
134
+ expect(result).toContain("from '#generated'");
135
+ expect(result).toContain("from '#generated/types'");
136
+ expect(result).toContain('createClient');
177
137
  });
178
138
  });
179
- describe('health module templates', () => {
180
- it('healthModuleDefTemplate returns non-empty string', () => {
181
- const result = healthModuleDefTemplate();
182
- expect(result.length).toBeGreaterThan(0);
139
+ describe('appComponentTemplate', () => {
140
+ it('exports getInjectedCSS for SSR', () => {
141
+ expect(appComponentTemplate()).toContain('getInjectedCSS');
183
142
  });
184
- it('healthModuleTemplate returns non-empty string', () => {
185
- const result = healthModuleTemplate();
186
- expect(result.length).toBeGreaterThan(0);
143
+ it('uses ThemeProvider', () => {
144
+ expect(appComponentTemplate()).toContain('ThemeProvider');
187
145
  });
188
- it('healthServiceTemplate returns non-empty string', () => {
189
- const result = healthServiceTemplate();
190
- expect(result.length).toBeGreaterThan(0);
146
+ it('renders HomePage', () => {
147
+ expect(appComponentTemplate()).toContain('HomePage');
191
148
  });
192
- it('healthRouterTemplate returns non-empty string', () => {
193
- const result = healthRouterTemplate();
194
- expect(result.length).toBeGreaterThan(0);
149
+ });
150
+ describe('entryClientTemplate', () => {
151
+ it('uses mount from @vertz/ui', () => {
152
+ expect(entryClientTemplate()).toContain('mount');
195
153
  });
196
- it('healthCheckSchemaTemplate returns non-empty string', () => {
197
- const result = healthCheckSchemaTemplate();
198
- expect(result.length).toBeGreaterThan(0);
154
+ it('includes HMR self-accept', () => {
155
+ expect(entryClientTemplate()).toContain('import.meta.hot.accept()');
199
156
  });
200
- it('templates include helpful comments for new users', () => {
201
- const serviceResult = healthServiceTemplate();
202
- expect(serviceResult).toContain('In a real app');
157
+ });
158
+ describe('themeTemplate', () => {
159
+ it('uses configureTheme from @vertz/theme-shadcn', () => {
160
+ const result = themeTemplate();
161
+ expect(result).toContain('configureTheme');
162
+ expect(result).toContain("from '@vertz/theme-shadcn'");
203
163
  });
204
164
  });
205
- describe('denoConfigTemplate', () => {
206
- it('returns valid JSON', () => {
207
- const result = denoConfigTemplate();
208
- expect(() => JSON.parse(result)).not.toThrow();
165
+ describe('homePageTemplate', () => {
166
+ it('uses query and queryMatch', () => {
167
+ const result = homePageTemplate();
168
+ expect(result).toContain('query');
169
+ expect(result).toContain('queryMatch');
170
+ });
171
+ it('uses api.tasks', () => {
172
+ expect(homePageTemplate()).toContain('api.tasks');
209
173
  });
210
- it('includes imports', () => {
211
- const result = denoConfigTemplate();
212
- const config = JSON.parse(result);
213
- expect(config.imports).toBeDefined();
174
+ it('exports HomePage component', () => {
175
+ expect(homePageTemplate()).toContain('export function HomePage()');
214
176
  });
215
177
  });
216
178
  describe('all templates return non-empty strings', () => {
217
179
  it('every template function returns a non-empty string', () => {
218
180
  const templates = [
219
- () => packageJsonTemplate({ projectName: 'test', runtime: 'bun' }),
220
- () => tsconfigTemplate('bun'),
181
+ () => packageJsonTemplate('test'),
182
+ tsconfigTemplate,
221
183
  vertzConfigTemplate,
222
184
  envTemplate,
223
185
  envExampleTemplate,
224
186
  gitignoreTemplate,
225
- envSrcTemplate,
226
- () => appTemplate(true),
227
- mainTemplate,
228
- requestIdMiddlewareTemplate,
229
- healthModuleDefTemplate,
230
- healthModuleTemplate,
231
- healthServiceTemplate,
232
- healthRouterTemplate,
233
- healthCheckSchemaTemplate,
234
- denoConfigTemplate,
187
+ serverTemplate,
188
+ schemaTemplate,
189
+ dbTemplate,
190
+ tasksEntityTemplate,
191
+ clientTemplate,
192
+ appComponentTemplate,
193
+ entryClientTemplate,
194
+ themeTemplate,
195
+ homePageTemplate,
235
196
  ];
236
197
  for (const template of templates) {
237
198
  const result = template();
@@ -1,18 +1,13 @@
1
- import type { Runtime } from '../types.js';
2
1
  /**
3
- * Package.json template
2
+ * Package.json template — full-stack deps + #generated imports map
4
3
  */
5
- export declare function packageJsonTemplate({ projectName, runtime, }: {
6
- projectName: string;
7
- runtime: Runtime;
8
- includeExample?: boolean;
9
- }): string;
4
+ export declare function packageJsonTemplate(projectName: string): string;
10
5
  /**
11
- * Tsconfig.json template - runtime-specific types
6
+ * Tsconfig.json template JSX config for @vertz/ui
12
7
  */
13
- export declare function tsconfigTemplate(runtime: Runtime): string;
8
+ export declare function tsconfigTemplate(): string;
14
9
  /**
15
- * vertz.config.ts template
10
+ * vertz.config.ts template — compiler entry + codegen config
16
11
  */
17
12
  export declare function vertzConfigTemplate(): string;
18
13
  /**
@@ -28,43 +23,39 @@ export declare function envExampleTemplate(): string;
28
23
  */
29
24
  export declare function gitignoreTemplate(): string;
30
25
  /**
31
- * src/env.ts template
26
+ * src/api/server.ts — createServer with entities + db
32
27
  */
33
- export declare function envSrcTemplate(): string;
28
+ export declare function serverTemplate(): string;
34
29
  /**
35
- * src/app.ts template
30
+ * src/api/schema.ts — tasks table + model
36
31
  */
37
- export declare function appTemplate(includeExample: boolean): string;
32
+ export declare function schemaTemplate(): string;
38
33
  /**
39
- * src/main.ts template
34
+ * src/api/db.ts — createSqliteAdapter with autoApply migrations
40
35
  */
41
- export declare function mainTemplate(): string;
36
+ export declare function dbTemplate(): string;
42
37
  /**
43
- * src/middlewares/request-id.middleware.ts template
38
+ * src/api/entities/tasks.entity.ts — entity with CRUD access
44
39
  */
45
- export declare function requestIdMiddlewareTemplate(): string;
40
+ export declare function tasksEntityTemplate(): string;
46
41
  /**
47
- * src/modules/health.module-def.ts template
42
+ * src/client.ts — #generated imports + type re-export
48
43
  */
49
- export declare function healthModuleDefTemplate(): string;
44
+ export declare function clientTemplate(): string;
50
45
  /**
51
- * src/modules/health.module.ts template
46
+ * src/app.tsx — SSR module exports + ThemeProvider + render HomePage
52
47
  */
53
- export declare function healthModuleTemplate(): string;
48
+ export declare function appComponentTemplate(): string;
54
49
  /**
55
- * src/modules/health.service.ts template
50
+ * src/entry-client.ts — mount + HMR self-accept
56
51
  */
57
- export declare function healthServiceTemplate(): string;
52
+ export declare function entryClientTemplate(): string;
58
53
  /**
59
- * src/modules/health.router.ts template
54
+ * src/styles/theme.ts — configureTheme from @vertz/theme-shadcn
60
55
  */
61
- export declare function healthRouterTemplate(): string;
56
+ export declare function themeTemplate(): string;
62
57
  /**
63
- * src/modules/schemas/health-check.schema.ts template
58
+ * src/pages/home.tsx — task list + create form with query + css
64
59
  */
65
- export declare function healthCheckSchemaTemplate(): string;
66
- /**
67
- * deno.json template for Deno runtime
68
- */
69
- export declare function denoConfigTemplate(): string;
60
+ export declare function homePageTemplate(): string;
70
61
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,MAAM,CAkDT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA+BzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAO5C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAgC1C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAavC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,OAAO,GAAG,MAAM,CAkB3D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAQrC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAmBpD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAKhD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAW7C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAY9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAqB7C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAQlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAgB3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA8B/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAoBzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAa5C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA6B1C;AAID;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAoBvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAavC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CASnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAe5C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAgD7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAWtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAyGzC"}