@isahaq/kosh-ui 0.0.0-stage → 0.1.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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/api.d.ts +158 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +216 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/app.d.ts +14 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +355 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/components/primitives.d.ts +60 -0
  12. package/dist/components/primitives.d.ts.map +1 -0
  13. package/dist/components/primitives.js +105 -0
  14. package/dist/components/primitives.js.map +1 -0
  15. package/dist/context.d.ts +34 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +58 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/i18n/index.d.ts +14 -0
  20. package/dist/i18n/index.d.ts.map +1 -0
  21. package/dist/i18n/index.js +43 -0
  22. package/dist/i18n/index.js.map +1 -0
  23. package/dist/i18n/messages.d.ts +104 -0
  24. package/dist/i18n/messages.d.ts.map +1 -0
  25. package/dist/i18n/messages.js +194 -0
  26. package/dist/i18n/messages.js.map +1 -0
  27. package/dist/index.d.ts +31 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +42 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/cn.d.ts +4 -0
  32. package/dist/lib/cn.d.ts.map +1 -0
  33. package/dist/lib/cn.js +7 -0
  34. package/dist/lib/cn.js.map +1 -0
  35. package/dist/lib/format.d.ts +18 -0
  36. package/dist/lib/format.d.ts.map +1 -0
  37. package/dist/lib/format.js +48 -0
  38. package/dist/lib/format.js.map +1 -0
  39. package/dist/registry.d.ts +80 -0
  40. package/dist/registry.d.ts.map +1 -0
  41. package/dist/registry.js +57 -0
  42. package/dist/registry.js.map +1 -0
  43. package/dist/search/SearchBar.d.ts +19 -0
  44. package/dist/search/SearchBar.d.ts.map +1 -0
  45. package/dist/search/SearchBar.js +84 -0
  46. package/dist/search/SearchBar.js.map +1 -0
  47. package/dist/shell/Login.d.ts +7 -0
  48. package/dist/shell/Login.d.ts.map +1 -0
  49. package/dist/shell/Login.js +41 -0
  50. package/dist/shell/Login.js.map +1 -0
  51. package/dist/views/FormView.d.ts +5 -0
  52. package/dist/views/FormView.d.ts.map +1 -0
  53. package/dist/views/FormView.js +276 -0
  54. package/dist/views/FormView.js.map +1 -0
  55. package/dist/views/KanbanView.d.ts +11 -0
  56. package/dist/views/KanbanView.d.ts.map +1 -0
  57. package/dist/views/KanbanView.js +156 -0
  58. package/dist/views/KanbanView.js.map +1 -0
  59. package/dist/views/ListView.d.ts +5 -0
  60. package/dist/views/ListView.d.ts.map +1 -0
  61. package/dist/views/ListView.js +227 -0
  62. package/dist/views/ListView.js.map +1 -0
  63. package/dist/views/widgets.d.ts +15 -0
  64. package/dist/views/widgets.d.ts.map +1 -0
  65. package/dist/views/widgets.js +253 -0
  66. package/dist/views/widgets.js.map +1 -0
  67. package/package.json +75 -3
  68. package/src/styles.css +101 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Isahaq
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,22 @@
1
- # Temporary Holding Version
1
+ # @isahaq/kosh-ui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ React app shell, design system and view renderers (RFC 0007)
4
+
5
+ Part of [Kosh](https://github.com/isahaq1/kosh), a modern ERP framework on TypeScript, PostgreSQL and the
6
+ [Shutro](https://github.com/isahaq1/shutro) ORM.
7
+
8
+ ```sh
9
+ pnpm add @isahaq/kosh-ui
10
+ ```
11
+
12
+ Documentation: [docs/ui.md](https://github.com/isahaq1/kosh/blob/main/docs/ui.md) · design: [RFCs](https://github.com/isahaq1/kosh/tree/main/docs/rfcs)
13
+
14
+ Node.js 24 or later; ESM only.
15
+
16
+ ## Contact
17
+
18
+ Isahaq · hmisahaq01@gmail.com · +8801852376598
19
+
20
+ ## License
21
+
22
+ MIT
package/dist/api.d.ts ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * The API as the view renderers see it: models known only at runtime, from view definitions (RFC 0004). Business
3
+ * code uses the generated typed client (`kosh generate client`); both speak the same REST API, sessions (cookie +
4
+ * CSRF header) and RFC 9457 problems. The server decides everything; this only transports.
5
+ */
6
+ import type { Condition, SearchSpec, ViewDefinition, ViewType, WindowAction } from '@isahaq/kosh-views';
7
+ export type Row = Record<string, unknown> & {
8
+ readonly id: number;
9
+ };
10
+ /** An RFC 9457 problem. */
11
+ export interface Problem {
12
+ readonly type: string;
13
+ readonly title: string;
14
+ readonly status: number;
15
+ readonly detail: string;
16
+ readonly hint?: string;
17
+ }
18
+ /** A refused request. */
19
+ export declare class ApiError extends Error {
20
+ readonly status: number;
21
+ readonly problem: Problem;
22
+ constructor(problem: Problem);
23
+ /** The short problem type (`stale-record`, `access`, `two-factor-required`). */
24
+ get kind(): string;
25
+ }
26
+ export interface ViewField {
27
+ readonly key: string;
28
+ readonly kind: string;
29
+ readonly label: string;
30
+ readonly required: boolean;
31
+ readonly readonly: boolean;
32
+ readonly target?: string;
33
+ readonly options?: readonly {
34
+ readonly value: string;
35
+ readonly label: string;
36
+ }[];
37
+ }
38
+ /** A view for the current user (`GET /api/v1/views/:id`). */
39
+ export interface ServedView {
40
+ readonly view: ViewDefinition;
41
+ readonly fields: Readonly<Record<string, Readonly<Record<string, ViewField>>>>;
42
+ readonly transitions: readonly {
43
+ name: string;
44
+ field: string;
45
+ from: readonly string[];
46
+ to: string;
47
+ }[];
48
+ readonly operations: {
49
+ readonly create: boolean;
50
+ readonly write: boolean;
51
+ readonly unlink: boolean;
52
+ };
53
+ readonly onchange: readonly string[];
54
+ }
55
+ export interface CurrentUser {
56
+ readonly id: number;
57
+ readonly login: string;
58
+ readonly name: string;
59
+ readonly company: number | null;
60
+ readonly companies: readonly number[];
61
+ readonly twoFactorEnabled: boolean;
62
+ readonly administrator: boolean;
63
+ readonly administratorNeedsSecondFactor: boolean;
64
+ }
65
+ export interface AppEntry {
66
+ readonly code: string;
67
+ readonly label: string;
68
+ readonly icon?: string;
69
+ readonly sequence: number;
70
+ }
71
+ export interface MenuNode {
72
+ readonly id: string;
73
+ readonly label: string;
74
+ readonly app?: string;
75
+ readonly action?: string;
76
+ readonly sequence: number;
77
+ readonly children: readonly MenuNode[];
78
+ }
79
+ export interface ListQuery {
80
+ readonly filter?: Condition | undefined;
81
+ readonly order?: readonly string[];
82
+ readonly fields?: readonly string[];
83
+ readonly limit?: number;
84
+ readonly offset?: number;
85
+ readonly count?: boolean;
86
+ }
87
+ export interface Versioned {
88
+ readonly record: Row;
89
+ readonly etag: string | null;
90
+ }
91
+ /** The dynamic API. */
92
+ export interface KoshApi {
93
+ me(): Promise<CurrentUser>;
94
+ login(login: string, password: string): Promise<{
95
+ twoFactorRequired: boolean;
96
+ }>;
97
+ verifyTwoFactor(code: string): Promise<void>;
98
+ logout(): Promise<void>;
99
+ apps(): Promise<readonly AppEntry[]>;
100
+ menus(app?: string): Promise<readonly MenuNode[]>;
101
+ action(id: string): Promise<WindowAction>;
102
+ view(id: string): Promise<ServedView>;
103
+ viewFor(model: string, type: ViewType): Promise<ServedView>;
104
+ search(model: string): Promise<SearchSpec>;
105
+ list(model: string, query?: ListQuery): Promise<{
106
+ items: Row[];
107
+ count?: number;
108
+ }>;
109
+ get(model: string, id: number, fields?: readonly string[]): Promise<Versioned>;
110
+ create(model: string, values: Record<string, unknown>): Promise<Versioned>;
111
+ update(model: string, id: number, values: Record<string, unknown>, ifMatch?: string | null): Promise<Versioned>;
112
+ remove(model: string, id: number): Promise<void>;
113
+ /** Name search (`q`) or display names of `ids`. */
114
+ names(model: string, query: {
115
+ readonly q?: string;
116
+ readonly ids?: readonly number[];
117
+ readonly limit?: number;
118
+ }): Promise<{
119
+ id: number;
120
+ displayName: string;
121
+ }[]>;
122
+ transition(model: string, id: number, name: string): Promise<Versioned>;
123
+ onchange(model: string, input: {
124
+ readonly id?: number;
125
+ readonly values: Record<string, unknown>;
126
+ readonly changed: readonly string[];
127
+ }): Promise<{
128
+ values: Record<string, unknown>;
129
+ warnings?: readonly string[];
130
+ }>;
131
+ aggregate(model: string, query: {
132
+ where?: Condition | undefined;
133
+ groupBy?: readonly string[];
134
+ measures: Record<string, unknown>;
135
+ }): Promise<Record<string, unknown>[]>;
136
+ /** The company of later requests (`X-Company`). */
137
+ setCompany(company: number | undefined): void;
138
+ /** The language of later requests (`Accept-Language`: server-side labels and messages). */
139
+ setLanguage(lang: string): void;
140
+ /** Raw call for module code (custom routes). */
141
+ call<T>(method: string, path: string, body?: unknown): Promise<T>;
142
+ /** A file from the API (exports, documents): the response body and its file name. */
143
+ download(path: string, body?: unknown, method?: 'GET' | 'POST'): Promise<{
144
+ readonly blob: Blob;
145
+ readonly filename: string;
146
+ }>;
147
+ /** Sends a file as the raw body (`Content-Type` from the file, `X-Filename` URI-encoded); the JSON answer. */
148
+ upload<T>(path: string, file: Blob, filename: string): Promise<T>;
149
+ }
150
+ export interface ApiOptions {
151
+ readonly baseUrl?: string;
152
+ readonly fetch?: typeof fetch;
153
+ /** Where the CSRF token survives reloads (default: `sessionStorage`). */
154
+ readonly storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
155
+ }
156
+ /** Creates the API over the browser session (httpOnly cookie + CSRF header). */
157
+ export declare function createKoshApi(options?: ApiOptions): KoshApi;
158
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js ADDED
@@ -0,0 +1,216 @@
1
+ /** A refused request. */
2
+ export class ApiError extends Error {
3
+ status;
4
+ problem;
5
+ constructor(problem) {
6
+ super(problem.hint === undefined ? problem.detail : `${problem.detail} ${problem.hint}`);
7
+ this.name = 'ApiError';
8
+ this.status = problem.status;
9
+ this.problem = problem;
10
+ }
11
+ /** The short problem type (`stale-record`, `access`, `two-factor-required`). */
12
+ get kind() {
13
+ return this.problem.type.replace(/^https:\/\/kosh\.dev\/problems\//, '');
14
+ }
15
+ }
16
+ const CSRF_KEY = 'kosh.csrf';
17
+ /** Creates the API over the browser session (httpOnly cookie + CSRF header). */
18
+ export function createKoshApi(options = {}) {
19
+ const base = (options.baseUrl ?? '').replace(/\/$/, '');
20
+ const doFetch = options.fetch ?? globalThis.fetch.bind(globalThis);
21
+ const storage = options.storage ?? (typeof sessionStorage === 'undefined' ? undefined : sessionStorage);
22
+ let csrf = storage?.getItem(CSRF_KEY) ?? undefined;
23
+ let company;
24
+ let language;
25
+ async function request(method, path, init = {}) {
26
+ const params = new URLSearchParams();
27
+ for (const [k, v] of Object.entries(init.query ?? {}))
28
+ if (v !== undefined)
29
+ params.set(k, v);
30
+ const headers = { accept: 'application/json' };
31
+ for (const [k, v] of Object.entries(init.headers ?? {}))
32
+ if (v !== undefined)
33
+ headers[k] = v;
34
+ if (init.body !== undefined)
35
+ headers['content-type'] = 'application/json';
36
+ if (csrf !== undefined && method !== 'GET')
37
+ headers['x-csrf-token'] = csrf;
38
+ if (company !== undefined)
39
+ headers['x-company'] = String(company);
40
+ if (language !== undefined)
41
+ headers['accept-language'] = language.replace('_', '-');
42
+ const search = params.size === 0 ? '' : `?${params.toString()}`;
43
+ const response = await doFetch(`${base}${path}${search}`, {
44
+ method,
45
+ headers,
46
+ credentials: 'include',
47
+ ...(init.body === undefined ? {} : { body: JSON.stringify(init.body) }),
48
+ });
49
+ const text = await response.text();
50
+ let body = null;
51
+ try {
52
+ body = text === '' ? null : JSON.parse(text);
53
+ }
54
+ catch {
55
+ body = null;
56
+ }
57
+ if (!response.ok) {
58
+ const problem = typeof body === 'object' && body !== null && 'type' in body
59
+ ? body
60
+ : {
61
+ type: 'about:blank',
62
+ title: response.statusText,
63
+ status: response.status,
64
+ detail: text.slice(0, 300),
65
+ };
66
+ throw new ApiError(problem);
67
+ }
68
+ return { body: body, headers: response.headers };
69
+ }
70
+ const json = async (method, path, body) => (await request(method, path, body === undefined ? {} : { body })).body;
71
+ const versioned = async (pending) => {
72
+ const { body, headers } = await pending;
73
+ return { record: body, etag: headers.get('etag') };
74
+ };
75
+ const model = (name) => `/api/v1/models/${encodeURIComponent(name)}`;
76
+ return {
77
+ me: () => json('GET', '/api/v1/auth/me'),
78
+ async login(login, password) {
79
+ const result = await json('POST', '/api/v1/auth/login', { login, password });
80
+ csrf = result.csrfToken;
81
+ storage?.setItem(CSRF_KEY, csrf);
82
+ return { twoFactorRequired: result.twoFactorRequired };
83
+ },
84
+ async verifyTwoFactor(code) {
85
+ await json('POST', '/api/v1/auth/2fa/verify', { code });
86
+ },
87
+ async logout() {
88
+ await json('POST', '/api/v1/auth/logout').catch(() => undefined);
89
+ csrf = undefined;
90
+ storage?.removeItem(CSRF_KEY);
91
+ },
92
+ apps: async () => (await json('GET', '/api/v1/apps')).apps,
93
+ menus: async (app) => (await request('GET', '/api/v1/menus', { query: { app } })).body.menus,
94
+ action: async (id) => (await json('GET', `/api/v1/actions/${encodeURIComponent(id)}`)).spec,
95
+ view: (id) => json('GET', `/api/v1/views/${encodeURIComponent(id)}`),
96
+ viewFor: async (name, type) => (await request('GET', '/api/v1/views', { query: { model: name, type } })).body,
97
+ search: (name) => json('GET', `/api/v1/search/${encodeURIComponent(name)}`),
98
+ async list(name, query = {}) {
99
+ return (await request('GET', model(name), {
100
+ query: {
101
+ filter: query.filter === undefined ? undefined : JSON.stringify(query.filter),
102
+ order: query.order?.join(','),
103
+ fields: query.fields?.join(','),
104
+ limit: query.limit === undefined ? undefined : String(query.limit),
105
+ offset: query.offset === undefined ? undefined : String(query.offset),
106
+ count: query.count === true ? 'true' : undefined,
107
+ },
108
+ })).body;
109
+ },
110
+ get: (name, id, fields) => versioned(request('GET', `${model(name)}/${id}`, { query: { fields: fields?.join(',') } })),
111
+ create: (name, values) => versioned(request('POST', model(name), { body: values })),
112
+ update: (name, id, values, ifMatch) => versioned(request('PATCH', `${model(name)}/${id}`, {
113
+ body: values,
114
+ headers: { 'if-match': ifMatch ?? undefined },
115
+ })),
116
+ async remove(name, id) {
117
+ await request('DELETE', `${model(name)}/${id}`);
118
+ },
119
+ names: async (name, query) => (await request('GET', `${model(name)}/names`, {
120
+ query: {
121
+ q: query.q,
122
+ ids: query.ids === undefined ? undefined : query.ids.join(','),
123
+ limit: query.limit === undefined ? undefined : String(query.limit),
124
+ },
125
+ })).body.items,
126
+ transition: (name, id, t) => versioned(request('POST', `${model(name)}/${id}/transitions/${encodeURIComponent(t)}`)),
127
+ onchange: (name, input) => json('POST', `${model(name)}/onchange`, input),
128
+ aggregate: async (name, query) => (await json('POST', `${model(name)}/aggregate`, query))
129
+ .rows,
130
+ setCompany(next) {
131
+ company = next;
132
+ },
133
+ setLanguage(next) {
134
+ language = next;
135
+ },
136
+ call: (method, path, body) => json(method, path, body),
137
+ async upload(path, file, filename) {
138
+ const headers = {
139
+ 'content-type': file.type === '' ? 'application/octet-stream' : file.type,
140
+ 'x-filename': encodeURIComponent(filename),
141
+ };
142
+ if (csrf !== undefined)
143
+ headers['x-csrf-token'] = csrf;
144
+ if (company !== undefined)
145
+ headers['x-company'] = String(company);
146
+ if (language !== undefined)
147
+ headers['accept-language'] = language.replace('_', '-');
148
+ const response = await doFetch(`${base}${path}`, {
149
+ method: 'POST',
150
+ headers,
151
+ credentials: 'include',
152
+ body: file,
153
+ });
154
+ const text = await response.text();
155
+ let parsed = null;
156
+ try {
157
+ parsed = text === '' ? null : JSON.parse(text);
158
+ }
159
+ catch {
160
+ parsed = null;
161
+ }
162
+ if (!response.ok)
163
+ throw new ApiError(parsed ?? {
164
+ type: 'about:blank',
165
+ title: response.statusText,
166
+ status: response.status,
167
+ detail: text.slice(0, 300),
168
+ });
169
+ return parsed;
170
+ },
171
+ async download(path, body, method = 'POST') {
172
+ const headers = method === 'POST' ? { 'content-type': 'application/json' } : {};
173
+ if (csrf !== undefined && method !== 'GET')
174
+ headers['x-csrf-token'] = csrf;
175
+ if (company !== undefined)
176
+ headers['x-company'] = String(company);
177
+ if (language !== undefined)
178
+ headers['accept-language'] = language.replace('_', '-');
179
+ const response = await doFetch(`${base}${path}`, {
180
+ method,
181
+ headers,
182
+ credentials: 'include',
183
+ ...(method === 'POST' ? { body: JSON.stringify(body ?? {}) } : {}),
184
+ });
185
+ if (!response.ok) {
186
+ const text = await response.text();
187
+ let problem;
188
+ try {
189
+ problem = JSON.parse(text);
190
+ }
191
+ catch {
192
+ problem = {
193
+ type: 'about:blank',
194
+ title: response.statusText,
195
+ status: response.status,
196
+ detail: text.slice(0, 300),
197
+ };
198
+ }
199
+ throw new ApiError(problem);
200
+ }
201
+ const disposition = response.headers.get('content-disposition') ?? '';
202
+ // RFC 6266: the UTF-8 name when given, else the ASCII fallback.
203
+ const encoded = /filename\*=UTF-8''([^;]+)/i.exec(disposition)?.[1];
204
+ let filename = /filename="([^"]+)"/.exec(disposition)?.[1] ?? 'download';
205
+ if (encoded !== undefined)
206
+ try {
207
+ filename = decodeURIComponent(encoded);
208
+ }
209
+ catch {
210
+ // keep the fallback
211
+ }
212
+ return { blob: await response.blob(), filename };
213
+ },
214
+ };
215
+ }
216
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { type ReactElement, type ReactNode } from 'react';
2
+ import { type KoshApi } from './api.js';
3
+ import type { Registry } from './registry.js';
4
+ export interface KoshAppProps {
5
+ readonly api: KoshApi;
6
+ readonly registry: Registry;
7
+ /** Module messages by namespace and language (`{ reporting: { en: {...}, bn: {...} } }`). */
8
+ readonly messages?: Readonly<Record<string, Readonly<Record<string, object>>>>;
9
+ /** Loading screen while translations initialize. */
10
+ readonly fallback?: ReactNode;
11
+ }
12
+ /** The whole app: providers, translations, router. */
13
+ export declare function KoshApp({ api, registry, messages, fallback }: KoshAppProps): ReactElement;
14
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AA+CA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAEf,OAAO,EAA8B,KAAK,OAAO,EAAiB,MAAM,UAAU,CAAC;AAkBnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqkB9C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAe,EAAE,EAAE,YAAY,GAAG,YAAY,CA2DhG"}