@oatelauser/crosschat 1.5.0 → 1.5.2

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.
@@ -4,7 +4,7 @@
4
4
  * runSend,fileInbox 落盘本机收件)。
5
5
  */
6
6
  import { execSync, spawn } from 'node:child_process';
7
- import { appendFileSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
7
+ import { appendFileSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, writeFileSync } from 'node:fs';
8
8
  import { randomBytes } from 'node:crypto';
9
9
  import { homedir, hostname, networkInterfaces } from 'node:os';
10
10
  import { fileURLToPath } from 'node:url';
@@ -13,7 +13,7 @@ import process from 'node:process';
13
13
  import { MultichatError } from '../errors.js';
14
14
  import { machineId } from '../platform/machine-id.js';
15
15
  import { Broker, DEFAULT_PORT, defaultDeliverLocal } from '../serve/broker.js';
16
- import { genKeys, listNodes, readRegistry, registryFileOf, removeNode, setPort, tcpDir, writeRegistry } from '../serve/registry.js';
16
+ import { ensureStarId, genKeys, listNodes, readRegistry, registryFileOf, removeNode, setPort, tcpDir, writeRegistry } from '../serve/registry.js';
17
17
  import { deliverViaRunSend, NodeClient, readNodeConfig } from '../serve/node.js';
18
18
  import { FileInbox } from '../serve/file-channel.js';
19
19
  export function realServeDeps() {
@@ -46,16 +46,24 @@ export async function runServe(args, deps) {
46
46
  return runList(deps, registryFile);
47
47
  if (args.remove !== undefined)
48
48
  return runRemove(args.remove, deps, registryFile);
49
+ if (args.stopSelector !== undefined)
50
+ return runStopSelector(args.stopSelector, deps);
49
51
  if (args.stopTarget !== undefined)
50
52
  return runStop(args.stopTarget, deps, registryFile);
51
53
  const detachedChild = deps.env.CROSSCHAT_SERVE_DETACHED === '1';
52
54
  if (args.connect !== undefined) {
53
- if (args.detach && !detachedChild)
54
- return runDetach(deps, ['--connect', ...(args.connect === '' ? [] : [args.connect])], 'node.log');
55
+ if (args.detach && !detachedChild) {
56
+ const logName = args.connect === '' ? 'node.log' : `node-${args.connect}.log`;
57
+ return runDetach(deps, ['--connect', ...(args.connect === '' ? [] : [args.connect])], logName);
58
+ }
55
59
  return runForegroundNode(args.connect, deps);
56
60
  }
57
- if (args.detach && !detachedChild)
58
- return runDetach(deps, [], 'broker.log');
61
+ if (args.detach && !detachedChild) {
62
+ // 父进程先自登记并出声(子进程里再跑是幂等空转)——后台模式控制台不留黑盒
63
+ const effectivePort = port ?? readRegistry(registryFile).port ?? DEFAULT_PORT;
64
+ announceSelfEntry(deps, ensureSelfEntry(deps, registryFile, effectivePort));
65
+ return runDetach(deps, [], 'broker.log', effectivePort);
66
+ }
59
67
  return runForegroundBroker(deps, port);
60
68
  }
61
69
  function runGenKey(genKeyArg, deps, registryFile, port) {
@@ -65,13 +73,18 @@ function runGenKey(genKeyArg, deps, registryFile, port) {
65
73
  }
66
74
  const host = firstNonInternalIPv4(deps.networkInterfaces());
67
75
  const portNum = port ?? readRegistry(registryFile).port ?? DEFAULT_PORT;
68
- const results = genKeys(registryFile, n, { host, port: portNum, alias: deps.hostname() });
69
- deps.stdout(`自动探测 broker 地址:${host}(只取第一个网卡,可能不对——请人工核对,不保证正确)`);
70
- deps.stdout('分发前把每份 node.json 的 name 改成目标机器名(人读用,回信不依赖它——寻址走 machine-id 前缀)');
76
+ const results = genKeys(registryFile, n, { host, port: portNum, alias: deps.hostname(), starId: ensureStarId(registryFile) });
77
+ deps.stdout(`自动探测 broker 地址:${host}:${portNum}(多网卡/NAT 常探错——按下述规则人工核对改写 node.json 的 host 与 port):`);
78
+ deps.stdout(' · broker 机自身 → 无需分发(首次 serve 已自动写好 127.0.0.1 的自用 node.json)');
79
+ deps.stdout(' · broker 是云主机/NAT 内网机 → host 填对外公网 IP(探测常拿内网 IP,必核对)');
80
+ deps.stdout(' · 普通局域网 → broker 机的局域网 IP;broker 用非默认端口时 port 一并改');
81
+ deps.stdout('分发前把每份 node.json 的 name 改成「贴这份配置的机器」的自报名字(建议=其 hostname;纯显示用——roster 怎么称呼它,寻址/回信不依赖,走 machine-id 前缀)');
71
82
  for (const result of results) {
72
83
  deps.stdout('--------------------------------');
73
84
  deps.stdout(result.nodeJsonContent.trimEnd());
74
85
  }
86
+ deps.stdout('放置路径(目标机器):~/.crosschat/tcp/node.json(win 写法 C:\\Users\\<用户>\\.crosschat\\tcp\\node.json)');
87
+ deps.stdout('本命令须在 broker 机上执行(钥匙登记进本机 broker.json);broker 机自己的 node.json 已由首次 serve 自动写好,勿用上面的钥匙覆盖');
75
88
  deps.stdout('钥匙已进入终端回滚缓冲,分发完建议清屏');
76
89
  return 0;
77
90
  }
@@ -99,8 +112,8 @@ function runRemove(label, deps, registryFile) {
99
112
  deps.stdout(removed ? `已移除 ${label}` : `未找到 ${label}`);
100
113
  return removed ? 0 : 1;
101
114
  }
102
- /** 后台化:spawn 自身 detached + env 标记防循环;日志写 tcp/<name>。 */
103
- function runDetach(deps, extraArgs, logName) {
115
+ /** 后台化:spawn 自身 detached + env 标记防循环;日志写 tcp/<name>(B2 节点命名条目=node-<选择器>.log)。broker 传端口(节点客户端外连无监听口)。 */
116
+ function runDetach(deps, extraArgs, logName, portNum) {
104
117
  const logFile = join(tcpDir(deps.baseDir), logName);
105
118
  mkdirSync(tcpDir(deps.baseDir), { recursive: true });
106
119
  const fd = openSync(logFile, 'a');
@@ -111,18 +124,13 @@ function runDetach(deps, extraArgs, logName) {
111
124
  env: { ...deps.env, CROSSCHAT_SERVE_DETACHED: '1' },
112
125
  });
113
126
  child.unref();
114
- deps.stdout(`${logName === 'node.log' ? '节点客户端' : 'broker'} 后台运行中 pid=${child.pid}(日志:${logFile})`);
127
+ deps.stdout(`${logName.startsWith('node') ? '节点客户端' : 'broker'} 后台运行中 pid=${child.pid}${portNum !== undefined ? ` 端口 ${portNum}` : ''}(日志:${logFile})`);
115
128
  return 0;
116
129
  }
117
- /**
118
- * B2.1:broker 首启自登记——本机条目直接落注册表(machineId=本机、name=hostname),
119
- * 并自动写本机 node.json(host=127.0.0.1)。broker 机与其他节点完全同构:
120
- * 其他机器可立即用 mid8/名字寻址本机,本机 send --via tcp: 也有凭证,零管理员动作。
121
- */
122
130
  export function ensureSelfEntry(deps, registryFile, port) {
123
131
  const mid = deps.machineId();
124
132
  if (mid === undefined || mid === '')
125
- return;
133
+ return undefined;
126
134
  const registry = readRegistry(registryFile);
127
135
  let self = registry.nodes.find((node) => node.machineId === mid);
128
136
  if (self === undefined) {
@@ -133,7 +141,61 @@ export function ensureSelfEntry(deps, registryFile, port) {
133
141
  const nodeJson = join(tcpDir(deps.baseDir), 'node.json');
134
142
  if (!existsSync(nodeJson)) {
135
143
  mkdirSync(tcpDir(deps.baseDir), { recursive: true });
136
- writeFileSync(nodeJson, `${JSON.stringify({ broker: { host: '127.0.0.1', port, alias: deps.hostname() }, key: self.key, name: deps.hostname() }, null, 2)}\n`, 'utf8');
144
+ // B0:自用 node.json 同带 starId(与 gen-key 分发的钥匙同构)
145
+ const starId = ensureStarId(registryFile);
146
+ writeFileSync(nodeJson, `${JSON.stringify({ broker: { host: '127.0.0.1', port, alias: deps.hostname(), starId }, key: self.key, name: deps.hostname() }, null, 2)}\n`, 'utf8');
147
+ return { status: 'written' };
148
+ }
149
+ // 已存在:宽松解析判状态(不抛——这里只是体检,坏文件交给上层教学报错)
150
+ let parsed;
151
+ try {
152
+ parsed = JSON.parse(readFileSync(nodeJson, 'utf8'));
153
+ }
154
+ catch {
155
+ parsed = undefined;
156
+ }
157
+ const broker = parsed?.broker;
158
+ if (typeof broker?.host !== 'string' || typeof parsed?.key !== 'string')
159
+ return { status: 'stale' };
160
+ if (broker.host !== '127.0.0.1')
161
+ return { status: 'foreign', host: broker.host, port: broker.port };
162
+ if (parsed.key !== self.key || broker.port !== port)
163
+ return { status: 'stale' };
164
+ // B1:钥匙/host/port 匹配但条目缺 starId(B0 之前写下的自用 node.json)→
165
+ // 原子补写注册表 starId,其余字段不碰
166
+ if (broker.starId === undefined)
167
+ backfillSelfStarId(nodeJson, ensureStarId(registryFile));
168
+ return { status: 'ok' };
169
+ }
170
+ /** B1:自用 node.json 的 broker 条目补 starId(tmp+rename 原子写,风格同 B0 backfillStarId);失败不倒 serve。 */
171
+ function backfillSelfStarId(nodeJson, starId) {
172
+ try {
173
+ const raw = JSON.parse(readFileSync(nodeJson, 'utf8'));
174
+ if (raw === null || typeof raw !== 'object' || raw.broker === null || typeof raw.broker !== 'object' || raw.broker.starId !== undefined) {
175
+ return;
176
+ }
177
+ raw.broker.starId = starId;
178
+ const tmp = `${nodeJson}.tmp`;
179
+ writeFileSync(tmp, `${JSON.stringify(raw, null, 2)}\n`, 'utf8');
180
+ renameSync(tmp, nodeJson);
181
+ }
182
+ catch {
183
+ // 补写失败不倒 serve(下次启动再试)
184
+ }
185
+ }
186
+ /** 自登记结局出声(written/foreign/stale 三种;ok 静默——状态没变不刷屏)。 */
187
+ function announceSelfEntry(deps, result) {
188
+ if (result === undefined)
189
+ return;
190
+ const path = join(tcpDir(deps.baseDir), 'node.json');
191
+ if (result.status === 'written') {
192
+ deps.stdout(`已自动生成本机 node.json(${path},host=127.0.0.1——本机 send --via tcp: 凭证)`);
193
+ }
194
+ else if (result.status === 'foreign') {
195
+ deps.stdout(`检测到已有 node.json(指向 ${result.host}:${result.port})——本机 tcp 发送将走它;若本机现在是 broker 要自连,移走该文件后重启 serve`);
196
+ }
197
+ else if (result.status === 'stale') {
198
+ deps.stdout(`检测到已有 node.json 但钥匙/端口与当前 broker 不符(陈旧或损坏)——本地发送会失败;删除该文件重启 serve 可重建(${path})`);
137
199
  }
138
200
  }
139
201
  async function runForegroundBroker(deps, port) {
@@ -149,6 +211,9 @@ async function runForegroundBroker(deps, port) {
149
211
  }
150
212
  }
151
213
  : (line) => deps.stdout(line);
214
+ // B1 多星:broker 自投递签发的 ref 盖注册表星标识(与 gen-key 分发的钥匙同源)
215
+ const registryFile = registryFileOf(deps.baseDir);
216
+ const registryStarId = ensureStarId(registryFile);
152
217
  // B2:broker 机自己也是全权节点——deliverLocal 接 runSend、file 落本机收件。
153
218
  const deliverLocal = deps.makeSendDeps === undefined
154
219
  ? defaultDeliverLocal
@@ -162,7 +227,7 @@ async function runForegroundBroker(deps, port) {
162
227
  conversation: frame.conversation,
163
228
  origin: frame.origin,
164
229
  };
165
- const r = await deliverViaRunSend(deliver, deps.makeSendDeps());
230
+ const r = await deliverViaRunSend(deliver, { ...deps.makeSendDeps(), refStarId: registryStarId });
166
231
  // deliverViaRunSend 的失败即 ResultFrame{status:'error'}——规整为
167
232
  // ErrorFrame,broker 本地分支的失败语义(op:'error')保持 B1 不变。
168
233
  return r.status === 'error'
@@ -170,7 +235,10 @@ async function runForegroundBroker(deps, port) {
170
235
  : r;
171
236
  };
172
237
  // B2.1:起服务前自登记(本机=全权成员,mid8/名字可寻址 + 本机 node.json)。
173
- ensureSelfEntry(deps, registryFileOf(deps.baseDir), port ?? readRegistry(registryFileOf(deps.baseDir)).port ?? DEFAULT_PORT);
238
+ // 后台子进程不重复出声——父进程 spawn 前已向控制台播报过。
239
+ const self = ensureSelfEntry(deps, registryFile, port ?? readRegistry(registryFile).port ?? DEFAULT_PORT);
240
+ if (!detached)
241
+ announceSelfEntry(deps, self);
174
242
  const broker = new Broker({
175
243
  registryFile: registryFileOf(deps.baseDir),
176
244
  statusFile: join(tcpDir(deps.baseDir), 'status-broker.json'),
@@ -198,11 +266,42 @@ async function runForegroundBroker(deps, port) {
198
266
  });
199
267
  return 0;
200
268
  }
201
- /** B2:--connect 节点客户端前台跑(Ctrl+C 退出)。 */
269
+ /**
270
+ * B2:--connect 选择器解析(限定器风格对齐 via-tcp 的 selectBrokerEntry):
271
+ * 别名精确匹配 → starId 前缀唯一匹配(歧义教加长);无命中时单条目走旧
272
+ * "别名不符拒绝"校验路径(旧形状兼容),多条目列条目并给示例。'' = entries[0]。
273
+ */
274
+ export function selectConnectEntry(selector, config) {
275
+ const entries = config.entries;
276
+ if (selector === '')
277
+ return { entry: entries[0], selector };
278
+ const byAlias = entries.find((e) => e.alias === selector);
279
+ if (byAlias !== undefined)
280
+ return { entry: byAlias, selector };
281
+ const byPrefix = entries.filter((e) => e.starId !== undefined && e.starId.startsWith(selector));
282
+ if (byPrefix.length === 1)
283
+ return { entry: byPrefix[0], selector };
284
+ if (byPrefix.length > 1) {
285
+ throw new MultichatError('USAGE', `--connect 选择器 ${selector} 的 starId 前缀命中多个星(${byPrefix.map((e) => e.alias ?? e.starId).join('、')})——加长前缀使其唯一`);
286
+ }
287
+ if (entries.length === 1) {
288
+ // 旧校验路径:单条目(旧形状)别名不符拒绝;无别名则容忍直连(B2 前行为)
289
+ const alias = entries[0].alias;
290
+ if (alias !== undefined) {
291
+ throw new MultichatError('USAGE', `--connect ${selector} 与 node.json 的 broker 别名 ${alias} 不符——省略别名直连,或向管理员核对 node.json`);
292
+ }
293
+ return { entry: entries[0], selector };
294
+ }
295
+ const list = entries.map((e) => `${e.alias ?? '(无别名)'}(starId ${e.starId ?? '未登记'})`).join('、');
296
+ throw new MultichatError('USAGE', `--connect 选择器 ${selector} 不匹配任何条目——本机 node.json 现有:${list};示例:--connect ${entries[0].alias ?? entries[0].starId}`);
297
+ }
298
+ /** B2:--connect 节点客户端前台跑(Ctrl+C 退出)。守护只连选中条目(config.entries 收窄为单元素)。 */
202
299
  async function runForegroundNode(aliasArg, deps) {
203
- const config = loadNodeConfigChecked(aliasArg, deps);
300
+ const config = readNodeConfig(join(tcpDir(deps.baseDir), 'node.json'));
301
+ const { entry, selector } = selectConnectEntry(aliasArg, config);
302
+ const suffix = selector === '' ? '' : `-${selector}`;
204
303
  const detached = deps.env.CROSSCHAT_SERVE_DETACHED === '1';
205
- const logFile = join(tcpDir(deps.baseDir), 'node.log');
304
+ const logFile = join(tcpDir(deps.baseDir), `node${suffix}.log`);
206
305
  const logLine = detached
207
306
  ? (line) => {
208
307
  try {
@@ -214,9 +313,10 @@ async function runForegroundNode(aliasArg, deps) {
214
313
  }
215
314
  : (line) => deps.stdout(line);
216
315
  const client = new NodeClient({
217
- config,
316
+ config: { ...config, entries: [entry] },
317
+ configFile: join(tcpDir(deps.baseDir), 'node.json'),
218
318
  machineId: deps.machineId,
219
- statusFile: join(tcpDir(deps.baseDir), 'status-node.json'),
319
+ statusFile: join(tcpDir(deps.baseDir), `status-node${suffix}.json`),
220
320
  fileInbox: new FileInbox({
221
321
  inboxDir: join(tcpDir(deps.baseDir), 'inbox'),
222
322
  partsDir: join(tcpDir(deps.baseDir), 'parts'),
@@ -231,18 +331,10 @@ async function runForegroundNode(aliasArg, deps) {
231
331
  log: logLine,
232
332
  onSignal: deps.onSignal,
233
333
  });
234
- logLine(`节点客户端启动:目标 broker ${config.broker.alias ?? `${config.broker.host}:${config.broker.port}`}(Ctrl+C 退出)`);
334
+ logLine(`节点客户端启动:目标 broker ${entry.alias ?? `${entry.host}:${entry.port}`}(Ctrl+C 退出)`);
235
335
  await client.run();
236
336
  return 0;
237
337
  }
238
- /** 读 node.json(教学报错);--connect 显式给的别名与凭证不符时拒绝。 */
239
- function loadNodeConfigChecked(aliasArg, deps) {
240
- const config = readNodeConfig(join(tcpDir(deps.baseDir), 'node.json'));
241
- if (aliasArg !== '' && config.broker.alias !== undefined && aliasArg !== config.broker.alias) {
242
- throw new MultichatError('USAGE', `--connect ${aliasArg} 与 node.json 的 broker 别名 ${config.broker.alias} 不符——省略别名直连,或向管理员核对 node.json`);
243
- }
244
- return config;
245
- }
246
338
  function readResultTimeoutMs(env) {
247
339
  const raw = env.CROSSCHAT_TCP_TIMEOUT_MS;
248
340
  if (raw === undefined || raw === '')
@@ -331,22 +423,64 @@ function pidsOnPort(port) {
331
423
  }
332
424
  return pids;
333
425
  }
426
+ /** 命令行里 --connect 的取值(空串=裸 --connect 默认守护;undefined=非节点进程)。 */
427
+ export function connectValueOf(cmdline) {
428
+ const m = cmdline.match(/--connect(?:=|\s+)([^\s]*)/);
429
+ return m === null ? undefined : m[1] ?? '';
430
+ }
431
+ /**
432
+ * B2:--stop <选择器>——只停该选择器的节点守护(精确匹配 --connect 的取值,
433
+ * 身份校验沿用 matchServeProcesses 的 exe/脚本特征闸门)。
434
+ */
435
+ function runStopSelector(selector, deps) {
436
+ const procs = (deps.listServeProcesses ?? listServeProcesses)();
437
+ const kill = deps.killPid ?? killPid;
438
+ const targets = procs.filter((p) => p.cmdline.includes('--connect') && connectValueOf(p.cmdline) === selector);
439
+ if (targets.length === 0) {
440
+ deps.stdout(`stop node: 未找到 ${selector}`);
441
+ return 1;
442
+ }
443
+ let rc = 0;
444
+ for (const n of targets) {
445
+ if (kill(n.pid))
446
+ deps.stdout(`stop node: pid ${n.pid} 已终止(--connect ${selector})`);
447
+ else {
448
+ deps.stdout(`stop node: pid ${n.pid} 终止失败`);
449
+ rc = 1;
450
+ }
451
+ }
452
+ return rc;
453
+ }
334
454
  function runStop(target, deps, registryFile) {
335
- const procs = listServeProcesses();
455
+ const procs = (deps.listServeProcesses ?? listServeProcesses)();
456
+ const kill = deps.killPid ?? killPid;
336
457
  const brokers = procs.filter((p) => !p.cmdline.includes('--connect'));
337
458
  const nodes = procs.filter((p) => p.cmdline.includes('--connect'));
338
459
  let rc = 0;
460
+ // B2:both 时先停全部节点守护再停 broker——节点腿断流在前,broker 关闭在后
461
+ if (target === 'node' || target === 'both') {
462
+ if (nodes.length === 0)
463
+ deps.stdout('stop node: 未发现运行中的节点');
464
+ for (const n of nodes) {
465
+ if (kill(n.pid))
466
+ deps.stdout(`stop node: pid ${n.pid} 已终止`);
467
+ else {
468
+ deps.stdout(`stop node: pid ${n.pid} 终止失败`);
469
+ rc = 1;
470
+ }
471
+ }
472
+ }
339
473
  if (target === 'broker' || target === 'both') {
340
474
  if (brokers.length === 0)
341
475
  deps.stdout('stop broker: 未发现运行中的 broker');
342
476
  const port = readRegistry(registryFile).port ?? DEFAULT_PORT;
343
- const confirmed = pidsOnPort(port);
477
+ const confirmed = (deps.pidsOnPort ?? pidsOnPort)(port);
344
478
  for (const b of brokers) {
345
479
  if (!confirmed.has(b.pid)) {
346
480
  deps.stdout(`stop broker: pid ${b.pid} 命令行匹配但未持有端口 ${port},未确认跳过`);
347
481
  continue;
348
482
  }
349
- if (killPid(b.pid))
483
+ if (kill(b.pid))
350
484
  deps.stdout(`stop broker: pid ${b.pid} 已终止(端口 ${port} 双重确认)`);
351
485
  else {
352
486
  deps.stdout(`stop broker: pid ${b.pid} 终止失败`);
@@ -354,18 +488,6 @@ function runStop(target, deps, registryFile) {
354
488
  }
355
489
  }
356
490
  }
357
- if (target === 'node' || target === 'both') {
358
- if (nodes.length === 0)
359
- deps.stdout('stop node: 未发现运行中的节点');
360
- for (const n of nodes) {
361
- if (killPid(n.pid))
362
- deps.stdout(`stop node: pid ${n.pid} 已终止`);
363
- else {
364
- deps.stdout(`stop node: pid ${n.pid} 终止失败`);
365
- rc = 1;
366
- }
367
- }
368
- }
369
491
  return rc;
370
492
  }
371
493
  function killPid(pid) {
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjI,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAA6B,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAqC,MAAM,kBAAkB,CAAC;AACpH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAqCrD,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC;QACtC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;QACnD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EACL,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAChF,CAAC,OAAO;QACT,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE;QAC1B,iBAAiB,EAAE,GAAG,EAAE,CAAC,iBAAiB,EAAE;QAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAe,EAAE,IAAe;IAC7D,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;YAC/C,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,4BAA4B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,GAAG,CAAC,CAAC;QACT,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,+BAA+B;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC7F,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACjF,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC;IAChE,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,OAAO,MAAM,CAAC;YAC9E,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,uCAAuC;QACvC,MAAM,aAAa,GAAG,IAAI,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC;QAC9E,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;QAC5E,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB,EAAE,IAAe,EAAE,YAAoB,EAAE,IAAwB;IACnG,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,8BAA8B,SAAS,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9H,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,OAAO,qDAAqD,CAAC,CAAC;IACpG,IAAI,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,sGAAsG,CAAC,CAAC;IACpH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,2FAA2F,CAAC,CAAC;IACzG,IAAI,CAAC,MAAM,CAAC,wFAAwF,CAAC,CAAC;IACtG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA2C;IACvE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,KAAK,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,CAAC,OAAO,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,OAAO,CAAC,IAAe,EAAE,YAAoB;IACpD,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACrF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CACT,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CACnI,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,IAAe,EAAE,YAAoB;IACrE,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,0GAA0G;AAC1G,SAAS,SAAS,CAAC,IAAe,EAAE,SAAmB,EAAE,OAAe,EAAE,OAAgB;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,EAAE;QAClF,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;QACzB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE;KACpD,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,cAAc,KAAK,CAAC,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,OAAO,GAAG,CAAC,CAAC;IACxJ,OAAO,CAAC,CAAC;AACX,CAAC;AAiBD,MAAM,UAAU,eAAe,CAAC,IAAe,EAAE,YAAoB,EAAE,IAAY;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1J,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,+CAA+C;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC1C,aAAa,CACX,QAAQ,EACR,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC7I,MAAM,CACP,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,sCAAsC;IACtC,IAAI,MAAiG,CAAC;IACtG,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAkB,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;IAC9B,IAAI,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACpG,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACpG,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAChF,uDAAuD;IACvD,wBAAwB;IACxB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,4FAA4F;AAC5F,SAAS,kBAAkB,CAAC,QAAgB,EAAE,MAAc;IAC1D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAgD,CAAC;QACtG,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxI,OAAO;QACT,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,CAAC;QAC9B,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,SAAS,iBAAiB,CAAC,IAAe,EAAE,MAAmC;IAC7E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,yCAAyC,CAAC,CAAC;IAClF,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,sBAAsB,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,kDAAkD,CAAC,CAAC;IAClH,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,yEAAyE,IAAI,GAAG,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAe,EAAE,IAAwB;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,QAAQ;QACtB,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE;YACf,IAAI,CAAC;gBACH,cAAc,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QACH,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,qDAAqD;IACrD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAClD,0DAA0D;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS;QAClD,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,KAAK,EAAE,KAAgB,EAAqC,EAAE;YAC5D,MAAM,OAAO,GAAiB;gBAC5B,EAAE,EAAE,SAAS;gBACb,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,KAAK,CAAC,IAAI;gBACnB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;YACF,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,YAAa,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;YACnG,0DAA0D;YAC1D,mDAAmD;YACnD,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO;gBACzB,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,QAAQ,EAAE;gBAClF,CAAC,CAAC,CAAC,CAAC;QACR,CAAC,CAAC;IACN,mDAAmD;IACnD,mCAAmC;IACnC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;IAC1G,IAAI,CAAC,QAAQ;QAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;QAC5D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,EAAE,OAAO;QACZ,YAAY;QACZ,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YAC7C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;SAC9C,CAAC;QACF,IAAI;QACJ,eAAe,EAAE,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,+BAA+B,MAAM,aAAa,CAAC,CAAC;IAChE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,MAAkB;IACrE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,CAAC;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,CAAC;IACpE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,cAAc,CACtB,OAAO,EACP,iBAAiB,QAAQ,qBAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAC9G,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,wCAAwC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,cAAc,CACtB,OAAO,EACP,aAAa,QAAQ,4BAA4B,KAAK,+BAA+B,CACtF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,WAAW,CAAC,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChG,MAAM,IAAI,cAAc,CACtB,OAAO,EACP,iBAAiB,QAAQ,6BAA6B,IAAI,iBAAiB,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CACrH,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,IAAe;IAChE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,QAAQ;QACtB,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE;YACf,IAAI,CAAC;gBACH,cAAc,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa;YACf,CAAC;QACH,CAAC;QACH,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;QAC5B,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE;QACvC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;QACnD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,MAAM,OAAO,CAAC;QACnE,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YAC7C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;SAC9C,CAAC;QACF,YAAY,EAAE,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;QACD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,qBAAqB,KAAK,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxF,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACnB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAsB;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,wBAAwB,CAAC;IACzC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACzD,CAAC;AAcD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAgB,EAAE,OAAe;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC7D,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,eAAe;YAAE,OAAO,KAAK,CAAC;QAC7G,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4DAA4D;AAC5D,SAAS,kBAAkB;IACzB,IAAI,GAAW,CAAC;IAChB,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,GAAG,GAAG,QAAQ,CACZ,+KAA+K,EAC/K,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAA8J,CAAC;QACpM,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,QAAQ,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,EAAE;gBAAE,SAAS;YAC7B,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,iCAAiC;AACjC,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAClE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAAE,SAAS;gBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;oBACzC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC7D,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;wBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,QAAQ,CAAC,uCAAuC,IAAI,2BAA2B,EAAE;gBAC3F,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACtF,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACpB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC7C,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;wBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACtD,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,IAAe;IACxD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC/G,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,kBAAkB,QAAQ,GAAG,CAAC,CAAC;aAC9E,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;YAC5C,EAAE,GAAG,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,MAAkC,EAAE,IAAe,EAAE,YAAoB;IACxF,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACnE,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,kDAAkD;IAClD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;iBACvD,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;gBAC5C,EAAE,GAAG,CAAC,CAAC;YACT,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC;QAC7D,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,gBAAgB,IAAI,QAAQ,CAAC,CAAC;gBACnE,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,WAAW,IAAI,QAAQ,CAAC,CAAC;iBAC1E,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;gBAC9C,EAAE,GAAG,CAAC,CAAC;YACT,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
- import { readFileSync } from 'node:fs';
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { MultichatError } from '../errors.js';
4
+ import { readNodeConfig } from '../serve/node.js';
4
5
  /** B2 freshness bound: a status file older than this reads as "没在跑". */
5
6
  export const TCP_STATUS_FRESH_MS = 90_000;
6
7
  function readStatusJson(file) {
@@ -11,26 +12,62 @@ function readStatusJson(file) {
11
12
  return undefined;
12
13
  }
13
14
  }
14
- /** 转发器区块(节点行 + broker 行 + 在线机器表);dir=undefined → 空数组。 */
15
+ /** B2:tcp 目录下的节点守护状态文件(默认在前,其余按选择器名排序)。 */
16
+ function listNodeStatusFiles(tcpDir) {
17
+ try {
18
+ return readdirSync(tcpDir)
19
+ .filter((f) => /^status-node(-.*)?\.json$/.test(f))
20
+ .sort((a, b) => (a === 'status-node.json' ? -1 : b === 'status-node.json' ? 1 : a.localeCompare(b)));
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ /** 文件名 → 选择器(status-node.json='';status-node-work.json='work')。 */
27
+ function nodeStatusSelector(file) {
28
+ return file === 'status-node.json' ? '' : file.replace(/^status-node-/, '').replace(/\.json$/, '');
29
+ }
30
+ /** 单守护状态行(prefix='转发器:' 单条目 / '转发器[<选择器>]:' 多条目)。 */
31
+ function nodeStateLine(prefix, st) {
32
+ if (st.state === 'online')
33
+ return `${prefix} online tcp:${st.brokerAlias} (since ${formatCreatedAt(st.since)})`;
34
+ if (st.state === 'reconnect-wait') {
35
+ const next = st.nextAttemptAt === undefined ? '-' : formatHms(st.nextAttemptAt);
36
+ return `${prefix} 重连等待中,下次尝试 ${next}`;
37
+ }
38
+ return `${prefix} 连接中 tcp:${st.brokerAlias}`;
39
+ }
40
+ /**
41
+ * 转发器区块(节点行 + broker 行 + 在线机器表);dir=undefined → 空数组。
42
+ * B2 多守护:逐个 status-node*.json 出行(多条目时带 [选择器] 标签);
43
+ * 单条目(仅默认文件/无文件)输出与 B2 之前逐字节同形。
44
+ */
15
45
  async function tcpForwarderLines(tcpDir, nowMs, roster) {
16
46
  if (tcpDir === undefined)
17
47
  return [];
18
48
  const lines = [];
19
- const node = readStatusJson(join(tcpDir, 'status-node.json'));
20
- const nodeFresh = node !== undefined && nowMs - Date.parse(node.lastUpdated) < TCP_STATUS_FRESH_MS;
21
- if (!nodeFresh) {
22
- lines.push('转发器: 未运行');
23
- }
24
- else if (node.state === 'online') {
25
- lines.push(`转发器: online tcp:${node.brokerAlias} (since ${formatCreatedAt(node.since)})`);
26
- }
27
- else if (node.state === 'reconnect-wait') {
28
- const next = node.nextAttemptAt === undefined ? '-' : formatHms(node.nextAttemptAt);
29
- lines.push(`转发器: 重连等待中,下次尝试 ${next}`);
30
- }
31
- else {
32
- lines.push(`转发器: 连接中 tcp:${node.brokerAlias}`);
49
+ const files = listNodeStatusFiles(tcpDir);
50
+ const multi = files.length > 1;
51
+ let anyFresh = false;
52
+ for (const file of files) {
53
+ const node = readStatusJson(join(tcpDir, file));
54
+ const fresh = node !== undefined && nowMs - Date.parse(node.lastUpdated) < TCP_STATUS_FRESH_MS;
55
+ if (multi) {
56
+ const tag = nodeStatusSelector(file) || '默认';
57
+ if (!fresh) {
58
+ lines.push(`转发器[${tag}]: 未运行`);
59
+ continue;
60
+ }
61
+ anyFresh = true;
62
+ lines.push(nodeStateLine(`转发器[${tag}]:`, node));
63
+ }
64
+ else if (fresh) {
65
+ anyFresh = true;
66
+ lines.push(nodeStateLine('转发器:', node));
67
+ }
33
68
  }
69
+ if (!multi && !anyFresh)
70
+ lines.push('转发器: 未运行');
34
71
  const broker = readStatusJson(join(tcpDir, 'status-broker.json'));
35
72
  if (broker !== undefined && broker.state === 'running' && nowMs - Date.parse(broker.lastUpdated) < TCP_STATUS_FRESH_MS) {
36
73
  const nodes = broker.onlineNodes ?? [];
@@ -40,25 +77,44 @@ async function tcpForwarderLines(tcpDir, nowMs, roster) {
40
77
  return lines;
41
78
  }
42
79
  // B2.1:非 broker 机(本机 status-broker.json 不新鲜)且有 roster 接线 → 瞬态拉在线表;
43
- // 失败静默降级为一行"不可达"。
80
+ // 失败静默降级为一行"不可达"。B2:node.json 多条目时逐条目探各自 broker。
44
81
  if (roster !== undefined) {
45
- const machines = await roster();
46
- if (machines === undefined) {
47
- lines.push('转发器: 不可达');
82
+ let entries;
83
+ try {
84
+ entries = readNodeConfig(join(tcpDir, 'node.json')).entries;
85
+ }
86
+ catch {
87
+ // 无 node.json/损坏 → 走单条目路径(roster 自行降级)
88
+ }
89
+ if (entries === undefined || entries.length <= 1) {
90
+ const machines = await roster();
91
+ pushRosterLines(lines, '', machines);
48
92
  }
49
93
  else {
50
- const disp = (m) => `${m.name ?? '?'} (${m.mid8})`;
51
- const online = machines.filter((m) => m.online);
52
- const offline = machines.filter((m) => !m.online);
53
- lines.push(`转发器: broker 可达,${online.length} 机器在线`);
54
- if (online.length > 0)
55
- lines.push(`在线机器: ${online.map(disp).join('、')}`);
56
- if (offline.length > 0)
57
- lines.push(`离线机器: ${offline.map(disp).join('、')}`);
94
+ for (const entry of entries) {
95
+ const label = entry.alias ?? `${entry.host}:${entry.port}`;
96
+ const machines = await roster(entry);
97
+ pushRosterLines(lines, label, machines);
98
+ }
58
99
  }
59
100
  }
60
101
  return lines;
61
102
  }
103
+ /** 在线表行(label='' 时与 B2.1 单条目格式逐字节一致)。 */
104
+ function pushRosterLines(lines, label, machines) {
105
+ if (machines === undefined) {
106
+ lines.push(label === '' ? '转发器: 不可达' : `转发器: broker ${label} 不可达`);
107
+ return;
108
+ }
109
+ const disp = (m) => `${m.name ?? '?'} (${m.mid8})`;
110
+ const online = machines.filter((m) => m.online);
111
+ const offline = machines.filter((m) => !m.online);
112
+ lines.push(label === '' ? `转发器: broker 可达,${online.length} 机器在线` : `转发器: broker ${label} 可达,${online.length} 机器在线`);
113
+ if (online.length > 0)
114
+ lines.push(label === '' ? `在线机器: ${online.map(disp).join('、')}` : `在线机器[${label}]: ${online.map(disp).join('、')}`);
115
+ if (offline.length > 0)
116
+ lines.push(label === '' ? `离线机器: ${offline.map(disp).join('、')}` : `离线机器[${label}]: ${offline.map(disp).join('、')}`);
117
+ }
62
118
  /** `hh:mm:ss` (local time); `-` when unknown/invalid. */
63
119
  function formatHms(iso) {
64
120
  const date = new Date(iso);
@@ -104,10 +160,14 @@ export async function runStatus(deps, json, conversations = false) {
104
160
  const held = deps.listWriterLocks?.() ?? new Set();
105
161
  if (json) {
106
162
  // B2:tcp 小节仅在 tcpDir 接线时出现——嵌入方(无该 dep)的 json 键集
107
- // 保持 {claude, codex} 冻结契约不变。
108
- const tcp = deps.tcpDir === undefined ? {} : { tcp: tcpJson(deps.tcpDir, deps.now?.() ?? Date.now()) };
163
+ // 保持 {claude, codex} 冻结契约不变。B2 多星新增 tcpProfiles(逐守护
164
+ // status-node*.json);tcp.node/tcp.broker 既有形状不动。
165
+ const nowMs = deps.now?.() ?? Date.now();
166
+ const tcp = deps.tcpDir === undefined ? {} : { tcp: tcpJson(deps.tcpDir, nowMs) };
167
+ const tcpProfiles = deps.tcpDir === undefined ? {} : { tcpProfiles: nodeProfilesJson(deps.tcpDir, nowMs) };
109
168
  return JSON.stringify({
110
169
  ...tcp,
170
+ ...tcpProfiles,
111
171
  claude: scan.sessions.map((session) => ({
112
172
  name: session.name ?? null,
113
173
  kind: session.kind,
@@ -183,8 +243,15 @@ function tcpJson(tcpDir, nowMs) {
183
243
  broker: brokerFresh ? { port: broker.port ?? null, onlineNodes: broker.onlineNodes ?? [] } : null,
184
244
  };
185
245
  }
186
- /** Locks whose thread id is not in the thread/list result (empty when listing failed). */
187
- function unlistedLocks(held, threads) {
246
+ /** B2:--json 的多守护小节——逐 status-node*.json(选择器 + 新鲜状态,陈旧为 null)。 */
247
+ function nodeProfilesJson(tcpDir, nowMs) {
248
+ return listNodeStatusFiles(tcpDir).map((file) => {
249
+ const st = readStatusJson(join(tcpDir, file));
250
+ const fresh = st !== undefined && nowMs - Date.parse(st.lastUpdated) < TCP_STATUS_FRESH_MS;
251
+ return { selector: nodeStatusSelector(file), status: fresh ? st : null };
252
+ });
253
+ }
254
+ /** Locks whose thread id is not in the thread/list result (empty when listing failed). */ function unlistedLocks(held, threads) {
188
255
  if (threads === undefined)
189
256
  return [];
190
257
  const listed = new Set(threads.map((thread) => thread.id));