@contentrain/query 4.0.0 → 5.0.0

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,3 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_generate = require("../generate-CPKYh6ZU.cjs");
3
+ exports.generate = require_generate.generate;
@@ -0,0 +1,14 @@
1
+ //#region src/generator/generate.d.ts
2
+ interface GenerateOptions {
3
+ projectRoot: string;
4
+ }
5
+ interface GenerateResult {
6
+ generatedFiles: string[];
7
+ typesCount: number;
8
+ dataModulesCount: number;
9
+ packageJsonUpdated: boolean;
10
+ }
11
+ declare function generate(options: GenerateOptions): Promise<GenerateResult>;
12
+ //#endregion
13
+ export { GenerateOptions, GenerateResult, generate };
14
+ //# sourceMappingURL=generate.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.cts","names":[],"sources":["../../src/generator/generate.ts"],"mappings":";UASiB,eAAA;EACf,WAAA;AAAA;AAAA,UAGe,cAAA;EACf,cAAA;EACA,UAAA;EACA,gBAAA;EACA,kBAAA;AAAA;AAAA,iBAGoB,QAAA,CAAS,OAAA,EAAS,eAAA,GAAkB,OAAA,CAAQ,cAAA"}
@@ -0,0 +1,14 @@
1
+ //#region src/generator/generate.d.ts
2
+ interface GenerateOptions {
3
+ projectRoot: string;
4
+ }
5
+ interface GenerateResult {
6
+ generatedFiles: string[];
7
+ typesCount: number;
8
+ dataModulesCount: number;
9
+ packageJsonUpdated: boolean;
10
+ }
11
+ declare function generate(options: GenerateOptions): Promise<GenerateResult>;
12
+ //#endregion
13
+ export { GenerateOptions, GenerateResult, generate };
14
+ //# sourceMappingURL=generate.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.mts","names":[],"sources":["../../src/generator/generate.ts"],"mappings":";UASiB,eAAA;EACf,WAAA;AAAA;AAAA,UAGe,cAAA;EACf,cAAA;EACA,UAAA;EACA,gBAAA;EACA,kBAAA;AAAA;AAAA,iBAGoB,QAAA,CAAS,OAAA,EAAS,eAAA,GAAkB,OAAA,CAAQ,cAAA"}
@@ -0,0 +1,2 @@
1
+ import { t as generate } from "../generate-C5Qz8qKt.mjs";
2
+ export { generate };
package/dist/index.cjs ADDED
@@ -0,0 +1,356 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ //#region src/runtime/query.ts
6
+ var QueryBuilder = class {
7
+ _data;
8
+ _locale = null;
9
+ _filters = [];
10
+ _sortField = null;
11
+ _sortOrder = "asc";
12
+ _limit = null;
13
+ _offset = 0;
14
+ _includes = [];
15
+ _relationMeta;
16
+ _resolver;
17
+ _defaultLocale;
18
+ constructor(data, relationMeta, resolver, defaultLocale) {
19
+ this._data = data;
20
+ this._relationMeta = relationMeta ?? {};
21
+ this._resolver = resolver ?? null;
22
+ this._defaultLocale = defaultLocale ?? null;
23
+ }
24
+ locale(lang) {
25
+ this._locale = lang;
26
+ return this;
27
+ }
28
+ where(field, value) {
29
+ this._filters.push((item) => {
30
+ const v = item[field];
31
+ if (Array.isArray(v)) return v.includes(value);
32
+ return v === value;
33
+ });
34
+ return this;
35
+ }
36
+ sort(field, order = "asc") {
37
+ this._sortField = field;
38
+ this._sortOrder = order;
39
+ return this;
40
+ }
41
+ limit(n) {
42
+ this._limit = n;
43
+ return this;
44
+ }
45
+ offset(n) {
46
+ this._offset = n;
47
+ return this;
48
+ }
49
+ include(...fields) {
50
+ this._includes.push(...fields);
51
+ return this;
52
+ }
53
+ all() {
54
+ let items = this._resolveData();
55
+ for (const filter of this._filters) items = items.filter(filter);
56
+ if (this._sortField) {
57
+ const field = this._sortField;
58
+ const dir = this._sortOrder === "asc" ? 1 : -1;
59
+ items.sort((a, b) => {
60
+ const va = a[field];
61
+ const vb = b[field];
62
+ if (va == null && vb == null) return 0;
63
+ if (va == null) return dir;
64
+ if (vb == null) return -dir;
65
+ if (va < vb) return -dir;
66
+ if (va > vb) return dir;
67
+ return 0;
68
+ });
69
+ }
70
+ if (this._offset > 0 || this._limit !== null) {
71
+ const end = this._limit !== null ? this._offset + this._limit : void 0;
72
+ items = items.slice(this._offset, end);
73
+ }
74
+ if (this._includes.length > 0 && this._resolver) items = items.map((item) => this._resolveIncludes(item));
75
+ return items;
76
+ }
77
+ first() {
78
+ return this.all()[0];
79
+ }
80
+ _resolveData() {
81
+ if (this._locale) return [...this._data.get(this._locale) ?? []];
82
+ if (this._defaultLocale) {
83
+ const defaultData = this._data.get(this._defaultLocale);
84
+ if (defaultData) return [...defaultData];
85
+ }
86
+ const firstKey = this._data.keys().next().value;
87
+ if (firstKey !== void 0) return [...this._data.get(firstKey) ?? []];
88
+ return [];
89
+ }
90
+ _resolveIncludes(item) {
91
+ const resolved = { ...item };
92
+ const src = item;
93
+ const dst = resolved;
94
+ for (const field of this._includes) {
95
+ const meta = this._relationMeta[field];
96
+ if (!meta) continue;
97
+ const targets = Array.isArray(meta.target) ? meta.target : [meta.target];
98
+ if (meta.multi) {
99
+ const ids = src[field];
100
+ if (Array.isArray(ids)) dst[field] = ids.map((id) => {
101
+ if (typeof id === "string") return this._resolveId(targets, id) ?? id;
102
+ if (typeof id === "object" && id !== null && "model" in id && "ref" in id) {
103
+ const polyObj = id;
104
+ return this._resolveId([polyObj.model], polyObj.ref) ?? id;
105
+ }
106
+ return id;
107
+ });
108
+ } else {
109
+ const id = src[field];
110
+ if (typeof id === "string") dst[field] = this._resolveId(targets, id) ?? id;
111
+ else if (typeof id === "object" && id !== null && "model" in id && "ref" in id) {
112
+ const polyObj = id;
113
+ dst[field] = this._resolveId([polyObj.model], polyObj.ref) ?? id;
114
+ }
115
+ }
116
+ }
117
+ return resolved;
118
+ }
119
+ _resolveId(targets, id) {
120
+ for (const target of targets) {
121
+ const result = this._resolver(target, id, this._locale);
122
+ if (result) return result;
123
+ }
124
+ }
125
+ };
126
+ //#endregion
127
+ //#region src/runtime/singleton.ts
128
+ var SingletonAccessor = class {
129
+ _data;
130
+ _locale = null;
131
+ _defaultLocale;
132
+ _includes = [];
133
+ _relationMeta = {};
134
+ _resolveEntry;
135
+ constructor(data, defaultLocale, relationMeta, resolveEntry) {
136
+ this._data = data;
137
+ this._defaultLocale = defaultLocale ?? null;
138
+ if (relationMeta) this._relationMeta = relationMeta;
139
+ this._resolveEntry = resolveEntry;
140
+ }
141
+ locale(lang) {
142
+ this._locale = lang;
143
+ return this;
144
+ }
145
+ include(...fields) {
146
+ this._includes.push(...fields);
147
+ return this;
148
+ }
149
+ get() {
150
+ if (this._locale) {
151
+ const d = this._data.get(this._locale);
152
+ if (!d) throw new Error(`No data for locale "${this._locale}"`);
153
+ if (this._includes.length > 0) return this._resolveIncludes(d, this._locale);
154
+ return d;
155
+ }
156
+ const locale = this._defaultLocale ?? void 0;
157
+ let data;
158
+ if (locale) data = this._data.get(locale);
159
+ if (!data) {
160
+ const firstKey = this._data.keys().next().value;
161
+ if (firstKey !== void 0) data = this._data.get(firstKey);
162
+ }
163
+ if (!data) throw new Error("No data available");
164
+ if (this._includes.length > 0) return this._resolveIncludes(data, locale ?? "en");
165
+ return data;
166
+ }
167
+ _resolveIncludes(item, locale) {
168
+ if (!this._resolveEntry || this._includes.length === 0) return item;
169
+ const resolved = { ...item };
170
+ const src = item;
171
+ const dst = resolved;
172
+ for (const field of this._includes) {
173
+ const meta = this._relationMeta[field];
174
+ if (!meta) continue;
175
+ const targets = Array.isArray(meta.target) ? meta.target : [meta.target];
176
+ if (meta.multi) {
177
+ const ids = src[field];
178
+ if (Array.isArray(ids)) dst[field] = ids.map((id) => {
179
+ if (typeof id === "string") return this._resolveId(targets, id, locale) ?? id;
180
+ if (typeof id === "object" && id !== null && "model" in id && "ref" in id) {
181
+ const polyObj = id;
182
+ return this._resolveId([polyObj.model], polyObj.ref, locale) ?? id;
183
+ }
184
+ return id;
185
+ });
186
+ } else {
187
+ const id = src[field];
188
+ if (typeof id === "string") dst[field] = this._resolveId(targets, id, locale) ?? id;
189
+ else if (typeof id === "object" && id !== null && "model" in id && "ref" in id) {
190
+ const polyObj = id;
191
+ dst[field] = this._resolveId([polyObj.model], polyObj.ref, locale) ?? id;
192
+ }
193
+ }
194
+ }
195
+ return resolved;
196
+ }
197
+ _resolveId(targets, id, locale) {
198
+ if (!this._resolveEntry) return void 0;
199
+ for (const model of targets) {
200
+ const result = this._resolveEntry(model, id, locale);
201
+ if (result) return result;
202
+ }
203
+ }
204
+ };
205
+ //#endregion
206
+ //#region src/runtime/dictionary.ts
207
+ var DictionaryAccessor = class {
208
+ _data;
209
+ _locale = null;
210
+ _defaultLocale;
211
+ constructor(data, defaultLocale) {
212
+ this._data = data;
213
+ this._defaultLocale = defaultLocale ?? null;
214
+ }
215
+ locale(lang) {
216
+ this._locale = lang;
217
+ return this;
218
+ }
219
+ get(key, params) {
220
+ const dict = this._resolveData();
221
+ if (key === void 0) return dict;
222
+ const value = dict[key];
223
+ if (value === void 0) return void 0;
224
+ if (params) return interpolate(value, params);
225
+ return value;
226
+ }
227
+ _resolveData() {
228
+ if (this._locale) return this._data.get(this._locale) ?? {};
229
+ if (this._defaultLocale) {
230
+ const d = this._data.get(this._defaultLocale);
231
+ if (d) return d;
232
+ }
233
+ const firstKey = this._data.keys().next().value;
234
+ if (firstKey !== void 0) return this._data.get(firstKey) ?? {};
235
+ return {};
236
+ }
237
+ };
238
+ function interpolate(template, params) {
239
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
240
+ const val = params[key];
241
+ return val !== void 0 ? String(val) : match;
242
+ });
243
+ }
244
+ //#endregion
245
+ //#region src/runtime/document.ts
246
+ var DocumentQuery = class {
247
+ _data;
248
+ _locale = null;
249
+ _filters = [];
250
+ _includes = [];
251
+ _relationMeta;
252
+ _resolver;
253
+ _defaultLocale;
254
+ constructor(data, relationMeta, resolver, defaultLocale) {
255
+ this._data = data;
256
+ this._relationMeta = relationMeta ?? {};
257
+ this._resolver = resolver ?? null;
258
+ this._defaultLocale = defaultLocale ?? null;
259
+ }
260
+ locale(lang) {
261
+ this._locale = lang;
262
+ return this;
263
+ }
264
+ where(field, value) {
265
+ this._filters.push((item) => item[field] === value);
266
+ return this;
267
+ }
268
+ include(...fields) {
269
+ this._includes.push(...fields);
270
+ return this;
271
+ }
272
+ bySlug(slug) {
273
+ const item = this._resolveData().find((i) => i["slug"] === slug);
274
+ if (item && this._includes.length > 0 && this._resolver) return this._resolveIncludes(item);
275
+ return item;
276
+ }
277
+ all() {
278
+ let items = this._resolveData();
279
+ for (const filter of this._filters) items = items.filter(filter);
280
+ if (this._includes.length > 0 && this._resolver) items = items.map((item) => this._resolveIncludes(item));
281
+ return items;
282
+ }
283
+ first() {
284
+ return this.all()[0];
285
+ }
286
+ _resolveData() {
287
+ if (this._locale) return [...this._data.get(this._locale) ?? []];
288
+ if (this._defaultLocale) {
289
+ const defaultData = this._data.get(this._defaultLocale);
290
+ if (defaultData) return [...defaultData];
291
+ }
292
+ const firstKey = this._data.keys().next().value;
293
+ if (firstKey !== void 0) return [...this._data.get(firstKey) ?? []];
294
+ return [];
295
+ }
296
+ _resolveIncludes(item) {
297
+ const resolved = { ...item };
298
+ const src = item;
299
+ const dst = resolved;
300
+ for (const field of this._includes) {
301
+ const meta = this._relationMeta[field];
302
+ if (!meta) continue;
303
+ const targets = Array.isArray(meta.target) ? meta.target : [meta.target];
304
+ if (meta.multi) {
305
+ const ids = src[field];
306
+ if (Array.isArray(ids)) dst[field] = ids.map((id) => {
307
+ if (typeof id === "string") return this._resolveId(targets, id) ?? id;
308
+ if (typeof id === "object" && id !== null && "model" in id && "ref" in id) {
309
+ const polyObj = id;
310
+ return this._resolveId([polyObj.model], polyObj.ref) ?? id;
311
+ }
312
+ return id;
313
+ });
314
+ } else {
315
+ const id = src[field];
316
+ if (typeof id === "string") dst[field] = this._resolveId(targets, id) ?? id;
317
+ else if (typeof id === "object" && id !== null && "model" in id && "ref" in id) {
318
+ const polyObj = id;
319
+ dst[field] = this._resolveId([polyObj.model], polyObj.ref) ?? id;
320
+ }
321
+ }
322
+ }
323
+ return resolved;
324
+ }
325
+ _resolveId(targets, id) {
326
+ for (const target of targets) {
327
+ const result = this._resolver(target, id, this._locale);
328
+ if (result) return result;
329
+ }
330
+ }
331
+ };
332
+ //#endregion
333
+ //#region src/index.ts
334
+ /**
335
+ * Factory for framework SDK authors.
336
+ * Returns the generated client module loaded from .contentrain/client/.
337
+ *
338
+ * Usage (Nuxt composable):
339
+ * ```ts
340
+ * import { createContentrainClient } from '@contentrain/query'
341
+ * const client = createContentrainClient()
342
+ * const posts = client.query('blog-post').locale('en').all()
343
+ * ```
344
+ */
345
+ async function createContentrainClient(projectRoot) {
346
+ const { resolve } = await import("node:path");
347
+ const { pathToFileURL } = await import("node:url");
348
+ return await import(pathToFileURL(resolve(projectRoot ?? process.cwd(), ".contentrain", "client", "index.mjs")).href);
349
+ }
350
+ //#endregion
351
+ exports.DictionaryAccessor = DictionaryAccessor;
352
+ exports.DocumentQuery = DocumentQuery;
353
+ exports.QueryBuilder = QueryBuilder;
354
+ exports.SingletonAccessor = SingletonAccessor;
355
+ exports.createContentrainClient = createContentrainClient;
356
+ exports.default = createContentrainClient;
@@ -0,0 +1,108 @@
1
+ import { ContentStatus, ContentrainConfig, FieldDef, FieldType, ModelDefinition, ModelKind } from "@contentrain/types";
2
+
3
+ //#region src/runtime/query.d.ts
4
+ interface RelationMeta {
5
+ target: string | string[];
6
+ multi: boolean;
7
+ }
8
+ type RelationResolver = (model: string, id: string, locale: string | null) => Record<string, unknown> | undefined;
9
+ declare class QueryBuilder<T extends object> {
10
+ private _data;
11
+ private _locale;
12
+ private _filters;
13
+ private _sortField;
14
+ private _sortOrder;
15
+ private _limit;
16
+ private _offset;
17
+ private _includes;
18
+ private _relationMeta;
19
+ private _resolver;
20
+ private _defaultLocale;
21
+ constructor(data: Map<string, T[]>, relationMeta?: Record<string, RelationMeta>, resolver?: RelationResolver, defaultLocale?: string);
22
+ locale(lang: string): this;
23
+ where<K extends string & keyof T>(field: K, value: T[K]): this;
24
+ sort<K extends string & keyof T>(field: K, order?: 'asc' | 'desc'): this;
25
+ limit(n: number): this;
26
+ offset(n: number): this;
27
+ include(...fields: string[]): this;
28
+ all(): T[];
29
+ first(): T | undefined;
30
+ private _resolveData;
31
+ private _resolveIncludes;
32
+ private _resolveId;
33
+ }
34
+ //#endregion
35
+ //#region src/runtime/singleton.d.ts
36
+ declare class SingletonAccessor<T extends Record<string, unknown>> {
37
+ private _data;
38
+ private _locale;
39
+ private _defaultLocale;
40
+ private _includes;
41
+ private _relationMeta;
42
+ private _resolveEntry?;
43
+ constructor(data: Map<string, T>, defaultLocale?: string, relationMeta?: Record<string, {
44
+ target: string | string[];
45
+ multi: boolean;
46
+ }>, resolveEntry?: (model: string, id: string, locale: string) => unknown);
47
+ locale(lang: string): this;
48
+ include(...fields: string[]): this;
49
+ get(): T;
50
+ private _resolveIncludes;
51
+ private _resolveId;
52
+ }
53
+ //#endregion
54
+ //#region src/runtime/dictionary.d.ts
55
+ declare class DictionaryAccessor {
56
+ private _data;
57
+ private _locale;
58
+ private _defaultLocale;
59
+ constructor(data: Map<string, Record<string, string>>, defaultLocale?: string);
60
+ locale(lang: string): this;
61
+ get(): Record<string, string>;
62
+ get(key: string): string | undefined;
63
+ get(key: string, params: Record<string, string | number>): string;
64
+ private _resolveData;
65
+ }
66
+ //#endregion
67
+ //#region src/runtime/document.d.ts
68
+ declare class DocumentQuery<T extends object> {
69
+ private _data;
70
+ private _locale;
71
+ private _filters;
72
+ private _includes;
73
+ private _relationMeta;
74
+ private _resolver;
75
+ private _defaultLocale;
76
+ constructor(data: Map<string, T[]>, relationMeta?: Record<string, RelationMeta>, resolver?: RelationResolver, defaultLocale?: string);
77
+ locale(lang: string): this;
78
+ where<K extends string & keyof T>(field: K, value: T[K]): this;
79
+ include(...fields: string[]): this;
80
+ bySlug(slug: string): T | undefined;
81
+ all(): T[];
82
+ first(): T | undefined;
83
+ private _resolveData;
84
+ private _resolveIncludes;
85
+ private _resolveId;
86
+ }
87
+ //#endregion
88
+ //#region src/index.d.ts
89
+ /**
90
+ * Factory for framework SDK authors.
91
+ * Returns the generated client module loaded from .contentrain/client/.
92
+ *
93
+ * Usage (Nuxt composable):
94
+ * ```ts
95
+ * import { createContentrainClient } from '@contentrain/query'
96
+ * const client = createContentrainClient()
97
+ * const posts = client.query('blog-post').locale('en').all()
98
+ * ```
99
+ */
100
+ declare function createContentrainClient(projectRoot?: string): Promise<{
101
+ query: (model: string) => QueryBuilder<Record<string, unknown>>;
102
+ singleton: (model: string) => SingletonAccessor<Record<string, unknown>>;
103
+ dictionary: (model: string) => DictionaryAccessor;
104
+ document: (model: string) => DocumentQuery<Record<string, unknown>>;
105
+ }>;
106
+ //#endregion
107
+ export { type ContentStatus, type ContentrainConfig, DictionaryAccessor, DocumentQuery, type FieldDef, type FieldType, type ModelDefinition, type ModelKind, QueryBuilder, type RelationMeta, type RelationResolver, SingletonAccessor, createContentrainClient, createContentrainClient as default };
108
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/runtime/query.ts","../src/runtime/singleton.ts","../src/runtime/dictionary.ts","../src/runtime/document.ts","../src/index.ts"],"mappings":";;;UAAiB,YAAA;EACf,MAAA;EACA,KAAA;AAAA;AAAA,KAGU,gBAAA,IAAoB,KAAA,UAAe,EAAA,UAAY,MAAA,oBAA0B,MAAA;AAAA,cAExE,YAAA;EAAA,QACH,KAAA;EAAA,QACA,OAAA;EAAA,QACA,QAAA;EAAA,QACA,UAAA;EAAA,QACA,UAAA;EAAA,QACA,MAAA;EAAA,QACA,OAAA;EAAA,QACA,SAAA;EAAA,QACA,aAAA;EAAA,QACA,SAAA;EAAA,QACA,cAAA;cAGN,IAAA,EAAM,GAAA,SAAY,CAAA,KAClB,YAAA,GAAe,MAAA,SAAe,YAAA,GAC9B,QAAA,GAAW,gBAAA,EACX,aAAA;EAQF,MAAA,CAAO,IAAA;EAKP,KAAA,0BAA+B,CAAA,CAAA,CAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,CAAA;EASrD,IAAA,0BAA8B,CAAA,CAAA,CAAG,KAAA,EAAO,CAAA,EAAG,KAAA;EAM3C,KAAA,CAAM,CAAA;EAKN,MAAA,CAAO,CAAA;EAKP,OAAA,CAAA,GAAW,MAAA;EAKX,GAAA,CAAA,GAAO,CAAA;EAsCP,KAAA,CAAA,GAAS,CAAA;EAAA,QAID,YAAA;EAAA,QAeA,gBAAA;EAAA,QAoCA,UAAA;AAAA;;;cChKG,iBAAA,WAA4B,MAAA;EAAA,QAC/B,KAAA;EAAA,QACA,OAAA;EAAA,QACA,cAAA;EAAA,QACA,SAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAGN,IAAA,EAAM,GAAA,SAAY,CAAA,GAClB,aAAA,WACA,YAAA,GAAe,MAAA;IAAiB,MAAA;IAA2B,KAAA;EAAA,IAC3D,YAAA,IAAgB,KAAA,UAAe,EAAA,UAAY,MAAA;EAQ7C,MAAA,CAAO,IAAA;EAKP,OAAA,CAAA,GAAW,MAAA;EAKX,GAAA,CAAA,GAAO,CAAA;EAAA,QA4BC,gBAAA;EAAA,QAuCA,UAAA;AAAA;;;cCjGG,kBAAA;EAAA,QACH,KAAA;EAAA,QACA,OAAA;EAAA,QACA,cAAA;cAEI,IAAA,EAAM,GAAA,SAAY,MAAA,mBAAyB,aAAA;EAKvD,MAAA,CAAO,IAAA;EAKP,GAAA,CAAA,GAAO,MAAA;EACP,GAAA,CAAI,GAAA;EACJ,GAAA,CAAI,GAAA,UAAa,MAAA,EAAQ,MAAA;EAAA,QAUjB,YAAA;AAAA;;;cCzBG,aAAA;EAAA,QACH,KAAA;EAAA,QACA,OAAA;EAAA,QACA,QAAA;EAAA,QACA,SAAA;EAAA,QACA,aAAA;EAAA,QACA,SAAA;EAAA,QACA,cAAA;cAGN,IAAA,EAAM,GAAA,SAAY,CAAA,KAClB,YAAA,GAAe,MAAA,SAAe,YAAA,GAC9B,QAAA,GAAW,gBAAA,EACX,aAAA;EAQF,MAAA,CAAO,IAAA;EAKP,KAAA,0BAA+B,CAAA,CAAA,CAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,CAAA;EAKrD,OAAA,CAAA,GAAW,MAAA;EAKX,MAAA,CAAO,IAAA,WAAe,CAAA;EAStB,GAAA,CAAA,GAAO,CAAA;EAWP,KAAA,CAAA,GAAS,CAAA;EAAA,QAID,YAAA;EAAA,QAeA,gBAAA;EAAA,QAoCA,UAAA;AAAA;;;;;AH5GV;;;;;;;;;iBIuBsB,uBAAA,CACpB,WAAA,YACC,OAAA;EACD,KAAA,GAAQ,KAAA,aAAkE,YAAA,CAAN,MAAA;EACpE,SAAA,GAAY,KAAA,aAA2E,iBAAA,CAAN,MAAA;EACjF,UAAA,GAAa,KAAA,aADmE,kBAAA;EAEhF,QAAA,GAAW,KAAA,aAAsE,aAAA,CAAN,MAAA;AAAA"}