dynim-core 1.0.4 → 1.0.6
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.
- package/README.md +9 -282
- package/dist/builder/builder-client.d.ts +1 -5
- package/dist/builder/builder-client.d.ts.map +1 -1
- package/dist/builder/builder-client.js +2 -22
- package/dist/builder/builder.d.ts +0 -4
- package/dist/builder/builder.d.ts.map +1 -1
- package/dist/builder/builder.js +64 -207
- package/dist/builder/editor-overlays.d.ts +1 -10
- package/dist/builder/editor-overlays.d.ts.map +1 -1
- package/dist/builder/editor-overlays.js +1 -103
- package/dist/builder/editor-state.d.ts +2 -21
- package/dist/builder/editor-state.d.ts.map +1 -1
- package/dist/builder/editor-state.js +2 -34
- package/dist/builder/element-utils.d.ts +0 -11
- package/dist/builder/element-utils.d.ts.map +1 -1
- package/dist/builder/element-utils.js +0 -58
- package/dist/builder/freeze-overlay.d.ts +1 -1
- package/dist/builder/freeze-overlay.d.ts.map +1 -1
- package/dist/builder/freeze-overlay.js +1 -2
- package/dist/builder/index.d.ts +5 -9
- package/dist/builder/index.d.ts.map +1 -1
- package/dist/builder/index.js +3 -7
- package/dist/builder/{drag-engine.d.ts → interaction-engine.d.ts} +6 -20
- package/dist/builder/interaction-engine.d.ts.map +1 -0
- package/dist/builder/interaction-engine.js +101 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/README.md +10 -0
- package/src/styles/builder.css +1 -189
- package/src/styles/editor.css +2 -61
- package/dist/builder/diff-state.d.ts +0 -24
- package/dist/builder/diff-state.d.ts.map +0 -1
- package/dist/builder/diff-state.js +0 -134
- package/dist/builder/drag-engine.d.ts.map +0 -1
- package/dist/builder/drag-engine.js +0 -686
- package/dist/builder/history-state.d.ts +0 -41
- package/dist/builder/history-state.d.ts.map +0 -1
- package/dist/builder/history-state.js +0 -76
package/README.md
CHANGED
|
@@ -1,290 +1,17 @@
|
|
|
1
1
|
# dynim-core
|
|
2
2
|
|
|
3
|
-
Framework-agnostic TypeScript library for visual page building
|
|
3
|
+
Framework-agnostic TypeScript library for visual page building.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Documentation
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
npm install dynim-core
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Features
|
|
12
|
-
|
|
13
|
-
- **Visual Page Builder** - Drag-and-drop editing with undo/redo history
|
|
14
|
-
- **AI Chat Integration** - SSE-based streaming chat with element context awareness
|
|
15
|
-
- **Code Generation** - Flexcode integration for AI-powered code changes
|
|
16
|
-
- **Element Classification** - Semantic, visual, and size analysis of DOM elements
|
|
17
|
-
- **DOM Utilities** - Tree scanning, stable IDs, selector generation
|
|
18
|
-
|
|
19
|
-
## Quick Start
|
|
20
|
-
|
|
21
|
-
### Chat Widget
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
import { createState, createClient, createWidget } from 'dynim-core';
|
|
25
|
-
|
|
26
|
-
const state = createState();
|
|
27
|
-
const client = createClient({
|
|
28
|
-
endpoint: '/api/chat',
|
|
29
|
-
apiKey: 'your-api-key',
|
|
30
|
-
onMessage: (data) => state.updateMessage(data.id, data.text),
|
|
31
|
-
onError: (error) => console.error(error),
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const widget = createWidget({
|
|
35
|
-
state,
|
|
36
|
-
client,
|
|
37
|
-
position: 'bottom-right', // or 'inline'
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
widget.mount(document.body);
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Visual Builder
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
import { createBuilder, createBuilderClient } from 'dynim-core';
|
|
47
|
-
|
|
48
|
-
const builderClient = createBuilderClient({
|
|
49
|
-
apiBase: 'https://api.example.com',
|
|
50
|
-
sessionToken: 'jwt-token',
|
|
51
|
-
onMessage: (msg) => console.log('AI response:', msg),
|
|
52
|
-
onError: (err) => console.error(err),
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
const builder = createBuilder({
|
|
56
|
-
contentRoot: document.getElementById('app'),
|
|
57
|
-
client: builderClient,
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// Enter edit mode
|
|
61
|
-
builder.enter();
|
|
62
|
-
|
|
63
|
-
// Save changes
|
|
64
|
-
await builder.save();
|
|
65
|
-
|
|
66
|
-
// Exit without saving
|
|
67
|
-
builder.exit();
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Code Generation (Flexcode)
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
import { createCodeClient } from 'dynim-core';
|
|
74
|
-
|
|
75
|
-
const codeClient = createCodeClient({
|
|
76
|
-
apiBase: 'https://api.example.com',
|
|
77
|
-
sessionToken: 'jwt-token',
|
|
78
|
-
onMessage: (event) => {
|
|
79
|
-
switch (event.type) {
|
|
80
|
-
case 'text':
|
|
81
|
-
console.log('Response:', event.content);
|
|
82
|
-
break;
|
|
83
|
-
case 'thinking':
|
|
84
|
-
console.log('Thinking:', event.content);
|
|
85
|
-
break;
|
|
86
|
-
case 'edit':
|
|
87
|
-
console.log('Code edit:', event.edit);
|
|
88
|
-
break;
|
|
89
|
-
case 'done':
|
|
90
|
-
console.log('Complete');
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
// Send code generation request
|
|
97
|
-
await codeClient.sendCode('project-id', 'Add a dark mode toggle');
|
|
98
|
-
|
|
99
|
-
// Get pending edits
|
|
100
|
-
const edits = codeClient.getEdits();
|
|
101
|
-
|
|
102
|
-
// Save or abandon
|
|
103
|
-
await codeClient.saveCode('project-id');
|
|
104
|
-
await codeClient.abandonCode('project-id');
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## API Reference
|
|
108
|
-
|
|
109
|
-
### State Management
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
createState(): StateStore
|
|
113
|
-
|
|
114
|
-
interface StateStore {
|
|
115
|
-
getState(): ChatState;
|
|
116
|
-
setState(state: Partial<ChatState>): void;
|
|
117
|
-
subscribe(listener: (state: ChatState) => void): () => void;
|
|
118
|
-
addMessage(message: Message): void;
|
|
119
|
-
updateMessage(id: string, text: string): void;
|
|
120
|
-
clearMessages(): void;
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### Streaming Client
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
createClient(config: ClientConfig): StreamClient
|
|
128
|
-
|
|
129
|
-
interface ClientConfig {
|
|
130
|
-
endpoint: string;
|
|
131
|
-
apiKey?: string;
|
|
132
|
-
onMessage: (data: MessageData) => void;
|
|
133
|
-
onError?: (error: Error) => void;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
interface StreamClient {
|
|
137
|
-
send(message: string): Promise<void>;
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Builder
|
|
7
|
+
See [SDK Core Documentation](../../utils/docs/sdk/CORE.md)
|
|
142
8
|
|
|
143
|
-
|
|
144
|
-
|
|
9
|
+
Related:
|
|
10
|
+
- [SDK Overview](../../utils/docs/sdk/README.md)
|
|
11
|
+
- [UI Builder](../../utils/docs/ui-builder/README.md)
|
|
145
12
|
|
|
146
|
-
|
|
147
|
-
contentRoot?: HTMLElement;
|
|
148
|
-
client: BuilderClient;
|
|
149
|
-
}
|
|
13
|
+
## Install
|
|
150
14
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
exit(): void;
|
|
154
|
-
save(): Promise<void>;
|
|
155
|
-
isActive(): boolean;
|
|
156
|
-
getChanges(): DiffEntry[];
|
|
157
|
-
getEditorState(): EditorState;
|
|
158
|
-
getTreeState(): TreeState;
|
|
159
|
-
destroy(): void;
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Builder Client
|
|
164
|
-
|
|
165
|
-
```typescript
|
|
166
|
-
createBuilderClient(config: BuilderClientConfig): BuilderClient
|
|
167
|
-
|
|
168
|
-
interface BuilderClientConfig {
|
|
169
|
-
apiBase?: string;
|
|
170
|
-
sessionToken?: string;
|
|
171
|
-
refreshToken?: string;
|
|
172
|
-
getSession?: () => Promise<{ token: string }>;
|
|
173
|
-
onMessage?: (data: BuilderMessage) => void;
|
|
174
|
-
onError?: (error: Error) => void;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
interface BuilderClient {
|
|
178
|
-
sendChat(message: string): Promise<void>;
|
|
179
|
-
sendElementChat(message: string, element: HTMLElement): Promise<void>;
|
|
180
|
-
saveDiffs(diffs: DiffEntry[]): Promise<void>;
|
|
181
|
-
setSessionToken(token: string): void;
|
|
182
|
-
isAuthenticated(): boolean;
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Code Client
|
|
187
|
-
|
|
188
|
-
```typescript
|
|
189
|
-
createCodeClient(config: CodeClientConfig): CodeClient
|
|
190
|
-
|
|
191
|
-
interface CodeClientConfig {
|
|
192
|
-
apiBase?: string;
|
|
193
|
-
sessionToken?: string;
|
|
194
|
-
getSession?: () => Promise<{ token: string }>;
|
|
195
|
-
onMessage?: (event: CodeEvent) => void;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
interface CodeClient {
|
|
199
|
-
sendCode(projectId: string, prompt: string): Promise<void>;
|
|
200
|
-
saveCode(projectId: string): Promise<void>;
|
|
201
|
-
abandonCode(projectId: string): Promise<void>;
|
|
202
|
-
getEdits(): CodeEdit[];
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
type CodeEvent =
|
|
206
|
-
| { type: 'text'; content: string }
|
|
207
|
-
| { type: 'thinking'; content: string }
|
|
208
|
-
| { type: 'edit'; edit: CodeEdit }
|
|
209
|
-
| { type: 'question'; content: string }
|
|
210
|
-
| { type: 'done' }
|
|
211
|
-
| { type: 'error'; content: string };
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### DOM Utilities
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
// Scan DOM tree
|
|
218
|
-
scanDOM(root: HTMLElement): DOMNode[]
|
|
219
|
-
|
|
220
|
-
// Create debounced scanner
|
|
221
|
-
createDebouncedScanner(callback: (nodes: DOMNode[]) => void): Scanner
|
|
222
|
-
|
|
223
|
-
// Element queries
|
|
224
|
-
getElementAtPath(root: HTMLElement, path: number[]): HTMLElement | null
|
|
225
|
-
queryElements(root: HTMLElement, selector: string): HTMLElement[]
|
|
226
|
-
generateSelector(element: HTMLElement): string
|
|
227
|
-
|
|
228
|
-
// Stable IDs for tracking elements across changes
|
|
229
|
-
getStableId(element: HTMLElement): string
|
|
230
|
-
findByStableId(root: HTMLElement, id: string): HTMLElement | null
|
|
231
|
-
|
|
232
|
-
// Build element context for AI
|
|
233
|
-
buildElementIdentifier(element: HTMLElement): ElementIdentifier
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### Element Classifier
|
|
237
|
-
|
|
238
|
-
```typescript
|
|
239
|
-
createClassifier(): Classifier
|
|
240
|
-
|
|
241
|
-
interface Classifier {
|
|
242
|
-
classify(element: HTMLElement): Classification;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
interface Classification {
|
|
246
|
-
semantic: SemanticInfo; // HTML tag, ARIA roles, attributes
|
|
247
|
-
classes: ClassInfo; // CSS class patterns
|
|
248
|
-
visual: VisualInfo; // Colors, fonts, spacing
|
|
249
|
-
size: SizeInfo; // Dimensions, viewport relation
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
## Styling
|
|
254
|
-
|
|
255
|
-
Import base styles for the chat widget and builder UI:
|
|
256
|
-
|
|
257
|
-
```typescript
|
|
258
|
-
import 'dynim-core/styles/base.css';
|
|
259
|
-
import 'dynim-core/styles/builder.css';
|
|
260
|
-
import 'dynim-core/styles/editor.css';
|
|
261
|
-
|
|
262
|
-
// Themes
|
|
263
|
-
import 'dynim-core/styles/themes/light.css';
|
|
264
|
-
import 'dynim-core/styles/themes/dark.css';
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## Browser Global API
|
|
268
|
-
|
|
269
|
-
For non-module usage, `dynim-core` exposes global helpers:
|
|
270
|
-
|
|
271
|
-
```html
|
|
272
|
-
<script src="dynim-core/dist/index.js"></script>
|
|
273
|
-
<script>
|
|
274
|
-
// Quick chatbot setup
|
|
275
|
-
window.Chatbot.init({
|
|
276
|
-
endpoint: '/api/chat',
|
|
277
|
-
position: 'bottom-right',
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
// Quick builder setup
|
|
281
|
-
window.Builder.create({
|
|
282
|
-
apiBase: 'https://api.example.com',
|
|
283
|
-
sessionToken: 'jwt-token',
|
|
284
|
-
});
|
|
285
|
-
</script>
|
|
15
|
+
```bash
|
|
16
|
+
npm install dynim-core
|
|
286
17
|
```
|
|
287
|
-
|
|
288
|
-
## License
|
|
289
|
-
|
|
290
|
-
MIT
|
|
@@ -3,13 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* NOTE: For AI chat/code operations, use code-client.ts instead.
|
|
5
5
|
* This client handles visual builder-specific operations:
|
|
6
|
-
* - saveDiffs: Save visual DOM changes
|
|
7
6
|
* - preview: Generate preview URL
|
|
8
7
|
* - exit: Notify server of builder exit
|
|
9
8
|
*
|
|
10
9
|
* Authentication uses JWT session tokens.
|
|
11
10
|
*/
|
|
12
|
-
import type { DiffEntry } from './diff-state';
|
|
13
11
|
export interface BuilderClientConfig {
|
|
14
12
|
apiBase?: string;
|
|
15
13
|
/** JWT session token for authentication */
|
|
@@ -28,10 +26,8 @@ export interface BuilderClientConfig {
|
|
|
28
26
|
onAuthError?: (error: Error) => void;
|
|
29
27
|
}
|
|
30
28
|
export interface BuilderClient {
|
|
31
|
-
/** Save visual DOM diffs to backend */
|
|
32
|
-
saveDiffs: (pageId: string, diffs: DiffEntry[]) => Promise<unknown>;
|
|
33
29
|
/** Generate preview URL for current changes */
|
|
34
|
-
preview: (pageId: string
|
|
30
|
+
preview: (pageId: string) => Promise<{
|
|
35
31
|
success: boolean;
|
|
36
32
|
previewUrl?: string;
|
|
37
33
|
message?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder-client.d.ts","sourceRoot":"","sources":["../../src/builder/builder-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"builder-client.d.ts","sourceRoot":"","sources":["../../src/builder/builder-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC;AAGD,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,oCAAoC;IACpC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,mBAAwB,GAAG,aAAa,CAoJnF"}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* NOTE: For AI chat/code operations, use code-client.ts instead.
|
|
5
5
|
* This client handles visual builder-specific operations:
|
|
6
|
-
* - saveDiffs: Save visual DOM changes
|
|
7
6
|
* - preview: Generate preview URL
|
|
8
7
|
* - exit: Notify server of builder exit
|
|
9
8
|
*
|
|
@@ -84,30 +83,12 @@ export function createBuilderClient(config = {}) {
|
|
|
84
83
|
headers.set('Authorization', `Bearer ${token}`);
|
|
85
84
|
return fetch(url, { ...options, headers });
|
|
86
85
|
}
|
|
87
|
-
async function
|
|
88
|
-
try {
|
|
89
|
-
const response = await authenticatedFetch(`${apiBase}/api/builder/save`, {
|
|
90
|
-
method: 'POST',
|
|
91
|
-
headers: { 'Content-Type': 'application/json' },
|
|
92
|
-
body: JSON.stringify({ pageId, diffs })
|
|
93
|
-
});
|
|
94
|
-
if (!response.ok) {
|
|
95
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
96
|
-
}
|
|
97
|
-
return response.json();
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
console.error('[BuilderClient] Save error:', error);
|
|
101
|
-
onError?.(error);
|
|
102
|
-
throw error;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
async function preview(pageId, diffs) {
|
|
86
|
+
async function preview(pageId) {
|
|
106
87
|
try {
|
|
107
88
|
const response = await authenticatedFetch(`${apiBase}/api/builder/preview`, {
|
|
108
89
|
method: 'POST',
|
|
109
90
|
headers: { 'Content-Type': 'application/json' },
|
|
110
|
-
body: JSON.stringify({ pageId
|
|
91
|
+
body: JSON.stringify({ pageId })
|
|
111
92
|
});
|
|
112
93
|
if (!response.ok) {
|
|
113
94
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
@@ -148,7 +129,6 @@ export function createBuilderClient(config = {}) {
|
|
|
148
129
|
}
|
|
149
130
|
}
|
|
150
131
|
return {
|
|
151
|
-
saveDiffs,
|
|
152
132
|
preview,
|
|
153
133
|
exit,
|
|
154
134
|
setSessionToken,
|
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
* Manages the floating pill bar, chat widget, and visual editor
|
|
4
4
|
*/
|
|
5
5
|
import { type WidgetConfig } from './widget';
|
|
6
|
-
import { type DiffEntry } from './diff-state';
|
|
7
6
|
import { type CodeClient } from './code-client';
|
|
8
7
|
export interface BuilderConfig {
|
|
9
8
|
logo?: string;
|
|
10
|
-
onSave?: (diffs: DiffEntry[]) => void;
|
|
11
9
|
onExit?: () => void;
|
|
12
10
|
onEnter?: () => void;
|
|
13
11
|
chatConfig?: WidgetConfig;
|
|
@@ -29,9 +27,7 @@ export interface BuilderConfig {
|
|
|
29
27
|
export interface Builder {
|
|
30
28
|
enter: () => void;
|
|
31
29
|
exit: () => void;
|
|
32
|
-
save: () => Promise<void>;
|
|
33
30
|
isActive: () => boolean;
|
|
34
|
-
getChanges: () => DiffEntry[];
|
|
35
31
|
getEditorState: () => unknown;
|
|
36
32
|
getTreeState: () => unknown;
|
|
37
33
|
destroy: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAQxE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,+FAA+F;IAC/F,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CA0bjE;;;;AAMD,wBAAyC"}
|