@f2a/openclaw-adapter 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 (51) hide show
  1. package/README.md +510 -0
  2. package/dist/announcement-queue.d.ts +71 -0
  3. package/dist/announcement-queue.d.ts.map +1 -0
  4. package/dist/announcement-queue.js +181 -0
  5. package/dist/announcement-queue.js.map +1 -0
  6. package/dist/capability-detector.d.ts +21 -0
  7. package/dist/capability-detector.d.ts.map +1 -0
  8. package/dist/capability-detector.js +177 -0
  9. package/dist/capability-detector.js.map +1 -0
  10. package/dist/connector.d.ts +62 -0
  11. package/dist/connector.d.ts.map +1 -0
  12. package/dist/connector.js +1063 -0
  13. package/dist/connector.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +44 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/network-client.d.ts +48 -0
  19. package/dist/network-client.d.ts.map +1 -0
  20. package/dist/network-client.js +104 -0
  21. package/dist/network-client.js.map +1 -0
  22. package/dist/node-manager.d.ts +50 -0
  23. package/dist/node-manager.d.ts.map +1 -0
  24. package/dist/node-manager.js +187 -0
  25. package/dist/node-manager.js.map +1 -0
  26. package/dist/plugin.d.ts +16 -0
  27. package/dist/plugin.d.ts.map +1 -0
  28. package/dist/plugin.js +116 -0
  29. package/dist/plugin.js.map +1 -0
  30. package/dist/reputation.d.ts +72 -0
  31. package/dist/reputation.d.ts.map +1 -0
  32. package/dist/reputation.js +215 -0
  33. package/dist/reputation.js.map +1 -0
  34. package/dist/task-guard.d.ts +77 -0
  35. package/dist/task-guard.d.ts.map +1 -0
  36. package/dist/task-guard.js +330 -0
  37. package/dist/task-guard.js.map +1 -0
  38. package/dist/task-queue.d.ts +71 -0
  39. package/dist/task-queue.d.ts.map +1 -0
  40. package/dist/task-queue.js +126 -0
  41. package/dist/task-queue.js.map +1 -0
  42. package/dist/types.d.ts +248 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +6 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/webhook-server.d.ts +44 -0
  47. package/dist/webhook-server.d.ts.map +1 -0
  48. package/dist/webhook-server.js +119 -0
  49. package/dist/webhook-server.js.map +1 -0
  50. package/openclaw.plugin.json +106 -0
  51. package/package.json +40 -0
package/README.md ADDED
@@ -0,0 +1,510 @@
1
+ # @f2a/openclaw-adapter
2
+
3
+ OpenClaw 插件,用于集成 F2A P2P 网络。
4
+
5
+ ## 功能
6
+
7
+ - 🔍 **发现 Agents** - 发现局域网或公网中的其他 Agents
8
+ - 📤 **委托任务** - 将任务委托给其他 Agent 执行
9
+ - 📢 **广播任务** - 并行委托给多个 Agents
10
+ - 🔐 **信誉系统** - 基于行为的 Peer 信誉评分
11
+ - 🛡️ **安全控制** - 白名单、黑名单、手动确认
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ npm install @f2a/openclaw-adapter
17
+ ```
18
+
19
+ ## 配置
20
+
21
+ 在 OpenClaw 配置文件中添加:
22
+
23
+ ```json
24
+ {
25
+ "plugins": {
26
+ "@f2a/openclaw-adapter": {
27
+ "enabled": true,
28
+ "config": {
29
+ "agentName": "My OpenClaw Agent",
30
+ "f2aPath": "~/projects/F2A",
31
+ "autoStart": true,
32
+ "webhookPort": 9002,
33
+ "controlPort": 9001,
34
+ "p2pPort": 9000,
35
+ "enableMDNS": true,
36
+ "webhookPush": {
37
+ "url": "https://your-openclaw-instance.com/webhook/f2a",
38
+ "token": "your-webhook-token",
39
+ "timeout": 5000,
40
+ "enabled": true
41
+ },
42
+ "processingTimeoutMs": 300000,
43
+ "maxQueuedTasks": 100,
44
+ "pollInterval": 60000,
45
+ "dataDir": "./f2a-data",
46
+ "reputation": {
47
+ "enabled": true,
48
+ "initialScore": 50,
49
+ "minScoreForService": 20
50
+ },
51
+ "security": {
52
+ "requireConfirmation": false,
53
+ "whitelist": [],
54
+ "blacklist": []
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### 配置项说明
63
+
64
+ | 配置项 | 类型 | 默认值 | 说明 |
65
+ |--------|------|--------|------|
66
+ | `agentName` | string | "OpenClaw Agent" | Agent 显示名称 |
67
+ | `f2aPath` | string | "./F2A" | F2A Node 路径 |
68
+ | `autoStart` | boolean | true | 是否自动启动 F2A Node |
69
+ | `webhookPort` | number | 9002 | Webhook 服务端口 |
70
+ | `controlPort` | number | 9001 | F2A 控制端口 |
71
+ | `p2pPort` | number | 9000 | P2P 网络端口 |
72
+ | `enableMDNS` | boolean | true | 是否启用 mDNS 发现 |
73
+ | `webhookPush` | object | - | Webhook 推送配置,用于主动推送任务通知到 OpenClaw |
74
+ | `webhookPush.url` | string | - | OpenClaw webhook URL |
75
+ | `webhookPush.token` | string | - | 认证 token |
76
+ | `webhookPush.timeout` | number | 5000 | 推送超时(毫秒) |
77
+ | `webhookPush.enabled` | boolean | true | 是否启用 |
78
+ | `processingTimeoutMs` | number | 300000 | processing 任务超时时间(毫秒),超过此时间将被重置为 pending,防止僵尸任务 |
79
+ | `maxQueuedTasks` | number | 100 | 任务队列最大容量 |
80
+ | `pollInterval` | number | 60000 | 兜底轮询间隔(毫秒) |
81
+ | `dataDir` | string | "./f2a-data" | 数据持久化目录 |
82
+
83
+ ## 使用
84
+
85
+ ### 发现 Agents
86
+
87
+ ```
88
+ 用户: 帮我找一下网络里能写代码的 Agents
89
+
90
+ OpenClaw: [调用 f2a_discover capability=code-generation]
91
+
92
+ 🔍 发现 2 个 Agents:
93
+
94
+ 1. MacBook-Pro (信誉: 85)
95
+ ID: f2a-a1b2-c3d4-e5f6...
96
+ 能力: code-generation, file-operation
97
+
98
+ 2. RaspberryPi-4 (信誉: 72)
99
+ ID: f2a-e5f6-g7h8-i9j0...
100
+ 能力: code-generation, data-analysis
101
+ ```
102
+
103
+ ### 委托任务
104
+
105
+ ```
106
+ 用户: 让 MacBook-Pro 帮我写一个斐波那契函数
107
+
108
+ OpenClaw: [调用 f2a_delegate agent="MacBook-Pro" task="写斐波那契函数"]
109
+
110
+ ✅ MacBook-Pro 已完成任务:
111
+
112
+ def fibonacci(n):
113
+ if n <= 1:
114
+ return n
115
+ return fibonacci(n-1) + fibonacci(n-2)
116
+ ```
117
+
118
+ ### 广播任务
119
+
120
+ ```
121
+ 用户: 让所有人帮我检查这段代码的 bug
122
+
123
+ OpenClaw: [调用 f2a_broadcast capability=code-generation task="检查代码bug"]
124
+
125
+ ✅ 收到 2/2 个成功响应:
126
+
127
+ ✅ MacBook-Pro (245ms)
128
+ 完成
129
+
130
+ ✅ RaspberryPi-4 (312ms)
131
+ 完成
132
+ ```
133
+
134
+ ## 工具列表
135
+
136
+ ### 发现与委托工具
137
+
138
+ #### f2a_discover - 发现 Agents
139
+
140
+ 发现 F2A 网络中的 Agents,可按能力或信誉过滤。
141
+
142
+ **参数:**
143
+ - `capability` (可选): 按能力过滤,如 `code-generation`, `file-operation`
144
+ - `min_reputation` (可选): 最低信誉分数 (0-100)
145
+
146
+ ```
147
+ 用户: 帮我找一下网络里能写代码的 Agents
148
+
149
+ OpenClaw: [调用 f2a_discover capability=code-generation]
150
+
151
+ 🔍 发现 2 个 Agents:
152
+
153
+ 1. MacBook-Pro (信誉: 85)
154
+ ID: f2a-a1b2-c3d4-e5f6...
155
+ 能力: code-generation, file-operation
156
+
157
+ 2. RaspberryPi-4 (信誉: 72)
158
+ ID: f2a-e5f6-g7h8-i9j0...
159
+ 能力: code-generation, data-analysis
160
+ ```
161
+
162
+ #### f2a_delegate - 委托任务
163
+
164
+ 将任务委托给网络中的特定 Agent 执行。
165
+
166
+ **参数:**
167
+ - `agent` (必填): 目标 Agent ID、名称或索引(如 `#1`)
168
+ - `task` (必填): 任务描述
169
+ - `context` (可选): 任务上下文或附件
170
+ - `timeout` (可选): 超时时间(毫秒)
171
+
172
+ ```
173
+ 用户: 让 MacBook-Pro 帮我写一个斐波那契函数
174
+
175
+ OpenClaw: [调用 f2a_delegate agent="MacBook-Pro" task="写斐波那契函数"]
176
+
177
+ ✅ MacBook-Pro 已完成任务:
178
+
179
+ def fibonacci(n):
180
+ if n <= 1:
181
+ return n
182
+ return fibonacci(n-1) + fibonacci(n-2)
183
+ ```
184
+
185
+ #### f2a_broadcast - 广播任务
186
+
187
+ 广播任务给所有具备某能力的 Agents,实现并行执行。
188
+
189
+ **参数:**
190
+ - `capability` (必填): 所需能力
191
+ - `task` (必填): 任务描述
192
+ - `min_responses` (可选): 最少响应数
193
+
194
+ ```
195
+ 用户: 让所有人帮我检查这段代码的 bug
196
+
197
+ OpenClaw: [调用 f2a_broadcast capability=code-generation task="检查代码bug"]
198
+
199
+ ✅ 收到 2/2 个成功响应:
200
+
201
+ ✅ MacBook-Pro (245ms)
202
+ 完成
203
+
204
+ ✅ RaspberryPi-4 (312ms)
205
+ 完成
206
+ ```
207
+
208
+ #### f2a_status - 查看网络状态
209
+
210
+ 查看 F2A 网络状态和已连接的 Peers。
211
+
212
+ **参数:** 无
213
+
214
+ ```
215
+ 用户: 查看 F2A 网络状态
216
+
217
+ OpenClaw: [调用 f2a_status]
218
+
219
+ 📊 F2A 网络状态:
220
+ - 节点 ID: f2a-a1b2-c3d4-e5f6...
221
+ - 状态: 在线
222
+ - 已连接 Peers: 3
223
+ - 本地任务队列: 2 待处理, 1 执行中
224
+ ```
225
+
226
+ #### f2a_reputation - 管理信誉
227
+
228
+ 查看或管理 Peer 的信誉分数。
229
+
230
+ **参数:**
231
+ - `action` (必填): 操作类型
232
+ - `list`: 列出所有信誉记录
233
+ - `view`: 查看指定 Peer 的信誉详情
234
+ - `block`: 封锁指定 Peer
235
+ - `unblock`: 解封指定 Peer
236
+ - `peer_id` (可选): Peer ID(view/block/unblock 时需要)
237
+
238
+ ```
239
+ 用户: 查看所有信誉记录
240
+
241
+ OpenClaw: [调用 f2a_reputation action=list]
242
+
243
+ 📋 信誉记录:
244
+
245
+ | Peer ID | 名称 | 信誉分 | 状态 |
246
+ |---------|------|-------|------|
247
+ | f2a-abc... | MacBook-Pro | 85 | 正常 |
248
+ | f2a-def... | RaspberryPi-4 | 72 | 正常 |
249
+ | f2a-xyz... | Unknown | 15 | 受限 |
250
+
251
+ 用户: 封锁那个信誉太低的节点
252
+
253
+ OpenClaw: [调用 f2a_reputation action=block peer_id="f2a-xyz..."]
254
+
255
+ ✅ 已封锁节点 f2a-xyz...
256
+ ```
257
+
258
+ ### 任务队列工具
259
+
260
+ #### f2a_poll_tasks - 查询任务队列
261
+
262
+ 查询待处理的任务队列,获取需要执行的任务列表。
263
+
264
+ ```
265
+ 用户: 查看我的任务队列
266
+
267
+ OpenClaw: [调用 f2a_poll_tasks]
268
+
269
+ 📋 任务队列:
270
+ - task-001: 代码审查 (待处理)
271
+ - task-002: 文档生成 (待处理)
272
+ ```
273
+
274
+ #### f2a_submit_result - 提交任务结果
275
+
276
+ 执行完任务后,提交执行结果。
277
+
278
+ ```
279
+ 用户: 提交任务结果,代码审查已完成
280
+
281
+ OpenClaw: [调用 f2a_submit_result taskId="task-001" result="审查完成,发现3个问题"]
282
+
283
+ ✅ 任务结果已提交:
284
+ - 任务ID: task-001
285
+ - 状态: 成功
286
+ - 结果: 审查完成,发现3个问题
287
+ ```
288
+
289
+ #### f2a_task_stats - 查看队列统计
290
+
291
+ 查看任务队列的统计信息,包括待处理、执行中、已完成等状态。
292
+
293
+ ```
294
+ 用户: 查看任务队列统计
295
+
296
+ OpenClaw: [调用 f2a_task_stats]
297
+
298
+ 📊 队列统计:
299
+ - 待处理: 5
300
+ - 执行中: 2
301
+ - 已完成: 128
302
+ - 失败: 3
303
+ - 总计: 138
304
+ ```
305
+
306
+ ### 广播与认领工具
307
+
308
+ #### f2a_announce - 广播任务
309
+
310
+ 创建任务广播,让其他 Agent 可以认领执行。适用于需要并行处理或寻找合适执行者的场景。
311
+
312
+ ```
313
+ 用户: 广播一个数据分析任务
314
+
315
+ OpenClaw: [调用 f2a_announce taskType="data-analysis" description="分析销售数据,生成月度报告"]
316
+
317
+ 📢 任务已广播:
318
+ - 广播ID: ann-abc123
319
+ - 任务类型: data-analysis
320
+ - 状态: 开放认领
321
+ - 超时: 30分钟
322
+ ```
323
+
324
+ #### f2a_list_announcements - 查看开放广播
325
+
326
+ 查看当前所有开放的、可以被认领的任务广播。
327
+
328
+ ```
329
+ 用户: 查看有哪些开放的任务
330
+
331
+ OpenClaw: [调用 f2a_list_announcements]
332
+
333
+ 📋 开放广播列表:
334
+ 1. [ann-abc123] 数据分析任务
335
+ - 类型: data-analysis
336
+ - 发布者: MacBook-Pro
337
+ - 剩余时间: 25分钟
338
+
339
+ 2. [ann-def456] 翻译任务
340
+ - 类型: translation
341
+ - 发布者: iPhone-14
342
+ - 剩余时间: 10分钟
343
+ ```
344
+
345
+ #### f2a_claim - 认领任务
346
+
347
+ 认领一个开放的任务广播,表示愿意执行该任务。
348
+
349
+ ```
350
+ 用户: 认领数据分析任务
351
+
352
+ OpenClaw: [调用 f2a_claim announcementId="ann-abc123"]
353
+
354
+ ✅ 认领成功:
355
+ - 广播ID: ann-abc123
356
+ - 认领ID: claim-xyz789
357
+ - 状态: 等待确认
358
+ - 预计时间: 10分钟
359
+ ```
360
+
361
+ #### f2a_manage_claims - 管理认领
362
+
363
+ 管理你发布的任务广播收到的认领请求,可以接受或拒绝认领。
364
+
365
+ ```
366
+ 用户: 查看我的广播收到的认领请求
367
+
368
+ OpenClaw: [调用 f2a_manage_claims action="list"]
369
+
370
+ 📋 认领请求列表:
371
+ - claim-xyz789 (来自: MacBook-Pro)
372
+ 广播: ann-abc123
373
+ 状态: 待处理
374
+ 预计时间: 10分钟
375
+
376
+ 用户: 接受 MacBook-Pro 的认领
377
+
378
+ OpenClaw: [调用 f2a_manage_claims action="accept" claimId="claim-xyz789"]
379
+
380
+ ✅ 已接受认领:
381
+ - 认领ID: claim-xyz789
382
+ - 认领者: MacBook-Pro
383
+ - 任务已正式委托
384
+ ```
385
+
386
+ #### f2a_my_claims - 查看我的认领
387
+
388
+ 查看自己提交的所有认领请求及其状态。
389
+
390
+ ```
391
+ 用户: 查看我认领的任务
392
+
393
+ OpenClaw: [调用 f2a_my_claims]
394
+
395
+ 📋 我的认领:
396
+ 1. [claim-xyz789] 数据分析任务
397
+ - 状态: 已接受
398
+ - 发布者: MacBook-Pro
399
+ - 时间: 2024-01-15 10:30
400
+
401
+ 2. [claim-mno456] 翻译任务
402
+ - 状态: 待处理
403
+ - 发布者: iPhone-14
404
+ - 时间: 2024-01-15 11:00
405
+ ```
406
+
407
+ #### f2a_announcement_stats - 广播统计
408
+
409
+ 查看任务广播的统计信息,包括开放、已认领、已委托、已过期等状态数量。
410
+
411
+ ```
412
+ 用户: 查看广播统计
413
+
414
+ OpenClaw: [调用 f2a_announcement_stats]
415
+
416
+ 📊 广播统计:
417
+ - 开放中: 5
418
+ - 已认领: 3
419
+ - 已委托: 12
420
+ - 已过期: 2
421
+ - 总计: 22
422
+ ```
423
+
424
+ ## 架构
425
+
426
+ ```
427
+ ┌─────────────────────────────────────────────────────────┐
428
+ │ OpenClaw Agent │
429
+ │ │
430
+ │ ┌─────────────────────────────────────────────────┐ │
431
+ │ │ @f2a/openclaw-adapter 插件 │ │
432
+ │ │ │ │
433
+ │ │ • 检测 OpenClaw 能力 │ │
434
+ │ │ • 提供 f2a_* Tools │ │
435
+ │ │ • 通过 Webhook 接收任务 │ │
436
+ │ │ • 调用 OpenClaw.execute() 执行远程任务 │ │
437
+ │ └─────────────────────────────────────────────────┘ │
438
+ │ │ │
439
+ │ │ HTTP / WebSocket │
440
+ │ ▼ │
441
+ │ ┌─────────────────────────────────────────────────┐ │
442
+ │ │ F2A Node (同机部署) │ │
443
+ │ │ │ │
444
+ │ │ • P2P 网络连接 (libp2p) │ │
445
+ │ │ • mDNS 节点发现 │ │
446
+ │ │ • 消息路由转发 │ │
447
+ │ └─────────────────────────────────────────────────┘ │
448
+ └─────────────────────────────────────────────────────────┘
449
+
450
+ │ P2P 网络
451
+
452
+ ┌─────────────────┐
453
+ │ 其他 F2A 节点 │
454
+ └─────────────────┘
455
+ ```
456
+
457
+ ### Webhook 推送机制
458
+
459
+ 当配置了 `webhookPush` 时,F2A 会主动推送任务通知到 OpenClaw:
460
+
461
+ 1. **新任务到达时**,立即通过 webhook 推送
462
+ 2. **如果推送失败**,进入冷却期(指数退避,最大 5 分钟)
463
+ 3. **冷却期间**,任务可通过轮询机制获取
464
+ 4. **连续失败 3 次后**进入降级模式
465
+
466
+ 推送流程:
467
+ ```
468
+ 任务到达 → 尝试 Webhook 推送
469
+
470
+ 成功? → 标记已推送,等待处理
471
+
472
+ 失败 → 进入冷却期,等待轮询兜底
473
+ ```
474
+
475
+ ### 僵尸任务处理
476
+
477
+ 系统会定期检查 `processing` 状态的任务,防止因异常导致的任务丢失:
478
+
479
+ **检测条件**(满足任一即触发):
480
+ - 任务在 `processing` 状态停留超过 `processingTimeoutMs`(默认 5 分钟)
481
+ - 或超过任务自身超时时间的 2 倍
482
+
483
+ **处理方式**:
484
+ - 自动将任务重置为 `pending` 状态
485
+ - 记录警告日志,便于问题追踪
486
+
487
+ ```
488
+ 定期检查 → processing 任务超时?
489
+
490
+ 是 → 重置为 pending,重新入队
491
+
492
+ 否 → 继续等待
493
+ ```
494
+
495
+ ## 开发
496
+
497
+ ```bash
498
+ # 安装依赖
499
+ npm install
500
+
501
+ # 构建
502
+ npm run build
503
+
504
+ # 测试
505
+ npm test
506
+ ```
507
+
508
+ ## License
509
+
510
+ MIT
@@ -0,0 +1,71 @@
1
+ /**
2
+ * F2A Announcement Queue
3
+ * 管理任务广播和认领(Claim Pattern)
4
+ */
5
+ import type { TaskAnnouncement, TaskClaim } from './types.js';
6
+ export interface AnnouncementQueueStats {
7
+ open: number;
8
+ claimed: number;
9
+ delegated: number;
10
+ expired: number;
11
+ total: number;
12
+ }
13
+ export declare class AnnouncementQueue {
14
+ private announcements;
15
+ private maxSize;
16
+ private maxAgeMs;
17
+ constructor(options?: {
18
+ maxSize?: number;
19
+ maxAgeMs?: number;
20
+ });
21
+ /**
22
+ * 创建任务广播
23
+ */
24
+ create(announcement: Omit<TaskAnnouncement, 'announcementId' | 'timestamp' | 'status' | 'claims'>): TaskAnnouncement;
25
+ /**
26
+ * 获取所有开放的广播
27
+ */
28
+ getOpen(): TaskAnnouncement[];
29
+ /**
30
+ * 获取特定广播
31
+ */
32
+ get(announcementId: string): TaskAnnouncement | undefined;
33
+ /**
34
+ * 提交认领
35
+ */
36
+ submitClaim(announcementId: string, claim: Omit<TaskClaim, 'claimId' | 'timestamp' | 'status' | 'announcementId'>): TaskClaim | null;
37
+ /**
38
+ * 接受认领
39
+ */
40
+ acceptClaim(announcementId: string, claimId: string): TaskClaim | null;
41
+ /**
42
+ * 拒绝认领
43
+ */
44
+ rejectClaim(announcementId: string, claimId: string): TaskClaim | null;
45
+ /**
46
+ * 标记为已委托
47
+ */
48
+ markDelegated(announcementId: string): boolean;
49
+ /**
50
+ * 获取我的认领(作为认领方)
51
+ */
52
+ getMyClaims(claimantId: string): TaskClaim[];
53
+ /**
54
+ * 获取我的广播(作为发布方)
55
+ */
56
+ getMyAnnouncements(fromId: string): TaskAnnouncement[];
57
+ /**
58
+ * 获取统计
59
+ */
60
+ getStats(): AnnouncementQueueStats;
61
+ /**
62
+ * 清理过期
63
+ */
64
+ cleanup(): void;
65
+ /**
66
+ * 清空
67
+ */
68
+ clear(): void;
69
+ }
70
+ export declare const announcementQueue: AnnouncementQueue;
71
+ //# sourceMappingURL=announcement-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announcement-queue.d.ts","sourceRoot":"","sources":["../src/announcement-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D;;OAEG;IACH,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,gBAAgB;IAsBpH;;OAEG;IACH,OAAO,IAAI,gBAAgB,EAAE;IAM7B;;OAEG;IACH,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIzD;;OAEG;IACH,WAAW,CACT,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,CAAC,GAC5E,SAAS,GAAG,IAAI;IAsBnB;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAuBtE;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAWtE;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAQ9C;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE;IAW5C;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAMtD;;OAEG;IACH,QAAQ,IAAI,sBAAsB;IAWlC;;OAEG;IACH,OAAO,IAAI,IAAI;IAgBf;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}