@synap-core/cli 1.12.2 → 1.13.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.
- package/LICENSE +21 -0
- package/README.md +25 -8
- package/dist/build-info.json +2 -2
- package/dist/commands/agents.d.ts +0 -1
- package/dist/commands/agents.js +1 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/app.js +2 -1
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/automation.js +46 -41
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/box.d.ts +42 -0
- package/dist/commands/box.js +89 -0
- package/dist/commands/box.js.map +1 -0
- package/dist/commands/bridge-setup.js +3 -1
- package/dist/commands/bridge-setup.js.map +1 -1
- package/dist/commands/capability.d.ts +1 -1
- package/dist/commands/capability.js +57 -34
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/close-questions.d.ts +27 -0
- package/dist/commands/close-questions.js +49 -0
- package/dist/commands/close-questions.js.map +1 -0
- package/dist/commands/close-questions.test.d.ts +1 -0
- package/dist/commands/close-questions.test.js +52 -0
- package/dist/commands/close-questions.test.js.map +1 -0
- package/dist/commands/connect.d.ts +1 -3
- package/dist/commands/connect.js +2 -2
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/context.js +72 -43
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.js +12 -4
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.js +2 -1
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/doctor.d.ts +21 -0
- package/dist/commands/doctor.js +108 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/hooks.d.ts +19 -0
- package/dist/commands/hooks.js +70 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/import.d.ts +25 -0
- package/dist/commands/import.js +98 -12
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.js +59 -19
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.js +4 -2
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/lens.js +2 -1
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.js +1 -1
- package/dist/commands/market-authoring.js.map +1 -1
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/observe.category.test.d.ts +1 -0
- package/dist/commands/observe.category.test.js +59 -0
- package/dist/commands/observe.category.test.js.map +1 -0
- package/dist/commands/observe.d.ts +3 -0
- package/dist/commands/observe.js +7 -5
- package/dist/commands/observe.js.map +1 -1
- package/dist/commands/observe.title.test.d.ts +1 -0
- package/dist/commands/observe.title.test.js +37 -0
- package/dist/commands/observe.title.test.js.map +1 -0
- package/dist/commands/playbook.js +9 -0
- package/dist/commands/playbook.js.map +1 -1
- package/dist/commands/pods.d.ts +6 -1
- package/dist/commands/pods.js +32 -15
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proton-setup.js +3 -1
- package/dist/commands/proton-setup.js.map +1 -1
- package/dist/commands/session-feed-wait.d.ts +48 -0
- package/dist/commands/session-feed-wait.js +261 -0
- package/dist/commands/session-feed-wait.js.map +1 -0
- package/dist/commands/session-post.d.ts +40 -0
- package/dist/commands/session-post.js +96 -0
- package/dist/commands/session-post.js.map +1 -0
- package/dist/commands/session-wait.d.ts +9 -4
- package/dist/commands/session-wait.js +20 -5
- package/dist/commands/session-wait.js.map +1 -1
- package/dist/commands/sessions.d.ts +2 -0
- package/dist/commands/sessions.js +23 -0
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skills-commands.d.ts +2 -0
- package/dist/commands/skills-commands.js +9 -1
- package/dist/commands/skills-commands.js.map +1 -1
- package/dist/commands/skills-commands.test.d.ts +1 -0
- package/dist/commands/skills-commands.test.js +57 -0
- package/dist/commands/skills-commands.test.js.map +1 -0
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/template.d.ts +42 -0
- package/dist/commands/template.js +191 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/tracks.d.ts +67 -6
- package/dist/commands/tracks.js +268 -16
- package/dist/commands/tracks.js.map +1 -1
- package/dist/commands/whoami.d.ts +7 -0
- package/dist/commands/whoami.js +17 -0
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker-accounts.d.ts +149 -0
- package/dist/commands/worker-accounts.js +339 -0
- package/dist/commands/worker-accounts.js.map +1 -0
- package/dist/commands/worker-accounts.test.d.ts +1 -0
- package/dist/commands/worker-accounts.test.js +224 -0
- package/dist/commands/worker-accounts.test.js.map +1 -0
- package/dist/commands/worker.d.ts +219 -10
- package/dist/commands/worker.js +749 -117
- package/dist/commands/worker.js.map +1 -1
- package/dist/commands/worker.test.js +321 -10
- package/dist/commands/worker.test.js.map +1 -1
- package/dist/index.js +164 -27
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-door.d.ts +1 -3
- package/dist/lib/agent-door.js +10 -7
- package/dist/lib/agent-door.js.map +1 -1
- package/dist/lib/auth.d.ts +3 -2
- package/dist/lib/auth.js +3 -3
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/box/egress.d.ts +82 -0
- package/dist/lib/box/egress.js +264 -0
- package/dist/lib/box/egress.js.map +1 -0
- package/dist/lib/box/evidence.d.ts +86 -0
- package/dist/lib/box/evidence.js +121 -0
- package/dist/lib/box/evidence.js.map +1 -0
- package/dist/lib/box/job-server.d.ts +72 -0
- package/dist/lib/box/job-server.js +246 -0
- package/dist/lib/box/job-server.js.map +1 -0
- package/dist/lib/box/provisioner.d.ts +83 -0
- package/dist/lib/box/provisioner.js +312 -0
- package/dist/lib/box/provisioner.js.map +1 -0
- package/dist/lib/box/proxmox.d.ts +112 -0
- package/dist/lib/box/proxmox.js +211 -0
- package/dist/lib/box/proxmox.js.map +1 -0
- package/dist/lib/box/wire.d.ts +98 -0
- package/dist/lib/box/wire.js +70 -0
- package/dist/lib/box/wire.js.map +1 -0
- package/dist/lib/browser-auth.d.ts +35 -0
- package/dist/lib/browser-auth.js +170 -0
- package/dist/lib/browser-auth.js.map +1 -0
- package/dist/lib/client-header.test.d.ts +1 -0
- package/dist/lib/client-header.test.js +85 -0
- package/dist/lib/client-header.test.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +24 -9
- package/dist/lib/conversation-headers.js +40 -3
- package/dist/lib/conversation-headers.js.map +1 -1
- package/dist/lib/credential-class.d.ts +28 -1
- package/dist/lib/credential-class.js +28 -6
- package/dist/lib/credential-class.js.map +1 -1
- package/dist/lib/exporter-coverage.d.ts +1 -1
- package/dist/lib/exporter-coverage.js +1 -1
- package/dist/lib/goal-words.d.ts +38 -0
- package/dist/lib/goal-words.js +112 -0
- package/dist/lib/goal-words.js.map +1 -0
- package/dist/lib/hub-client.d.ts +28 -7
- package/dist/lib/hub-client.js +75 -34
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/init-handoff.d.ts +8 -0
- package/dist/lib/init-handoff.js +9 -2
- package/dist/lib/init-handoff.js.map +1 -1
- package/dist/lib/key-source.d.ts +3 -1
- package/dist/lib/key-source.js +7 -4
- package/dist/lib/key-source.js.map +1 -1
- package/dist/lib/knowledge-title.d.ts +3 -2
- package/dist/lib/knowledge-title.js +3 -2
- package/dist/lib/knowledge-title.js.map +1 -1
- package/dist/lib/mcp-bridge.d.ts +7 -0
- package/dist/lib/mcp-bridge.js +34 -1
- package/dist/lib/mcp-bridge.js.map +1 -1
- package/dist/lib/mcp-bridge.test.js +31 -3
- package/dist/lib/mcp-bridge.test.js.map +1 -1
- package/dist/lib/openclaw.d.ts +32 -0
- package/dist/lib/openclaw.js +165 -0
- package/dist/lib/openclaw.js.map +1 -0
- package/dist/lib/pod-moved.d.ts +70 -0
- package/dist/lib/pod-moved.js +146 -0
- package/dist/lib/pod-moved.js.map +1 -0
- package/dist/lib/pod-reach.d.ts +39 -0
- package/dist/lib/pod-reach.js +117 -0
- package/dist/lib/pod-reach.js.map +1 -0
- package/dist/lib/pod-reach.test.d.ts +1 -0
- package/dist/lib/pod-reach.test.js +67 -0
- package/dist/lib/pod-reach.test.js.map +1 -0
- package/dist/lib/pod.d.ts +8 -0
- package/dist/lib/pod.js +12 -3
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/register-claude-code-mcp.test.d.ts +1 -0
- package/dist/lib/register-claude-code-mcp.test.js +78 -0
- package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
- package/dist/lib/review-credential.js +3 -1
- package/dist/lib/review-credential.js.map +1 -1
- package/dist/lib/seed.d.ts +13 -0
- package/dist/lib/seed.js +135 -0
- package/dist/lib/seed.js.map +1 -0
- package/dist/lib/session-feed.d.ts +185 -0
- package/dist/lib/session-feed.js +257 -0
- package/dist/lib/session-feed.js.map +1 -0
- package/dist/lib/targets.d.ts +21 -3
- package/dist/lib/targets.js +52 -107
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/wake-hook-settings.d.ts +57 -0
- package/dist/lib/wake-hook-settings.js +153 -0
- package/dist/lib/wake-hook-settings.js.map +1 -0
- package/dist/lib/wake-state.d.ts +65 -0
- package/dist/lib/wake-state.js +122 -0
- package/dist/lib/wake-state.js.map +1 -0
- package/package.json +5 -2
- package/skills/README.md +1 -1
- package/skills/agent-os/SKILL.md +8 -8
- package/skills/synap/SKILL.md +141 -84
- package/skills/synap/code-skills.md +70 -0
- package/skills/synap/concepts.md +28 -20
- package/skills/synap/creative-loop.md +1 -1
- package/skills/synap/document-embeds.md +3 -1
- package/skills/synap/focus-sessions.md +16 -7
- package/skills/synap/from-intent.md +32 -16
- package/skills/synap/governance-rules.md +1 -1
- package/skills/synap/lenses.md +4 -4
- package/skills/synap/linking.md +2 -2
- package/skills/synap/mental-model.md +1 -1
- package/skills/synap/operating-mode-rules.md +1 -1
- package/skills/synap/quick-reference.md +2 -1
- package/skills/synap/reflexes.md +6 -6
- package/skills/synap/viewframe-cells.md +1 -1
- package/skills/synap/work-model.md +24 -10
- package/skills/synap/workspace-design.md +5 -5
- package/skills/synap/writes.md +16 -9
- package/skills/synap-app/SKILL.md +148 -66
- package/skills/synap-app/creating-the-base-app.md +12 -7
- package/skills/synap-app/governance.md +27 -16
- package/skills/synap-app/install-commands.md +18 -9
- package/skills/synap-app/overview.md +16 -9
- package/skills/synap-app/using-the-sdk.md +75 -25
- package/skills/synap-schema/SKILL.md +21 -21
- package/skills/synap-schema/intent-vocabulary-ssot.md +21 -21
- package/templates/box/runner.py +206 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap worker --accounts <file>`: which Claude account a run uses.
|
|
3
|
+
*
|
|
4
|
+
* The file (default ~/.config/synap-worker/accounts.json, owner-only) lists
|
|
5
|
+
* Claude Code setup-tokens in priority order:
|
|
6
|
+
*
|
|
7
|
+
* { "version": 1, "reserve": 2,
|
|
8
|
+
* "accounts": [ { "id": "dev", "label": "Dev", "token": "sk-ant-oat…", "design": true }, … ] }
|
|
9
|
+
*
|
|
10
|
+
* Before a launch every account is MEASURED with a 1-token request whose
|
|
11
|
+
* response headers carry the account's 5-hour and weekly use (the probe is
|
|
12
|
+
* ClaudeSwitch's, main.swift `probeOnce`). A probe that fails is UNMEASURED:
|
|
13
|
+
* it is never read as "has room" and never as "full".
|
|
14
|
+
*
|
|
15
|
+
* A token is a credential. It goes into the launched run's environment and
|
|
16
|
+
* into the probe's Authorization header — nowhere else: no state file, no run
|
|
17
|
+
* log, no line the worker prints. Everything else names an account by id.
|
|
18
|
+
*/
|
|
19
|
+
export interface AccountSpec {
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
token: string;
|
|
23
|
+
/** Design runs (the Artifact tool) publish from this account and no other. */
|
|
24
|
+
design?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface AccountsFile {
|
|
27
|
+
version: 1;
|
|
28
|
+
/** The non-design accounts with the most weekly room left stay unused, for the person. */
|
|
29
|
+
reserve: number;
|
|
30
|
+
accounts: AccountSpec[];
|
|
31
|
+
}
|
|
32
|
+
export declare function defaultAccountsFile(): string;
|
|
33
|
+
/**
|
|
34
|
+
* The accounts file, or `null` when the DEFAULT file does not exist (the
|
|
35
|
+
* worker then runs on the environment's token, as before). A file named with
|
|
36
|
+
* `--accounts` that is missing, or any file that does not parse or has the
|
|
37
|
+
* wrong shape, THROWS: a broken accounts file is never "no accounts".
|
|
38
|
+
* Error messages never quote a token.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadAccountsFile(file: string | undefined): AccountsFile | null;
|
|
41
|
+
/** True when the file can be read by anyone but its owner. */
|
|
42
|
+
export declare function accountsFileTooOpen(file: string): boolean;
|
|
43
|
+
/** One measurement, from the `anthropic-ratelimit-unified-*` headers. Percents; times in ms. */
|
|
44
|
+
export interface Meter {
|
|
45
|
+
fiveHour?: number;
|
|
46
|
+
fiveHourReset?: number;
|
|
47
|
+
week?: number;
|
|
48
|
+
weekReset?: number;
|
|
49
|
+
/** The server refused the request on the account's own limit. */
|
|
50
|
+
rejected: boolean;
|
|
51
|
+
reset?: number;
|
|
52
|
+
claim?: string;
|
|
53
|
+
checkedAt: number;
|
|
54
|
+
}
|
|
55
|
+
export type ProbeResult = {
|
|
56
|
+
kind: "measured";
|
|
57
|
+
meter: Meter;
|
|
58
|
+
} | {
|
|
59
|
+
kind: "unmeasured";
|
|
60
|
+
reason: string;
|
|
61
|
+
} | {
|
|
62
|
+
kind: "refused";
|
|
63
|
+
reason: string;
|
|
64
|
+
};
|
|
65
|
+
/** Tried in order when a model is retired, so the probe outlives any one model name. */
|
|
66
|
+
export declare const PROBE_MODELS: string[];
|
|
67
|
+
export declare function meterFromHeaders(h: Headers, now: number): Meter;
|
|
68
|
+
/** Measure one account: the first probe model that exists answers. */
|
|
69
|
+
export declare function probeAccount(token: string, opts?: {
|
|
70
|
+
fetchImpl?: typeof fetch;
|
|
71
|
+
models?: string[];
|
|
72
|
+
now?: () => number;
|
|
73
|
+
}): Promise<ProbeResult>;
|
|
74
|
+
/** An account counts as full once its 5-hour or weekly window reaches this percent. */
|
|
75
|
+
export declare const FULL_AT_PERCENT = 95;
|
|
76
|
+
/** A measurement is reused this long before the account is measured again. */
|
|
77
|
+
export declare const MEASURE_TTL_MS: number;
|
|
78
|
+
export type Standing = {
|
|
79
|
+
kind: "room";
|
|
80
|
+
meter: Meter;
|
|
81
|
+
} | {
|
|
82
|
+
kind: "full";
|
|
83
|
+
until: number;
|
|
84
|
+
meter?: Meter;
|
|
85
|
+
} | {
|
|
86
|
+
kind: "refused";
|
|
87
|
+
reason: string;
|
|
88
|
+
} | {
|
|
89
|
+
kind: "unmeasured";
|
|
90
|
+
reason: string;
|
|
91
|
+
};
|
|
92
|
+
export declare function isFull(m: Meter, threshold?: number): boolean;
|
|
93
|
+
/** When the window that makes it full resets; a quarter of an hour when the server gave no time. */
|
|
94
|
+
export declare function fullUntil(m: Meter, threshold?: number): number;
|
|
95
|
+
/**
|
|
96
|
+
* What one account can take now, from its last probe and any "full until"
|
|
97
|
+
* mark a run left on it (a run that ended on a usage limit). A full window
|
|
98
|
+
* whose reset has passed is UNMEASURED until it is measured again — never room.
|
|
99
|
+
*/
|
|
100
|
+
export declare function standingOf(probe: ProbeResult | undefined, markedFullUntil: number | undefined, now: number, threshold?: number): Standing;
|
|
101
|
+
/**
|
|
102
|
+
* The reserve: the `reserve` NON-design accounts with the most weekly room
|
|
103
|
+
* left — kept for the person's own morning. Only MEASURED accounts are ranked
|
|
104
|
+
* (an unmeasured one cannot be launched on anyway); a measured account whose
|
|
105
|
+
* weekly figure is missing ranks last. Ties go to file order.
|
|
106
|
+
*/
|
|
107
|
+
export declare function reserveIds(accounts: AccountSpec[], standings: Map<string, Standing>, reserve: number): Set<string>;
|
|
108
|
+
export interface Selection {
|
|
109
|
+
account?: AccountSpec;
|
|
110
|
+
/** Why nothing was picked (no token in it). */
|
|
111
|
+
reason?: string;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Pick the account a run launches on.
|
|
115
|
+
*
|
|
116
|
+
* - A DESIGN run: only an account flagged `design` (the artifact belongs to
|
|
117
|
+
* the publishing account). None with room ⇒ nothing: wait, never another one.
|
|
118
|
+
* - Any other run: leave out the reserve; among the rest with room, the one
|
|
119
|
+
* whose 5-hour window resets SOONEST (use it or lose it); ties → file order.
|
|
120
|
+
* A design account comes last: it is spent on other runs only when no other
|
|
121
|
+
* account has room, so its quota stays for the designs only it can publish.
|
|
122
|
+
* An unmeasured, refused or full account is never picked.
|
|
123
|
+
*/
|
|
124
|
+
export declare function selectAccount(file: AccountsFile, standings: Map<string, Standing>, opts: {
|
|
125
|
+
design: boolean;
|
|
126
|
+
}): Selection;
|
|
127
|
+
export declare function describeStanding(s: Standing | undefined): string;
|
|
128
|
+
/**
|
|
129
|
+
* The accounts plus what the worker knows about each: the last probe (reused
|
|
130
|
+
* for MEASURE_TTL_MS) and a "full until" mark left by a run that ended on a
|
|
131
|
+
* usage limit. In memory only: a restart measures again.
|
|
132
|
+
*/
|
|
133
|
+
export declare class AccountPool {
|
|
134
|
+
readonly file: AccountsFile;
|
|
135
|
+
private readonly probe;
|
|
136
|
+
private readonly now;
|
|
137
|
+
private probes;
|
|
138
|
+
private marks;
|
|
139
|
+
constructor(file: AccountsFile, probe: (token: string) => Promise<ProbeResult>, now?: () => number);
|
|
140
|
+
byId(id: string | undefined): AccountSpec | undefined;
|
|
141
|
+
/** Measure every account whose measurement is stale (in parallel), skipping marked-full ones. */
|
|
142
|
+
measure(): Promise<Map<string, Standing>>;
|
|
143
|
+
standings(): Map<string, Standing>;
|
|
144
|
+
/** A run on this account ended on a usage limit: full until then, measured afresh after. */
|
|
145
|
+
markFull(id: string, until: number): void;
|
|
146
|
+
select(opts: {
|
|
147
|
+
design: boolean;
|
|
148
|
+
}): Selection;
|
|
149
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap worker --accounts <file>`: which Claude account a run uses.
|
|
3
|
+
*
|
|
4
|
+
* The file (default ~/.config/synap-worker/accounts.json, owner-only) lists
|
|
5
|
+
* Claude Code setup-tokens in priority order:
|
|
6
|
+
*
|
|
7
|
+
* { "version": 1, "reserve": 2,
|
|
8
|
+
* "accounts": [ { "id": "dev", "label": "Dev", "token": "sk-ant-oat…", "design": true }, … ] }
|
|
9
|
+
*
|
|
10
|
+
* Before a launch every account is MEASURED with a 1-token request whose
|
|
11
|
+
* response headers carry the account's 5-hour and weekly use (the probe is
|
|
12
|
+
* ClaudeSwitch's, main.swift `probeOnce`). A probe that fails is UNMEASURED:
|
|
13
|
+
* it is never read as "has room" and never as "full".
|
|
14
|
+
*
|
|
15
|
+
* A token is a credential. It goes into the launched run's environment and
|
|
16
|
+
* into the probe's Authorization header — nowhere else: no state file, no run
|
|
17
|
+
* log, no line the worker prints. Everything else names an account by id.
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import os from "node:os";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
export function defaultAccountsFile() {
|
|
23
|
+
return path.join(os.homedir(), ".config", "synap-worker", "accounts.json");
|
|
24
|
+
}
|
|
25
|
+
const ID_RE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
26
|
+
/**
|
|
27
|
+
* The accounts file, or `null` when the DEFAULT file does not exist (the
|
|
28
|
+
* worker then runs on the environment's token, as before). A file named with
|
|
29
|
+
* `--accounts` that is missing, or any file that does not parse or has the
|
|
30
|
+
* wrong shape, THROWS: a broken accounts file is never "no accounts".
|
|
31
|
+
* Error messages never quote a token.
|
|
32
|
+
*/
|
|
33
|
+
export function loadAccountsFile(file) {
|
|
34
|
+
const explicit = file !== undefined;
|
|
35
|
+
const target = file ?? defaultAccountsFile();
|
|
36
|
+
if (!fs.existsSync(target)) {
|
|
37
|
+
if (explicit)
|
|
38
|
+
throw new Error(`accounts file ${target} does not exist`);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
let data;
|
|
42
|
+
try {
|
|
43
|
+
data = JSON.parse(fs.readFileSync(target, "utf8"));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new Error(`accounts file ${target} is not valid JSON`);
|
|
47
|
+
}
|
|
48
|
+
const bad = (why) => new Error(`accounts file ${target}: ${why}`);
|
|
49
|
+
if (!data || typeof data !== "object")
|
|
50
|
+
throw bad("not an object");
|
|
51
|
+
const d = data;
|
|
52
|
+
if (d.version !== 1)
|
|
53
|
+
throw bad(`version must be 1`);
|
|
54
|
+
const reserve = d.reserve === undefined ? 0 : d.reserve;
|
|
55
|
+
if (typeof reserve !== "number" || !Number.isInteger(reserve) || reserve < 0)
|
|
56
|
+
throw bad("reserve must be a whole number ≥ 0");
|
|
57
|
+
if (!Array.isArray(d.accounts) || d.accounts.length === 0)
|
|
58
|
+
throw bad("accounts must be a non-empty list");
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
const accounts = d.accounts.map((raw, i) => {
|
|
61
|
+
const a = (raw ?? {});
|
|
62
|
+
if (typeof a.id !== "string" || !ID_RE.test(a.id))
|
|
63
|
+
throw bad(`accounts[${i}].id must match ${ID_RE}`);
|
|
64
|
+
if (seen.has(a.id))
|
|
65
|
+
throw bad(`account id "${a.id}" appears twice`);
|
|
66
|
+
seen.add(a.id);
|
|
67
|
+
if (typeof a.token !== "string" || a.token.trim() === "")
|
|
68
|
+
throw bad(`account "${a.id}" has no token`);
|
|
69
|
+
return {
|
|
70
|
+
id: a.id,
|
|
71
|
+
label: typeof a.label === "string" && a.label.trim() ? a.label : a.id,
|
|
72
|
+
token: a.token.trim(),
|
|
73
|
+
...(a.design === true ? { design: true } : {}),
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
return { version: 1, reserve, accounts };
|
|
77
|
+
}
|
|
78
|
+
/** True when the file can be read by anyone but its owner. */
|
|
79
|
+
export function accountsFileTooOpen(file) {
|
|
80
|
+
try {
|
|
81
|
+
return (fs.statSync(file).mode & 0o077) !== 0;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Tried in order when a model is retired, so the probe outlives any one model name. */
|
|
88
|
+
export const PROBE_MODELS = ["claude-haiku-4-5", "claude-haiku-5-5", "claude-sonnet-5-5"];
|
|
89
|
+
export function meterFromHeaders(h, now) {
|
|
90
|
+
const get = (name) => h.get(`anthropic-ratelimit-unified-${name}`);
|
|
91
|
+
const num = (name) => {
|
|
92
|
+
const v = get(name);
|
|
93
|
+
if (v === null || v.trim() === "")
|
|
94
|
+
return undefined;
|
|
95
|
+
const n = Number(v);
|
|
96
|
+
return Number.isFinite(n) ? n : undefined;
|
|
97
|
+
};
|
|
98
|
+
// Utilization is a fraction of the window (0.15 = 15%) and can pass 1 when over.
|
|
99
|
+
const pct = (name) => {
|
|
100
|
+
const n = num(name);
|
|
101
|
+
return n === undefined ? undefined : n * 100;
|
|
102
|
+
};
|
|
103
|
+
const at = (name) => {
|
|
104
|
+
const n = num(name);
|
|
105
|
+
return n === undefined ? undefined : n * 1000;
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
fiveHour: pct("5h-utilization"),
|
|
109
|
+
fiveHourReset: at("5h-reset"),
|
|
110
|
+
week: pct("7d-utilization"),
|
|
111
|
+
weekReset: at("7d-reset"),
|
|
112
|
+
rejected: get("status") === "rejected",
|
|
113
|
+
reset: at("reset"),
|
|
114
|
+
claim: get("representative-claim") ?? undefined,
|
|
115
|
+
checkedAt: now,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async function probeOnce(token, model, fetchImpl, now) {
|
|
119
|
+
let res;
|
|
120
|
+
try {
|
|
121
|
+
res = await fetchImpl("https://api.anthropic.com/v1/messages", {
|
|
122
|
+
method: "POST",
|
|
123
|
+
headers: {
|
|
124
|
+
Authorization: `Bearer ${token}`,
|
|
125
|
+
"anthropic-version": "2023-06-01",
|
|
126
|
+
"anthropic-beta": "oauth-2025-04-20",
|
|
127
|
+
"content-type": "application/json",
|
|
128
|
+
},
|
|
129
|
+
body: JSON.stringify({ model, max_tokens: 1, messages: [{ role: "user", content: "ok" }] }),
|
|
130
|
+
signal: AbortSignal.timeout(15_000),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
return { result: { kind: "unmeasured", reason: `probe failed: ${err.name}` }, modelMissing: false };
|
|
135
|
+
}
|
|
136
|
+
let error;
|
|
137
|
+
try {
|
|
138
|
+
error = (await res.json())?.error;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
error = undefined;
|
|
142
|
+
}
|
|
143
|
+
const message = error?.message ?? `HTTP ${res.status}`;
|
|
144
|
+
const meter = meterFromHeaders(res.headers, now());
|
|
145
|
+
switch (res.status) {
|
|
146
|
+
case 200:
|
|
147
|
+
return { result: { kind: "measured", meter }, modelMissing: false };
|
|
148
|
+
case 429:
|
|
149
|
+
// Without status=rejected it is a short burst limit, not the account's quota.
|
|
150
|
+
return meter.rejected
|
|
151
|
+
? { result: { kind: "measured", meter }, modelMissing: false }
|
|
152
|
+
: { result: { kind: "unmeasured", reason: "briefly rate limited" }, modelMissing: false };
|
|
153
|
+
case 401:
|
|
154
|
+
case 403:
|
|
155
|
+
return { result: { kind: "refused", reason: message }, modelMissing: false };
|
|
156
|
+
case 400:
|
|
157
|
+
case 404: {
|
|
158
|
+
const modelMissing = error?.type === "not_found_error" || message.toLowerCase().includes("model");
|
|
159
|
+
return { result: { kind: "unmeasured", reason: modelMissing ? `model ${model} unavailable` : message }, modelMissing };
|
|
160
|
+
}
|
|
161
|
+
default:
|
|
162
|
+
return { result: { kind: "unmeasured", reason: message }, modelMissing: false };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** Measure one account: the first probe model that exists answers. */
|
|
166
|
+
export async function probeAccount(token, opts = {}) {
|
|
167
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
168
|
+
const now = opts.now ?? Date.now;
|
|
169
|
+
let last = { kind: "unmeasured", reason: "no probe model answered" };
|
|
170
|
+
for (const m of opts.models ?? PROBE_MODELS) {
|
|
171
|
+
const { result, modelMissing } = await probeOnce(token, m, fetchImpl, now);
|
|
172
|
+
if (!modelMissing)
|
|
173
|
+
return result;
|
|
174
|
+
last = result;
|
|
175
|
+
}
|
|
176
|
+
return last;
|
|
177
|
+
}
|
|
178
|
+
// ─── standing + selection ─────────────────────────────────────────────────────
|
|
179
|
+
/** An account counts as full once its 5-hour or weekly window reaches this percent. */
|
|
180
|
+
export const FULL_AT_PERCENT = 95;
|
|
181
|
+
/** A measurement is reused this long before the account is measured again. */
|
|
182
|
+
export const MEASURE_TTL_MS = 3 * 60_000;
|
|
183
|
+
export function isFull(m, threshold = FULL_AT_PERCENT) {
|
|
184
|
+
return m.rejected || (m.fiveHour ?? 0) >= threshold || (m.week ?? 0) >= threshold;
|
|
185
|
+
}
|
|
186
|
+
/** When the window that makes it full resets; a quarter of an hour when the server gave no time. */
|
|
187
|
+
export function fullUntil(m, threshold = FULL_AT_PERCENT) {
|
|
188
|
+
const dates = [];
|
|
189
|
+
if ((m.week ?? 0) >= threshold && m.weekReset)
|
|
190
|
+
dates.push(m.weekReset);
|
|
191
|
+
if ((m.fiveHour ?? 0) >= threshold && m.fiveHourReset)
|
|
192
|
+
dates.push(m.fiveHourReset);
|
|
193
|
+
if (!dates.length && m.rejected) {
|
|
194
|
+
const r = m.reset ?? m.fiveHourReset ?? m.weekReset;
|
|
195
|
+
if (r)
|
|
196
|
+
dates.push(r);
|
|
197
|
+
}
|
|
198
|
+
return dates.length ? Math.max(...dates) : m.checkedAt + 15 * 60_000;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* What one account can take now, from its last probe and any "full until"
|
|
202
|
+
* mark a run left on it (a run that ended on a usage limit). A full window
|
|
203
|
+
* whose reset has passed is UNMEASURED until it is measured again — never room.
|
|
204
|
+
*/
|
|
205
|
+
export function standingOf(probe, markedFullUntil, now, threshold = FULL_AT_PERCENT) {
|
|
206
|
+
if (markedFullUntil !== undefined && markedFullUntil > now) {
|
|
207
|
+
return { kind: "full", until: markedFullUntil, ...(probe?.kind === "measured" ? { meter: probe.meter } : {}) };
|
|
208
|
+
}
|
|
209
|
+
if (!probe)
|
|
210
|
+
return { kind: "unmeasured", reason: "not measured yet" };
|
|
211
|
+
if (probe.kind === "refused")
|
|
212
|
+
return { kind: "refused", reason: probe.reason };
|
|
213
|
+
if (probe.kind === "unmeasured")
|
|
214
|
+
return { kind: "unmeasured", reason: probe.reason };
|
|
215
|
+
const m = probe.meter;
|
|
216
|
+
if (isFull(m, threshold)) {
|
|
217
|
+
const until = fullUntil(m, threshold);
|
|
218
|
+
return until > now ? { kind: "full", until, meter: m } : { kind: "unmeasured", reason: "full window has reset; not measured since" };
|
|
219
|
+
}
|
|
220
|
+
return { kind: "room", meter: m };
|
|
221
|
+
}
|
|
222
|
+
/** Weekly room left in percent, when the account was measured. */
|
|
223
|
+
function weeklyLeft(s) {
|
|
224
|
+
const m = s.kind === "room" || s.kind === "full" ? s.meter : undefined;
|
|
225
|
+
if (!m || m.week === undefined)
|
|
226
|
+
return undefined;
|
|
227
|
+
return 100 - m.week;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* The reserve: the `reserve` NON-design accounts with the most weekly room
|
|
231
|
+
* left — kept for the person's own morning. Only MEASURED accounts are ranked
|
|
232
|
+
* (an unmeasured one cannot be launched on anyway); a measured account whose
|
|
233
|
+
* weekly figure is missing ranks last. Ties go to file order.
|
|
234
|
+
*/
|
|
235
|
+
export function reserveIds(accounts, standings, reserve) {
|
|
236
|
+
if (reserve <= 0)
|
|
237
|
+
return new Set();
|
|
238
|
+
const ranked = accounts
|
|
239
|
+
.map((a, order) => ({ a, order, s: standings.get(a.id) }))
|
|
240
|
+
.filter((x) => !x.a.design && x.s && (x.s.kind === "room" || x.s.kind === "full"))
|
|
241
|
+
.map((x) => ({ ...x, left: weeklyLeft(x.s) }))
|
|
242
|
+
.sort((x, y) => (y.left ?? -Infinity) - (x.left ?? -Infinity) || x.order - y.order);
|
|
243
|
+
return new Set(ranked.slice(0, reserve).map((x) => x.a.id));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Pick the account a run launches on.
|
|
247
|
+
*
|
|
248
|
+
* - A DESIGN run: only an account flagged `design` (the artifact belongs to
|
|
249
|
+
* the publishing account). None with room ⇒ nothing: wait, never another one.
|
|
250
|
+
* - Any other run: leave out the reserve; among the rest with room, the one
|
|
251
|
+
* whose 5-hour window resets SOONEST (use it or lose it); ties → file order.
|
|
252
|
+
* A design account comes last: it is spent on other runs only when no other
|
|
253
|
+
* account has room, so its quota stays for the designs only it can publish.
|
|
254
|
+
* An unmeasured, refused or full account is never picked.
|
|
255
|
+
*/
|
|
256
|
+
export function selectAccount(file, standings, opts) {
|
|
257
|
+
const pool = opts.design
|
|
258
|
+
? file.accounts.filter((a) => a.design)
|
|
259
|
+
: (() => {
|
|
260
|
+
const reserved = reserveIds(file.accounts, standings, file.reserve);
|
|
261
|
+
return file.accounts.filter((a) => !reserved.has(a.id));
|
|
262
|
+
})();
|
|
263
|
+
if (opts.design && pool.length === 0)
|
|
264
|
+
return { reason: "no account is flagged design:true" };
|
|
265
|
+
const withRoom = pool
|
|
266
|
+
.map((a, order) => ({ a, order, s: standings.get(a.id) }))
|
|
267
|
+
.filter((x) => x.s?.kind === "room");
|
|
268
|
+
if (!withRoom.length) {
|
|
269
|
+
const why = pool.map((a) => `${a.id}: ${describeStanding(standings.get(a.id))}`).join(", ");
|
|
270
|
+
return { reason: `no ${opts.design ? "design " : ""}account with room (${why || "all reserved"})` };
|
|
271
|
+
}
|
|
272
|
+
withRoom.sort((x, y) => (opts.design ? 0 : Number(!!x.a.design) - Number(!!y.a.design)) ||
|
|
273
|
+
(x.s.meter.fiveHourReset ?? Infinity) - (y.s.meter.fiveHourReset ?? Infinity) ||
|
|
274
|
+
x.order - y.order);
|
|
275
|
+
return { account: withRoom[0].a };
|
|
276
|
+
}
|
|
277
|
+
export function describeStanding(s) {
|
|
278
|
+
if (!s)
|
|
279
|
+
return "not measured";
|
|
280
|
+
switch (s.kind) {
|
|
281
|
+
case "room":
|
|
282
|
+
return `room (5h ${Math.round(s.meter.fiveHour ?? 0)}%, 7d ${Math.round(s.meter.week ?? 0)}%)`;
|
|
283
|
+
case "full":
|
|
284
|
+
return `full until ${new Date(s.until).toISOString()}`;
|
|
285
|
+
case "refused":
|
|
286
|
+
return "token refused";
|
|
287
|
+
case "unmeasured":
|
|
288
|
+
return `unmeasured (${s.reason})`;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// ─── the pool: cache + marks ──────────────────────────────────────────────────
|
|
292
|
+
/**
|
|
293
|
+
* The accounts plus what the worker knows about each: the last probe (reused
|
|
294
|
+
* for MEASURE_TTL_MS) and a "full until" mark left by a run that ended on a
|
|
295
|
+
* usage limit. In memory only: a restart measures again.
|
|
296
|
+
*/
|
|
297
|
+
export class AccountPool {
|
|
298
|
+
file;
|
|
299
|
+
probe;
|
|
300
|
+
now;
|
|
301
|
+
probes = new Map();
|
|
302
|
+
marks = new Map();
|
|
303
|
+
constructor(file, probe, now = Date.now) {
|
|
304
|
+
this.file = file;
|
|
305
|
+
this.probe = probe;
|
|
306
|
+
this.now = now;
|
|
307
|
+
}
|
|
308
|
+
byId(id) {
|
|
309
|
+
return id ? this.file.accounts.find((a) => a.id === id) : undefined;
|
|
310
|
+
}
|
|
311
|
+
/** Measure every account whose measurement is stale (in parallel), skipping marked-full ones. */
|
|
312
|
+
async measure() {
|
|
313
|
+
const t = this.now();
|
|
314
|
+
await Promise.all(this.file.accounts.map(async (a) => {
|
|
315
|
+
const mark = this.marks.get(a.id);
|
|
316
|
+
if (mark !== undefined && mark > t)
|
|
317
|
+
return;
|
|
318
|
+
const last = this.probes.get(a.id);
|
|
319
|
+
const fresh = last?.kind === "measured" && t - last.meter.checkedAt < MEASURE_TTL_MS && !(isFull(last.meter) && fullUntil(last.meter) <= t);
|
|
320
|
+
if (fresh)
|
|
321
|
+
return;
|
|
322
|
+
this.probes.set(a.id, await this.probe(a.token));
|
|
323
|
+
}));
|
|
324
|
+
return this.standings();
|
|
325
|
+
}
|
|
326
|
+
standings() {
|
|
327
|
+
const t = this.now();
|
|
328
|
+
return new Map(this.file.accounts.map((a) => [a.id, standingOf(this.probes.get(a.id), this.marks.get(a.id), t)]));
|
|
329
|
+
}
|
|
330
|
+
/** A run on this account ended on a usage limit: full until then, measured afresh after. */
|
|
331
|
+
markFull(id, until) {
|
|
332
|
+
this.marks.set(id, until);
|
|
333
|
+
this.probes.delete(id);
|
|
334
|
+
}
|
|
335
|
+
select(opts) {
|
|
336
|
+
return selectAccount(this.file, this.standings(), opts);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=worker-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-accounts.js","sourceRoot":"","sources":["../../src/commands/worker-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAiB7B,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAwB;IACvD,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,IAAI,mBAAmB,EAAE,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,iBAAiB,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,oBAAoB,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,iBAAiB,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,MAAM,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAC9H,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAe,EAAE;QACtD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;QACjD,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,GAAG,CAAC,YAAY,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;QACtG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACtG,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;YACrB,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAsBD,wFAAwF;AACxF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;AAE1F,MAAM,UAAU,gBAAgB,CAAC,CAAU,EAAE,GAAW;IACtD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,CAAC,CAAC;IACF,iFAAiF;IACjF,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC;QAC/B,aAAa,EAAE,EAAE,CAAC,UAAU,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC,gBAAgB,CAAC;QAC3B,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC;QACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,UAAU;QACtC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC;QAClB,KAAK,EAAE,GAAG,CAAC,sBAAsB,CAAC,IAAI,SAAS;QAC/C,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,KAAa,EACb,SAAuB,EACvB,GAAiB;IAEjB,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,uCAAuC,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,mBAAmB,EAAE,YAAY;gBACjC,gBAAgB,EAAE,kBAAkB;gBACpC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3F,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAkB,GAAa,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACjH,CAAC;IACD,IAAI,KAAsD,CAAC;IAC3D,IAAI,CAAC;QACH,KAAK,GAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqD,EAAE,KAAK,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,GAAG;YACN,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACtE,KAAK,GAAG;YACN,8EAA8E;YAC9E,OAAO,KAAK,CAAC,QAAQ;gBACnB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;gBAC9D,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,sBAAsB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC9F,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACN,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC/E,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,MAAM,YAAY,GAAG,KAAK,EAAE,IAAI,KAAK,iBAAiB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClG,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC;QACzH,CAAC;QACD;YACE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACpF,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,OAA4E,EAAE;IAE9E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,IAAI,IAAI,GAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAClF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC3E,IAAI,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC;QACjC,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AAEjF,uFAAuF;AACvF,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC;AAQzC,MAAM,UAAU,MAAM,CAAC,CAAQ,EAAE,SAAS,GAAG,eAAe;IAC1D,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC;AACpF,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,SAAS,CAAC,CAAQ,EAAE,SAAS,GAAG,eAAe;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvE,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,CAAC;QACpD,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,KAA8B,EAC9B,eAAmC,EACnC,GAAW,EACX,SAAS,GAAG,eAAe;IAE3B,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACtE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/E,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACrF,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACtB,IAAI,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;IACvI,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,kEAAkE;AAClE,SAAS,UAAU,CAAC,CAAW;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,QAAuB,EAAE,SAAgC,EAAE,OAAe;IACnG,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;SACjF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAa,CAAC,EAAE,CAAC,CAAC;SACzD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACtF,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAkB,EAClB,SAAgC,EAChC,IAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;QACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACvC,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,CAAC;IACT,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC7F,MAAM,QAAQ,GAAG,IAAI;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzD,MAAM,CAAC,CAAC,CAAC,EAAkF,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;IACvH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,sBAAsB,GAAG,IAAI,cAAc,GAAG,EAAE,CAAC;IACtG,CAAC;IACD,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC;QAC7E,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CACpB,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAuB;IACtD,IAAI,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC;IAC9B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;QACjG,KAAK,MAAM;YACT,OAAO,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACzD,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC;QACzB,KAAK,YAAY;YACf,OAAO,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC;IACtC,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAKX;IACQ;IACA;IANX,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IACxC,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,YACW,IAAkB,EACV,KAA8C,EAC9C,MAAoB,IAAI,CAAC,GAAG;QAFpC,SAAI,GAAJ,IAAI,CAAc;QACV,UAAK,GAAL,KAAK,CAAyC;QAC9C,QAAG,GAAH,GAAG,CAAyB;IAC5C,CAAC;IAEJ,IAAI,CAAC,EAAsB;QACzB,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IAED,iGAAiG;IACjG,KAAK,CAAC,OAAO;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC;gBAAE,OAAO;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,KAAK,GACT,IAAI,EAAE,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,cAAc,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAChI,IAAI,KAAK;gBAAE,OAAO;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CACH,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED,SAAS;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC;IAED,4FAA4F;IAC5F,QAAQ,CAAC,EAAU,EAAE,KAAa;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAyB;QAC9B,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|