@motherbase/client 1.5.0 → 1.5.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 (94) hide show
  1. package/README.md +25 -1
  2. package/dist/admin.d.ts +131 -0
  3. package/dist/admin.d.ts.map +1 -0
  4. package/dist/admin.js +121 -0
  5. package/dist/admin.js.map +1 -0
  6. package/dist/auth.d.ts +463 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +884 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/channel.d.ts +129 -0
  11. package/dist/channel.d.ts.map +1 -0
  12. package/dist/channel.js +215 -0
  13. package/dist/channel.js.map +1 -0
  14. package/dist/compat.d.ts +40 -0
  15. package/dist/compat.d.ts.map +1 -0
  16. package/dist/compat.js +100 -0
  17. package/dist/compat.js.map +1 -0
  18. package/dist/cookie.d.ts +68 -0
  19. package/dist/cookie.d.ts.map +1 -0
  20. package/dist/cookie.js +152 -0
  21. package/dist/cookie.js.map +1 -0
  22. package/dist/database.d.ts +188 -0
  23. package/dist/database.d.ts.map +1 -0
  24. package/dist/database.js +2 -0
  25. package/dist/database.js.map +1 -0
  26. package/dist/functions.d.ts +60 -0
  27. package/dist/functions.d.ts.map +1 -0
  28. package/dist/functions.js +75 -0
  29. package/dist/functions.js.map +1 -0
  30. package/dist/http.d.ts +122 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +206 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/index.d.ts +215 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +365 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mfa.d.ts +126 -0
  39. package/dist/mfa.d.ts.map +1 -0
  40. package/dist/mfa.js +167 -0
  41. package/dist/mfa.js.map +1 -0
  42. package/dist/organization.d.ts +234 -0
  43. package/dist/organization.d.ts.map +1 -0
  44. package/dist/organization.js +157 -0
  45. package/dist/organization.js.map +1 -0
  46. package/dist/passkey.d.ts +59 -0
  47. package/dist/passkey.d.ts.map +1 -0
  48. package/dist/passkey.js +87 -0
  49. package/dist/passkey.js.map +1 -0
  50. package/dist/pkce.d.ts +13 -0
  51. package/dist/pkce.d.ts.map +1 -0
  52. package/dist/pkce.js +52 -0
  53. package/dist/pkce.js.map +1 -0
  54. package/dist/plugin-endpoint.d.ts +20 -0
  55. package/dist/plugin-endpoint.d.ts.map +1 -0
  56. package/dist/plugin-endpoint.js +24 -0
  57. package/dist/plugin-endpoint.js.map +1 -0
  58. package/dist/postgrest.d.ts +326 -0
  59. package/dist/postgrest.d.ts.map +1 -0
  60. package/dist/postgrest.js +625 -0
  61. package/dist/postgrest.js.map +1 -0
  62. package/dist/query.d.ts +97 -0
  63. package/dist/query.d.ts.map +1 -0
  64. package/dist/query.js +94 -0
  65. package/dist/query.js.map +1 -0
  66. package/dist/realtime.d.ts +114 -0
  67. package/dist/realtime.d.ts.map +1 -0
  68. package/dist/realtime.js +376 -0
  69. package/dist/realtime.js.map +1 -0
  70. package/dist/session.d.ts +47 -0
  71. package/dist/session.d.ts.map +1 -0
  72. package/dist/session.js +136 -0
  73. package/dist/session.js.map +1 -0
  74. package/dist/sso.d.ts +147 -0
  75. package/dist/sso.d.ts.map +1 -0
  76. package/dist/sso.js +35 -0
  77. package/dist/sso.js.map +1 -0
  78. package/dist/storage.d.ts +268 -0
  79. package/dist/storage.d.ts.map +1 -0
  80. package/dist/storage.js +441 -0
  81. package/dist/storage.js.map +1 -0
  82. package/dist/testing.d.ts +38 -0
  83. package/dist/testing.d.ts.map +1 -0
  84. package/dist/testing.js +50 -0
  85. package/dist/testing.js.map +1 -0
  86. package/dist/types.d.ts +353 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/warn.d.ts +2 -0
  91. package/dist/warn.d.ts.map +1 -0
  92. package/dist/warn.js +23 -0
  93. package/dist/warn.js.map +1 -0
  94. package/package.json +4 -2
@@ -0,0 +1,625 @@
1
+ import { toError } from './http.js';
2
+ import { contractPath } from '@motherbase/contracts';
3
+ // ── value encoding ───────────────────────────────────────────────────────────
4
+ /**
5
+ * Characters that end a token in the PostgREST grammar (or in a Postgres array
6
+ * literal). A string value carrying any of them has to be quoted or the server
7
+ * reads a different filter than the caller wrote.
8
+ */
9
+ const NEEDS_QUOTING = /[,.:()"\\{}\s]/;
10
+ function quoteLiteral(value) {
11
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
12
+ }
13
+ /** One scalar value: quoted only when it has to be. */
14
+ export function encodeLiteral(value) {
15
+ if (value === null)
16
+ return 'null';
17
+ if (typeof value !== 'string')
18
+ return String(value);
19
+ if (value === '' || NEEDS_QUOTING.test(value))
20
+ return quoteLiteral(value);
21
+ return value;
22
+ }
23
+ /** `in.(a,"b,c")` and the `(all)` / `(any)` modifier lists. */
24
+ function encodeList(values) {
25
+ return `(${values.map(encodeLiteral).join(',')})`;
26
+ }
27
+ /** A Postgres array literal: `{a,"b,c"}`. Used by `cs`, `cd`, `ov` and the like modifiers. */
28
+ function encodeArrayLiteral(values) {
29
+ return `{${values.map(encodeLiteral).join(',')}}`;
30
+ }
31
+ /**
32
+ * The operand of `cs` / `cd` / `ov`, which is polymorphic in PostgREST:
33
+ * an array column takes `{a,b}`, a range column takes its own literal
34
+ * (`[2000-01-01,2000-01-31]`) and a jsonb column takes JSON. A string is passed
35
+ * through untouched because it is already one of the last two.
36
+ */
37
+ function encodeArrayOperand(value) {
38
+ if (typeof value === 'string')
39
+ return value;
40
+ if (Array.isArray(value))
41
+ return encodeArrayLiteral(value);
42
+ return JSON.stringify(value);
43
+ }
44
+ /** Values handed to `not()` / `filter()`: strings verbatim, arrays as a list. */
45
+ function encodeRawOperand(value) {
46
+ if (Array.isArray(value))
47
+ return encodeList(value);
48
+ if (value === null)
49
+ return 'null';
50
+ return String(value);
51
+ }
52
+ function isValueOf(value) {
53
+ if (value === null)
54
+ return 'null';
55
+ if (value === true)
56
+ return 'true';
57
+ if (value === false)
58
+ return 'false';
59
+ if (value === 'null' || value === 'true' || value === 'false' || value === 'unknown')
60
+ return value;
61
+ // Programmer misuse, not an API error: fail loudly rather than emit a filter
62
+ // the server will reject with an opaque 400.
63
+ throw new TypeError(`is() accepts null, true, false or unknown, received ${JSON.stringify(value)}`);
64
+ }
65
+ function referenced(options) {
66
+ return options?.referencedTable ?? options?.foreignTable ?? '';
67
+ }
68
+ function scopedKey(prefix, name) {
69
+ return prefix ? `${prefix}.${name}` : name;
70
+ }
71
+ /** `0-9/57` -> 57. An unknown total (a star after the slash) and a missing header both give null. */
72
+ function parseContentRange(header) {
73
+ if (!header)
74
+ return null;
75
+ const total = header.split('/')[1];
76
+ if (!total || total === '*')
77
+ return null;
78
+ const parsed = Number(total);
79
+ return Number.isFinite(parsed) ? parsed : null;
80
+ }
81
+ // ── the builder ──────────────────────────────────────────────────────────────
82
+ /**
83
+ * PostgREST-style, chainable, thenable query builder mapping onto the backend's
84
+ * `/rest/v1/:model` query-param dialect. Awaiting it resolves to
85
+ * `{ data, error, count }` and never rejects for expected API errors (only for
86
+ * programmer misuse).
87
+ *
88
+ * @internal This is the implementation behind `client.from()`, not a surface to
89
+ * construct directly. The public, typed entry point is `client.from(table)`,
90
+ * whose return type (`TypedQuery`, from `database.ts`) is what user code should
91
+ * name. It is exported only so the type can be referenced where inference needs
92
+ * a name for it.
93
+ */
94
+ export class PostgrestQueryBuilder {
95
+ constructor(http, model,
96
+ /** supabase-js semantic parity, from `createClient(..., { compat: 'supabase' })`. */
97
+ compat = false) {
98
+ this.http = http;
99
+ this.model = model;
100
+ this.compat = compat;
101
+ this.method = 'GET';
102
+ this.columns = '*';
103
+ /**
104
+ * Repeated filters on one column must all survive: `?price=gt.10&price=lt.20`
105
+ * is two conditions ANDed together, which is why every filter is `append`ed
106
+ * and never `set`. Using `set` here (as this builder once did) silently
107
+ * dropped the first of the two.
108
+ */
109
+ this.filters = new URLSearchParams();
110
+ /** Reserved params that are replaced rather than repeated (`columns`, `on_conflict`). */
111
+ this.extras = new Map();
112
+ /** Keyed by referenced table (`''` for the base relation). */
113
+ this.orderParts = new Map();
114
+ this.limits = new Map();
115
+ this.offsets = new Map();
116
+ this.prefer = [];
117
+ this.responseKind = 'json';
118
+ this.headOnly = false;
119
+ this.rowMode = 'many';
120
+ this.shouldThrow = false;
121
+ /** Set by `select()`, so a write can tell "rows asked for" from "no rows requested". */
122
+ this.selectCalled = false;
123
+ }
124
+ // --- verbs -------------------------------------------------------------
125
+ /**
126
+ * Choose the columns, and optionally ask for a row count.
127
+ *
128
+ * After a write, `.select()` is the supabase-js way of asking for the rows
129
+ * back, so it also sends `Prefer: return=representation`.
130
+ */
131
+ select(columns = '*', options = {}) {
132
+ this.columns = columns;
133
+ this.selectCalled = true;
134
+ if (options.count)
135
+ this.countOption = options.count;
136
+ if (options.head) {
137
+ this.headOnly = true;
138
+ if (this.method === 'GET')
139
+ this.method = 'HEAD';
140
+ }
141
+ return this;
142
+ }
143
+ insert(values, options = {}) {
144
+ this.method = 'POST';
145
+ this.body = values;
146
+ this.applyColumns(values);
147
+ if (options.count)
148
+ this.countOption = options.count;
149
+ if (options.defaultToNull === false)
150
+ this.prefer.push('missing=default');
151
+ return this;
152
+ }
153
+ /**
154
+ * `INSERT .. ON CONFLICT DO UPDATE`. The conflict target defaults to the
155
+ * primary key server side; `onConflict` names another unique constraint.
156
+ */
157
+ upsert(values, options = {}) {
158
+ this.method = 'POST';
159
+ this.body = values;
160
+ this.applyColumns(values);
161
+ this.prefer.push(`resolution=${options.ignoreDuplicates ? 'ignore' : 'merge'}-duplicates`);
162
+ if (options.onConflict !== undefined)
163
+ this.extras.set('on_conflict', options.onConflict);
164
+ if (options.count)
165
+ this.countOption = options.count;
166
+ if (options.defaultToNull === false)
167
+ this.prefer.push('missing=default');
168
+ return this;
169
+ }
170
+ update(values, options = {}) {
171
+ this.method = 'PATCH';
172
+ this.body = values;
173
+ if (options.count)
174
+ this.countOption = options.count;
175
+ return this;
176
+ }
177
+ delete(options = {}) {
178
+ this.method = 'DELETE';
179
+ if (options.count)
180
+ this.countOption = options.count;
181
+ return this;
182
+ }
183
+ /**
184
+ * A bulk write states its column set explicitly, so a key missing from one
185
+ * row is still written (as NULL, or as the column default under
186
+ * `missing=default`) instead of being inferred from the first row alone.
187
+ */
188
+ applyColumns(values) {
189
+ if (!Array.isArray(values))
190
+ return;
191
+ const seen = new Set();
192
+ for (const row of values) {
193
+ if (row && typeof row === 'object')
194
+ for (const key of Object.keys(row))
195
+ seen.add(key);
196
+ }
197
+ if (seen.size) {
198
+ this.extras.set('columns', Array.from(seen, column => `"${column}"`).join(','));
199
+ }
200
+ }
201
+ // --- filters -----------------------------------------------------------
202
+ eq(column, value) {
203
+ return this.push(column, `eq.${encodeLiteral(value)}`);
204
+ }
205
+ neq(column, value) {
206
+ return this.push(column, `neq.${encodeLiteral(value)}`);
207
+ }
208
+ gt(column, value) {
209
+ return this.push(column, `gt.${encodeLiteral(value)}`);
210
+ }
211
+ gte(column, value) {
212
+ return this.push(column, `gte.${encodeLiteral(value)}`);
213
+ }
214
+ lt(column, value) {
215
+ return this.push(column, `lt.${encodeLiteral(value)}`);
216
+ }
217
+ lte(column, value) {
218
+ return this.push(column, `lte.${encodeLiteral(value)}`);
219
+ }
220
+ /** Case-sensitive LIKE. `*` is PostgREST's URL-friendly `%`. */
221
+ like(column, pattern) {
222
+ return this.push(column, `like.${encodeLiteral(pattern)}`);
223
+ }
224
+ ilike(column, pattern) {
225
+ return this.push(column, `ilike.${encodeLiteral(pattern)}`);
226
+ }
227
+ likeAllOf(column, patterns) {
228
+ return this.push(column, `like(all).${encodeArrayLiteral(patterns)}`);
229
+ }
230
+ likeAnyOf(column, patterns) {
231
+ return this.push(column, `like(any).${encodeArrayLiteral(patterns)}`);
232
+ }
233
+ ilikeAllOf(column, patterns) {
234
+ return this.push(column, `ilike(all).${encodeArrayLiteral(patterns)}`);
235
+ }
236
+ ilikeAnyOf(column, patterns) {
237
+ return this.push(column, `ilike(any).${encodeArrayLiteral(patterns)}`);
238
+ }
239
+ in(column, values) {
240
+ return this.push(column, `in.${encodeList(values)}`);
241
+ }
242
+ is(column, value) {
243
+ return this.push(column, `is.${isValueOf(value)}`);
244
+ }
245
+ /** Every key equal to its value, ANDed together. */
246
+ match(query) {
247
+ for (const [column, value] of Object.entries(query))
248
+ this.eq(column, value);
249
+ return this;
250
+ }
251
+ /**
252
+ * Negate any operator: `not('status', 'eq', 'live')` emits
253
+ * `status=not.eq.live`. The value is passed through verbatim for a string, so
254
+ * composite operands (`not('id', 'in', '(1,2)')`) reach the server as written.
255
+ */
256
+ not(column, operator, value) {
257
+ return this.push(column, `not.${operator}.${encodeRawOperand(value)}`);
258
+ }
259
+ /**
260
+ * The escape hatch: any operator, including the ones with no dedicated method
261
+ * (`match`, `imatch`, `isdistinct`) and the modifier forms (`like(any)`).
262
+ */
263
+ filter(column, operator, value) {
264
+ return this.push(column, `${operator}.${encodeRawOperand(value)}`);
265
+ }
266
+ /**
267
+ * A disjunction, written in PostgREST's own syntax and nestable:
268
+ * `or('status.eq.live,and(price.gt.10,price.lt.20)')`.
269
+ */
270
+ or(filters, options = {}) {
271
+ return this.push(scopedKey(referenced(options), 'or'), `(${filters})`);
272
+ }
273
+ /** Full-text search. `type` picks the tsquery parser, `config` the dictionary. */
274
+ textSearch(column, query, options = {}) {
275
+ const prefix = options.type === 'plain'
276
+ ? 'pl'
277
+ : options.type === 'phrase'
278
+ ? 'ph'
279
+ : options.type === 'websearch'
280
+ ? 'w'
281
+ : '';
282
+ const config = options.config === undefined ? '' : `(${options.config})`;
283
+ return this.push(column, `${prefix}fts${config}.${encodeLiteral(query)}`);
284
+ }
285
+ /** `@>`: the column contains the operand (array, range or jsonb). */
286
+ contains(column, value) {
287
+ return this.push(column, `cs.${encodeArrayOperand(value)}`);
288
+ }
289
+ /** `<@`: the column is contained by the operand. */
290
+ containedBy(column, value) {
291
+ return this.push(column, `cd.${encodeArrayOperand(value)}`);
292
+ }
293
+ /** `&&`: the column and the operand have an element (or a point) in common. */
294
+ overlaps(column, value) {
295
+ return this.push(column, `ov.${encodeArrayOperand(value)}`);
296
+ }
297
+ /** `>>`: strictly right of the range. */
298
+ rangeGt(column, range) {
299
+ return this.push(column, `sr.${range}`);
300
+ }
301
+ /** `&>`: does not extend to the left of the range. */
302
+ rangeGte(column, range) {
303
+ return this.push(column, `nxl.${range}`);
304
+ }
305
+ /** `<<`: strictly left of the range. */
306
+ rangeLt(column, range) {
307
+ return this.push(column, `sl.${range}`);
308
+ }
309
+ /** `&<`: does not extend to the right of the range. */
310
+ rangeLte(column, range) {
311
+ return this.push(column, `nxr.${range}`);
312
+ }
313
+ /** `-|-`: adjacent to the range. */
314
+ rangeAdjacent(column, range) {
315
+ return this.push(column, `adj.${range}`);
316
+ }
317
+ push(key, value) {
318
+ this.filters.append(key, value);
319
+ return this;
320
+ }
321
+ // --- modifiers ---------------------------------------------------------
322
+ order(column, options = {}) {
323
+ const direction = options.ascending === false ? 'desc' : 'asc';
324
+ const nulls = options.nullsFirst === undefined ? '' : options.nullsFirst ? '.nullsfirst' : '.nullslast';
325
+ const prefix = referenced(options);
326
+ const parts = this.orderParts.get(prefix) ?? [];
327
+ parts.push(`${column}.${direction}${nulls}`);
328
+ this.orderParts.set(prefix, parts);
329
+ return this;
330
+ }
331
+ limit(count, options = {}) {
332
+ this.limits.set(referenced(options), count);
333
+ return this;
334
+ }
335
+ /** Inclusive range -> offset/limit. `range(0, 9)` fetches 10 rows from offset 0. */
336
+ range(from, to, options = {}) {
337
+ const prefix = referenced(options);
338
+ this.offsets.set(prefix, from);
339
+ this.limits.set(prefix, to - from + 1);
340
+ return this;
341
+ }
342
+ /**
343
+ * Every matching row, one page at a time.
344
+ *
345
+ * An unbounded `select()` stops at the server's `api.rest.maxRows` (1000 by
346
+ * default) and says nothing about it: the caller gets a full-looking array
347
+ * that is missing everything past the cap. This walks the result instead, so
348
+ * "give me all of them" is expressible without knowing the cap exists.
349
+ *
350
+ * ```ts
351
+ * for await (const row of client.from('events').select('*').stream()) { ... }
352
+ * ```
353
+ *
354
+ * The pages are separate requests, so rows inserted while the walk is running
355
+ * may be seen or missed depending on when they land. Order by a stable column
356
+ * if that matters.
357
+ */
358
+ async *stream(options = {}) {
359
+ for await (const page of this.paginate(options)) {
360
+ for (const row of page.rows)
361
+ yield row;
362
+ }
363
+ }
364
+ /**
365
+ * Like `stream()`, a page at a time rather than a row at a time, with the
366
+ * total from `Content-Range` when the server sent one.
367
+ *
368
+ * An error ends the walk by throwing, unlike awaiting the builder, which
369
+ * resolves `{ data, error }`. A `for await` loop has nowhere to put an error
370
+ * value, and silently ending the iteration early would look exactly like
371
+ * reaching the last page.
372
+ */
373
+ async *paginate(options = {}) {
374
+ const pageSize = options.pageSize ?? 1000;
375
+ if (!Number.isInteger(pageSize) || pageSize < 1) {
376
+ throw new Error(`pageSize must be a positive integer, received ${String(options.pageSize)}`);
377
+ }
378
+ if (this.method !== 'GET') {
379
+ throw new Error('stream() and paginate() read rows: call them on a select(), not on a write.');
380
+ }
381
+ if (this.rowMode !== 'many') {
382
+ throw new Error('stream() and paginate() walk many rows: drop single() / maybeSingle().');
383
+ }
384
+ let from = 0;
385
+ for (;;) {
386
+ this.range(from, from + pageSize - 1);
387
+ const result = await this.execute();
388
+ if (result.error)
389
+ throw Object.assign(new Error(result.error.message), result.error);
390
+ const rows = (result.data ?? []);
391
+ if (rows.length)
392
+ yield { rows, from, count: result.count };
393
+ // A short page is the last page. Requesting the next one would cost a
394
+ // round trip to learn what this one already said.
395
+ if (rows.length < pageSize)
396
+ return;
397
+ from += rows.length;
398
+ }
399
+ }
400
+ /** Cancel the in-flight request when the signal aborts. */
401
+ abortSignal(signal) {
402
+ this.signal = signal;
403
+ return this;
404
+ }
405
+ /**
406
+ * Re-type the rows. Purely a compile-time cast, for cases the generated
407
+ * `Database` cannot express (a computed column, an embedded shape).
408
+ */
409
+ returns() {
410
+ return this;
411
+ }
412
+ /** supabase-js's newer name for `returns()`. Also a compile-time cast only. */
413
+ overrideTypes() {
414
+ return this;
415
+ }
416
+ /**
417
+ * Reject the query instead of resolving `{ data: null, error }`.
418
+ *
419
+ * The `{ data, error }` envelope is the default in both SDKs because it makes
420
+ * a failure impossible to skip by accident. `throwOnError()` is the opt-out
421
+ * for code that would rather use try/catch, and ported Supabase code uses it
422
+ * widely enough that its absence is a `TypeError: … is not a function` on the
423
+ * first query.
424
+ */
425
+ throwOnError() {
426
+ this.shouldThrow = true;
427
+ return this;
428
+ }
429
+ /**
430
+ * Fail the write if it would touch more than `count` rows.
431
+ *
432
+ * A guard against the missing-filter class of accident (`update()` with a
433
+ * typo'd `.eq()`), sent as `Prefer: max-affected`. A server that does not
434
+ * implement it ignores the preference, so treat this as a safety net rather
435
+ * than a guarantee, and keep the filter correct.
436
+ */
437
+ maxAffected(count) {
438
+ this.prefer.push('handling=strict', `max-affected=${count}`);
439
+ return this;
440
+ }
441
+ /**
442
+ * Roll the transaction back after running the query, so nothing is persisted.
443
+ * Useful for validating a write, or previewing what it would return.
444
+ */
445
+ rollback() {
446
+ this.prefer.push('tx=rollback');
447
+ return this;
448
+ }
449
+ /** Ask for GeoJSON instead of rows. The result resolves to the parsed object. */
450
+ geojson() {
451
+ this.accept = 'application/geo+json';
452
+ this.responseKind = 'text-json';
453
+ return this;
454
+ }
455
+ /** Ask for `text/csv` instead of JSON. The result resolves to a string. */
456
+ csv() {
457
+ this.accept = 'text/csv';
458
+ this.responseKind = 'text';
459
+ return this;
460
+ }
461
+ /** Ask the server for the query plan. Admin-only, and off by default. */
462
+ explain(options = {}) {
463
+ const format = options.format ?? 'text';
464
+ const flags = ['analyze', 'verbose', 'settings', 'buffers', 'wal']
465
+ .filter(flag => options[flag])
466
+ .join('|');
467
+ const forMediatype = this.accept ?? 'application/json';
468
+ this.accept = `application/vnd.pgrst.plan+${format}; for="${forMediatype}"; options=${flags};`;
469
+ this.responseKind = format === 'json' ? 'text-json' : 'text';
470
+ return this;
471
+ }
472
+ single() {
473
+ this.rowMode = 'single';
474
+ return this;
475
+ }
476
+ maybeSingle() {
477
+ this.rowMode = 'maybeSingle';
478
+ return this;
479
+ }
480
+ // --- execution ---------------------------------------------------------
481
+ /** The URL path (with query string) this builder targets. Exposed for tests. */
482
+ toPath() {
483
+ const params = new URLSearchParams();
484
+ if (this.columns && this.columns !== '*')
485
+ params.set('select', this.columns);
486
+ for (const [key, value] of this.extras)
487
+ params.append(key, value);
488
+ // `append`, never `set`: two filters on one column are two conditions.
489
+ this.filters.forEach((value, key) => params.append(key, value));
490
+ for (const [prefix, parts] of this.orderParts) {
491
+ if (parts.length)
492
+ params.append(scopedKey(prefix, 'order'), parts.join(','));
493
+ }
494
+ for (const [prefix, value] of this.limits) {
495
+ params.append(scopedKey(prefix, 'limit'), String(value));
496
+ }
497
+ for (const [prefix, value] of this.offsets) {
498
+ params.append(scopedKey(prefix, 'offset'), String(value));
499
+ }
500
+ const query = params.toString();
501
+ return `${contractPath.rest(this.model)}${query ? `?${query}` : ''}`;
502
+ }
503
+ /**
504
+ * The request this builder would send, as data.
505
+ *
506
+ * `client.transaction()` needs to describe several writes without issuing
507
+ * them, and the method and body are otherwise private. Exposed rather than
508
+ * reached into: a batch built from `(builder as any).method` would break the
509
+ * first time this class was refactored.
510
+ */
511
+ toRequest() {
512
+ const path = this.toPath();
513
+ const queryString = path.includes('?') ? path.slice(path.indexOf('?') + 1) : '';
514
+ const query = {};
515
+ // Repeated keys are two conditions on one column, never one overwriting the
516
+ // other, so the value is always a list.
517
+ // `forEach` rather than iteration: this package targets a lib without the
518
+ // URLSearchParams iterator declaration, and forEach is in every runtime.
519
+ new URLSearchParams(queryString).forEach((value, key) => {
520
+ (query[key] ?? (query[key] = [])).push(value);
521
+ });
522
+ return { method: this.method, model: this.model, query, body: this.body };
523
+ }
524
+ /** The headers this builder sends. Exposed for tests alongside `toPath()`. */
525
+ toHeaders() {
526
+ const headers = {};
527
+ const prefer = [...this.prefer];
528
+ if (this.countOption)
529
+ prefer.push(`count=${this.countOption}`);
530
+ // Use the same write contract with and without compat mode.
531
+ if (this.isWrite())
532
+ prefer.push(`return=${this.selectCalled ? 'representation' : 'minimal'}`);
533
+ if (prefer.length)
534
+ headers['Prefer'] = prefer.join(',');
535
+ if (this.accept)
536
+ headers['Accept'] = this.accept;
537
+ return headers;
538
+ }
539
+ async execute() {
540
+ const path = this.toPath();
541
+ const headers = this.toHeaders();
542
+ try {
543
+ if (this.responseKind !== 'json') {
544
+ const res = await this.http.requestRaw(path, {
545
+ method: this.method,
546
+ body: this.body,
547
+ headers,
548
+ signal: this.signal,
549
+ });
550
+ const text = await res.text();
551
+ const data = this.responseKind === 'text-json' ? safeJson(text) : text;
552
+ return { data, error: null, count: parseContentRange(res.headers.get('content-range')) };
553
+ }
554
+ const result = await this.http.requestWithHeaders(path, {
555
+ method: this.method,
556
+ body: this.body,
557
+ headers,
558
+ signal: this.signal,
559
+ });
560
+ const count = parseContentRange(result.headers.get('content-range'));
561
+ // A HEAD request has no body by definition: the count is the whole answer.
562
+ if (this.headOnly)
563
+ return { data: null, error: null, count };
564
+ // `return=minimal` was sent: the write happened, there are no rows to
565
+ // report, and supabase-js resolves `{ data: null }` for exactly this case.
566
+ if (this.isWrite() && !this.selectCalled) {
567
+ return { data: null, error: null, count };
568
+ }
569
+ const rows = result.data;
570
+ return this.finish(Array.isArray(rows) ? rows : rows == null ? [] : [rows], count);
571
+ }
572
+ catch (err) {
573
+ const error = toError(err);
574
+ // A filter matching nothing is a 404 here and an empty array in
575
+ // supabase-js. Under compat the write resolves empty, which is what
576
+ // ported code branches on (`if (!data.length)`), instead of a thrown or
577
+ // surfaced error it never had a handler for.
578
+ if (this.compat && error.status === 404 && (this.method === 'PATCH' || this.method === 'DELETE')) {
579
+ return this.finish([], 0);
580
+ }
581
+ return { data: null, error, count: null };
582
+ }
583
+ }
584
+ isWrite() {
585
+ return this.method === 'POST' || this.method === 'PATCH' || this.method === 'DELETE';
586
+ }
587
+ /** Apply `single()` / `maybeSingle()` to a row list. The one place row mode is read. */
588
+ finish(list, count) {
589
+ if (this.rowMode === 'single') {
590
+ if (list.length !== 1) {
591
+ const error = {
592
+ message: 'JSON object requested, multiple (or no) rows returned',
593
+ code: 'PGRST116',
594
+ };
595
+ return { data: null, error, count };
596
+ }
597
+ return { data: list[0], error: null, count };
598
+ }
599
+ if (this.rowMode === 'maybeSingle') {
600
+ return { data: list.length ? list[0] : null, error: null, count };
601
+ }
602
+ return { data: list, error: null, count };
603
+ }
604
+ then(onfulfilled, onrejected) {
605
+ // `throwOnError()` is applied here rather than inside execute() so every
606
+ // builder variant (single, csv, explain, geojson) inherits it: they are all
607
+ // the same object, cast, and `then` is the one path they share.
608
+ const settled = this.execute().then(result => {
609
+ if (this.shouldThrow && result.error) {
610
+ throw Object.assign(new Error(result.error.message), result.error);
611
+ }
612
+ return result;
613
+ });
614
+ return settled.then(onfulfilled, onrejected);
615
+ }
616
+ }
617
+ function safeJson(text) {
618
+ try {
619
+ return JSON.parse(text);
620
+ }
621
+ catch {
622
+ return text;
623
+ }
624
+ }
625
+ //# sourceMappingURL=postgrest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest.js","sourceRoot":"","sources":["../src/postgrest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAsIrD,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+DAA+D;AAC/D,SAAS,UAAU,CAAC,MAAqC;IACvD,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,8FAA8F;AAC9F,SAAS,kBAAkB,CAAC,MAAqC;IAC/D,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,KAA4B;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC,KAAsC,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,iFAAiF;AACjF,SAAS,gBAAgB,CAAC,KAAyD;IACjF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,KAAsC,CAAC,CAAC;IACpF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB;IACxC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACnG,6EAA6E;IAC7E,6CAA6C;IAC7C,MAAM,IAAI,SAAS,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,UAAU,CAAC,OAA0C;IAC5D,OAAO,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,IAAY;IAC7C,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,qGAAqG;AACrG,SAAS,iBAAiB,CAAC,MAAqB;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,qBAAqB;IA8BhC,YACmB,IAAgB,EAChB,KAAa;IAC9B,qFAAqF;IACpE,SAAS,KAAK;QAHd,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAQ;QAEb,WAAM,GAAN,MAAM,CAAQ;QA/BzB,WAAM,GAAiD,KAAK,CAAC;QAC7D,YAAO,GAAG,GAAG,CAAC;QACtB;;;;;WAKG;QACc,YAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACjD,yFAAyF;QACxE,WAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACpD,8DAA8D;QAC7C,eAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;QACzC,WAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACnC,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QACpC,WAAM,GAAa,EAAE,CAAC;QAE/B,iBAAY,GAAiB,MAAM,CAAC;QAEpC,aAAQ,GAAG,KAAK,CAAC;QAGjB,YAAO,GAAY,MAAM,CAAC;QAC1B,gBAAW,GAAG,KAAK,CAAC;QAC5B,wFAAwF;QAChF,iBAAY,GAAG,KAAK,CAAC;IAO1B,CAAC;IAEJ,0EAA0E;IAE1E;;;;;OAKG;IACH,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,UAAyB,EAAE;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;gBAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,MAA0C,EAAE,UAAyB,EAAE;QAC5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACpD,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAA0C,EAAE,UAAyB,EAAE;QAC5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACpD,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,UAAyB,EAAE;QACtD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,UAAyB,EAAE;QAChC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,MAAe;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,0EAA0E;IAE1E,EAAE,CAAC,MAAc,EAAE,KAAyB;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,GAAG,CAAC,MAAc,EAAE,KAAyB;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,KAAyB;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,GAAG,CAAC,MAAc,EAAE,KAAyB;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,KAAyB;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,GAAG,CAAC,MAAc,EAAE,KAAyB;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,gEAAgE;IAChE,IAAI,CAAC,MAAc,EAAE,OAAe;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,CAAC,MAAc,EAAE,OAAe;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,SAAS,CAAC,MAAc,EAAE,QAA2B;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,SAAS,CAAC,MAAc,EAAE,QAA2B;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,UAAU,CAAC,MAAc,EAAE,QAA2B;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,UAAU,CAAC,MAAc,EAAE,QAA2B;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,MAAqC;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,KAAuB;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,oDAAoD;IACpD,KAAK,CAAC,KAAyC;QAC7C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,GAAG,CACD,MAAc,EACd,QAAiD,EACjD,KAAyD;QAEzD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,MAAc,EACd,QAAiD,EACjD,KAAyD;QAEzD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACH,EAAE,CAAC,OAAe,EAAE,UAAiC,EAAE;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,kFAAkF;IAClF,UAAU,CACR,MAAc,EACd,KAAa,EACb,UAAsD,EAAE;QAExD,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,OAAO;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;gBACzB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;oBAC5B,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QACzE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,MAAM,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,qEAAqE;IACrE,QAAQ,CAAC,MAAc,EAAE,KAA4B;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,oDAAoD;IACpD,WAAW,CAAC,MAAc,EAAE,KAA4B;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,+EAA+E;IAC/E,QAAQ,CAAC,MAAc,EAAE,KAA4B;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,yCAAyC;IACzC,OAAO,CAAC,MAAc,EAAE,KAAa;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,sDAAsD;IACtD,QAAQ,CAAC,MAAc,EAAE,KAAa;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,wCAAwC;IACxC,OAAO,CAAC,MAAc,EAAE,KAAa;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,uDAAuD;IACvD,QAAQ,CAAC,MAAc,EAAE,KAAa;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,oCAAoC;IACpC,aAAa,CAAC,MAAc,EAAE,KAAa;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,IAAI,CAAC,GAAW,EAAE,KAAa;QACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAE1E,KAAK,CAAC,MAAc,EAAE,UAAwB,EAAE;QAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,MAAM,KAAK,GACT,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5F,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,UAAiC,EAAE;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,IAAY,EAAE,EAAU,EAAE,UAAiC,EAAE;QACjE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,UAA2B,EAAE;QACzC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,GAAG,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,CAAC,QAAQ,CACb,UAA2B,EAAE;QAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,SAAS,CAAC;YACR,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,KAAK;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAErF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAU,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC3D,sEAAsE;YACtE,kDAAkD;YAClD,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ;gBAAE,OAAO;YACnC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,WAAW,CAAC,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,OAAO,IAA2C,CAAC;IACrD,CAAC;IAED,+EAA+E;IAC/E,aAAa;QACX,OAAO,IAA2C,CAAC;IACrD,CAAC;IAED;;;;;;;;OAQG;IACH,YAAY;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iFAAiF;IACjF,OAAO;QACL,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,OAAO,IAA0C,CAAC;IACpD,CAAC;IAED,2EAA2E;IAC3E,GAAG;QACD,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,OAAO,IAAuC,CAAC;IACjD,CAAC;IAED,yEAAyE;IACzE,OAAO,CAAC,UAA0B,EAAE;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;QACxC,MAAM,KAAK,GAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAW;aAC1E,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,8BAA8B,MAAM,UAAU,YAAY,cAAc,KAAK,GAAG,CAAC;QAC/F,IAAI,CAAC,YAAY,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,OAAO,IAA0C,CAAC;IACpD,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,OAAO,IAA8C,CAAC;IACxD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;QAC7B,OAAO,IAA8C,CAAC;IACxD,CAAC;IAED,0EAA0E;IAE1E,gFAAgF;IAChF,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,uEAAuE;QACvE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACvE,CAAC;IAED;;;;;;;OAOG;IACH,SAAS;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,KAAK,GAA6B,EAAE,CAAC;QAC3C,4EAA4E;QAC5E,wCAAwC;QACxC,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtD,CAAC,KAAK,CAAC,GAAG,MAAT,KAAK,CAAC,GAAG,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5E,CAAC;IAED,8EAA8E;IAC9E,SAAS;QACP,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,4DAA4D;QAC5D,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;oBAC3C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO;oBACP,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YAC3F,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAQ,IAAI,EAAE;gBAC7D,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;YAErE,2EAA2E;YAC3E,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAE7D,sEAAsE;YACtE,2EAA2E;YAC3E,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC5C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,gEAAgE;YAChE,oEAAoE;YACpE,wEAAwE;YACxE,6CAA6C;YAC7C,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACjG,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,OAAO;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;IACvF,CAAC;IAED,wFAAwF;IAChF,MAAM,CAAC,IAAe,EAAE,KAAoB;QAClD,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAoB;oBAC7B,OAAO,EAAE,uDAAuD;oBAChE,IAAI,EAAE,UAAU;iBACjB,CAAC;gBACF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACtC,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,CACF,WAA4F,EAC5F,UAA2E;QAE3E,yEAAyE;QACzE,4EAA4E;QAC5E,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAC3C,IAAI,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,WAAoB,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}