linkgress-orm 0.0.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/dist/database/database-client.interface.d.ts +45 -0
  4. package/dist/database/database-client.interface.d.ts.map +1 -0
  5. package/dist/database/database-client.interface.js +20 -0
  6. package/dist/database/database-client.interface.js.map +1 -0
  7. package/dist/database/index.d.ts +5 -0
  8. package/dist/database/index.d.ts.map +1 -0
  9. package/dist/database/index.js +10 -0
  10. package/dist/database/index.js.map +1 -0
  11. package/dist/database/pg-client.d.ts +30 -0
  12. package/dist/database/pg-client.d.ts.map +1 -0
  13. package/dist/database/pg-client.js +76 -0
  14. package/dist/database/pg-client.js.map +1 -0
  15. package/dist/database/postgres-client.d.ts +44 -0
  16. package/dist/database/postgres-client.d.ts.map +1 -0
  17. package/dist/database/postgres-client.js +111 -0
  18. package/dist/database/postgres-client.js.map +1 -0
  19. package/dist/database/types.d.ts +200 -0
  20. package/dist/database/types.d.ts.map +1 -0
  21. package/dist/database/types.js +8 -0
  22. package/dist/database/types.js.map +1 -0
  23. package/dist/entity/base-entity.d.ts +21 -0
  24. package/dist/entity/base-entity.d.ts.map +1 -0
  25. package/dist/entity/base-entity.js +27 -0
  26. package/dist/entity/base-entity.js.map +1 -0
  27. package/dist/entity/db-column.d.ts +61 -0
  28. package/dist/entity/db-column.d.ts.map +1 -0
  29. package/dist/entity/db-column.js +35 -0
  30. package/dist/entity/db-column.js.map +1 -0
  31. package/dist/entity/db-context.d.ts +665 -0
  32. package/dist/entity/db-context.d.ts.map +1 -0
  33. package/dist/entity/db-context.js +1463 -0
  34. package/dist/entity/db-context.js.map +1 -0
  35. package/dist/entity/entity-base.d.ts +76 -0
  36. package/dist/entity/entity-base.d.ts.map +1 -0
  37. package/dist/entity/entity-base.js +42 -0
  38. package/dist/entity/entity-base.js.map +1 -0
  39. package/dist/entity/entity-builder.d.ts +171 -0
  40. package/dist/entity/entity-builder.d.ts.map +1 -0
  41. package/dist/entity/entity-builder.js +376 -0
  42. package/dist/entity/entity-builder.js.map +1 -0
  43. package/dist/entity/model-config.d.ts +18 -0
  44. package/dist/entity/model-config.d.ts.map +1 -0
  45. package/dist/entity/model-config.js +157 -0
  46. package/dist/entity/model-config.js.map +1 -0
  47. package/dist/index.d.ts +27 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +142 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/migration/db-schema-manager.d.ts +228 -0
  52. package/dist/migration/db-schema-manager.d.ts.map +1 -0
  53. package/dist/migration/db-schema-manager.js +1055 -0
  54. package/dist/migration/db-schema-manager.js.map +1 -0
  55. package/dist/migration/enum-migrator.d.ts +29 -0
  56. package/dist/migration/enum-migrator.d.ts.map +1 -0
  57. package/dist/migration/enum-migrator.js +137 -0
  58. package/dist/migration/enum-migrator.js.map +1 -0
  59. package/dist/query/collection-strategy.factory.d.ts +16 -0
  60. package/dist/query/collection-strategy.factory.d.ts.map +1 -0
  61. package/dist/query/collection-strategy.factory.js +37 -0
  62. package/dist/query/collection-strategy.factory.js.map +1 -0
  63. package/dist/query/collection-strategy.interface.d.ts +146 -0
  64. package/dist/query/collection-strategy.interface.d.ts.map +1 -0
  65. package/dist/query/collection-strategy.interface.js +3 -0
  66. package/dist/query/collection-strategy.interface.js.map +1 -0
  67. package/dist/query/conditions.d.ts +222 -0
  68. package/dist/query/conditions.d.ts.map +1 -0
  69. package/dist/query/conditions.js +446 -0
  70. package/dist/query/conditions.js.map +1 -0
  71. package/dist/query/cte-builder.d.ts +95 -0
  72. package/dist/query/cte-builder.d.ts.map +1 -0
  73. package/dist/query/cte-builder.js +172 -0
  74. package/dist/query/cte-builder.js.map +1 -0
  75. package/dist/query/grouped-query.d.ts +186 -0
  76. package/dist/query/grouped-query.d.ts.map +1 -0
  77. package/dist/query/grouped-query.js +588 -0
  78. package/dist/query/grouped-query.js.map +1 -0
  79. package/dist/query/join-builder.d.ts +106 -0
  80. package/dist/query/join-builder.d.ts.map +1 -0
  81. package/dist/query/join-builder.js +275 -0
  82. package/dist/query/join-builder.js.map +1 -0
  83. package/dist/query/query-builder.d.ts +543 -0
  84. package/dist/query/query-builder.d.ts.map +1 -0
  85. package/dist/query/query-builder.js +2649 -0
  86. package/dist/query/query-builder.js.map +1 -0
  87. package/dist/query/strategies/jsonb-collection-strategy.d.ts +51 -0
  88. package/dist/query/strategies/jsonb-collection-strategy.d.ts.map +1 -0
  89. package/dist/query/strategies/jsonb-collection-strategy.js +210 -0
  90. package/dist/query/strategies/jsonb-collection-strategy.js.map +1 -0
  91. package/dist/query/strategies/temptable-collection-strategy.d.ts +95 -0
  92. package/dist/query/strategies/temptable-collection-strategy.d.ts.map +1 -0
  93. package/dist/query/strategies/temptable-collection-strategy.js +456 -0
  94. package/dist/query/strategies/temptable-collection-strategy.js.map +1 -0
  95. package/dist/query/subquery.d.ts +152 -0
  96. package/dist/query/subquery.d.ts.map +1 -0
  97. package/dist/query/subquery.js +206 -0
  98. package/dist/query/subquery.js.map +1 -0
  99. package/dist/schema/column-builder.d.ts +127 -0
  100. package/dist/schema/column-builder.d.ts.map +1 -0
  101. package/dist/schema/column-builder.js +184 -0
  102. package/dist/schema/column-builder.js.map +1 -0
  103. package/dist/schema/inference.d.ts +26 -0
  104. package/dist/schema/inference.d.ts.map +1 -0
  105. package/dist/schema/inference.js +3 -0
  106. package/dist/schema/inference.js.map +1 -0
  107. package/dist/schema/navigation.d.ts +215 -0
  108. package/dist/schema/navigation.d.ts.map +1 -0
  109. package/dist/schema/navigation.js +233 -0
  110. package/dist/schema/navigation.js.map +1 -0
  111. package/dist/schema/row-type.d.ts +26 -0
  112. package/dist/schema/row-type.d.ts.map +1 -0
  113. package/dist/schema/row-type.js +3 -0
  114. package/dist/schema/row-type.js.map +1 -0
  115. package/dist/schema/sequence-builder.d.ts +87 -0
  116. package/dist/schema/sequence-builder.d.ts.map +1 -0
  117. package/dist/schema/sequence-builder.js +123 -0
  118. package/dist/schema/sequence-builder.js.map +1 -0
  119. package/dist/schema/table-builder.d.ts +122 -0
  120. package/dist/schema/table-builder.d.ts.map +1 -0
  121. package/dist/schema/table-builder.js +132 -0
  122. package/dist/schema/table-builder.js.map +1 -0
  123. package/dist/schema/typed-schema.d.ts +22 -0
  124. package/dist/schema/typed-schema.d.ts.map +1 -0
  125. package/dist/schema/typed-schema.js +28 -0
  126. package/dist/schema/typed-schema.js.map +1 -0
  127. package/dist/types/column-types.d.ts +20 -0
  128. package/dist/types/column-types.d.ts.map +1 -0
  129. package/dist/types/column-types.js +14 -0
  130. package/dist/types/column-types.js.map +1 -0
  131. package/dist/types/custom-types.d.ts +85 -0
  132. package/dist/types/custom-types.d.ts.map +1 -0
  133. package/dist/types/custom-types.js +132 -0
  134. package/dist/types/custom-types.js.map +1 -0
  135. package/dist/types/enum-builder.d.ts +31 -0
  136. package/dist/types/enum-builder.d.ts.map +1 -0
  137. package/dist/types/enum-builder.js +46 -0
  138. package/dist/types/enum-builder.js.map +1 -0
  139. package/dist/types/metadata.d.ts +67 -0
  140. package/dist/types/metadata.d.ts.map +1 -0
  141. package/dist/types/metadata.js +57 -0
  142. package/dist/types/metadata.js.map +1 -0
  143. package/dist/types/type-mapper.d.ts +49 -0
  144. package/dist/types/type-mapper.d.ts.map +1 -0
  145. package/dist/types/type-mapper.js +49 -0
  146. package/dist/types/type-mapper.js.map +1 -0
  147. package/package.json +77 -0
@@ -0,0 +1,588 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GroupedSelectQueryBuilder = exports.GroupedQueryBuilder = void 0;
4
+ const conditions_1 = require("./conditions");
5
+ const subquery_1 = require("./subquery");
6
+ /**
7
+ * Create an aggregate field reference that can be used in conditions
8
+ */
9
+ function createAggregateFieldRef(aggregateType, selector) {
10
+ return {
11
+ __fieldName: aggregateType.toLowerCase(),
12
+ __dbColumnName: aggregateType.toLowerCase(),
13
+ __isAggregate: true,
14
+ __aggregateType: aggregateType,
15
+ __aggregateSelector: selector,
16
+ };
17
+ }
18
+ /**
19
+ * Grouped query builder - result of calling groupBy()
20
+ * Provides type-safe access to grouping keys and aggregate functions
21
+ */
22
+ class GroupedQueryBuilder {
23
+ constructor(schema, client, originalSelector, groupingKeySelector, whereCond, executor, manualJoins, joinCounter) {
24
+ this.orderByFields = [];
25
+ this.manualJoins = [];
26
+ this.joinCounter = 0;
27
+ this.schema = schema;
28
+ this.client = client;
29
+ this.originalSelector = originalSelector;
30
+ this.groupingKeySelector = groupingKeySelector;
31
+ this.whereCond = whereCond;
32
+ this.executor = executor;
33
+ this.manualJoins = manualJoins || [];
34
+ this.joinCounter = joinCounter || 0;
35
+ }
36
+ /**
37
+ * Select from grouped results
38
+ * The selector receives a GroupedItem with key and aggregate functions
39
+ */
40
+ select(selector) {
41
+ return new GroupedSelectQueryBuilder(this.schema, this.client, this.originalSelector, this.groupingKeySelector, selector, this.whereCond, this.havingCond, this.limitValue, this.offsetValue, this.orderByFields, this.executor, this.manualJoins, this.joinCounter);
42
+ }
43
+ /**
44
+ * Add HAVING condition (filter groups after aggregation)
45
+ */
46
+ having(condition) {
47
+ const mockGroup = this.createMockGroupedItem();
48
+ this.havingCond = condition(mockGroup);
49
+ return this;
50
+ }
51
+ /**
52
+ * Create a mock GroupedItem for type inference and condition building
53
+ */
54
+ createMockGroupedItem() {
55
+ // Create mock for the original row
56
+ const mockOriginalRow = this.createMockRow();
57
+ // Evaluate the grouping key selector to get the key structure
58
+ const mockKey = this.groupingKeySelector(mockOriginalRow);
59
+ return {
60
+ key: mockKey,
61
+ count: () => {
62
+ return createAggregateFieldRef('COUNT');
63
+ },
64
+ sum: (selector) => {
65
+ return createAggregateFieldRef('SUM', selector);
66
+ },
67
+ min: (selector) => {
68
+ return createAggregateFieldRef('MIN', selector);
69
+ },
70
+ max: (selector) => {
71
+ return createAggregateFieldRef('MAX', selector);
72
+ },
73
+ avg: (selector) => {
74
+ return createAggregateFieldRef('AVG', selector);
75
+ },
76
+ };
77
+ }
78
+ /**
79
+ * Create mock row for the original table
80
+ */
81
+ createMockRow() {
82
+ const mock = {};
83
+ // Add columns as FieldRef objects
84
+ for (const [colName, colBuilder] of Object.entries(this.schema.columns)) {
85
+ const dbColumnName = colBuilder.build().name;
86
+ Object.defineProperty(mock, colName, {
87
+ get: () => ({
88
+ __fieldName: colName,
89
+ __dbColumnName: dbColumnName,
90
+ __tableAlias: this.schema.name,
91
+ }),
92
+ enumerable: true,
93
+ configurable: true,
94
+ });
95
+ }
96
+ // Add columns from manually joined tables
97
+ for (const join of this.manualJoins) {
98
+ if (join.isSubquery || !join.schema) {
99
+ continue;
100
+ }
101
+ for (const [colName, colBuilder] of Object.entries(join.schema.columns)) {
102
+ const dbColumnName = colBuilder.build().name;
103
+ if (!mock[join.alias]) {
104
+ mock[join.alias] = {};
105
+ }
106
+ Object.defineProperty(mock[join.alias], colName, {
107
+ get: () => ({
108
+ __fieldName: colName,
109
+ __dbColumnName: dbColumnName,
110
+ __tableAlias: join.alias,
111
+ }),
112
+ enumerable: true,
113
+ configurable: true,
114
+ });
115
+ }
116
+ }
117
+ return mock;
118
+ }
119
+ }
120
+ exports.GroupedQueryBuilder = GroupedQueryBuilder;
121
+ /**
122
+ * Grouped select query builder - result of calling select() on a GroupedQueryBuilder
123
+ */
124
+ class GroupedSelectQueryBuilder {
125
+ constructor(schema, client, originalSelector, groupingKeySelector, resultSelector, whereCond, havingCond, limit, offset, orderBy, executor, manualJoins, joinCounter) {
126
+ this.orderByFields = [];
127
+ this.manualJoins = [];
128
+ this.joinCounter = 0;
129
+ this.schema = schema;
130
+ this.client = client;
131
+ this.originalSelector = originalSelector;
132
+ this.groupingKeySelector = groupingKeySelector;
133
+ this.resultSelector = resultSelector;
134
+ this.whereCond = whereCond;
135
+ this.havingCond = havingCond;
136
+ this.limitValue = limit;
137
+ this.offsetValue = offset;
138
+ this.orderByFields = orderBy || [];
139
+ this.executor = executor;
140
+ this.manualJoins = manualJoins || [];
141
+ this.joinCounter = joinCounter || 0;
142
+ }
143
+ /**
144
+ * Add HAVING condition (filter groups after aggregation)
145
+ */
146
+ having(condition) {
147
+ const mockGroup = this.createMockGroupedItem();
148
+ this.havingCond = condition(mockGroup);
149
+ return this;
150
+ }
151
+ /**
152
+ * Limit results
153
+ */
154
+ limit(count) {
155
+ this.limitValue = count;
156
+ return this;
157
+ }
158
+ /**
159
+ * Offset results
160
+ */
161
+ offset(count) {
162
+ this.offsetValue = count;
163
+ return this;
164
+ }
165
+ orderBy(selector) {
166
+ const mockGroup = this.createMockGroupedItem();
167
+ const mockResult = this.resultSelector(mockGroup);
168
+ const result = selector(mockResult);
169
+ // Handle array of [field, direction] tuples
170
+ if (Array.isArray(result) && result.length > 0 && Array.isArray(result[0])) {
171
+ for (const [fieldRef, direction] of result) {
172
+ if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
173
+ this.orderByFields.push({
174
+ field: fieldRef.__dbColumnName || fieldRef.__fieldName,
175
+ direction: direction || 'ASC'
176
+ });
177
+ }
178
+ }
179
+ }
180
+ // Handle array of fields (all ASC)
181
+ else if (Array.isArray(result)) {
182
+ for (const fieldRef of result) {
183
+ if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
184
+ this.orderByFields.push({
185
+ field: fieldRef.__dbColumnName || fieldRef.__fieldName,
186
+ direction: 'ASC'
187
+ });
188
+ }
189
+ }
190
+ }
191
+ // Handle single field
192
+ else if (result && typeof result === 'object' && '__fieldName' in result) {
193
+ this.orderByFields.push({
194
+ field: result.__dbColumnName || result.__fieldName,
195
+ direction: 'ASC'
196
+ });
197
+ }
198
+ return this;
199
+ }
200
+ /**
201
+ * Execute query and return results
202
+ */
203
+ async toList() {
204
+ const context = {
205
+ ctes: new Map(),
206
+ cteCounter: 0,
207
+ paramCounter: 1,
208
+ allParams: [],
209
+ };
210
+ const { sql, params } = this.buildQuery(context);
211
+ // Execute using executor if available, otherwise use client directly
212
+ const result = this.executor
213
+ ? await this.executor.query(sql, params)
214
+ : await this.client.query(sql, params);
215
+ // Transform results: convert aggregate string values to numbers
216
+ return this.transformResults(result.rows);
217
+ }
218
+ /**
219
+ * Transform database results - convert aggregate values from strings to numbers
220
+ */
221
+ transformResults(rows) {
222
+ // Get the mock result to identify which fields are aggregates
223
+ const mockGroup = this.createMockGroupedItem();
224
+ const mockResult = this.resultSelector(mockGroup);
225
+ return rows.map(row => {
226
+ const transformed = {};
227
+ for (const [key, value] of Object.entries(row)) {
228
+ const mockValue = mockResult[key];
229
+ // Check if this field is an aggregate
230
+ if (mockValue && typeof mockValue === 'object' && '__isAggregate' in mockValue && mockValue.__isAggregate) {
231
+ const aggType = mockValue.__aggregateType;
232
+ // Convert string to number for numeric aggregates
233
+ if (aggType === 'COUNT' || aggType === 'SUM' || aggType === 'AVG' || aggType === 'MIN' || aggType === 'MAX') {
234
+ transformed[key] = value === null ? null : Number(value);
235
+ }
236
+ else {
237
+ transformed[key] = value;
238
+ }
239
+ }
240
+ else {
241
+ // Non-aggregate field - keep as is
242
+ transformed[key] = value;
243
+ }
244
+ }
245
+ return transformed;
246
+ });
247
+ }
248
+ /**
249
+ * Execute query and return first result or null
250
+ */
251
+ async first() {
252
+ const results = await this.limit(1).toList();
253
+ return results.length > 0 ? results[0] : null;
254
+ }
255
+ /**
256
+ * Execute query and return first result or throw
257
+ */
258
+ async firstOrThrow() {
259
+ const result = await this.first();
260
+ if (!result) {
261
+ throw new Error('No results found');
262
+ }
263
+ return result;
264
+ }
265
+ /**
266
+ * Convert to subquery for use in other queries
267
+ */
268
+ asSubquery(mode = 'table') {
269
+ const sqlBuilder = (outerContext) => {
270
+ const context = {
271
+ ctes: new Map(),
272
+ cteCounter: 0,
273
+ paramCounter: outerContext.paramCounter,
274
+ allParams: outerContext.params,
275
+ };
276
+ const { sql } = this.buildQuery(context);
277
+ outerContext.paramCounter = context.paramCounter;
278
+ return sql;
279
+ };
280
+ return new subquery_1.Subquery(sqlBuilder, mode);
281
+ }
282
+ /**
283
+ * Build the SQL query for grouped results
284
+ */
285
+ buildQuery(context) {
286
+ // Create mocks for evaluation
287
+ const mockRow = this.createMockRow();
288
+ const mockOriginalSelection = this.originalSelector(mockRow);
289
+ const mockGroupingKey = this.groupingKeySelector(mockOriginalSelection);
290
+ const mockGroup = this.createMockGroupedItem();
291
+ const mockResult = this.resultSelector(mockGroup);
292
+ // Extract GROUP BY fields from the grouping key
293
+ const groupByFields = [];
294
+ for (const [key, value] of Object.entries(mockGroupingKey)) {
295
+ if (typeof value === 'object' && value !== null && '__dbColumnName' in value) {
296
+ const field = value;
297
+ const tableAlias = field.__tableAlias || this.schema.name;
298
+ groupByFields.push(`"${tableAlias}"."${field.__dbColumnName}"`);
299
+ }
300
+ }
301
+ // Build SELECT clause from result selector
302
+ const selectParts = [];
303
+ for (const [alias, value] of Object.entries(mockResult)) {
304
+ if (typeof value === 'object' && value !== null && '__isAggregate' in value && value.__isAggregate) {
305
+ // This is an AggregateFieldRef (from our mock GroupedItem)
306
+ const aggField = value;
307
+ const aggType = aggField.__aggregateType;
308
+ if (aggType === 'COUNT') {
309
+ // COUNT always returns bigint, cast to integer for cleaner results
310
+ selectParts.push(`CAST(COUNT(*) AS INTEGER) as "${alias}"`);
311
+ }
312
+ else if (aggField.__aggregateSelector) {
313
+ // SUM, MIN, MAX, AVG with selector
314
+ const mockOriginalRow = this.createMockRow();
315
+ const field = aggField.__aggregateSelector(mockOriginalRow);
316
+ if (typeof field === 'object' && field !== null && '__dbColumnName' in field) {
317
+ const fieldRef = field;
318
+ const tableAlias = fieldRef.__tableAlias || this.schema.name;
319
+ // Cast numeric aggregates to appropriate types
320
+ if (aggType === 'SUM' || aggType === 'AVG') {
321
+ // SUM and AVG return numeric - cast to double precision for JavaScript number
322
+ selectParts.push(`CAST(${aggType}("${tableAlias}"."${fieldRef.__dbColumnName}") AS DOUBLE PRECISION) as "${alias}"`);
323
+ }
324
+ else {
325
+ // MIN/MAX preserve the field's type - no cast needed usually, but could be added if needed
326
+ selectParts.push(`${aggType}("${tableAlias}"."${fieldRef.__dbColumnName}") as "${alias}"`);
327
+ }
328
+ }
329
+ }
330
+ else {
331
+ // Aggregate without selector (shouldn't happen for SUM/MIN/MAX/AVG, but handle it)
332
+ selectParts.push(`${aggType}(*) as "${alias}"`);
333
+ }
334
+ }
335
+ else if (typeof value === 'object' && value !== null && '__aggregateType' in value) {
336
+ // Backward compatibility: Old AggregateMarker style (if any still exist)
337
+ const agg = value;
338
+ if (agg.__aggregateType === 'COUNT') {
339
+ selectParts.push(`CAST(COUNT(*) AS INTEGER) as "${alias}"`);
340
+ }
341
+ else if (agg.__selector) {
342
+ const mockOriginalRow = this.createMockRow();
343
+ const field = agg.__selector(mockOriginalRow);
344
+ if (typeof field === 'object' && field !== null && '__dbColumnName' in field) {
345
+ const fieldRef = field;
346
+ const tableAlias = fieldRef.__tableAlias || this.schema.name;
347
+ if (agg.__aggregateType === 'SUM' || agg.__aggregateType === 'AVG') {
348
+ selectParts.push(`CAST(${agg.__aggregateType}("${tableAlias}"."${fieldRef.__dbColumnName}") AS DOUBLE PRECISION) as "${alias}"`);
349
+ }
350
+ else {
351
+ selectParts.push(`${agg.__aggregateType}("${tableAlias}"."${fieldRef.__dbColumnName}") as "${alias}"`);
352
+ }
353
+ }
354
+ }
355
+ }
356
+ else if (typeof value === 'object' && value !== null && '__dbColumnName' in value) {
357
+ // Direct field reference from the grouping key
358
+ const field = value;
359
+ const tableAlias = field.__tableAlias || this.schema.name;
360
+ selectParts.push(`"${tableAlias}"."${field.__dbColumnName}" as "${alias}"`);
361
+ }
362
+ else if (value instanceof conditions_1.SqlFragment) {
363
+ // SQL fragment
364
+ const sqlBuildContext = {
365
+ paramCounter: context.paramCounter,
366
+ params: context.allParams,
367
+ };
368
+ const fragmentSql = value.buildSql(sqlBuildContext);
369
+ context.paramCounter = sqlBuildContext.paramCounter;
370
+ selectParts.push(`${fragmentSql} as "${alias}"`);
371
+ }
372
+ }
373
+ // Build FROM clause with JOINs
374
+ let fromClause = `FROM "${this.schema.name}"`;
375
+ // Add manual JOINs
376
+ for (const manualJoin of this.manualJoins) {
377
+ const joinTypeStr = manualJoin.type === 'INNER' ? 'INNER JOIN' : 'LEFT JOIN';
378
+ const condBuilder = new conditions_1.ConditionBuilder();
379
+ const { sql: condSql, params: condParams } = condBuilder.build(manualJoin.condition, context.paramCounter);
380
+ context.paramCounter += condParams.length;
381
+ context.allParams.push(...condParams);
382
+ // Check if this is a subquery join
383
+ if (manualJoin.isSubquery && manualJoin.subquery) {
384
+ const subqueryBuildContext = {
385
+ paramCounter: context.paramCounter,
386
+ params: context.allParams,
387
+ };
388
+ const subquerySql = manualJoin.subquery.buildSql(subqueryBuildContext);
389
+ context.paramCounter = subqueryBuildContext.paramCounter;
390
+ fromClause += `\n${joinTypeStr} (${subquerySql}) AS "${manualJoin.alias}" ON ${condSql}`;
391
+ }
392
+ else {
393
+ fromClause += `\n${joinTypeStr} "${manualJoin.table}" AS "${manualJoin.alias}" ON ${condSql}`;
394
+ }
395
+ }
396
+ // Build WHERE clause
397
+ let whereClause = '';
398
+ if (this.whereCond) {
399
+ const condBuilder = new conditions_1.ConditionBuilder();
400
+ const { sql, params } = condBuilder.build(this.whereCond, context.paramCounter);
401
+ whereClause = `WHERE ${sql}`;
402
+ context.paramCounter += params.length;
403
+ context.allParams.push(...params);
404
+ }
405
+ // Build GROUP BY clause
406
+ const groupByClause = `GROUP BY ${groupByFields.join(', ')}`;
407
+ // Build HAVING clause
408
+ let havingClause = '';
409
+ if (this.havingCond) {
410
+ // Build the HAVING condition, but we need to substitute aggregate markers with actual SQL
411
+ const havingSql = this.buildHavingCondition(this.havingCond, context);
412
+ havingClause = `HAVING ${havingSql}`;
413
+ }
414
+ // Build ORDER BY clause
415
+ let orderByClause = '';
416
+ if (this.orderByFields.length > 0) {
417
+ const orderParts = this.orderByFields.map(({ field, direction }) => `"${field}" ${direction}`);
418
+ orderByClause = `ORDER BY ${orderParts.join(', ')}`;
419
+ }
420
+ // Build LIMIT/OFFSET
421
+ let limitClause = '';
422
+ if (this.limitValue !== undefined) {
423
+ limitClause = `LIMIT ${this.limitValue}`;
424
+ }
425
+ if (this.offsetValue !== undefined) {
426
+ limitClause += ` OFFSET ${this.offsetValue}`;
427
+ }
428
+ const finalQuery = `SELECT ${selectParts.join(', ')}\n${fromClause}\n${whereClause}\n${groupByClause}\n${havingClause}\n${orderByClause}\n${limitClause}`.trim();
429
+ return {
430
+ sql: finalQuery,
431
+ params: context.allParams,
432
+ };
433
+ }
434
+ /**
435
+ * Create mock row for the original table
436
+ */
437
+ createMockRow() {
438
+ const mock = {};
439
+ // Add columns as FieldRef objects
440
+ for (const [colName, colBuilder] of Object.entries(this.schema.columns)) {
441
+ const dbColumnName = colBuilder.build().name;
442
+ Object.defineProperty(mock, colName, {
443
+ get: () => ({
444
+ __fieldName: colName,
445
+ __dbColumnName: dbColumnName,
446
+ __tableAlias: this.schema.name,
447
+ }),
448
+ enumerable: true,
449
+ configurable: true,
450
+ });
451
+ }
452
+ // Add columns from manually joined tables
453
+ for (const join of this.manualJoins) {
454
+ if (join.isSubquery || !join.schema) {
455
+ continue;
456
+ }
457
+ for (const [colName, colBuilder] of Object.entries(join.schema.columns)) {
458
+ const dbColumnName = colBuilder.build().name;
459
+ if (!mock[join.alias]) {
460
+ mock[join.alias] = {};
461
+ }
462
+ Object.defineProperty(mock[join.alias], colName, {
463
+ get: () => ({
464
+ __fieldName: colName,
465
+ __dbColumnName: dbColumnName,
466
+ __tableAlias: join.alias,
467
+ }),
468
+ enumerable: true,
469
+ configurable: true,
470
+ });
471
+ }
472
+ }
473
+ return mock;
474
+ }
475
+ /**
476
+ * Create a mock GroupedItem for type inference
477
+ */
478
+ createMockGroupedItem() {
479
+ const mockRow = this.createMockRow();
480
+ const mockOriginalSelection = this.originalSelector(mockRow);
481
+ const mockKey = this.groupingKeySelector(mockOriginalSelection);
482
+ return {
483
+ key: mockKey,
484
+ count: () => {
485
+ return createAggregateFieldRef('COUNT');
486
+ },
487
+ sum: (selector) => {
488
+ return createAggregateFieldRef('SUM', selector);
489
+ },
490
+ min: (selector) => {
491
+ return createAggregateFieldRef('MIN', selector);
492
+ },
493
+ max: (selector) => {
494
+ return createAggregateFieldRef('MAX', selector);
495
+ },
496
+ avg: (selector) => {
497
+ return createAggregateFieldRef('AVG', selector);
498
+ },
499
+ };
500
+ }
501
+ /**
502
+ * Build HAVING condition SQL - handles aggregate field refs specially
503
+ */
504
+ buildHavingCondition(condition, context) {
505
+ // Replace aggregate field refs with SQL fragments in the condition
506
+ const transformedCondition = this.transformHavingCondition(condition);
507
+ // Now build the condition normally
508
+ const condBuilder = new conditions_1.ConditionBuilder();
509
+ const { sql, params } = condBuilder.build(transformedCondition, context.paramCounter);
510
+ context.paramCounter += params.length;
511
+ context.allParams.push(...params);
512
+ return sql;
513
+ }
514
+ /**
515
+ * Transform a HAVING condition by replacing aggregate field refs with SQL fragments
516
+ */
517
+ transformHavingCondition(condition) {
518
+ // If the condition has field references, check if they're aggregate refs
519
+ const cond = condition;
520
+ // Handle different condition types
521
+ if (cond.field && typeof cond.field === 'object' && '__isAggregate' in cond.field) {
522
+ // This is an aggregate comparison (e.g., COUNT(*) > 5)
523
+ const aggField = cond.field;
524
+ const aggSql = this.buildAggregateFieldSql(aggField);
525
+ // Create a new SQL fragment condition
526
+ // Since we can't easily replace the field, we'll create a SqlFragment
527
+ // that represents the whole expression
528
+ const operator = this.getOperatorForCondition(cond);
529
+ const value = cond.value;
530
+ // Build the full comparison SQL using SqlFragment's template literal style
531
+ // SqlFragment expects an array of strings (the template parts) and an array of values
532
+ return new conditions_1.SqlFragment([`${aggSql} ${operator} `, ''], [value]);
533
+ }
534
+ return condition;
535
+ }
536
+ /**
537
+ * Build SQL for an aggregate field reference
538
+ */
539
+ buildAggregateFieldSql(aggField) {
540
+ const aggType = aggField.__aggregateType;
541
+ if (aggType === 'COUNT') {
542
+ return 'COUNT(*)';
543
+ }
544
+ else if (aggField.__aggregateSelector) {
545
+ // Evaluate the selector to get the actual field
546
+ const mockRow = this.createMockRow();
547
+ const selectedField = aggField.__aggregateSelector(mockRow);
548
+ if (typeof selectedField === 'object' && selectedField !== null && '__dbColumnName' in selectedField) {
549
+ const field = selectedField;
550
+ const tableAlias = field.__tableAlias || this.schema.name;
551
+ return `${aggType}("${tableAlias}"."${field.__dbColumnName}")`;
552
+ }
553
+ else {
554
+ return `${aggType}(*)`;
555
+ }
556
+ }
557
+ else {
558
+ return `${aggType}(*)`;
559
+ }
560
+ }
561
+ /**
562
+ * Get the operator string from a condition object
563
+ */
564
+ getOperatorForCondition(cond) {
565
+ // Try to get the operator - this is a bit of a hack
566
+ // Different condition types have different ways to get the operator
567
+ if (cond.getOperator && typeof cond.getOperator === 'function') {
568
+ return cond.getOperator();
569
+ }
570
+ // Map common condition types to operators
571
+ const condName = cond.constructor?.name || '';
572
+ if (condName.includes('Eq'))
573
+ return '=';
574
+ if (condName.includes('Ne'))
575
+ return '!=';
576
+ if (condName.includes('Gt') && !condName.includes('Gte'))
577
+ return '>';
578
+ if (condName.includes('Gte'))
579
+ return '>=';
580
+ if (condName.includes('Lt') && !condName.includes('Lte'))
581
+ return '<';
582
+ if (condName.includes('Lte'))
583
+ return '<=';
584
+ return '='; // Default fallback
585
+ }
586
+ }
587
+ exports.GroupedSelectQueryBuilder = GroupedSelectQueryBuilder;
588
+ //# sourceMappingURL=grouped-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped-query.js","sourceRoot":"","sources":["../../src/query/grouped-query.ts"],"names":[],"mappings":";;;AAAA,6CAAuH;AAIvH,yCAAsC;AAmFtC;;GAEG;AACH,SAAS,uBAAuB,CAC9B,aAAsD,EACtD,QAA6B;IAE7B,OAAO;QACL,WAAW,EAAE,aAAa,CAAC,WAAW,EAAE;QACxC,cAAc,EAAE,aAAa,CAAC,WAAW,EAAE;QAC3C,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,aAAa;QAC9B,mBAAmB,EAAE,QAAQ;KAC9B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAa,mBAAmB;IAc9B,YACE,MAAmB,EACnB,MAAsB,EACtB,gBAAmC,EACnC,mBAAwD,EACxD,SAAqB,EACrB,QAAwB,EACxB,WAAoC,EACpC,WAAoB;QAbd,kBAAa,GAAwD,EAAE,CAAC;QAExE,gBAAW,GAA2B,EAAE,CAAC;QACzC,gBAAW,GAAW,CAAC,CAAC;QAY9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,QAAwE;QAExE,OAAO,IAAI,yBAAyB,CAClC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,QAAQ,EACR,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,WAAW,CACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,SAAwE;QAExE,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,mCAAmC;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAE7C,8DAA8D;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAA+B,CAAC,CAAC;QAE1E,OAAO;YACL,GAAG,EAAE,OAAc;YACnB,KAAK,EAAE,GAAG,EAAE;gBACV,OAAO,uBAAuB,CAAS,OAAO,CAAQ,CAAC;YACzD,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAS,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACjE,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACzD,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACzD,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAS,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACjE,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,IAAI,GAAQ,EAAE,CAAC;QAErB,kCAAkC;QAClC,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,MAAM,YAAY,GAAI,UAAkB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;gBACnC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;oBACV,WAAW,EAAE,OAAO;oBACpB,cAAc,EAAE,YAAY;oBAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;iBAC/B,CAAC;gBACF,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;QAED,0CAA0C;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAK,IAAY,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,MAAM,YAAY,GAAI,UAAkB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBACxB,CAAC;gBACD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE;oBAC/C,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;wBACV,WAAW,EAAE,OAAO;wBACpB,cAAc,EAAE,YAAY;wBAC5B,YAAY,EAAE,IAAI,CAAC,KAAK;qBACzB,CAAC;oBACF,UAAU,EAAE,IAAI;oBAChB,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAhJD,kDAgJC;AAED;;GAEG;AACH,MAAa,yBAAyB;IAepC,YACE,MAAmB,EACnB,MAAsB,EACtB,gBAAmC,EACnC,mBAAwD,EACxD,cAA8E,EAC9E,SAAqB,EACrB,UAAsB,EACtB,KAAc,EACd,MAAe,EACf,OAA6D,EAC7D,QAAwB,EACxB,WAAoC,EACpC,WAAoB;QAlBd,kBAAa,GAAwD,EAAE,CAAC;QAExE,gBAAW,GAA2B,EAAE,CAAC;QACzC,gBAAW,GAAW,CAAC,CAAC;QAiB9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,OAAO,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,SAAwE;QAExE,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAYD,OAAO,CAAC,QAAyE;QAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEpC,4CAA4C;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAsC,EAAE,CAAC;gBAC3E,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;oBAC1E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;wBACtB,KAAK,EAAG,QAAgB,CAAC,cAAc,IAAK,QAAgB,CAAC,WAAW;wBACxE,SAAS,EAAE,SAAS,IAAI,KAAK;qBAC9B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,mCAAmC;aAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;oBAC1E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;wBACtB,KAAK,EAAG,QAAgB,CAAC,cAAc,IAAK,QAAgB,CAAC,WAAW;wBACxE,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,sBAAsB;aACjB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;YACzE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAG,MAAc,CAAC,cAAc,IAAK,MAAc,CAAC,WAAW;gBACpE,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,OAAO,GAAiB;YAC5B,IAAI,EAAE,IAAI,GAAG,EAAE;YACf,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEjD,qEAAqE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ;YAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;YACxC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,gEAAgE;QAChE,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAW;QAClC,8DAA8D;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAElD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,WAAW,GAAQ,EAAE,CAAC;YAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAI,UAAkB,CAAC,GAAG,CAAC,CAAC;gBAE3C,sCAAsC;gBACtC,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,eAAe,IAAI,SAAS,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBAC1G,MAAM,OAAO,GAAI,SAA+B,CAAC,eAAe,CAAC;oBAEjE,kDAAkD;oBAClD,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;wBAC5G,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC3D,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBAC3B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,mCAAmC;oBACnC,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CACR,OAAc,OAAgB;QAE9B,MAAM,UAAU,GAAG,CAAC,YAAuD,EAAU,EAAE;YACrF,MAAM,OAAO,GAAiB;gBAC5B,IAAI,EAAE,IAAI,GAAG,EAAE;gBACf,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,YAAY,CAAC,YAAY;gBACvC,SAAS,EAAE,YAAY,CAAC,MAAM;aAC/B,CAAC;YAEF,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzC,YAAY,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;YAEjD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,OAAO,IAAI,mBAAQ,CAAC,UAAU,EAAE,IAAI,CAAQ,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAqB;QACtC,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqC,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAElD,gDAAgD;QAChD,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAyB,CAAC,EAAE,CAAC;YACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,KAAK,EAAE,CAAC;gBAC7E,MAAM,KAAK,GAAG,KAAY,CAAC;gBAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC1D,aAAa,CAAC,IAAI,CAAC,IAAI,UAAU,MAAM,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAoB,CAAC,EAAE,CAAC;YAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,IAAI,KAAK,IAAK,KAAa,CAAC,aAAa,EAAE,CAAC;gBAC5G,2DAA2D;gBAC3D,MAAM,QAAQ,GAAG,KAA0B,CAAC;gBAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAEzC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;oBACxB,mEAAmE;oBACnE,WAAW,CAAC,IAAI,CAAC,iCAAiC,KAAK,GAAG,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;oBACxC,mCAAmC;oBACnC,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;oBAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,KAAK,EAAE,CAAC;wBAC7E,MAAM,QAAQ,GAAG,KAAY,CAAC;wBAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBAE7D,+CAA+C;wBAC/C,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;4BAC3C,8EAA8E;4BAC9E,WAAW,CAAC,IAAI,CAAC,QAAQ,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,cAAc,+BAA+B,KAAK,GAAG,CAAC,CAAC;wBACvH,CAAC;6BAAM,CAAC;4BACN,2FAA2F;4BAC3F,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,cAAc,UAAU,KAAK,GAAG,CAAC,CAAC;wBAC7F,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,mFAAmF;oBACnF,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,WAAW,KAAK,GAAG,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,iBAAiB,IAAI,KAAK,EAAE,CAAC;gBACrF,yEAAyE;gBACzE,MAAM,GAAG,GAAG,KAAwB,CAAC;gBACrC,IAAI,GAAG,CAAC,eAAe,KAAK,OAAO,EAAE,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC,iCAAiC,KAAK,GAAG,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;oBAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;oBAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,KAAK,EAAE,CAAC;wBAC7E,MAAM,QAAQ,GAAG,KAAY,CAAC;wBAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBAE7D,IAAI,GAAG,CAAC,eAAe,KAAK,KAAK,IAAI,GAAG,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;4BACnE,WAAW,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,eAAe,KAAK,UAAU,MAAM,QAAQ,CAAC,cAAc,+BAA+B,KAAK,GAAG,CAAC,CAAC;wBACnI,CAAC;6BAAM,CAAC;4BACN,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,eAAe,KAAK,UAAU,MAAM,QAAQ,CAAC,cAAc,UAAU,KAAK,GAAG,CAAC,CAAC;wBACzG,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,KAAK,EAAE,CAAC;gBACpF,+CAA+C;gBAC/C,MAAM,KAAK,GAAG,KAAY,CAAC;gBAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC1D,WAAW,CAAC,IAAI,CAAC,IAAI,UAAU,MAAM,KAAK,CAAC,cAAc,SAAS,KAAK,GAAG,CAAC,CAAC;YAC9E,CAAC;iBAAM,IAAI,KAAK,YAAY,wBAAW,EAAE,CAAC;gBACxC,eAAe;gBACf,MAAM,eAAe,GAAG;oBACtB,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,MAAM,EAAE,OAAO,CAAC,SAAS;iBAC1B,CAAC;gBACF,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBACpD,OAAO,CAAC,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC;gBACpD,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,QAAQ,KAAK,GAAG,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,UAAU,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAE9C,mBAAmB;QACnB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;YAC7E,MAAM,WAAW,GAAG,IAAI,6BAAgB,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAC3G,OAAO,CAAC,YAAY,IAAI,UAAU,CAAC,MAAM,CAAC;YAC1C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAEtC,mCAAmC;YACnC,IAAK,UAAkB,CAAC,UAAU,IAAK,UAAkB,CAAC,QAAQ,EAAE,CAAC;gBACnE,MAAM,oBAAoB,GAAG;oBAC3B,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,MAAM,EAAE,OAAO,CAAC,SAAS;iBAC1B,CAAC;gBACF,MAAM,WAAW,GAAI,UAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAChF,OAAO,CAAC,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC;gBACzD,UAAU,IAAI,KAAK,WAAW,KAAK,WAAW,SAAS,UAAU,CAAC,KAAK,QAAQ,OAAO,EAAE,CAAC;YAC3F,CAAC;iBAAM,CAAC;gBACN,UAAU,IAAI,KAAK,WAAW,KAAK,UAAU,CAAC,KAAK,SAAS,UAAU,CAAC,KAAK,QAAQ,OAAO,EAAE,CAAC;YAChG,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,IAAI,6BAAgB,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAChF,WAAW,GAAG,SAAS,GAAG,EAAE,CAAC;YAC7B,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC;YACtC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,wBAAwB;QACxB,MAAM,aAAa,GAAG,YAAY,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAE7D,sBAAsB;QACtB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,0FAA0F;YAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACtE,YAAY,GAAG,UAAU,SAAS,EAAE,CAAC;QACvC,CAAC;QAED,wBAAwB;QACxB,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACvC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CACpD,CAAC;YACF,aAAa,GAAG,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,CAAC;QAED,qBAAqB;QACrB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,WAAW,GAAG,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,WAAW,IAAI,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,KAAK,WAAW,KAAK,aAAa,KAAK,YAAY,KAAK,aAAa,KAAK,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAEjK,OAAO;YACL,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,OAAO,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,IAAI,GAAQ,EAAE,CAAC;QAErB,kCAAkC;QAClC,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,MAAM,YAAY,GAAI,UAAkB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;gBACnC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;oBACV,WAAW,EAAE,OAAO;oBACpB,cAAc,EAAE,YAAY;oBAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;iBAC/B,CAAC;gBACF,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;QAED,0CAA0C;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAK,IAAY,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,MAAM,YAAY,GAAI,UAAkB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBACxB,CAAC;gBACD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE;oBAC/C,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;wBACV,WAAW,EAAE,OAAO;wBACpB,cAAc,EAAE,YAAY;wBAC5B,YAAY,EAAE,IAAI,CAAC,KAAK;qBACzB,CAAC;oBACF,UAAU,EAAE,IAAI;oBAChB,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqC,CAAC,CAAC;QAEhF,OAAO;YACL,GAAG,EAAE,OAAc;YACnB,KAAK,EAAE,GAAG,EAAE;gBACV,OAAO,uBAAuB,CAAS,OAAO,CAAQ,CAAC;YACzD,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAS,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACjE,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACzD,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACzD,CAAC;YACD,GAAG,EAAE,CAAC,QAAa,EAAE,EAAE;gBACrB,OAAO,uBAAuB,CAAS,KAAK,EAAE,QAAQ,CAAQ,CAAC;YACjE,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,SAAoB,EAAE,OAAqB;QACtE,mEAAmE;QACnE,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAEtE,mCAAmC;QACnC,MAAM,WAAW,GAAG,IAAI,6BAAgB,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACtF,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC;QACtC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAClC,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,SAAoB;QACnD,yEAAyE;QACzE,MAAM,IAAI,GAAG,SAAgB,CAAC;QAE9B,mCAAmC;QACnC,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,eAAe,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAClF,uDAAuD;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAA0B,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAErD,sCAAsC;YACtC,sEAAsE;YACtE,uCAAuC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAEzB,2EAA2E;YAC3E,sFAAsF;YACtF,OAAO,IAAI,wBAAW,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAQ,CAAC;QACzE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,QAA2B;QACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC;QAEzC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC;QACpB,CAAC;aAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACxC,gDAAgD;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAE5D,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;gBACrG,MAAM,KAAK,GAAG,aAAoB,CAAC;gBACnC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC1D,OAAO,GAAG,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC,cAAc,IAAI,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,OAAO,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,IAAS;QACvC,oDAAoD;QACpD,oEAAoE;QACpE,IAAI,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAED,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QACxC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACrE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACrE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,OAAO,GAAG,CAAC,CAAC,mBAAmB;IACjC,CAAC;CACF;AA7hBD,8DA6hBC"}