@danielfgray/pg-sourcerer 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.
Files changed (173) hide show
  1. package/dist/cli.js +25 -19
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +1 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/errors.d.ts +14 -1
  8. package/dist/errors.d.ts.map +1 -1
  9. package/dist/errors.js +2 -0
  10. package/dist/errors.js.map +1 -1
  11. package/dist/generate.d.ts +31 -21
  12. package/dist/generate.d.ts.map +1 -1
  13. package/dist/generate.js +53 -43
  14. package/dist/generate.js.map +1 -1
  15. package/dist/index.d.ts +20 -12
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +27 -13
  18. package/dist/index.js.map +1 -1
  19. package/dist/init.d.ts +0 -1
  20. package/dist/init.d.ts.map +1 -1
  21. package/dist/init.js +90 -35
  22. package/dist/init.js.map +1 -1
  23. package/dist/ir/extensions/queries.d.ts +264 -0
  24. package/dist/ir/extensions/queries.d.ts.map +1 -0
  25. package/dist/ir/extensions/queries.js +153 -0
  26. package/dist/ir/extensions/queries.js.map +1 -0
  27. package/dist/ir/extensions/schema-builder.d.ts +61 -0
  28. package/dist/ir/extensions/schema-builder.d.ts.map +1 -0
  29. package/dist/ir/extensions/schema-builder.js +5 -0
  30. package/dist/ir/extensions/schema-builder.js.map +1 -0
  31. package/dist/lib/conjure.d.ts +101 -0
  32. package/dist/lib/conjure.d.ts.map +1 -1
  33. package/dist/lib/conjure.js +204 -26
  34. package/dist/lib/conjure.js.map +1 -1
  35. package/dist/lib/hex.d.ts +10 -8
  36. package/dist/lib/hex.d.ts.map +1 -1
  37. package/dist/lib/hex.js +18 -15
  38. package/dist/lib/hex.js.map +1 -1
  39. package/dist/plugins/arktype.d.ts +27 -14
  40. package/dist/plugins/arktype.d.ts.map +1 -1
  41. package/dist/plugins/arktype.js +166 -130
  42. package/dist/plugins/arktype.js.map +1 -1
  43. package/dist/plugins/effect.d.ts +53 -0
  44. package/dist/plugins/effect.d.ts.map +1 -0
  45. package/dist/plugins/effect.js +1074 -0
  46. package/dist/plugins/effect.js.map +1 -0
  47. package/dist/plugins/http-elysia.d.ts +32 -0
  48. package/dist/plugins/http-elysia.d.ts.map +1 -0
  49. package/dist/plugins/http-elysia.js +613 -0
  50. package/dist/plugins/http-elysia.js.map +1 -0
  51. package/dist/plugins/http-express.d.ts +36 -0
  52. package/dist/plugins/http-express.d.ts.map +1 -0
  53. package/dist/plugins/http-express.js +388 -0
  54. package/dist/plugins/http-express.js.map +1 -0
  55. package/dist/plugins/http-hono.d.ts +36 -0
  56. package/dist/plugins/http-hono.d.ts.map +1 -0
  57. package/dist/plugins/http-hono.js +453 -0
  58. package/dist/plugins/http-hono.js.map +1 -0
  59. package/dist/plugins/http-orpc.d.ts +55 -0
  60. package/dist/plugins/http-orpc.d.ts.map +1 -0
  61. package/dist/plugins/http-orpc.js +370 -0
  62. package/dist/plugins/http-orpc.js.map +1 -0
  63. package/dist/plugins/http-trpc.d.ts +59 -0
  64. package/dist/plugins/http-trpc.d.ts.map +1 -0
  65. package/dist/plugins/http-trpc.js +392 -0
  66. package/dist/plugins/http-trpc.js.map +1 -0
  67. package/dist/plugins/kysely/queries.d.ts +92 -0
  68. package/dist/plugins/kysely/queries.d.ts.map +1 -0
  69. package/dist/plugins/kysely/queries.js +1169 -0
  70. package/dist/plugins/kysely/queries.js.map +1 -0
  71. package/dist/plugins/kysely/shared.d.ts +59 -0
  72. package/dist/plugins/kysely/shared.d.ts.map +1 -0
  73. package/dist/plugins/kysely/shared.js +247 -0
  74. package/dist/plugins/kysely/shared.js.map +1 -0
  75. package/dist/plugins/kysely/types.d.ts +22 -0
  76. package/dist/plugins/kysely/types.d.ts.map +1 -0
  77. package/dist/plugins/kysely/types.js +428 -0
  78. package/dist/plugins/kysely/types.js.map +1 -0
  79. package/dist/plugins/kysely.d.ts +72 -0
  80. package/dist/plugins/kysely.d.ts.map +1 -0
  81. package/dist/plugins/kysely.js +906 -0
  82. package/dist/plugins/kysely.js.map +1 -0
  83. package/dist/plugins/sql-queries.d.ts +55 -7
  84. package/dist/plugins/sql-queries.d.ts.map +1 -1
  85. package/dist/plugins/sql-queries.js +747 -121
  86. package/dist/plugins/sql-queries.js.map +1 -1
  87. package/dist/plugins/types.d.ts +20 -14
  88. package/dist/plugins/types.d.ts.map +1 -1
  89. package/dist/plugins/types.js +90 -112
  90. package/dist/plugins/types.js.map +1 -1
  91. package/dist/plugins/valibot.d.ts +45 -0
  92. package/dist/plugins/valibot.d.ts.map +1 -0
  93. package/dist/plugins/valibot.js +422 -0
  94. package/dist/plugins/valibot.js.map +1 -0
  95. package/dist/plugins/zod.d.ts +27 -14
  96. package/dist/plugins/zod.d.ts.map +1 -1
  97. package/dist/plugins/zod.js +231 -166
  98. package/dist/plugins/zod.js.map +1 -1
  99. package/dist/services/artifact-store.d.ts +11 -1
  100. package/dist/services/artifact-store.d.ts.map +1 -1
  101. package/dist/services/artifact-store.js +9 -0
  102. package/dist/services/artifact-store.js.map +1 -1
  103. package/dist/services/config-loader.d.ts +4 -0
  104. package/dist/services/config-loader.d.ts.map +1 -1
  105. package/dist/services/config-loader.js +1 -1
  106. package/dist/services/config-loader.js.map +1 -1
  107. package/dist/services/config.d.ts +57 -0
  108. package/dist/services/config.d.ts.map +1 -0
  109. package/dist/services/config.js +66 -0
  110. package/dist/services/config.js.map +1 -0
  111. package/dist/services/core-providers.d.ts +15 -0
  112. package/dist/services/core-providers.d.ts.map +1 -0
  113. package/dist/services/core-providers.js +23 -0
  114. package/dist/services/core-providers.js.map +1 -0
  115. package/dist/services/emissions.d.ts +14 -0
  116. package/dist/services/emissions.d.ts.map +1 -1
  117. package/dist/services/emissions.js +86 -47
  118. package/dist/services/emissions.js.map +1 -1
  119. package/dist/services/execution.d.ts +35 -0
  120. package/dist/services/execution.d.ts.map +1 -0
  121. package/dist/services/execution.js +86 -0
  122. package/dist/services/execution.js.map +1 -0
  123. package/dist/services/file-builder.d.ts +4 -0
  124. package/dist/services/file-builder.d.ts.map +1 -1
  125. package/dist/services/file-builder.js.map +1 -1
  126. package/dist/services/inflection.d.ts +2 -2
  127. package/dist/services/inflection.d.ts.map +1 -1
  128. package/dist/services/inflection.js +4 -4
  129. package/dist/services/inflection.js.map +1 -1
  130. package/dist/services/ir-builder.d.ts.map +1 -1
  131. package/dist/services/ir-builder.js +10 -3
  132. package/dist/services/ir-builder.js.map +1 -1
  133. package/dist/services/pg-types.d.ts +31 -0
  134. package/dist/services/pg-types.d.ts.map +1 -1
  135. package/dist/services/pg-types.js +24 -0
  136. package/dist/services/pg-types.js.map +1 -1
  137. package/dist/services/plugin-runner.d.ts +27 -37
  138. package/dist/services/plugin-runner.d.ts.map +1 -1
  139. package/dist/services/plugin-runner.js +73 -171
  140. package/dist/services/plugin-runner.js.map +1 -1
  141. package/dist/services/plugin.d.ts +350 -215
  142. package/dist/services/plugin.d.ts.map +1 -1
  143. package/dist/services/plugin.js +182 -130
  144. package/dist/services/plugin.js.map +1 -1
  145. package/dist/services/resolution.d.ts +38 -0
  146. package/dist/services/resolution.d.ts.map +1 -0
  147. package/dist/services/resolution.js +242 -0
  148. package/dist/services/resolution.js.map +1 -0
  149. package/dist/services/service-registry.d.ts +74 -0
  150. package/dist/services/service-registry.d.ts.map +1 -0
  151. package/dist/services/service-registry.js +61 -0
  152. package/dist/services/service-registry.js.map +1 -0
  153. package/dist/services/symbols.d.ts +59 -0
  154. package/dist/services/symbols.d.ts.map +1 -1
  155. package/dist/services/symbols.js +16 -0
  156. package/dist/services/symbols.js.map +1 -1
  157. package/dist/testing.d.ts +4 -25
  158. package/dist/testing.d.ts.map +1 -1
  159. package/dist/testing.js +2 -23
  160. package/dist/testing.js.map +1 -1
  161. package/package.json +1 -1
  162. package/dist/plugins/effect-model.d.ts +0 -17
  163. package/dist/plugins/effect-model.d.ts.map +0 -1
  164. package/dist/plugins/effect-model.js +0 -409
  165. package/dist/plugins/effect-model.js.map +0 -1
  166. package/dist/plugins/kysely-queries.d.ts +0 -66
  167. package/dist/plugins/kysely-queries.d.ts.map +0 -1
  168. package/dist/plugins/kysely-queries.js +0 -960
  169. package/dist/plugins/kysely-queries.js.map +0 -1
  170. package/dist/plugins/kysely-types.d.ts +0 -35
  171. package/dist/plugins/kysely-types.d.ts.map +0 -1
  172. package/dist/plugins/kysely-types.js +0 -601
  173. package/dist/plugins/kysely-types.js.map +0 -1
@@ -0,0 +1,613 @@
1
+ /**
2
+ * HTTP Elysia Plugin - Generate Elysia route handlers from query plugins
3
+ *
4
+ * Consumes method symbols from sql-queries or kysely-queries via the symbol registry
5
+ * and generates type-safe Elysia HTTP route handlers.
6
+ */
7
+ import { Option, pipe, Schema as S } from "effect";
8
+ import { definePlugin } from "../services/plugin.js";
9
+ import { conjure, cast } from "../lib/conjure.js";
10
+ import { inflect } from "../services/inflection.js";
11
+ import { SCHEMA_BUILDER_KIND, } from "../ir/extensions/schema-builder.js";
12
+ import { getTableEntities, getEnumEntities, } from "../ir/semantic-ir.js";
13
+ import { resolveFieldType, isUuidType, isDateType, isEnumType, getPgTypeName, } from "../lib/field-utils.js";
14
+ import { findEnumByPgName, TsType } from "../services/pg-types.js";
15
+ const { b, stmt } = conjure;
16
+ // ============================================================================
17
+ // Configuration
18
+ // ============================================================================
19
+ const HttpElysiaConfigSchema = S.Struct({
20
+ /** Output directory for generated route files. Default: "routes" */
21
+ outputDir: S.optionalWith(S.String, { default: () => "routes" }),
22
+ /** Base path for all routes. Default: "/api" */
23
+ basePath: S.optionalWith(S.String, { default: () => "/api" }),
24
+ /** Header content to prepend to each generated file */
25
+ header: S.optional(S.String),
26
+ /**
27
+ * Name of the aggregated router export.
28
+ * Default: "api"
29
+ */
30
+ aggregatorName: S.optionalWith(S.String, { default: () => "api" }),
31
+ });
32
+ // ============================================================================
33
+ // String Helpers
34
+ // ============================================================================
35
+ /** Convert PascalCase/camelCase to kebab-case */
36
+ const toKebabCase = (str) => str
37
+ .replace(/([a-z])([A-Z])/g, "$1-$2")
38
+ .replace(/_/g, "-")
39
+ .toLowerCase();
40
+ /** Convert entity name to URL path segment (kebab-case plural) */
41
+ const entityToPathSegment = (entityName) => inflect.pluralize(toKebabCase(entityName));
42
+ // ============================================================================
43
+ // Route Generation Helpers
44
+ // ============================================================================
45
+ /** Map query method kind to HTTP method */
46
+ const kindToHttpMethod = (kind) => {
47
+ switch (kind) {
48
+ case "read":
49
+ case "list":
50
+ case "lookup":
51
+ return "get";
52
+ case "create":
53
+ return "post";
54
+ case "update":
55
+ return "put";
56
+ case "delete":
57
+ return "delete";
58
+ case "function":
59
+ return "post";
60
+ }
61
+ };
62
+ /** Get the route path for a method */
63
+ const getRoutePath = (method) => {
64
+ switch (method.kind) {
65
+ case "read":
66
+ case "update":
67
+ case "delete": {
68
+ const pkParam = method.params.find((p) => p.source === "pk");
69
+ const paramName = pkParam?.name ?? "id";
70
+ return `/:${paramName}`;
71
+ }
72
+ case "list":
73
+ case "create":
74
+ return "/";
75
+ case "lookup": {
76
+ const field = method.lookupField ?? "field";
77
+ const fieldKebab = toKebabCase(field);
78
+ const lookupParam = method.params.find((p) => p.source === "lookup" || p.source === "fk");
79
+ const paramName = lookupParam?.name ?? field;
80
+ return `/by-${fieldKebab}/:${paramName}`;
81
+ }
82
+ case "function": {
83
+ return `/${toKebabCase(method.name)}`;
84
+ }
85
+ }
86
+ };
87
+ /**
88
+ * Build a TypeBox type call: t.String(), t.Number(), etc.
89
+ */
90
+ const buildTypeBoxCall = (methodName, args = []) => b.callExpression(b.memberExpression(b.identifier("t"), b.identifier(methodName)), args.map(cast.toExpr));
91
+ /**
92
+ * Map TypeScript type string to TypeBox method name.
93
+ * For path params (strings from URL), numeric types use t.Numeric() for coercion.
94
+ */
95
+ const tsTypeToTypeBoxMethod = (tsType, forPathParam) => {
96
+ switch (tsType) {
97
+ case TsType.String:
98
+ return "String";
99
+ case TsType.Number:
100
+ // t.Numeric() coerces string to number (for path/query params)
101
+ return forPathParam ? "Numeric" : "Number";
102
+ case TsType.Boolean:
103
+ return "Boolean";
104
+ case TsType.BigInt:
105
+ // BigInt comes as string from URL params
106
+ return forPathParam ? "String" : "BigInt";
107
+ case TsType.Date:
108
+ // Dates come as strings, need string schema
109
+ return "String";
110
+ case TsType.Buffer:
111
+ case TsType.Unknown:
112
+ default:
113
+ return "Unknown";
114
+ }
115
+ };
116
+ /**
117
+ * Build TypeBox enum schema: t.Union([t.Literal('a'), t.Literal('b'), ...])
118
+ */
119
+ const buildTypeBoxEnum = (values) => {
120
+ const literals = values.map((v) => buildTypeBoxCall("Literal", [b.stringLiteral(v)]));
121
+ return buildTypeBoxCall("Union", [b.arrayExpression(literals.map(cast.toExpr))]);
122
+ };
123
+ /**
124
+ * Build TypeBox array schema: t.Array(<inner>)
125
+ */
126
+ const buildTypeBoxArray = (inner) => buildTypeBoxCall("Array", [cast.toExpr(inner)]);
127
+ /**
128
+ * Build TypeBox optional schema: t.Optional(<inner>)
129
+ */
130
+ const buildTypeBoxOptional = (inner) => buildTypeBoxCall("Optional", [cast.toExpr(inner)]);
131
+ /**
132
+ * Build TypeBox union with null: t.Union([<inner>, t.Null()])
133
+ */
134
+ const buildTypeBoxNullable = (inner) => buildTypeBoxCall("Union", [
135
+ b.arrayExpression([cast.toExpr(inner), cast.toExpr(buildTypeBoxCall("Null"))]),
136
+ ]);
137
+ /**
138
+ * Resolve a Field to its TypeBox schema expression.
139
+ *
140
+ * @param field - The IR field to resolve
141
+ * @param ctx - Context with enums and extensions
142
+ * @param forInsert - True if generating for insert shape (fields with defaults are optional)
143
+ */
144
+ const resolveFieldTypeBoxSchema = (field, ctx, forInsert) => {
145
+ let baseSchema;
146
+ // 1. UUID types - still strings
147
+ if (isUuidType(field)) {
148
+ baseSchema = buildTypeBoxCall("String");
149
+ }
150
+ // 2. Date types - accept string or Date
151
+ else if (isDateType(field)) {
152
+ baseSchema = buildTypeBoxCall("Union", [
153
+ b.arrayExpression([
154
+ cast.toExpr(buildTypeBoxCall("String")),
155
+ cast.toExpr(buildTypeBoxCall("Date")),
156
+ ]),
157
+ ]);
158
+ }
159
+ // 3. Enum types - union of literals
160
+ else if (isEnumType(field)) {
161
+ const pgTypeName = getPgTypeName(field);
162
+ const enumDef = pgTypeName
163
+ ? pipe(findEnumByPgName(ctx.enums, pgTypeName), Option.getOrUndefined)
164
+ : undefined;
165
+ if (enumDef) {
166
+ baseSchema = buildTypeBoxEnum(enumDef.values);
167
+ }
168
+ else {
169
+ baseSchema = buildTypeBoxCall("Unknown");
170
+ }
171
+ }
172
+ // 4. Fallback to resolved TypeScript type
173
+ else {
174
+ const resolved = resolveFieldType(field, ctx.enums, ctx.extensions);
175
+ const typeBoxMethod = tsTypeToTypeBoxMethod(resolved.tsType, false);
176
+ baseSchema = buildTypeBoxCall(typeBoxMethod);
177
+ }
178
+ // Wrap with array if needed
179
+ if (field.isArray) {
180
+ baseSchema = buildTypeBoxArray(baseSchema);
181
+ }
182
+ // Apply nullable
183
+ if (field.nullable) {
184
+ baseSchema = buildTypeBoxNullable(baseSchema);
185
+ }
186
+ // Apply optional (for insert shapes: fields with defaults are optional)
187
+ if (forInsert && field.optional) {
188
+ baseSchema = buildTypeBoxOptional(baseSchema);
189
+ }
190
+ return baseSchema;
191
+ };
192
+ /**
193
+ * Build TypeBox object schema for an entity shape.
194
+ *
195
+ * @param entity - The entity to build schema for
196
+ * @param shapeKind - Which shape to use (insert or update)
197
+ * @param ctx - Context with enums and extensions
198
+ */
199
+ const buildEntityTypeBoxSchema = (entity, shapeKind, ctx) => {
200
+ const shape = shapeKind === "insert" ? entity.shapes.insert : entity.shapes.update;
201
+ if (!shape) {
202
+ // Fallback to row shape if specific shape doesn't exist
203
+ return buildTypeBoxCall("Unknown");
204
+ }
205
+ let objBuilder = conjure.obj();
206
+ for (const field of shape.fields) {
207
+ // For update shapes, ALL fields are optional (patch semantics)
208
+ // For insert shapes, only fields with defaults/nullable are optional (already marked in IR)
209
+ const applyOptional = shapeKind === "update" || (shapeKind === "insert" && field.optional);
210
+ let fieldSchema = resolveFieldTypeBoxSchema(field, ctx, false); // Don't apply optional inside
211
+ if (applyOptional) {
212
+ fieldSchema = buildTypeBoxOptional(fieldSchema);
213
+ }
214
+ objBuilder = objBuilder.prop(field.name, fieldSchema);
215
+ }
216
+ return buildTypeBoxCall("Object", [objBuilder.build()]);
217
+ };
218
+ /**
219
+ * Build TypeBox schema for a path/query parameter based on its type string.
220
+ *
221
+ * @param param - The query method param
222
+ */
223
+ const buildParamTypeBoxSchema = (param) => {
224
+ const typeBoxMethod = tsTypeToTypeBoxMethod(param.type, true);
225
+ return buildTypeBoxCall(typeBoxMethod);
226
+ };
227
+ /**
228
+ * Build the handler function body for a query method.
229
+ * Params/query are destructured in the handler signature, so we reference them directly.
230
+ */
231
+ const buildHandlerBody = (method) => {
232
+ const callSig = method.callSignature ?? { style: "named" };
233
+ // Build the function call arguments based on callSignature
234
+ const args = [];
235
+ if (callSig.style === "positional") {
236
+ // Positional: fn(a, b, c) - params are already destructured
237
+ for (const param of method.params) {
238
+ if (param.source === "pk" || param.source === "fk" || param.source === "lookup" || param.source === "pagination") {
239
+ args.push(b.identifier(param.name));
240
+ }
241
+ else if (param.source === "body") {
242
+ args.push(b.identifier("body"));
243
+ }
244
+ else {
245
+ // No source specified - get from body (body is not destructured)
246
+ args.push(b.memberExpression(b.identifier("body"), b.identifier(param.name)));
247
+ }
248
+ }
249
+ }
250
+ else {
251
+ // Named: fn({ a, b, c }) or fn({ id, data: body })
252
+ const bodyParam = method.params.find((p) => p.source === "body");
253
+ if (bodyParam && callSig.bodyStyle === "spread") {
254
+ // Body fields spread directly: fn(body)
255
+ args.push(b.identifier("body"));
256
+ }
257
+ else if (bodyParam && callSig.bodyStyle === "property") {
258
+ // Body wrapped in property: fn({ id, data: body })
259
+ let objBuilder = conjure.obj();
260
+ for (const param of method.params) {
261
+ if (param.source === "pk" || param.source === "fk" || param.source === "lookup" || param.source === "pagination") {
262
+ // Params are destructured, use shorthand: { id }
263
+ objBuilder = objBuilder.shorthand(param.name);
264
+ }
265
+ }
266
+ objBuilder = objBuilder.prop(bodyParam.name, b.identifier("body"));
267
+ args.push(objBuilder.build());
268
+ }
269
+ else {
270
+ // Build object from path/pagination params using shorthand
271
+ let objBuilder = conjure.obj();
272
+ for (const param of method.params) {
273
+ if (param.source === "pk" || param.source === "fk" || param.source === "lookup" || param.source === "pagination") {
274
+ objBuilder = objBuilder.shorthand(param.name);
275
+ }
276
+ }
277
+ if (method.params.length > 0) {
278
+ args.push(objBuilder.build());
279
+ }
280
+ }
281
+ }
282
+ // Build: const result = await Queries.queryFn(args)
283
+ const queryCall = b.callExpression(b.memberExpression(b.identifier("Queries"), b.identifier(method.name)), args.map(cast.toExpr));
284
+ const awaitExpr = b.awaitExpression(queryCall);
285
+ const resultDecl = stmt.const("result", awaitExpr);
286
+ // Handle 404 for read/lookup that returns null
287
+ if (method.kind === "read" || (method.kind === "lookup" && method.isUniqueLookup)) {
288
+ // if (!result) return status(404, 'Not found');
289
+ const statusCall = b.callExpression(b.identifier("status"), [b.numericLiteral(404), b.stringLiteral("Not found")]);
290
+ const notFoundCheck = b.ifStatement(b.unaryExpression("!", b.identifier("result")), b.returnStatement(statusCall));
291
+ return [resultDecl, notFoundCheck, b.returnStatement(b.identifier("result"))];
292
+ }
293
+ return [resultDecl, b.returnStatement(b.identifier("result"))];
294
+ };
295
+ /**
296
+ * Determine if a method needs body validation and which schema to use.
297
+ * Returns the schema import info or null if no body validation needed.
298
+ */
299
+ const getBodySchemaImport = (method, entityName) => {
300
+ if (method.kind === "create") {
301
+ return { entity: entityName, shape: "insert", schemaName: `${entityName}Insert` };
302
+ }
303
+ if (method.kind === "update") {
304
+ return { entity: entityName, shape: "update", schemaName: `${entityName}Update` };
305
+ }
306
+ return null;
307
+ };
308
+ /**
309
+ * Build the route options object (params/body/query validation schemas).
310
+ * Returns the options object expression, whether it needs 't' import, body schema info,
311
+ * and any schema builder imports needed.
312
+ *
313
+ * @param hasSchemaProvider - Whether a schema provider is registered for body validation
314
+ * @param entity - The entity for inline TypeBox body schema generation (when no schema provider)
315
+ * @param typeBoxCtx - Context for TypeBox field resolution
316
+ */
317
+ const buildRouteOptions = (method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx) => {
318
+ let objBuilder = conjure.obj();
319
+ let hasOptions = false;
320
+ let needsElysiaT = false;
321
+ let schemaBuilderImport = null;
322
+ let inlineBodySchema = null;
323
+ // Build params schema for path parameters
324
+ const pathParams = method.params.filter((p) => p.source === "pk" || p.source === "fk" || p.source === "lookup");
325
+ if (pathParams.length > 0) {
326
+ const schemaResult = requestSchema(pathParams);
327
+ if (schemaResult) {
328
+ objBuilder = objBuilder.prop("params", schemaResult.ast);
329
+ schemaBuilderImport = schemaResult.importSpec;
330
+ }
331
+ else {
332
+ // Fallback to TypeBox t.Object({ ... }) with proper type coercion
333
+ needsElysiaT = true;
334
+ let paramsBuilder = conjure.obj();
335
+ for (const param of pathParams) {
336
+ // Use buildParamTypeBoxSchema to get correct type (t.Numeric for numbers)
337
+ paramsBuilder = paramsBuilder.prop(param.name, buildParamTypeBoxSchema(param));
338
+ }
339
+ const paramsSchema = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Object")), [paramsBuilder.build()]);
340
+ objBuilder = objBuilder.prop("params", paramsSchema);
341
+ }
342
+ hasOptions = true;
343
+ }
344
+ // Build query schema for pagination params
345
+ const queryParams = method.params.filter((p) => p.source === "pagination");
346
+ if (queryParams.length > 0) {
347
+ const schemaResult = requestSchema(queryParams);
348
+ if (schemaResult) {
349
+ objBuilder = objBuilder.prop("query", schemaResult.ast);
350
+ schemaBuilderImport = schemaResult.importSpec;
351
+ }
352
+ else {
353
+ // Fallback to TypeBox t.Object({ ... })
354
+ needsElysiaT = true;
355
+ let queryBuilder = conjure.obj();
356
+ for (const param of queryParams) {
357
+ const tNumeric = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Numeric")), []);
358
+ const tOptional = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Optional")), [tNumeric]);
359
+ queryBuilder = queryBuilder.prop(param.name, tOptional);
360
+ }
361
+ const querySchema = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Object")), [queryBuilder.build()]);
362
+ objBuilder = objBuilder.prop("query", querySchema);
363
+ }
364
+ hasOptions = true;
365
+ }
366
+ // Body validation
367
+ const bodySchemaInfo = getBodySchemaImport(method, entityName);
368
+ let bodySchema = null;
369
+ if (bodySchemaInfo) {
370
+ if (hasSchemaProvider) {
371
+ // Use imported schema from schema provider (Zod, Valibot, etc.)
372
+ bodySchema = bodySchemaInfo;
373
+ objBuilder = objBuilder.prop("body", b.identifier(bodySchema.schemaName));
374
+ hasOptions = true;
375
+ }
376
+ else if (entity) {
377
+ // Generate inline TypeBox schema from IR
378
+ needsElysiaT = true;
379
+ inlineBodySchema = buildEntityTypeBoxSchema(entity, bodySchemaInfo.shape, typeBoxCtx);
380
+ objBuilder = objBuilder.prop("body", inlineBodySchema);
381
+ hasOptions = true;
382
+ }
383
+ // If neither schema provider nor entity, skip body validation (body will be unknown)
384
+ }
385
+ return {
386
+ options: hasOptions ? objBuilder.build() : null,
387
+ needsElysiaT,
388
+ bodySchema,
389
+ schemaBuilderImport,
390
+ inlineBodySchema,
391
+ };
392
+ };
393
+ /**
394
+ * Build a single route method call: .get('/path', handler, options)
395
+ */
396
+ const buildRouteCall = (method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx) => {
397
+ const httpMethod = kindToHttpMethod(method.kind);
398
+ const path = getRoutePath(method);
399
+ // Build handler: async ({ params: { id }, body, query: { limit }, status }) => { ... }
400
+ const handlerProps = [];
401
+ // Collect path params (pk, fk, lookup) for destructuring
402
+ const pathParams = method.params.filter((p) => p.source === "pk" || p.source === "fk" || p.source === "lookup");
403
+ if (pathParams.length > 0) {
404
+ // params: { id, slug, ... }
405
+ const paramsPattern = b.objectPattern(pathParams.map((p) => {
406
+ const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
407
+ prop.shorthand = true;
408
+ return prop;
409
+ }));
410
+ handlerProps.push(b.property("init", b.identifier("params"), paramsPattern));
411
+ }
412
+ // Add body if: explicit body param, create/update method, or function with params (no source = from body)
413
+ const needsBody = method.params.some((p) => p.source === "body") ||
414
+ method.kind === "create" ||
415
+ method.kind === "update" ||
416
+ (method.kind === "function" && method.params.some((p) => !p.source));
417
+ if (needsBody) {
418
+ const prop = b.property("init", b.identifier("body"), b.identifier("body"));
419
+ prop.shorthand = true;
420
+ handlerProps.push(prop);
421
+ }
422
+ // Collect pagination params for destructuring
423
+ const paginationParams = method.params.filter((p) => p.source === "pagination");
424
+ if (paginationParams.length > 0) {
425
+ // query: { limit, offset, ... }
426
+ const queryPattern = b.objectPattern(paginationParams.map((p) => {
427
+ const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
428
+ prop.shorthand = true;
429
+ return prop;
430
+ }));
431
+ handlerProps.push(b.property("init", b.identifier("query"), queryPattern));
432
+ }
433
+ if (method.kind === "read" || (method.kind === "lookup" && method.isUniqueLookup)) {
434
+ const prop = b.property("init", b.identifier("status"), b.identifier("status"));
435
+ prop.shorthand = true;
436
+ handlerProps.push(prop);
437
+ }
438
+ const handlerParamPattern = b.objectPattern(handlerProps);
439
+ const handlerBody = buildHandlerBody(method);
440
+ const handler = b.arrowFunctionExpression([handlerParamPattern], b.blockStatement(handlerBody.map(cast.toStmt)));
441
+ handler.async = true;
442
+ const { options, needsElysiaT, bodySchema, schemaBuilderImport } = buildRouteOptions(method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx);
443
+ return { httpMethod, path, handler, options, needsElysiaT, bodySchema, schemaBuilderImport };
444
+ };
445
+ // ============================================================================
446
+ // Plugin Definition
447
+ // ============================================================================
448
+ export function httpElysia(config) {
449
+ const parsed = S.decodeUnknownSync(HttpElysiaConfigSchema)(config);
450
+ return definePlugin({
451
+ name: "http-elysia",
452
+ kind: "http-routes",
453
+ singleton: true,
454
+ canProvide: () => true,
455
+ // Declare dependencies: queries required, schemas optional (falls back to TypeBox)
456
+ requires: () => [
457
+ { kind: "queries", params: {} },
458
+ ],
459
+ optionalRequires: () => [
460
+ { kind: "schemas", params: {} },
461
+ ],
462
+ provide: (_params, _deps, ctx) => {
463
+ const { outputDir, basePath, header, aggregatorName } = parsed;
464
+ // Get all entities with registered query methods
465
+ const entityNames = ctx.symbols.getEntitiesWithMethods();
466
+ if (entityNames.length === 0) {
467
+ // No query methods registered - nothing to generate
468
+ return;
469
+ }
470
+ // Track generated routes for aggregator index
471
+ const generatedRoutes = [];
472
+ // Build TypeBox context for inline schema generation (when no schema plugin)
473
+ const enumEntities = getEnumEntities(ctx.ir);
474
+ const tableEntities = getTableEntities(ctx.ir);
475
+ const typeBoxCtx = {
476
+ enums: enumEntities,
477
+ extensions: ctx.ir.extensions,
478
+ };
479
+ // Generate routes for each entity
480
+ for (const entityName of entityNames) {
481
+ const entityMethods = ctx.symbols.getEntityMethods(entityName);
482
+ if (!entityMethods || entityMethods.methods.length === 0)
483
+ continue;
484
+ // Find the entity in the IR for inline TypeBox body schema generation
485
+ const entity = tableEntities.find((e) => e.name === entityName);
486
+ const pathSegment = entityToPathSegment(entityName);
487
+ const filePath = `${outputDir}/${inflect.uncapitalize(entityName)}.ts`;
488
+ const routesVarName = `${inflect.uncapitalize(entityName)}Routes`;
489
+ const file = ctx.file(filePath);
490
+ if (header) {
491
+ file.header(header);
492
+ }
493
+ // Import Elysia
494
+ file.import({ kind: "package", names: ["Elysia"], from: "elysia" });
495
+ // Import queries as namespace
496
+ const queriesImportPath = `../${entityMethods.importPath.replace(/\.ts$/, ".js")}`;
497
+ file.import({
498
+ kind: "relative",
499
+ namespace: "Queries",
500
+ from: queriesImportPath,
501
+ });
502
+ // Build the Elysia route chain
503
+ // new Elysia({ prefix: '/api/users' }).get(...).post(...)
504
+ const prefixPath = `${basePath}/${pathSegment}`;
505
+ const elysiaConfig = conjure.obj().prop("prefix", b.stringLiteral(prefixPath)).build();
506
+ let chainExpr = b.newExpression(b.identifier("Elysia"), [elysiaConfig]);
507
+ let fileNeedsElysiaT = false;
508
+ const bodySchemaImports = [];
509
+ let schemaLibraryImport = null;
510
+ // Create a schema builder function that requests from the service registry
511
+ const requestSchema = (params) => {
512
+ if (params.length === 0)
513
+ return undefined;
514
+ try {
515
+ const request = { variant: "params", params };
516
+ return ctx.request(SCHEMA_BUILDER_KIND, request);
517
+ }
518
+ catch {
519
+ // No schema-builder registered, will fall back to TypeBox
520
+ return undefined;
521
+ }
522
+ };
523
+ // Check if a schema provider is available for body validation
524
+ // We probe by checking if the schema-builder service exists
525
+ let hasSchemaProvider = false;
526
+ try {
527
+ // Try to request an entity schema - if it succeeds, we have a provider
528
+ ctx.request(SCHEMA_BUILDER_KIND, { variant: "entity", entity: entityName, shape: "insert" });
529
+ hasSchemaProvider = true;
530
+ }
531
+ catch {
532
+ // No schema provider registered
533
+ }
534
+ for (const method of entityMethods.methods) {
535
+ const { httpMethod, path, handler, options, needsElysiaT, bodySchema, schemaBuilderImport } = buildRouteCall(method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx);
536
+ if (needsElysiaT)
537
+ fileNeedsElysiaT = true;
538
+ if (bodySchema)
539
+ bodySchemaImports.push(bodySchema);
540
+ if (schemaBuilderImport)
541
+ schemaLibraryImport = schemaBuilderImport;
542
+ const callArgs = [b.stringLiteral(path), handler];
543
+ if (options) {
544
+ callArgs.push(options);
545
+ }
546
+ chainExpr = b.callExpression(b.memberExpression(cast.toExpr(chainExpr), b.identifier(httpMethod)), callArgs.map(cast.toExpr));
547
+ }
548
+ if (fileNeedsElysiaT) {
549
+ file.import({ kind: "package", names: ["t"], from: "elysia" });
550
+ }
551
+ // Import schema library (e.g., Zod) if using schema-builder for params
552
+ if (schemaLibraryImport) {
553
+ if (schemaLibraryImport.names) {
554
+ file.import({
555
+ kind: "package",
556
+ names: [...schemaLibraryImport.names],
557
+ from: schemaLibraryImport.from,
558
+ });
559
+ }
560
+ else if (schemaLibraryImport.namespace) {
561
+ file.import({
562
+ kind: "package",
563
+ namespace: schemaLibraryImport.namespace,
564
+ from: schemaLibraryImport.from,
565
+ });
566
+ }
567
+ }
568
+ // Import body schemas from schema plugins (Zod, Valibot, etc.)
569
+ // These are resolved via the symbol registry's "schemas" capability
570
+ for (const schemaImport of bodySchemaImports) {
571
+ file.import({
572
+ kind: "symbol",
573
+ ref: {
574
+ capability: "schemas",
575
+ entity: schemaImport.entity,
576
+ shape: schemaImport.shape,
577
+ },
578
+ });
579
+ }
580
+ const exportStmt = conjure.export.const(routesVarName, chainExpr);
581
+ file.ast(conjure.program(exportStmt)).emit();
582
+ generatedRoutes.push({
583
+ fileName: `${inflect.uncapitalize(entityName)}.js`,
584
+ exportName: routesVarName,
585
+ });
586
+ }
587
+ // Generate aggregator index.ts
588
+ if (generatedRoutes.length > 0) {
589
+ const indexPath = `${outputDir}/index.ts`;
590
+ const indexFile = ctx.file(indexPath);
591
+ if (header) {
592
+ indexFile.header(header);
593
+ }
594
+ indexFile.import({ kind: "package", names: ["Elysia"], from: "elysia" });
595
+ for (const route of generatedRoutes) {
596
+ indexFile.import({
597
+ kind: "relative",
598
+ names: [route.exportName],
599
+ from: `./${route.fileName}`,
600
+ });
601
+ }
602
+ // Build: new Elysia().use(userRoutes).use(postRoutes)...
603
+ let chainExpr = b.newExpression(b.identifier("Elysia"), []);
604
+ for (const route of generatedRoutes) {
605
+ chainExpr = b.callExpression(b.memberExpression(cast.toExpr(chainExpr), b.identifier("use")), [b.identifier(route.exportName)]);
606
+ }
607
+ const exportStmt = conjure.export.const(aggregatorName, chainExpr);
608
+ indexFile.ast(conjure.program(exportStmt)).emit();
609
+ }
610
+ },
611
+ });
612
+ }
613
+ //# sourceMappingURL=http-elysia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-elysia.js","sourceRoot":"","sources":["../../src/plugins/http-elysia.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGpD,OAAO,EACL,mBAAmB,GAIpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,eAAe,GAKhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;AAE5B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,oEAAoE;IACpE,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAEhE,gDAAgD;IAChD,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;IAE7D,uDAAuD;IACvD,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5B;;;OAGG;IACH,cAAc,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;CACnE,CAAC,CAAC;AAKH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,iDAAiD;AACjD,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CAC1C,GAAG;KACA,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;KACnC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;KAClB,WAAW,EAAE,CAAC;AAEnB,kEAAkE;AAClE,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAU,EAAE,CACzD,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;AAE7C,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,2CAA2C;AAC3C,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAU,EAAE;IACzD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,sCAAsC;AACtC,MAAM,YAAY,GAAG,CAAC,MAAoB,EAAU,EAAE;IACpD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;YACxC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC;YAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;YAC1F,MAAM,SAAS,GAAG,WAAW,EAAE,IAAI,IAAI,KAAK,CAAC;YAC7C,OAAO,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3C,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAcF;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,OAAuB,EAAE,EAAgB,EAAE,CACvF,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CACtB,CAAC;AAEJ;;;GAGG;AACH,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAE,YAAqB,EAAU,EAAE;IAC9E,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,MAAM;YAChB,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM,CAAC,MAAM;YAChB,+DAA+D;YAC/D,OAAO,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7C,KAAK,MAAM,CAAC,OAAO;YACjB,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM,CAAC,MAAM;YAChB,yCAAyC;YACzC,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI;YACd,4CAA4C;YAC5C,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,MAAM,CAAC,OAAO,CAAC;QACpB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,MAAyB,EAAgB,EAAE;IACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAClD,CAAC;IACF,OAAO,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAmB,EAAgB,EAAE,CAC9D,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,oBAAoB,GAAG,CAAC,KAAmB,EAAgB,EAAE,CACjE,gBAAgB,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,oBAAoB,GAAG,CAAC,KAAmB,EAAgB,EAAE,CACjE,gBAAgB,CAAC,OAAO,EAAE;IACxB,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/E,CAAC,CAAC;AAEL;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,CAChC,KAAY,EACZ,GAAmB,EACnB,SAAkB,EACJ,EAAE;IAChB,IAAI,UAAwB,CAAC;IAE7B,gCAAgC;IAChC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IACD,wCAAwC;SACnC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE;YACrC,CAAC,CAAC,eAAe,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;aACtC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IACD,oCAAoC;SAC/B,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,UAAU;YACxB,CAAC,CAAC,IAAI,CACF,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,EACvC,MAAM,CAAC,cAAc,CACtB;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,0CAA0C;SACrC,CAAC;QACJ,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpE,UAAU,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED,4BAA4B;IAC5B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,wEAAwE;IACxE,IAAI,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,wBAAwB,GAAG,CAC/B,MAAmB,EACnB,SAA8B,EAC9B,GAAmB,EACL,EAAE;IAChB,MAAM,KAAK,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACnF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,+DAA+D;QAC/D,4FAA4F;QAC5F,MAAM,aAAa,GAAG,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3F,IAAI,WAAW,GAAG,yBAAyB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,8BAA8B;QAC9F,IAAI,aAAa,EAAE,CAAC;YAClB,WAAW,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC;QACD,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,KAAuB,EAAgB,EAAE;IACxE,MAAM,aAAa,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,OAAO,gBAAgB,CAAC,aAAa,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,MAAoB,EAAiB,EAAE;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,KAAK,EAAE,OAAgB,EAAE,CAAC;IAEpE,2DAA2D;IAC3D,MAAM,IAAI,GAAmB,EAAE,CAAC;IAEhC,IAAI,OAAO,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACnC,4DAA4D;QAC5D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACjH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,iEAAiE;gBACjE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mDAAmD;QACnD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAEjE,IAAI,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChD,wCAAwC;YACxC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACzD,mDAAmD;YACnD,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;oBACjH,iDAAiD;oBACjD,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;oBACjH,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,CAChC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CACtB,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEnD,+CAA+C;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAClF,gDAAgD;QAChD,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CACjC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EACtB,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CACtD,CAAC;QACF,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CACjC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC9C,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAC9B,CAAC;QACF,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AASF;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,MAAoB,EAAE,UAAkB,EAAuB,EAAE;IAC5F,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,QAAQ,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,QAAQ,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAQF;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAG,CACxB,MAAoB,EACpB,UAAkB,EAClB,aAA8B,EAC9B,iBAA0B,EAC1B,MAA+B,EAC/B,UAA0B,EAO1B,EAAE;IACF,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,mBAAmB,GAA6C,IAAI,CAAC;IACzE,IAAI,gBAAgB,GAAwB,IAAI,CAAC;IAEjD,0CAA0C;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CACvE,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;YACzD,mBAAmB,GAAG,YAAY,CAAC,UAAU,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,YAAY,GAAG,IAAI,CAAC;YACpB,IAAI,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,0EAA0E;gBAC1E,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,YAAY,GAAG,CAAC,CAAC,cAAc,CACnC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC7D,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CACxB,CAAC;YACF,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IAC3E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,YAAY,EAAE,CAAC;YACjB,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;YACxD,mBAAmB,GAAG,YAAY,CAAC,UAAU,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,YAAY,GAAG,IAAI,CAAC;YACpB,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,CAC/B,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAC9D,EAAE,CACH,CAAC;gBACF,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,CAChC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAC/D,CAAC,QAAQ,CAAC,CACX,CAAC;gBACF,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,WAAW,GAAG,CAAC,CAAC,cAAc,CAClC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC7D,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CACvB,CAAC;YACF,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,kBAAkB;IAClB,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/D,IAAI,UAAU,GAAwB,IAAI,CAAC;IAE3C,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,iBAAiB,EAAE,CAAC;YACtB,gEAAgE;YAChE,UAAU,GAAG,cAAc,CAAC;YAC5B,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1E,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,yCAAyC;YACzC,YAAY,GAAG,IAAI,CAAC;YACpB,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACtF,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACvD,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,qFAAqF;IACvF,CAAC;IAED,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;QAC/C,YAAY;QACZ,UAAU;QACV,mBAAmB;QACnB,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,CACrB,MAAoB,EACpB,UAAkB,EAClB,aAA8B,EAC9B,iBAA0B,EAC1B,MAA+B,EAC/B,UAA0B,EAS1B,EAAE;IACF,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAElC,uFAAuF;IACvF,MAAM,YAAY,GAAiB,EAAE,CAAC;IAEtC,yDAAyD;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAChH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,4BAA4B;QAC5B,MAAM,aAAa,GAAG,CAAC,CAAC,aAAa,CACnC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,0GAA0G;IAC1G,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QAC9D,MAAM,CAAC,IAAI,KAAK,QAAQ;QACxB,MAAM,CAAC,IAAI,KAAK,QAAQ;QACxB,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IAChF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,gCAAgC;QAChC,MAAM,YAAY,GAAG,CAAC,CAAC,aAAa,CAClC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAE1D,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,uBAAuB,CACvC,CAAC,mBAAmB,CAAC,EACrB,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAC/C,CAAC;IACF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAErB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,CAClF,MAAM,EACN,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,UAAU,CACX,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;AAC/F,CAAC,CAAC;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,UAAU,UAAU,CAAC,MAAwB;IACjD,MAAM,MAAM,GAAG,CAAC,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;IAEnE,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,IAAI;QAEf,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;QAEtB,mFAAmF;QACnF,QAAQ,EAAE,GAAG,EAAE,CAAC;YACd,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;SAChC;QAED,gBAAgB,EAAE,GAAG,EAAE,CAAC;YACtB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;SAChC;QAED,OAAO,EAAE,CAAC,OAAgB,EAAE,KAAyB,EAAE,GAAkB,EAAQ,EAAE;YACjF,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;YAE/D,iDAAiD;YACjD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;YAEzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,oDAAoD;gBACpD,OAAO;YACT,CAAC;YAED,8CAA8C;YAC9C,MAAM,eAAe,GAAoD,EAAE,CAAC;YAE5E,6EAA6E;YAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAmB;gBACjC,KAAK,EAAE,YAAY;gBACnB,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU;aAC9B,CAAC;YAEF,kCAAkC;YAClC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAC/D,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAEnE,sEAAsE;gBACtE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBAEhE,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;gBACvE,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAElE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEhC,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBAED,gBAAgB;gBAChB,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAEpE,8BAA8B;gBAC9B,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC;oBACV,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE,SAAS;oBACpB,IAAI,EAAE,iBAAiB;iBACxB,CAAC,CAAC;gBAEH,+BAA+B;gBAC/B,0DAA0D;gBAC1D,MAAM,UAAU,GAAG,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAC;gBAChD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBACvF,IAAI,SAAS,GAAiB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;gBAEtF,IAAI,gBAAgB,GAAG,KAAK,CAAC;gBAC7B,MAAM,iBAAiB,GAAmB,EAAE,CAAC;gBAC7C,IAAI,mBAAmB,GAA6C,IAAI,CAAC;gBAEzE,2EAA2E;gBAC3E,MAAM,aAAa,GAAoB,CAAC,MAAM,EAAE,EAAE;oBAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,SAAS,CAAC;oBAC1C,IAAI,CAAC;wBACH,MAAM,OAAO,GAAyB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;wBACpE,OAAO,GAAG,CAAC,OAAO,CAAkC,mBAAmB,EAAE,OAAO,CAAC,CAAC;oBACpF,CAAC;oBAAC,MAAM,CAAC;wBACP,0DAA0D;wBAC1D,OAAO,SAAS,CAAC;oBACnB,CAAC;gBACH,CAAC,CAAC;gBAEF,8DAA8D;gBAC9D,4DAA4D;gBAC5D,IAAI,iBAAiB,GAAG,KAAK,CAAC;gBAC9B,IAAI,CAAC;oBACH,uEAAuE;oBACvE,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC7F,iBAAiB,GAAG,IAAI,CAAC;gBAC3B,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;gBAED,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC3C,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,GACzF,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;oBAC3F,IAAI,YAAY;wBAAE,gBAAgB,GAAG,IAAI,CAAC;oBAC1C,IAAI,UAAU;wBAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACnD,IAAI,mBAAmB;wBAAE,mBAAmB,GAAG,mBAAmB,CAAC;oBAEnE,MAAM,QAAQ,GAAmB,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBAClE,IAAI,OAAO,EAAE,CAAC;wBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzB,CAAC;oBAED,SAAS,GAAG,CAAC,CAAC,cAAc,CAC1B,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EACpE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAC1B,CAAC;gBACJ,CAAC;gBAED,IAAI,gBAAgB,EAAE,CAAC;oBACrB,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACjE,CAAC;gBAED,uEAAuE;gBACvE,IAAI,mBAAmB,EAAE,CAAC;oBACxB,IAAI,mBAAmB,CAAC,KAAK,EAAE,CAAC;wBAC9B,IAAI,CAAC,MAAM,CAAC;4BACV,IAAI,EAAE,SAAS;4BACf,KAAK,EAAE,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC;4BACrC,IAAI,EAAE,mBAAmB,CAAC,IAAI;yBAC/B,CAAC,CAAC;oBACL,CAAC;yBAAM,IAAI,mBAAmB,CAAC,SAAS,EAAE,CAAC;wBACzC,IAAI,CAAC,MAAM,CAAC;4BACV,IAAI,EAAE,SAAS;4BACf,SAAS,EAAE,mBAAmB,CAAC,SAAS;4BACxC,IAAI,EAAE,mBAAmB,CAAC,IAAI;yBAC/B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,+DAA+D;gBAC/D,oEAAoE;gBACpE,KAAK,MAAM,YAAY,IAAI,iBAAiB,EAAE,CAAC;oBAC7C,IAAI,CAAC,MAAM,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,GAAG,EAAE;4BACH,UAAU,EAAE,SAAS;4BACrB,MAAM,EAAE,YAAY,CAAC,MAAM;4BAC3B,KAAK,EAAE,YAAY,CAAC,KAAK;yBAC1B;qBACF,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAClE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAE7C,eAAe,CAAC,IAAI,CAAC;oBACnB,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK;oBAClD,UAAU,EAAE,aAAa;iBAC1B,CAAC,CAAC;YACL,CAAC;YAED,+BAA+B;YAC/B,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,GAAG,SAAS,WAAW,CAAC;gBAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAEtC,IAAI,MAAM,EAAE,CAAC;oBACX,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC3B,CAAC;gBAED,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAEzE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;oBACpC,SAAS,CAAC,MAAM,CAAC;wBACf,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;wBACzB,IAAI,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE;qBAC5B,CAAC,CAAC;gBACL,CAAC;gBAED,yDAAyD;gBACzD,IAAI,SAAS,GAAiB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1E,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;oBACpC,SAAS,GAAG,CAAC,CAAC,cAAc,CAC1B,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAC/D,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CACjC,CAAC;gBACJ,CAAC;gBAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;gBACnE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}