@devrev/meerkat-node 0.0.122 → 0.0.124

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.
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Synthetic Schema Setup
3
+ *
4
+ * Creates comprehensive test tables with 1M+ rows covering all data types
5
+ * and patterns used in production Meerkat queries.
6
+ */ "use strict";
7
+ function _export(target, all) {
8
+ for(var name in all)Object.defineProperty(target, name, {
9
+ enumerable: true,
10
+ get: all[name]
11
+ });
12
+ }
13
+ _export(exports, {
14
+ createAllSyntheticTables: function() {
15
+ return createAllSyntheticTables;
16
+ },
17
+ createDimPartTable: function() {
18
+ return createDimPartTable;
19
+ },
20
+ createDimUserTable: function() {
21
+ return createDimUserTable;
22
+ },
23
+ createFactAllTypesTable: function() {
24
+ return createFactAllTypesTable;
25
+ },
26
+ dropSyntheticTables: function() {
27
+ return dropSyntheticTables;
28
+ },
29
+ verifySyntheticTables: function() {
30
+ return verifySyntheticTables;
31
+ }
32
+ });
33
+ const _duckdbexec = require("../../../duckdb-exec");
34
+ async function createFactAllTypesTable() {
35
+ console.log('Creating fact_all_types table with 1M rows...');
36
+ await (0, _duckdbexec.duckdbExec)(`
37
+ CREATE TABLE IF NOT EXISTS fact_all_types AS
38
+ SELECT
39
+ -- Keys/IDs
40
+ i AS id_bigint,
41
+ 'inc_' || (i % 100000) AS incident_id,
42
+ 'user_' || (i % 10000) AS user_id,
43
+ 'part_' || (i % 5000) AS part_id,
44
+
45
+ -- Numeric types: BIGINT
46
+ CAST(i * 10 AS BIGINT) AS metric_bigint,
47
+ CAST((i % 1000) AS BIGINT) AS small_bigint,
48
+
49
+ -- Numeric types: NUMERIC/DECIMAL
50
+ CAST((i % 1000) / 10.0 AS DECIMAL(18,2)) AS metric_numeric,
51
+ CAST((i % 10000) / 100.0 AS DECIMAL(18,4)) AS precise_numeric,
52
+
53
+ -- Numeric types: DOUBLE/FLOAT
54
+ (i % 1000) / 3.0 AS metric_double,
55
+ (i % 1000) * 1.5 AS metric_float,
56
+
57
+ -- Boolean
58
+ (i % 10 = 0) AS is_deleted,
59
+ (i % 3 = 0) AS flag_boolean,
60
+ -- Use a different modulus base to avoid correlation with status buckets.
61
+ ((CAST(i / 3 AS BIGINT)) % 2 = 0) AS is_active,
62
+ CASE WHEN i % 7 = 0 THEN NULL ELSE CAST(i % 10000 AS BIGINT) END AS resolved_by,
63
+
64
+ -- Strings/enums (VARCHAR)
65
+ CASE (i % 5)
66
+ WHEN 0 THEN 'high'
67
+ WHEN 1 THEN 'medium'
68
+ WHEN 2 THEN 'low'
69
+ WHEN 3 THEN 'critical'
70
+ ELSE 'unknown'
71
+ END AS priority,
72
+
73
+ CASE (i % 4)
74
+ WHEN 0 THEN 'open'
75
+ WHEN 1 THEN 'in_progress'
76
+ WHEN 2 THEN 'resolved'
77
+ ELSE 'closed'
78
+ END AS status,
79
+
80
+ CASE (i % 3)
81
+ WHEN 0 THEN 'P0'
82
+ WHEN 1 THEN 'P1'
83
+ ELSE 'P2'
84
+ END AS severity_label,
85
+
86
+ CASE (i % 4)
87
+ WHEN 0 THEN 'production'
88
+ WHEN 1 THEN 'staging'
89
+ WHEN 2 THEN 'development'
90
+ ELSE 'test'
91
+ END AS environment,
92
+
93
+ 'Title ' || i AS title,
94
+ 'Test description for incident ' || i AS description,
95
+
96
+ -- Dates (cast to INTEGER for date arithmetic)
97
+ -- Using % 1460 for ~4 year cycle, % 366 for full year including leap day
98
+ DATE '2020-01-01' + CAST((i % 1460) AS INTEGER) AS record_date,
99
+ DATE '2020-01-01' + CAST((i % 366) AS INTEGER) AS created_date,
100
+ DATE '2020-01-01' + CAST(((i + 30) % 1460) AS INTEGER) AS mitigated_date,
101
+ DATE '2019-01-01' + CAST((i % 730) AS INTEGER) AS partition_record_date,
102
+
103
+ -- Timestamps
104
+ TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST((i % 1460) AS INTEGER)) DAY + INTERVAL (CAST((i % 86400) AS INTEGER)) SECOND AS created_timestamp,
105
+ TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST(((i + 100) % 1460) AS INTEGER)) DAY AS identified_timestamp,
106
+ TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST((i % 366) AS INTEGER)) DAY AS deployment_time,
107
+ TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST((i % 1460) AS INTEGER)) DAY AS partition_record_ts,
108
+
109
+ -- Arrays (VARCHAR[])
110
+ CASE
111
+ WHEN i % 4 = 0 THEN ARRAY['backend', 'urgent']
112
+ WHEN i % 4 = 1 THEN ARRAY['frontend']
113
+ WHEN i % 4 = 2 THEN ARRAY['api', 'backend']
114
+ ELSE ARRAY[]::VARCHAR[]
115
+ END AS tags,
116
+
117
+ CASE
118
+ WHEN i % 3 = 0 THEN ARRAY['user_' || ((i % 1000) + 1), 'user_' || ((i % 1000) + 2)]
119
+ WHEN i % 3 = 1 THEN ARRAY['user_' || (i % 1000)]
120
+ ELSE ARRAY[]::VARCHAR[]
121
+ END AS owned_by_ids,
122
+
123
+ CASE
124
+ WHEN i % 5 = 0 THEN ARRAY['part_' || (i % 500), 'part_' || ((i % 500) + 1), 'part_' || ((i % 500) + 2)]
125
+ WHEN i % 5 = 1 THEN ARRAY['part_' || (i % 500)]
126
+ ELSE ARRAY[]::VARCHAR[]
127
+ END AS part_ids,
128
+
129
+ -- JSON-like VARCHAR (to test JSON extraction)
130
+ '{"severity_id": ' || ((i % 5) + 1) || ', "impact": "' ||
131
+ CASE (i % 3)
132
+ WHEN 0 THEN 'high'
133
+ WHEN 1 THEN 'medium'
134
+ ELSE 'low'
135
+ END ||
136
+ '", "source": "' ||
137
+ CASE (i % 3)
138
+ WHEN 0 THEN 'web'
139
+ WHEN 1 THEN 'mobile'
140
+ ELSE 'api'
141
+ END ||
142
+ '", "reported_by": "' || 'user_' || (i % 100) || '"}' AS metadata_json,
143
+
144
+ '{"stage": "' ||
145
+ CASE (i % 4)
146
+ WHEN 0 THEN 'investigation'
147
+ WHEN 1 THEN 'mitigation'
148
+ WHEN 2 THEN 'resolution'
149
+ ELSE 'closed'
150
+ END || '"}' AS stage_json,
151
+
152
+ '{"customers": [' ||
153
+ '"customer_' || (i % 1000) || '", ' ||
154
+ '"customer_' || ((i % 1000) + 1) || '"' ||
155
+ ']}' AS impact_json,
156
+
157
+ -- Derived-style fields (mirroring real widget expressions)
158
+ (i % 10000) AS mtti_seconds,
159
+ MONTHNAME(DATE '2020-01-01' + CAST((i % 365) AS INTEGER)) AS created_month,
160
+ (i % 5) AS severity_id_int,
161
+
162
+ -- Special values for NULL testing
163
+ CASE WHEN i % 10 = 0 THEN NULL ELSE 'value_' || i END AS nullable_string,
164
+ CASE WHEN i % 15 = 0 THEN NULL ELSE (i % 1000) END AS nullable_int,
165
+ CASE WHEN i % 20 = 0 THEN NULL ELSE DATE '2020-01-01' + CAST((i % 365) AS INTEGER) END AS nullable_date,
166
+
167
+ -- Edge case values
168
+ CASE
169
+ WHEN i % 100 = 0 THEN 'value with "quotes"'
170
+ WHEN i % 100 = 1 THEN 'value with ''apostrophe'''
171
+ WHEN i % 100 = 2 THEN 'value with \\ backslash'
172
+ WHEN i % 100 = 3 THEN ''
173
+ ELSE 'normal_value_' || i
174
+ END AS edge_case_string
175
+
176
+ FROM range(0, 1000000) AS t(i)
177
+ `);
178
+ console.log('✅ Created fact_all_types with 1M rows');
179
+ }
180
+ async function createDimUserTable() {
181
+ console.log('Creating dim_user table...');
182
+ await (0, _duckdbexec.duckdbExec)(`
183
+ CREATE TABLE IF NOT EXISTS dim_user AS
184
+ SELECT
185
+ 'user_' || i AS user_id,
186
+ 'User ' || i AS user_name,
187
+ 'user' || i || '@example.com' AS user_email,
188
+ CASE (i % 3)
189
+ WHEN 0 THEN 'enterprise'
190
+ WHEN 1 THEN 'pro'
191
+ ELSE 'free'
192
+ END AS user_segment,
193
+ CASE (i % 4)
194
+ WHEN 0 THEN 'engineering'
195
+ WHEN 1 THEN 'product'
196
+ WHEN 2 THEN 'support'
197
+ ELSE 'sales'
198
+ END AS user_department,
199
+ DATE '2019-01-01' + CAST((i % 1095) AS INTEGER) AS user_created_date,
200
+ (i % 2 = 0) AS is_active_user
201
+ FROM range(0, 10000) AS t(i)
202
+ `);
203
+ console.log('✅ Created dim_user with 10K rows');
204
+ }
205
+ async function createDimPartTable() {
206
+ console.log('Creating dim_part table...');
207
+ await (0, _duckdbexec.duckdbExec)(`
208
+ CREATE TABLE IF NOT EXISTS dim_part AS
209
+ SELECT
210
+ 'part_' || i AS part_id,
211
+ 'Part ' || i AS part_name,
212
+ CASE (i % 5)
213
+ WHEN 0 THEN 'electronics'
214
+ WHEN 1 THEN 'furniture'
215
+ WHEN 2 THEN 'clothing'
216
+ WHEN 3 THEN 'food'
217
+ ELSE 'other'
218
+ END AS product_category,
219
+ CASE (i % 3)
220
+ WHEN 0 THEN 'premium'
221
+ WHEN 1 THEN 'standard'
222
+ ELSE 'budget'
223
+ END AS product_tier,
224
+ (i % 1000) / 10.0 AS weight,
225
+ (i % 10000) / 100.0 AS price,
226
+ (i % 2 = 0) AS in_stock
227
+ FROM range(0, 5000) AS t(i)
228
+ `);
229
+ console.log('✅ Created dim_part with 5K rows');
230
+ }
231
+ async function createAllSyntheticTables() {
232
+ const startTime = Date.now();
233
+ await createFactAllTypesTable();
234
+ await createDimUserTable();
235
+ await createDimPartTable();
236
+ const duration = ((Date.now() - startTime) / 1000).toFixed(2);
237
+ console.log(`\n✅ All synthetic tables created in ${duration}s`);
238
+ }
239
+ async function dropSyntheticTables() {
240
+ console.log('Dropping synthetic tables...');
241
+ await (0, _duckdbexec.duckdbExec)('DROP TABLE IF EXISTS fact_all_types');
242
+ await (0, _duckdbexec.duckdbExec)('DROP TABLE IF EXISTS dim_user');
243
+ await (0, _duckdbexec.duckdbExec)('DROP TABLE IF EXISTS dim_part');
244
+ console.log('✅ Synthetic tables dropped');
245
+ }
246
+ async function verifySyntheticTables() {
247
+ const factCount = await (0, _duckdbexec.duckdbExec)('SELECT COUNT(*) as count FROM fact_all_types');
248
+ const userCount = await (0, _duckdbexec.duckdbExec)('SELECT COUNT(*) as count FROM dim_user');
249
+ const partCount = await (0, _duckdbexec.duckdbExec)('SELECT COUNT(*) as count FROM dim_part');
250
+ console.log('\n📊 Synthetic Table Verification:');
251
+ console.log(` fact_all_types: ${factCount[0].count} rows`);
252
+ console.log(` dim_user: ${userCount[0].count} rows`);
253
+ console.log(` dim_part: ${partCount[0].count} rows`);
254
+ }
255
+
256
+ //# sourceMappingURL=schema-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../meerkat-node/src/__tests__/comprehensive/synthetic/schema-setup.ts"],"sourcesContent":["/**\n * Synthetic Schema Setup\n * \n * Creates comprehensive test tables with 1M+ rows covering all data types\n * and patterns used in production Meerkat queries.\n */\n\nimport { duckdbExec } from '../../../duckdb-exec';\n\n/**\n * Create the comprehensive fact_all_types table\n * This table contains ~100 columns covering all normalized DB types\n */\nexport async function createFactAllTypesTable(): Promise<void> {\n console.log('Creating fact_all_types table with 1M rows...');\n \n await duckdbExec(`\n CREATE TABLE IF NOT EXISTS fact_all_types AS\n SELECT\n -- Keys/IDs\n i AS id_bigint,\n 'inc_' || (i % 100000) AS incident_id,\n 'user_' || (i % 10000) AS user_id,\n 'part_' || (i % 5000) AS part_id,\n \n -- Numeric types: BIGINT\n CAST(i * 10 AS BIGINT) AS metric_bigint,\n CAST((i % 1000) AS BIGINT) AS small_bigint,\n \n -- Numeric types: NUMERIC/DECIMAL\n CAST((i % 1000) / 10.0 AS DECIMAL(18,2)) AS metric_numeric,\n CAST((i % 10000) / 100.0 AS DECIMAL(18,4)) AS precise_numeric,\n \n -- Numeric types: DOUBLE/FLOAT\n (i % 1000) / 3.0 AS metric_double,\n (i % 1000) * 1.5 AS metric_float,\n \n -- Boolean\n (i % 10 = 0) AS is_deleted,\n (i % 3 = 0) AS flag_boolean,\n -- Use a different modulus base to avoid correlation with status buckets.\n ((CAST(i / 3 AS BIGINT)) % 2 = 0) AS is_active,\n CASE WHEN i % 7 = 0 THEN NULL ELSE CAST(i % 10000 AS BIGINT) END AS resolved_by,\n \n -- Strings/enums (VARCHAR)\n CASE (i % 5)\n WHEN 0 THEN 'high'\n WHEN 1 THEN 'medium'\n WHEN 2 THEN 'low'\n WHEN 3 THEN 'critical'\n ELSE 'unknown'\n END AS priority,\n \n CASE (i % 4)\n WHEN 0 THEN 'open'\n WHEN 1 THEN 'in_progress'\n WHEN 2 THEN 'resolved'\n ELSE 'closed'\n END AS status,\n \n CASE (i % 3)\n WHEN 0 THEN 'P0'\n WHEN 1 THEN 'P1'\n ELSE 'P2'\n END AS severity_label,\n \n CASE (i % 4)\n WHEN 0 THEN 'production'\n WHEN 1 THEN 'staging'\n WHEN 2 THEN 'development'\n ELSE 'test'\n END AS environment,\n \n 'Title ' || i AS title,\n 'Test description for incident ' || i AS description,\n \n -- Dates (cast to INTEGER for date arithmetic)\n -- Using % 1460 for ~4 year cycle, % 366 for full year including leap day\n DATE '2020-01-01' + CAST((i % 1460) AS INTEGER) AS record_date,\n DATE '2020-01-01' + CAST((i % 366) AS INTEGER) AS created_date,\n DATE '2020-01-01' + CAST(((i + 30) % 1460) AS INTEGER) AS mitigated_date,\n DATE '2019-01-01' + CAST((i % 730) AS INTEGER) AS partition_record_date,\n \n -- Timestamps\n TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST((i % 1460) AS INTEGER)) DAY + INTERVAL (CAST((i % 86400) AS INTEGER)) SECOND AS created_timestamp,\n TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST(((i + 100) % 1460) AS INTEGER)) DAY AS identified_timestamp,\n TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST((i % 366) AS INTEGER)) DAY AS deployment_time,\n TIMESTAMP '2020-01-01 00:00:00' + INTERVAL (CAST((i % 1460) AS INTEGER)) DAY AS partition_record_ts,\n \n -- Arrays (VARCHAR[])\n CASE\n WHEN i % 4 = 0 THEN ARRAY['backend', 'urgent']\n WHEN i % 4 = 1 THEN ARRAY['frontend']\n WHEN i % 4 = 2 THEN ARRAY['api', 'backend']\n ELSE ARRAY[]::VARCHAR[]\n END AS tags,\n \n CASE\n WHEN i % 3 = 0 THEN ARRAY['user_' || ((i % 1000) + 1), 'user_' || ((i % 1000) + 2)]\n WHEN i % 3 = 1 THEN ARRAY['user_' || (i % 1000)]\n ELSE ARRAY[]::VARCHAR[]\n END AS owned_by_ids,\n \n CASE\n WHEN i % 5 = 0 THEN ARRAY['part_' || (i % 500), 'part_' || ((i % 500) + 1), 'part_' || ((i % 500) + 2)]\n WHEN i % 5 = 1 THEN ARRAY['part_' || (i % 500)]\n ELSE ARRAY[]::VARCHAR[]\n END AS part_ids,\n \n -- JSON-like VARCHAR (to test JSON extraction)\n '{\"severity_id\": ' || ((i % 5) + 1) || ', \"impact\": \"' ||\n CASE (i % 3)\n WHEN 0 THEN 'high'\n WHEN 1 THEN 'medium'\n ELSE 'low'\n END ||\n '\", \"source\": \"' ||\n CASE (i % 3)\n WHEN 0 THEN 'web'\n WHEN 1 THEN 'mobile'\n ELSE 'api'\n END ||\n '\", \"reported_by\": \"' || 'user_' || (i % 100) || '\"}' AS metadata_json,\n \n '{\"stage\": \"' || \n CASE (i % 4)\n WHEN 0 THEN 'investigation'\n WHEN 1 THEN 'mitigation'\n WHEN 2 THEN 'resolution'\n ELSE 'closed'\n END || '\"}' AS stage_json,\n \n '{\"customers\": [' || \n '\"customer_' || (i % 1000) || '\", ' ||\n '\"customer_' || ((i % 1000) + 1) || '\"' ||\n ']}' AS impact_json,\n \n -- Derived-style fields (mirroring real widget expressions)\n (i % 10000) AS mtti_seconds,\n MONTHNAME(DATE '2020-01-01' + CAST((i % 365) AS INTEGER)) AS created_month,\n (i % 5) AS severity_id_int,\n \n -- Special values for NULL testing\n CASE WHEN i % 10 = 0 THEN NULL ELSE 'value_' || i END AS nullable_string,\n CASE WHEN i % 15 = 0 THEN NULL ELSE (i % 1000) END AS nullable_int,\n CASE WHEN i % 20 = 0 THEN NULL ELSE DATE '2020-01-01' + CAST((i % 365) AS INTEGER) END AS nullable_date,\n \n -- Edge case values\n CASE\n WHEN i % 100 = 0 THEN 'value with \"quotes\"'\n WHEN i % 100 = 1 THEN 'value with ''apostrophe'''\n WHEN i % 100 = 2 THEN 'value with \\\\ backslash'\n WHEN i % 100 = 3 THEN ''\n ELSE 'normal_value_' || i\n END AS edge_case_string\n \n FROM range(0, 1000000) AS t(i)\n `);\n \n console.log('✅ Created fact_all_types with 1M rows');\n}\n\n/**\n * Create dimension table: dim_user\n */\nexport async function createDimUserTable(): Promise<void> {\n console.log('Creating dim_user table...');\n \n await duckdbExec(`\n CREATE TABLE IF NOT EXISTS dim_user AS\n SELECT\n 'user_' || i AS user_id,\n 'User ' || i AS user_name,\n 'user' || i || '@example.com' AS user_email,\n CASE (i % 3)\n WHEN 0 THEN 'enterprise'\n WHEN 1 THEN 'pro'\n ELSE 'free'\n END AS user_segment,\n CASE (i % 4)\n WHEN 0 THEN 'engineering'\n WHEN 1 THEN 'product'\n WHEN 2 THEN 'support'\n ELSE 'sales'\n END AS user_department,\n DATE '2019-01-01' + CAST((i % 1095) AS INTEGER) AS user_created_date,\n (i % 2 = 0) AS is_active_user\n FROM range(0, 10000) AS t(i)\n `);\n \n console.log('✅ Created dim_user with 10K rows');\n}\n\n/**\n * Create dimension table: dim_part\n */\nexport async function createDimPartTable(): Promise<void> {\n console.log('Creating dim_part table...');\n \n await duckdbExec(`\n CREATE TABLE IF NOT EXISTS dim_part AS\n SELECT\n 'part_' || i AS part_id,\n 'Part ' || i AS part_name,\n CASE (i % 5)\n WHEN 0 THEN 'electronics'\n WHEN 1 THEN 'furniture'\n WHEN 2 THEN 'clothing'\n WHEN 3 THEN 'food'\n ELSE 'other'\n END AS product_category,\n CASE (i % 3)\n WHEN 0 THEN 'premium'\n WHEN 1 THEN 'standard'\n ELSE 'budget'\n END AS product_tier,\n (i % 1000) / 10.0 AS weight,\n (i % 10000) / 100.0 AS price,\n (i % 2 = 0) AS in_stock\n FROM range(0, 5000) AS t(i)\n `);\n \n console.log('✅ Created dim_part with 5K rows');\n}\n\n/**\n * Create all synthetic tables in one go\n */\nexport async function createAllSyntheticTables(): Promise<void> {\n const startTime = Date.now();\n \n await createFactAllTypesTable();\n await createDimUserTable();\n await createDimPartTable();\n \n const duration = ((Date.now() - startTime) / 1000).toFixed(2);\n console.log(`\\n✅ All synthetic tables created in ${duration}s`);\n}\n\n/**\n * Drop all synthetic tables (for cleanup)\n */\nexport async function dropSyntheticTables(): Promise<void> {\n console.log('Dropping synthetic tables...');\n \n await duckdbExec('DROP TABLE IF EXISTS fact_all_types');\n await duckdbExec('DROP TABLE IF EXISTS dim_user');\n await duckdbExec('DROP TABLE IF EXISTS dim_part');\n \n console.log('✅ Synthetic tables dropped');\n}\n\n/**\n * Verify tables exist and have data\n */\nexport async function verifySyntheticTables(): Promise<void> {\n const factCount = (await duckdbExec(\n 'SELECT COUNT(*) as count FROM fact_all_types'\n )) as Array<{ count: number }>;\n const userCount = (await duckdbExec(\n 'SELECT COUNT(*) as count FROM dim_user'\n )) as Array<{ count: number }>;\n const partCount = (await duckdbExec(\n 'SELECT COUNT(*) as count FROM dim_part'\n )) as Array<{ count: number }>;\n \n console.log('\\n📊 Synthetic Table Verification:');\n console.log(` fact_all_types: ${factCount[0].count} rows`);\n console.log(` dim_user: ${userCount[0].count} rows`);\n console.log(` dim_part: ${partCount[0].count} rows`);\n}\n\n"],"names":["createAllSyntheticTables","createDimPartTable","createDimUserTable","createFactAllTypesTable","dropSyntheticTables","verifySyntheticTables","console","log","duckdbExec","startTime","Date","now","duration","toFixed","factCount","userCount","partCount","count"],"mappings":"AAAA;;;;;CAKC;;;;;;;;IA+NqBA,wBAAwB;eAAxBA;;IAhCAC,kBAAkB;eAAlBA;;IA/BAC,kBAAkB;eAAlBA;;IAxJAC,uBAAuB;eAAvBA;;IAqOAC,mBAAmB;eAAnBA;;IAaAC,qBAAqB;eAArBA;;;4BAxPK;AAMpB,eAAeF;IACpBG,QAAQC,GAAG,CAAC;IAEZ,MAAMC,IAAAA,sBAAU,EAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6IlB,CAAC;IAEDF,QAAQC,GAAG,CAAC;AACd;AAKO,eAAeL;IACpBI,QAAQC,GAAG,CAAC;IAEZ,MAAMC,IAAAA,sBAAU,EAAC,CAAC;;;;;;;;;;;;;;;;;;;;EAoBlB,CAAC;IAEDF,QAAQC,GAAG,CAAC;AACd;AAKO,eAAeN;IACpBK,QAAQC,GAAG,CAAC;IAEZ,MAAMC,IAAAA,sBAAU,EAAC,CAAC;;;;;;;;;;;;;;;;;;;;;EAqBlB,CAAC;IAEDF,QAAQC,GAAG,CAAC;AACd;AAKO,eAAeP;IACpB,MAAMS,YAAYC,KAAKC,GAAG;IAE1B,MAAMR;IACN,MAAMD;IACN,MAAMD;IAEN,MAAMW,WAAW,AAAC,CAAA,AAACF,CAAAA,KAAKC,GAAG,KAAKF,SAAQ,IAAK,IAAG,EAAGI,OAAO,CAAC;IAC3DP,QAAQC,GAAG,CAAC,CAAC,oCAAoC,EAAEK,SAAS,CAAC,CAAC;AAChE;AAKO,eAAeR;IACpBE,QAAQC,GAAG,CAAC;IAEZ,MAAMC,IAAAA,sBAAU,EAAC;IACjB,MAAMA,IAAAA,sBAAU,EAAC;IACjB,MAAMA,IAAAA,sBAAU,EAAC;IAEjBF,QAAQC,GAAG,CAAC;AACd;AAKO,eAAeF;IACpB,MAAMS,YAAa,MAAMN,IAAAA,sBAAU,EACjC;IAEF,MAAMO,YAAa,MAAMP,IAAAA,sBAAU,EACjC;IAEF,MAAMQ,YAAa,MAAMR,IAAAA,sBAAU,EACjC;IAGFF,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC,CAAC,mBAAmB,EAAEO,SAAS,CAAC,EAAE,CAACG,KAAK,CAAC,KAAK,CAAC;IAC3DX,QAAQC,GAAG,CAAC,CAAC,aAAa,EAAEQ,SAAS,CAAC,EAAE,CAACE,KAAK,CAAC,KAAK,CAAC;IACrDX,QAAQC,GAAG,CAAC,CAAC,aAAa,EAAES,SAAS,CAAC,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;AACvD"}