@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
@@ -0,0 +1,276 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * The form renderer (RFC 0007 §5): statusbar and transition buttons from the served view (only what the user may
4
+ * run, from the current state), groups, notebooks, editable lines, registered components (escape hatches), onchange
5
+ * assistance, and saves with compare-and-set (a record changed by someone else since it was opened is not
6
+ * overwritten: the user reloads). Conditions only decide display; the server re-checks every write.
7
+ */
8
+ import { evaluate, holds, } from '@isahaq/kosh-views';
9
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
10
+ import { ArrowLeft, MoreHorizontal, Plus, Trash2 } from 'lucide-react';
11
+ import { useEffect, useId, useMemo, useState } from 'react';
12
+ import { useTranslation } from 'react-i18next';
13
+ import { ApiError } from '../api.js';
14
+ import { Alert, Button, Dialog, Label, Menu, MenuContent, MenuItem, MenuTrigger, Spinner, Tabs, TabsContent, TabsList, TabsTrigger, } from '../components/primitives.js';
15
+ import { useKosh } from '../context.js';
16
+ import { cn } from '../lib/cn.js';
17
+ import { PrefetchedNames, useRowNames } from './widgets.js';
18
+ function commandsOf(lines) {
19
+ return {
20
+ ...(lines.rows.some((r) => r.id === undefined)
21
+ ? { create: lines.rows.filter((r) => r.id === undefined).map((r) => r.values) }
22
+ : {}),
23
+ ...(lines.rows.some((r) => r.id !== undefined && r.dirty)
24
+ ? {
25
+ update: lines.rows
26
+ .filter((r) => r.id !== undefined && r.dirty)
27
+ .map((r) => ({ id: r.id, values: r.values })),
28
+ }
29
+ : {}),
30
+ ...(lines.deleted.length > 0 ? { delete: lines.deleted } : {}),
31
+ };
32
+ }
33
+ /** The payload of a save: changed values, many2many as `{ set }`. */
34
+ function payloadOf(changes, fields, lines) {
35
+ const out = {};
36
+ for (const [key, value] of Object.entries(changes)) {
37
+ if (fields[key]?.kind === 'many2many')
38
+ out[key] = { set: Array.isArray(value) ? value : [] };
39
+ else
40
+ out[key] = value;
41
+ }
42
+ for (const [key, state] of lines) {
43
+ const commands = commandsOf(state);
44
+ if (Object.keys(commands).length > 0)
45
+ out[key] = commands;
46
+ }
47
+ return out;
48
+ }
49
+ function Lines({ node, served, ids, readonly, state, onState, }) {
50
+ const { api, registry } = useKosh();
51
+ const { t } = useTranslation();
52
+ const field = served.fields[served.view.model]?.[node.field];
53
+ const target = field?.target ?? '';
54
+ const columnFields = served.fields[target] ?? {};
55
+ const columns = node.columns.filter((c) => columnFields[c.field] !== undefined);
56
+ const loaded = useQuery({
57
+ queryKey: ['lines', target, ids],
58
+ queryFn: () => api.list(target, {
59
+ filter: { id: { in: [...ids] } },
60
+ fields: ['id', ...columns.map((c) => c.field)],
61
+ limit: 1000,
62
+ }),
63
+ enabled: ids.length > 0 && target !== '',
64
+ });
65
+ const rows = state?.rows ??
66
+ (loaded.data?.items ?? []).map((r) => ({
67
+ key: `id-${r.id}`,
68
+ id: r.id,
69
+ values: r,
70
+ dirty: false,
71
+ }));
72
+ const names = useRowNames(rows.map((r) => r.values), Object.values(columnFields));
73
+ if (field === undefined)
74
+ return null;
75
+ const set = (next, deleted = state?.deleted ?? []) => onState({ rows: next, deleted });
76
+ return (_jsx(PrefetchedNames.Provider, { value: names, children: _jsxs("div", { className: "col-span-full overflow-x-auto", children: [_jsxs("table", { className: "w-full text-sm", children: [_jsx("caption", { className: "sr-only", children: node.id }), _jsx("thead", { children: _jsxs("tr", { className: "border-b", children: [columns.map((c) => (_jsx("th", { scope: "col", className: "px-2 py-1.5 text-start font-medium text-muted-foreground", children: c.label ?? columnFields[c.field]?.label ?? c.field }, c.id))), _jsx("th", { className: "w-10", children: _jsx("span", { className: "sr-only", children: t('views.removeLine') }) })] }) }), _jsx("tbody", { children: rows.map((row, index) => (_jsxs("tr", { className: "border-b", children: [columns.map((c) => {
77
+ const meta = columnFields[c.field];
78
+ const Widget = registry.widget(c, meta);
79
+ return (_jsx("td", { className: "px-2 py-1", children: _jsx(Widget, { id: `${row.key}-${c.id}`, node: c, field: meta, value: row.values[c.field], record: row.values, readonly: readonly || meta.readonly, onChange: (value) => set(rows.map((r, i) => i === index
80
+ ? { ...r, values: { ...r.values, [c.field]: value }, dirty: true }
81
+ : r)) }) }, c.id));
82
+ }), _jsx("td", { children: readonly ? null : (_jsx(Button, { variant: "ghost", size: "icon", "aria-label": t('views.removeLine'), onClick: () => set(rows.filter((_, i) => i !== index), row.id === undefined
83
+ ? (state?.deleted ?? [])
84
+ : [...(state?.deleted ?? []), row.id]), children: _jsx(Trash2, { "aria-hidden": true }) })) })] }, row.key))) })] }), readonly ? null : (_jsxs(Button, { variant: "link", size: "sm", className: "mt-1", onClick: () => set([...rows, { key: `new-${rows.length}-${Date.now()}`, values: {}, dirty: true }]), children: [_jsx(Plus, { "aria-hidden": true }), t('views.addLine')] }))] }) }));
85
+ }
86
+ /** The default form renderer. */
87
+ export function FormView({ served, recordId, defaults, onSaved, onBack }) {
88
+ const { api, registry, uid, companyId } = useKosh();
89
+ const { t } = useTranslation();
90
+ const queryClient = useQueryClient();
91
+ const formId = useId();
92
+ const view = served.view;
93
+ if (view.type !== 'form')
94
+ throw new Error(`FormView renders form views, not ${view.type}.`);
95
+ const model = view.model;
96
+ const fields = served.fields[model] ?? {};
97
+ const isNew = recordId === 'new';
98
+ const loaded = useQuery({
99
+ queryKey: ['record', model, recordId],
100
+ queryFn: async () => isNew
101
+ ? {
102
+ record: {
103
+ id: 0,
104
+ ...(await api.onchange(model, { values: defaults ?? {}, changed: [] })).values,
105
+ },
106
+ etag: null,
107
+ }
108
+ : api.get(model, recordId),
109
+ });
110
+ const [changes, setChanges] = useState({});
111
+ const [lines, setLines] = useState(new Map());
112
+ const [problem, setProblem] = useState(null);
113
+ const [warnings, setWarnings] = useState([]);
114
+ const [confirming, setConfirming] = useState(null);
115
+ const [deleting, setDeleting] = useState(false);
116
+ // biome-ignore lint/correctness/useExhaustiveDependencies: a new record id starts a clean form
117
+ useEffect(() => {
118
+ setChanges({});
119
+ setLines(new Map());
120
+ setProblem(null);
121
+ }, [recordId]);
122
+ const record = loaded.data?.record;
123
+ const values = useMemo(() => ({ ...(record ?? {}), ...changes }), [record, changes]);
124
+ const env = { uid, companyId };
125
+ const dirty = Object.keys(changes).length > 0 || lines.size > 0;
126
+ const canEdit = isNew ? served.operations.create : served.operations.write;
127
+ const locked = !canEdit || (!isNew && holds(view.readonlyWhen, values, env));
128
+ const save = useMutation({
129
+ mutationFn: async () => {
130
+ const payload = payloadOf(changes, fields, lines);
131
+ return isNew
132
+ ? api.create(model, payload)
133
+ : api.update(model, recordId, payload, loaded.data?.etag ?? null);
134
+ },
135
+ onSuccess: async (result) => {
136
+ setChanges({});
137
+ setLines(new Map());
138
+ setProblem(null);
139
+ await queryClient.invalidateQueries({ queryKey: ['list', model] });
140
+ if (isNew)
141
+ onSaved(result.record.id);
142
+ else
143
+ queryClient.setQueryData(['record', model, recordId], result);
144
+ },
145
+ onError: (e) => setProblem(e instanceof ApiError ? e : null),
146
+ });
147
+ const transition = useMutation({
148
+ mutationFn: async (name) => {
149
+ if (dirty)
150
+ await save.mutateAsync();
151
+ return api.transition(model, recordId, name);
152
+ },
153
+ onSuccess: async (result) => {
154
+ setProblem(null);
155
+ queryClient.setQueryData(['record', model, recordId], result);
156
+ await queryClient.invalidateQueries({ queryKey: ['list', model] });
157
+ },
158
+ onError: (e) => setProblem(e instanceof ApiError ? e : null),
159
+ });
160
+ const remove = useMutation({
161
+ mutationFn: () => api.remove(model, recordId),
162
+ onSuccess: async () => {
163
+ await queryClient.invalidateQueries({ queryKey: ['list', model] });
164
+ onBack();
165
+ },
166
+ onError: (e) => setProblem(e instanceof ApiError ? e : null),
167
+ });
168
+ const change = (key, value) => {
169
+ const next = { ...changes, [key]: value };
170
+ setChanges(next);
171
+ if (!served.onchange.includes(key))
172
+ return;
173
+ void api
174
+ .onchange(model, {
175
+ ...(isNew ? {} : { id: recordId }),
176
+ values: { ...values, [key]: value },
177
+ changed: [key],
178
+ })
179
+ .then((result) => {
180
+ const assisted = {};
181
+ for (const [k, v] of Object.entries(result.values))
182
+ if (k !== key && k !== 'id' && values[k] !== v)
183
+ assisted[k] = v;
184
+ if (Object.keys(assisted).length > 0)
185
+ setChanges((c) => ({ ...c, ...assisted }));
186
+ setWarnings(result.warnings ?? []);
187
+ })
188
+ .catch(() => undefined);
189
+ };
190
+ const names = useRowNames(record === undefined ? [] : [values], Object.values(fields));
191
+ if (loaded.isPending)
192
+ return _jsx(Spinner, { label: t('app.loading') });
193
+ if (loaded.isError)
194
+ return (_jsx(Alert, { action: _jsx(Button, { size: "sm", onClick: onBack, children: t('views.back') }), children: loaded.error instanceof ApiError ? loaded.error.message : t('app.error') }));
195
+ const visible = (condition) => evaluate(condition, values, env) !== false;
196
+ const renderField = (node) => {
197
+ const field = fields[node.field];
198
+ if (field === undefined || !visible(node.visibleWhen))
199
+ return null;
200
+ const Widget = registry.widget(node, field);
201
+ const readonly = locked || field.readonly || holds(node.readonlyWhen, values, env);
202
+ const id = `${formId}-${node.id}`;
203
+ const invalid = problem?.problem.detail.includes(node.field) === true;
204
+ return (_jsxs("div", { className: cn('grid gap-1', (field.kind === 'text' || field.kind === 'html') && 'col-span-full'), children: [_jsxs(Label, { htmlFor: id, children: [node.label ?? field.label, field.required && !readonly ? (_jsxs("span", { "aria-hidden": true, className: "text-danger", children: [' ', "*"] })) : null] }), _jsx("div", { className: "min-h-9 py-1.5 text-sm", children: _jsx(Widget, { id: id, node: node, field: field, value: values[node.field], record: values, readonly: readonly, onChange: (v) => change(node.field, v), invalid: invalid }) }), node.help === undefined ? null : (_jsx("p", { className: "text-xs text-muted-foreground", children: node.help }))] }, node.id));
205
+ };
206
+ const renderNodes = (nodes) => nodes.map((node) => {
207
+ switch (node.kind) {
208
+ case 'field':
209
+ return renderField(node);
210
+ case 'group':
211
+ if (!visible(node.visibleWhen))
212
+ return null;
213
+ return (_jsxs("fieldset", { className: "col-span-full", children: [node.label === undefined ? null : (_jsx("legend", { className: "mb-2 text-sm font-semibold", children: node.label })), _jsx("div", { className: cn('grid gap-x-6 gap-y-3', node.columns === 1
214
+ ? 'grid-cols-1'
215
+ : node.columns === 3
216
+ ? 'sm:grid-cols-3'
217
+ : 'sm:grid-cols-2'), children: renderNodes(node.children) })] }, node.id));
218
+ case 'notebook': {
219
+ const pages = node.pages.filter((p) => visible(p.visibleWhen));
220
+ if (pages.length === 0)
221
+ return null;
222
+ return (_jsxs(Tabs, { defaultValue: pages[0]?.id, className: "col-span-full", children: [_jsx(TabsList, { children: pages.map((p) => (_jsx(TabsTrigger, { value: p.id, children: p.label }, p.id))) }), pages.map((p) => (_jsx(TabsContent, { value: p.id, children: _jsx("div", { className: "grid gap-x-6 gap-y-3 sm:grid-cols-2", children: renderNodes(p.children) }) }, p.id)))] }, node.id));
223
+ }
224
+ case 'lines': {
225
+ const ids = Array.isArray(values[node.field])
226
+ ? values[node.field].filter((v) => typeof v === 'number')
227
+ : [];
228
+ return (_jsx(Lines, { node: node, served: served, ids: ids, readonly: locked || holds(node.readonlyWhen, values, env), state: lines.get(node.field), onState: (state) => setLines((m) => new Map(m).set(node.field, state)) }, node.id));
229
+ }
230
+ default: {
231
+ // component nodes (the escape hatch)
232
+ if (!visible(node.visibleWhen))
233
+ return null;
234
+ const Component = registry.component(node.component);
235
+ if (Component === undefined)
236
+ return (_jsx(Alert, { tone: "warning", children: `Component '${node.component}' is not registered.` }, node.id));
237
+ return (_jsx("div", { className: "col-span-full", children: _jsx(Component, { node: node, record: isNew ? null : (record ?? null), model: model, served: served, api: api, version: loaded.data?.etag ?? null, reload: () => void queryClient.invalidateQueries({ queryKey: ['record', model, recordId] }) }) }, node.id));
238
+ }
239
+ }
240
+ });
241
+ const statusbar = view.header.statusbar;
242
+ const state = statusbar === undefined ? undefined : values[statusbar];
243
+ const buttons = view.header.buttons.filter((b) => {
244
+ const spec = served.transitions.find((tr) => tr.name === b.transition);
245
+ return (!isNew &&
246
+ spec !== undefined &&
247
+ (state === undefined || spec.from.includes(String(state))) &&
248
+ visible(b.visibleWhen));
249
+ });
250
+ const title = String(values['displayName'] ?? values['name'] ?? (isNew ? t('views.new') : `#${recordId}`));
251
+ return (_jsxs(PrefetchedNames.Provider, { value: names, children: [_jsxs("form", { "aria-label": title, className: "grid gap-4", onSubmit: (e) => {
252
+ e.preventDefault();
253
+ if (dirty && !locked)
254
+ save.mutate();
255
+ }, children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "ghost", size: "icon", "aria-label": t('views.back'), onClick: onBack, children: _jsx(ArrowLeft, { className: "rtl:-scale-x-100", "aria-hidden": true }) }), _jsx("h1", { className: "text-lg font-semibold", children: title })] }), _jsxs("div", { className: "flex items-center gap-2", children: [dirty && !locked ? (_jsxs(_Fragment, { children: [_jsx(Button, { type: "button", onClick: () => {
256
+ setChanges({});
257
+ setLines(new Map());
258
+ setProblem(null);
259
+ }, children: t('views.discard') }), _jsx(Button, { type: "submit", variant: "primary", busy: save.isPending, children: t('views.save') })] })) : null, !isNew && served.operations.unlink ? (_jsxs(Menu, { children: [_jsx(MenuTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "icon", "aria-label": "Actions", children: _jsx(MoreHorizontal, { "aria-hidden": true }) }) }), _jsx(MenuContent, { children: _jsxs(MenuItem, { onSelect: () => setDeleting(true), children: [_jsx(Trash2, { className: "size-4", "aria-hidden": true }), t('views.delete')] }) })] })) : null] })] }), problem === null ? null : (_jsx(Alert, { tone: problem.kind === 'stale-record' ? 'warning' : 'danger', action: problem.kind === 'stale-record' ? (_jsx(Button, { type: "button", size: "sm", onClick: () => {
260
+ setChanges({});
261
+ setProblem(null);
262
+ void loaded.refetch();
263
+ }, children: t('views.reload') })) : undefined, children: problem.kind === 'stale-record' ? t('views.stale') : problem.message })), warnings.map((w) => (_jsx(Alert, { tone: "info", children: w }, w))), statusbar === undefined && buttons.length === 0 ? null : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 rounded-lg border bg-surface px-3 py-2", children: [_jsx("div", { className: "flex flex-wrap gap-2", children: buttons.map((b) => (_jsx(Button, { type: "button", size: "sm", variant: b.primary === true ? 'primary' : 'secondary', busy: transition.isPending && transition.variables === b.transition, onClick: () => b.confirm === undefined ? transition.mutate(b.transition) : setConfirming(b), children: b.label ?? b.transition }, b.id))) }), statusbar === undefined ? null : (_jsx("ol", { "aria-label": fields[statusbar]?.label ?? statusbar, className: "flex flex-wrap items-center gap-1 text-xs", children: (fields[statusbar]?.options ?? []).map((o) => (_jsx("li", { "aria-current": o.value === state ? 'step' : undefined, className: cn('rounded-full px-2.5 py-1', o.value === state
264
+ ? 'bg-primary text-primary-foreground'
265
+ : 'bg-muted text-muted-foreground'), children: o.label }, o.value))) }))] })), _jsxs("div", { className: "grid gap-6 rounded-lg border bg-surface p-5", children: [locked && !isNew ? (_jsx("p", { className: "text-xs text-muted-foreground", children: t('views.readonly') })) : null, _jsx("div", { className: "grid gap-x-6 gap-y-4 sm:grid-cols-2", children: renderNodes(view.sheet) })] }), view.chatter === true && registry.component('chatter') !== undefined && !isNew
266
+ ? (() => {
267
+ const Chatter = registry.component('chatter');
268
+ return (_jsx(Chatter, { node: { kind: 'component', id: 'chatter', component: 'chatter' }, record: record ?? null, model: model, served: served, api: api, version: loaded.data?.etag ?? null, reload: () => void loaded.refetch() }));
269
+ })()
270
+ : null] }), _jsx(Dialog, { open: confirming !== null, onOpenChange: (open) => !open && setConfirming(null), title: confirming?.label ?? confirming?.transition ?? '', description: confirming?.confirm ?? '', footer: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => setConfirming(null), children: t('views.no') }), _jsx(Button, { variant: "primary", onClick: () => {
271
+ if (confirming !== null)
272
+ transition.mutate(confirming.transition);
273
+ setConfirming(null);
274
+ }, children: t('views.yes') })] }) }), _jsx(Dialog, { open: deleting, onOpenChange: setDeleting, title: t('views.confirmDelete'), footer: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => setDeleting(false), children: t('views.no') }), _jsx(Button, { variant: "danger", busy: remove.isPending, onClick: () => remove.mutate(), children: t('views.delete') })] }) })] }));
275
+ }
276
+ //# sourceMappingURL=FormView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormView.js","sourceRoot":"","sources":["../../src/views/FormView.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAGL,QAAQ,EAGR,KAAK,GAEN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAqB,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAA6C,MAAM,WAAW,CAAC;AAChF,OAAO,EACL,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,WAAW,EACX,OAAO,EACP,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAe5D,SAAS,UAAU,CAAC,KAAgB;IAClC,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;YAC5C,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;YAC/E,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC;YACvD,CAAC,CAAC;gBACE,MAAM,EAAE,KAAK,CAAC,IAAI;qBACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC;qBAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAChD;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAChB,OAAe,EACf,MAA2C,EAC3C,KAAqC;IAErC,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,WAAW;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;;YACxF,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,EACb,IAAI,EACJ,MAAM,EACN,GAAG,EACH,QAAQ,EACR,KAAK,EACL,OAAO,GAQR;IACC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,QAAQ,CAAC;QACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,CACZ,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE;YAChC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9C,KAAK,EAAE,IAAI;SACZ,CAAC;QACJ,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,EAAE;KACzC,CAAC,CAAC;IACH,MAAM,IAAI,GACR,KAAK,EAAE,IAAI;QACX,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE;YACjB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAW;YACnB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC,CAAC;IACN,MAAM,KAAK,GAAG,WAAW,CACvB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EACzB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAC5B,CAAC;IACF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,CAAC,IAAuB,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,CACtE,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACpC,eAAK,SAAS,EAAC,+BAA+B,aAC5C,iBAAO,SAAS,EAAC,gBAAgB,aAC/B,kBAAS,SAAS,EAAC,SAAS,YAAE,IAAI,CAAC,EAAE,GAAW,EAChD,0BACE,cAAI,SAAS,EAAC,UAAU,aACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,aAEE,KAAK,EAAC,KAAK,EACX,SAAS,EAAC,0DAA0D,YAEnE,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,KAAK,IAJ9C,CAAC,CAAC,EAAE,CAKN,CACN,CAAC,EACF,aAAI,SAAS,EAAC,MAAM,YAClB,eAAM,SAAS,EAAC,SAAS,YAAE,CAAC,CAAC,kBAAkB,CAAC,GAAQ,GACrD,IACF,GACC,EACR,0BACG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,cAAkB,SAAS,EAAC,UAAU,aACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wCACjB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAc,CAAC;wCAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;wCACxC,OAAO,CACL,aAAe,SAAS,EAAC,WAAW,YAClC,KAAC,MAAM,IACL,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,EACxB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,EACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,GAAG,CACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,KAAK;oDACT,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;oDAClE,CAAC,CAAC,CAAC,CACN,CACF,GAEH,IAjBK,CAAC,CAAC,EAAE,CAkBR,CACN,CAAC;oCACJ,CAAC,CAAC,EACF,uBACG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,CAAC,CAAC,kBAAkB,CAAC,EACjC,OAAO,EAAE,GAAG,EAAE,CACZ,GAAG,CACD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,EAClC,GAAG,CAAC,EAAE,KAAK,SAAS;gDAClB,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;gDACxB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CACxC,YAGH,KAAC,MAAM,0BAAe,GACf,CACV,GACE,KA5CE,GAAG,CAAC,GAAG,CA6CX,CACN,CAAC,GACI,IACF,EACP,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,MAAC,MAAM,IACL,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,MAAM,EAChB,OAAO,EAAE,GAAG,EAAE,CACZ,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,aAGtF,KAAC,IAAI,0BAAe,EACnB,CAAC,CAAC,eAAe,CAAC,IACZ,CACV,IACG,GACmB,CAC5B,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAa;IACjF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,KAAK,KAAK,CAAC;IAEjC,MAAM,MAAM,GAAG,QAAQ,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrC,OAAO,EAAE,KAAK,IAAI,EAAE,CAClB,KAAK;YACH,CAAC,CAAC;gBACE,MAAM,EAAE;oBACN,EAAE,EAAE,CAAC;oBACL,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;iBACxE;gBACR,IAAI,EAAE,IAAI;aACX;YACH,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC/B,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAiC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,+FAA+F;IAC/F,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAS,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7F,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAE7E,MAAM,IAAI,GAAG,WAAW,CAAC;QACvB,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,KAAK;gBACV,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC5B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1B,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;;gBAChC,WAAW,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KAC7D,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,WAAW,CAAC;QAC7B,UAAU,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;YACjC,IAAI,KAAK;gBAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,QAAkB,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1B,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,WAAW,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KAC7D,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,WAAW,CAAC;QACzB,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAkB,CAAC;QACvD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACnE,MAAM,EAAE,CAAC;QACX,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KAC7D,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;QAC1C,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO;QAC3C,KAAK,GAAG;aACL,QAAQ,CAAC,KAAK,EAAE;YACf,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;YAClC,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE;YACnC,OAAO,EAAE,CAAC,GAAG,CAAC;SACf,CAAC;aACD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,MAAM,QAAQ,GAAW,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;YACjF,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,GAAI,CAAC;IAClE,IAAI,MAAM,CAAC,OAAO;QAChB,OAAO,CACL,KAAC,KAAK,IACJ,MAAM,EACJ,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,MAAM,YAC9B,CAAC,CAAC,YAAY,CAAC,GACT,YAGV,MAAM,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GACnE,CACT,CAAC;IAEJ,MAAM,OAAO,GAAG,CAAC,SAAgC,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC;IACjG,MAAM,WAAW,GAAG,CAAC,IAAe,EAAuB,EAAE;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACnF,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;QACtE,OAAO,CACL,eAEE,SAAS,EAAE,EAAE,CACX,YAAY,EACZ,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,eAAe,CACpE,aAED,MAAC,KAAK,IAAC,OAAO,EAAE,EAAE,aACf,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EACzB,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC7B,qCAAkB,SAAS,EAAC,aAAa,aACtC,GAAG,SAEC,CACR,CAAC,CAAC,CAAC,IAAI,IACF,EACR,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,MAAM,IACL,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EACtC,OAAO,EAAE,OAAO,GAChB,GACE,EACL,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,YAAG,SAAS,EAAC,+BAA+B,YAAE,IAAI,CAAC,IAAI,GAAK,CAC7D,KA7BI,IAAI,CAAC,EAAE,CA8BR,CACP,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,KAA0B,EAA2B,EAAE,CAC1E,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5C,OAAO,CACL,oBAAwB,SAAS,EAAC,eAAe,aAC9C,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjC,iBAAQ,SAAS,EAAC,4BAA4B,YAAE,IAAI,CAAC,KAAK,GAAU,CACrE,EACD,cACE,SAAS,EAAE,EAAE,CACX,sBAAsB,EACtB,IAAI,CAAC,OAAO,KAAK,CAAC;gCAChB,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC;oCAClB,CAAC,CAAC,gBAAgB;oCAClB,CAAC,CAAC,gBAAgB,CACvB,YAEA,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GACvB,KAfO,IAAI,CAAC,EAAE,CAgBX,CACZ,CAAC;YACJ,KAAK,UAAU,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACpC,OAAO,CACL,MAAC,IAAI,IAAe,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAC,eAAe,aACvE,KAAC,QAAQ,cACN,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,KAAC,WAAW,IAAY,KAAK,EAAE,CAAC,CAAC,EAAE,YAChC,CAAC,CAAC,KAAK,IADQ,CAAC,CAAC,EAAE,CAER,CACf,CAAC,GACO,EACV,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,KAAC,WAAW,IAAY,KAAK,EAAE,CAAC,CAAC,EAAE,YACjC,cAAK,SAAS,EAAC,qCAAqC,YACjD,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GACpB,IAHU,CAAC,CAAC,EAAE,CAIR,CACf,CAAC,KAdO,IAAI,CAAC,EAAE,CAeX,CACR,CAAC;YACJ,CAAC;YACD,KAAK,OAAO,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3C,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;oBACrF,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CACL,KAAC,KAAK,IAEJ,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EACzD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IANjE,IAAI,CAAC,EAAE,CAOZ,CACH,CAAC;YACJ,CAAC;YACD,SAAS,CAAC;gBACR,qCAAqC;gBACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,IAAI,SAAS,KAAK,SAAS;oBACzB,OAAO,CACL,KAAC,KAAK,IAAe,IAAI,EAAC,SAAS,YAChC,cAAc,IAAI,CAAC,SAAS,sBAAsB,IADzC,IAAI,CAAC,EAAE,CAEX,CACT,CAAC;gBACJ,OAAO,CACL,cAAmB,SAAS,EAAC,eAAe,YAC1C,KAAC,SAAS,IACR,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,EACvC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,EAClC,MAAM,EAAE,GAAG,EAAE,CACX,KAAK,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,GAE/E,IAXM,IAAI,CAAC,EAAE,CAYX,CACP,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QACvE,OAAO,CACL,CAAC,KAAK;YACN,IAAI,KAAK,SAAS;YAClB,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CACvB,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAClB,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CACrF,CAAC;IAEF,OAAO,CACL,MAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,aACpC,8BACc,KAAK,EACjB,SAAS,EAAC,YAAY,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,IAAI,KAAK,IAAI,CAAC,MAAM;wBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtC,CAAC,aAED,eAAK,SAAS,EAAC,mDAAmD,aAChE,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,CAAC,CAAC,YAAY,CAAC,EAC3B,OAAO,EAAE,MAAM,YAEf,KAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,wBAAe,GAC/C,EACT,aAAI,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAM,IAC9C,EACN,eAAK,SAAS,EAAC,yBAAyB,aACrC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAClB,8BACE,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;oDACZ,UAAU,CAAC,EAAE,CAAC,CAAC;oDACf,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;oDACpB,UAAU,CAAC,IAAI,CAAC,CAAC;gDACnB,CAAC,YAEA,CAAC,CAAC,eAAe,CAAC,GACZ,EACT,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,YACzD,CAAC,CAAC,YAAY,CAAC,GACT,IACR,CACJ,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CACpC,MAAC,IAAI,eACH,KAAC,WAAW,IAAC,OAAO,kBAClB,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAY,SAAS,YACpE,KAAC,cAAc,0BAAe,GACvB,GACG,EACd,KAAC,WAAW,cACV,MAAC,QAAQ,IAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,aACzC,KAAC,MAAM,IAAC,SAAS,EAAC,QAAQ,wBAAe,EACxC,CAAC,CAAC,cAAc,CAAC,IACT,GACC,IACT,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,EAEL,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACzB,KAAC,KAAK,IACJ,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAC5D,MAAM,EACJ,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE;gCACZ,UAAU,CAAC,EAAE,CAAC,CAAC;gCACf,UAAU,CAAC,IAAI,CAAC,CAAC;gCACjB,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;4BACxB,CAAC,YAEA,CAAC,CAAC,cAAc,CAAC,GACX,CACV,CAAC,CAAC,CAAC,SAAS,YAGd,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAC/D,CACT,EACA,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,KAAC,KAAK,IAAS,IAAI,EAAC,MAAM,YACvB,CAAC,IADQ,CAAC,CAEL,CACT,CAAC,EAED,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACxD,eAAK,SAAS,EAAC,0FAA0F,aACvG,cAAK,SAAS,EAAC,sBAAsB,YAClC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,KAAC,MAAM,IAEL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EACrD,IAAI,EAAE,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,KAAK,CAAC,CAAC,UAAU,EACnE,OAAO,EAAE,GAAG,EAAE,CACZ,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAG7E,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,IATnB,CAAC,CAAC,EAAE,CAUF,CACV,CAAC,GACE,EACL,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,2BACc,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,SAAS,EACjD,SAAS,EAAC,2CAA2C,YAEpD,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC7C,6BAEgB,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACpD,SAAS,EAAE,EAAE,CACX,0BAA0B,EAC1B,CAAC,CAAC,KAAK,KAAK,KAAK;wCACf,CAAC,CAAC,oCAAoC;wCACtC,CAAC,CAAC,gCAAgC,CACrC,YAEA,CAAC,CAAC,KAAK,IATH,CAAC,CAAC,KAAK,CAUT,CACN,CAAC,GACC,CACN,IACG,CACP,EAED,eAAK,SAAS,EAAC,6CAA6C,aACzD,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAClB,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,gBAAgB,CAAC,GAAK,CACvE,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAC,qCAAqC,YAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAO,IAChF,EAEL,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK;wBAC7E,CAAC,CAAC,CAAC,GAAG,EAAE;4BACJ,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAE3C,CAAC;4BACF,OAAO,CACL,KAAC,OAAO,IACN,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAChE,MAAM,EAAE,MAAM,IAAI,IAAI,EACtB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,EAClC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,GACnC,CACH,CAAC;wBACJ,CAAC,CAAC,EAAE;wBACN,CAAC,CAAC,IAAI,IACH,EAEP,KAAC,MAAM,IACL,IAAI,EAAE,UAAU,KAAK,IAAI,EACzB,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EACpD,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,UAAU,EAAE,UAAU,IAAI,EAAE,EACxD,WAAW,EAAE,UAAU,EAAE,OAAO,IAAI,EAAE,EACtC,MAAM,EACJ,8BACE,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,YAAG,CAAC,CAAC,UAAU,CAAC,GAAU,EACpE,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE;gCACZ,IAAI,UAAU,KAAK,IAAI;oCAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gCAClE,aAAa,CAAC,IAAI,CAAC,CAAC;4BACtB,CAAC,YAEA,CAAC,CAAC,WAAW,CAAC,GACR,IACR,GAEL,EACF,KAAC,MAAM,IACL,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,WAAW,EACzB,KAAK,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAC/B,MAAM,EACJ,8BACE,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,YAAG,CAAC,CAAC,UAAU,CAAC,GAAU,EACnE,KAAC,MAAM,IAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,YAC5E,CAAC,CAAC,cAAc,CAAC,GACX,IACR,GAEL,IACuB,CAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The kanban renderer (RFC 0007 §5): one column per value of the group-by field (selection or state options, or
3
+ * the groups the server returns for a many2one), cards from the view's card spec, drag-and-drop with dnd-kit
4
+ * (keyboard too: Space to pick up, arrows, Space to drop). Moving a card between state columns runs the transition
5
+ * that leads there; other fields are written. The server refuses moves the user may not make.
6
+ */
7
+ import { type ReactElement } from 'react';
8
+ import type { ViewProps } from '../registry.js';
9
+ /** The default kanban renderer. */
10
+ export declare function KanbanView(props: ViewProps): ReactElement;
11
+ //# sourceMappingURL=KanbanView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanView.d.ts","sourceRoot":"","sources":["../../src/views/KanbanView.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,OAAO,CAAC;AAMpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAuLhD,mCAAmC;AACnC,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CA0GzD"}
@@ -0,0 +1,156 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * The kanban renderer (RFC 0007 §5): one column per value of the group-by field (selection or state options, or
4
+ * the groups the server returns for a many2one), cards from the view's card spec, drag-and-drop with dnd-kit
5
+ * (keyboard too: Space to pick up, arrows, Space to drop). Moving a card between state columns runs the transition
6
+ * that leads there; other fields are written. The server refuses moves the user may not make.
7
+ */
8
+ import { DndContext, KeyboardSensor, PointerSensor, useDraggable, useDroppable, useSensor, useSensors, } from '@dnd-kit/core';
9
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
10
+ import { useState } from 'react';
11
+ import { useTranslation } from 'react-i18next';
12
+ import { ApiError } from '../api.js';
13
+ import { Alert, Input, Spinner } from '../components/primitives.js';
14
+ import { useKosh } from '../context.js';
15
+ import { cn } from '../lib/cn.js';
16
+ import { PrefetchedNames, useRowNames } from './widgets.js';
17
+ const and = (a, b) => a === undefined ? b : { and: [a, b] };
18
+ function Card({ row, served, onOpen, }) {
19
+ const { registry } = useKosh();
20
+ const view = served.view;
21
+ const { attributes, listeners, setNodeRef, transform, isDragging } = useDraggable({
22
+ id: row.id,
23
+ data: { row },
24
+ });
25
+ if (view.type !== 'kanban')
26
+ throw new Error('kanban');
27
+ const fields = served.fields[view.model] ?? {};
28
+ const show = (node) => {
29
+ const field = fields[node.field];
30
+ if (field === undefined)
31
+ return null;
32
+ const Widget = registry.widget(node, field);
33
+ return (_jsx(Widget, { id: `${row.id}-${node.id}`, node: node, field: field, value: row[node.field], record: row, readonly: true }, node.id));
34
+ };
35
+ const text = (key) => {
36
+ if (key === undefined)
37
+ return null;
38
+ const field = fields[key];
39
+ return field === undefined ? null : show({ kind: 'field', id: key, field: key });
40
+ };
41
+ return (_jsxs("li", { ref: setNodeRef, style: transform === null
42
+ ? undefined
43
+ : { transform: `translate3d(${transform.x}px, ${transform.y}px, 0)` }, className: cn('rounded-md border bg-surface p-3 text-sm shadow-sm', isDragging && 'opacity-70 shadow-lg'), children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsx("button", { type: "button", className: "text-start font-medium hover:underline", onClick: () => onOpen(row.id), children: text(view.card.title) }), _jsx("button", { type: "button", className: "cursor-grab rounded px-1 text-muted-foreground hover:bg-muted", "aria-label": `Move ${String(row['displayName'] ?? row[view.card.title] ?? row.id)}`, ...attributes, ...listeners, children: "\u283F" })] }), view.card.subtitle === undefined ? null : (_jsx("div", { className: "text-muted-foreground", children: text(view.card.subtitle) })), (view.card.badges ?? []).length === 0 ? null : (_jsx("div", { className: "mt-2 flex flex-wrap gap-1", children: (view.card.badges ?? []).map(show) })), (view.card.footer ?? []).length === 0 ? null : (_jsx("div", { className: "mt-2 flex flex-wrap justify-between gap-2 text-xs text-muted-foreground", children: (view.card.footer ?? []).map(show) }))] }));
44
+ }
45
+ function ColumnView({ column, props, keys, groupField, }) {
46
+ const { api } = useKosh();
47
+ const { t } = useTranslation();
48
+ const queryClient = useQueryClient();
49
+ const view = props.served.view;
50
+ const { setNodeRef, isOver } = useDroppable({ id: column.key, data: { column } });
51
+ const [quick, setQuick] = useState('');
52
+ const where = and(props.where, { [groupField.key]: column.value });
53
+ const rows = useQuery({
54
+ queryKey: ['list', view.model, where, keys, 'kanban'],
55
+ queryFn: () => api.list(view.model, { filter: where, fields: keys, limit: 100, count: true }),
56
+ });
57
+ const items = rows.data?.items ?? [];
58
+ const names = useRowNames(items, Object.values(props.served.fields[view.model] ?? {}));
59
+ const create = useMutation({
60
+ mutationFn: (name) => api.create(view.model, {
61
+ [view.type === 'kanban' ? view.card.title : 'name']: name,
62
+ ...(groupField.kind === 'state' ? {} : { [groupField.key]: column.value }),
63
+ }),
64
+ onSuccess: async () => {
65
+ setQuick('');
66
+ await queryClient.invalidateQueries({ queryKey: ['list', view.model] });
67
+ },
68
+ });
69
+ // New records start in the initial state, so quick create applies to columns of other fields only.
70
+ const quickCreate = view.type === 'kanban' &&
71
+ view.quickCreate === true &&
72
+ props.served.operations.create &&
73
+ groupField.kind !== 'state';
74
+ return (_jsxs("section", { ref: setNodeRef, "aria-label": column.label, className: cn('flex w-72 shrink-0 flex-col rounded-lg bg-muted/50 p-2', isOver && 'ring-2 ring-ring'), children: [_jsxs("h2", { className: "flex items-center justify-between px-1 pb-2 text-sm font-semibold", children: [_jsx("span", { children: column.label }), _jsx("span", { className: "text-xs font-normal text-muted-foreground", children: rows.data?.count ?? items.length })] }), quickCreate ? (_jsx("form", { className: "mb-2", onSubmit: (e) => {
75
+ e.preventDefault();
76
+ if (quick.trim() !== '')
77
+ create.mutate(quick.trim());
78
+ }, children: _jsx(Input, { "aria-label": `${t('views.quickCreate')}: ${column.label}`, placeholder: t('views.quickCreate'), value: quick, onChange: (e) => setQuick(e.target.value) }) })) : null, rows.isPending ? (_jsx(Spinner, { label: t('app.loading') })) : (_jsx(PrefetchedNames.Provider, { value: names, children: _jsx("ul", { className: "grid gap-2", children: items.map((row) => (_jsx(Card, { row: row, served: props.served, onOpen: props.onOpen }, row.id))) }) }))] }));
79
+ }
80
+ /** The default kanban renderer. */
81
+ export function KanbanView(props) {
82
+ const { api } = useKosh();
83
+ const { t } = useTranslation();
84
+ const queryClient = useQueryClient();
85
+ const [error, setError] = useState(null);
86
+ const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 4 } }), useSensor(KeyboardSensor));
87
+ const view = props.served.view;
88
+ const fields = view.type === 'kanban' ? (props.served.fields[view.model] ?? {}) : {};
89
+ const groupField = view.type === 'kanban' ? fields[view.groupBy] : undefined;
90
+ const groups = useQuery({
91
+ queryKey: ['groups', view.model, props.where, groupField?.key],
92
+ queryFn: () => api.aggregate(view.model, {
93
+ where: props.where,
94
+ groupBy: [groupField?.key],
95
+ measures: { n: 'count' },
96
+ }),
97
+ enabled: groupField !== undefined && groupField.options === undefined,
98
+ });
99
+ const groupNames = useRowNames((groups.data ?? []).map((g) => ({ [groupField?.key ?? '']: g[groupField?.key ?? ''] })), groupField === undefined ? [] : [groupField]);
100
+ const move = useMutation({
101
+ mutationFn: async ({ row, to }) => {
102
+ if (groupField === undefined)
103
+ return;
104
+ if (groupField.kind === 'state') {
105
+ const from = String(row[groupField.key]);
106
+ const transition = props.served.transitions.find((tr) => tr.field === groupField.key && tr.to === to.value && tr.from.includes(from));
107
+ if (transition === undefined)
108
+ throw new Error(t('views.moveRefused'));
109
+ await api.transition(view.model, row.id, transition.name);
110
+ }
111
+ else
112
+ await api.update(view.model, row.id, { [groupField.key]: to.value });
113
+ },
114
+ onSuccess: async () => {
115
+ setError(null);
116
+ await queryClient.invalidateQueries({ queryKey: ['list', view.model] });
117
+ },
118
+ onError: (e) => setError(e instanceof ApiError ? e.message : e instanceof Error ? e.message : String(e)),
119
+ });
120
+ if (view.type !== 'kanban' || groupField === undefined)
121
+ return (_jsx(Alert, { children: `The kanban needs the field ${view.type === 'kanban' ? view.groupBy : ''}.` }));
122
+ const columns = groupField.options !== undefined
123
+ ? groupField.options.map((o) => ({ key: o.value, value: o.value, label: o.label }))
124
+ : (groups.data ?? []).map((g) => {
125
+ const value = g[groupField.key] ?? null;
126
+ const label = value === null
127
+ ? t('views.none')
128
+ : groupField.kind === 'many2one'
129
+ ? (groupNames.get(groupField.target ?? '')?.get(Number(value)) ??
130
+ `#${String(value)}`)
131
+ : String(value);
132
+ return { key: JSON.stringify(value), value, label };
133
+ });
134
+ const keys = [
135
+ ...new Set([
136
+ 'id',
137
+ 'displayName',
138
+ view.groupBy,
139
+ view.card.title,
140
+ ...(view.card.subtitle === undefined ? [] : [view.card.subtitle]),
141
+ ...(view.card.footer ?? []).map((f) => f.field),
142
+ ...(view.card.badges ?? []).map((f) => f.field),
143
+ ]),
144
+ ].filter((k) => k === 'id' || fields[k] !== undefined);
145
+ const onDragEnd = (event) => {
146
+ const row = event.active.data.current?.['row'];
147
+ const to = event.over?.data.current?.['column'];
148
+ if (row === undefined ||
149
+ to === undefined ||
150
+ JSON.stringify(row[groupField.key] ?? null) === JSON.stringify(to.value))
151
+ return;
152
+ move.mutate({ row, to });
153
+ };
154
+ return (_jsxs("div", { className: "grid gap-3", children: [error === null ? null : _jsx(Alert, { children: error }), _jsx(DndContext, { sensors: sensors, onDragEnd: onDragEnd, children: _jsx("div", { className: "flex gap-3 overflow-x-auto pb-2", children: columns.map((column) => (_jsx(ColumnView, { column: column, props: props, keys: keys, groupField: groupField }, column.key))) }) })] }));
155
+ }
156
+ //# sourceMappingURL=KanbanView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanView.js","sourceRoot":"","sources":["../../src/views/KanbanView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { ViewProps } from '../registry.js';
3
+ /** The default list renderer. */
4
+ export declare function ListView(props: ViewProps): ReactElement;
5
+ //# sourceMappingURL=ListView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../src/views/ListView.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,YAAY,EAA6B,MAAM,OAAO,CAAC;AAMrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA6ZhD,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAyDvD"}