@songsid/agend 2.1.1-beta.2 → 2.1.1-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/README.zh-TW.md +1 -0
- package/dist/access-path.js +15 -6
- package/dist/access-path.js.map +1 -1
- package/dist/agent-cli-instructions.md +9 -0
- package/dist/backend/antigravity.d.ts +4 -1
- package/dist/backend/antigravity.js +24 -13
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +37 -0
- package/dist/backend/claude-code.js +47 -8
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.d.ts +17 -0
- package/dist/backend/codex.js +279 -62
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/gemini-cli.js +4 -7
- package/dist/backend/gemini-cli.js.map +1 -1
- package/dist/backend/grok.d.ts +24 -0
- package/dist/backend/grok.js +57 -8
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +27 -0
- package/dist/backend/kiro.js +96 -15
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/opencode.js +4 -7
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/types.d.ts +44 -0
- package/dist/backend/types.js +3 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +15 -0
- package/dist/channel/adapters/discord.js +94 -6
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +21 -0
- package/dist/channel/adapters/telegram.js +132 -15
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +17 -1
- package/dist/channel/ipc-bridge.js +53 -17
- package/dist/channel/ipc-bridge.js.map +1 -1
- package/dist/channel/ipc-timeouts.d.ts +40 -0
- package/dist/channel/ipc-timeouts.js +58 -0
- package/dist/channel/ipc-timeouts.js.map +1 -0
- package/dist/channel/mcp-server.js +30 -14
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.js +28 -1
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-queue.d.ts +1 -0
- package/dist/channel/message-queue.js +49 -17
- package/dist/channel/message-queue.js.map +1 -1
- package/dist/channel/reconnect-backoff.d.ts +17 -0
- package/dist/channel/reconnect-backoff.js +21 -0
- package/dist/channel/reconnect-backoff.js.map +1 -0
- package/dist/channel/types.d.ts +29 -0
- package/dist/classic-channel-manager.js +1 -5
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +148 -60
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +27 -0
- package/dist/completion.js +121 -0
- package/dist/completion.js.map +1 -0
- package/dist/config-validator.js +27 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/cost-guard.d.ts +3 -1
- package/dist/cost-guard.js +3 -1
- package/dist/cost-guard.js.map +1 -1
- package/dist/daemon.d.ts +230 -13
- package/dist/daemon.js +975 -335
- package/dist/daemon.js.map +1 -1
- package/dist/event-log.d.ts +31 -0
- package/dist/event-log.js +96 -0
- package/dist/event-log.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -0
- package/dist/fleet-manager.d.ts +209 -4
- package/dist/fleet-manager.js +813 -84
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +22 -0
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +14 -23
- package/dist/general-knowledge/skills/session-management/SKILL.md +15 -34
- package/dist/hang-detector.d.ts +19 -13
- package/dist/hang-detector.js +19 -49
- package/dist/hang-detector.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +21 -1
- package/dist/instance-lifecycle.js +141 -7
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +5 -0
- package/dist/instructions.js +10 -5
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +3 -0
- package/dist/locale.js.map +1 -1
- package/dist/logger.js +14 -0
- package/dist/logger.js.map +1 -1
- package/dist/mcp-liveness.d.ts +21 -0
- package/dist/mcp-liveness.js +27 -0
- package/dist/mcp-liveness.js.map +1 -0
- package/dist/outbound-handlers.d.ts +16 -0
- package/dist/outbound-handlers.js +121 -27
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +7 -2
- package/dist/outbound-schemas.js +13 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-write-lock.d.ts +48 -0
- package/dist/pane-write-lock.js +73 -0
- package/dist/pane-write-lock.js.map +1 -0
- package/dist/process-memory.d.ts +31 -0
- package/dist/process-memory.js +79 -0
- package/dist/process-memory.js.map +1 -0
- package/dist/quickstart.js +17 -16
- package/dist/quickstart.js.map +1 -1
- package/dist/scheduler/db.js +3 -0
- package/dist/scheduler/db.js.map +1 -1
- package/dist/sd-notify.d.ts +45 -0
- package/dist/sd-notify.js +74 -3
- package/dist/sd-notify.js.map +1 -1
- package/dist/secret-file.d.ts +33 -0
- package/dist/secret-file.js +36 -0
- package/dist/secret-file.js.map +1 -0
- package/dist/setup-wizard.js +9 -7
- package/dist/setup-wizard.js.map +1 -1
- package/dist/tmux-control.d.ts +58 -5
- package/dist/tmux-control.js +107 -13
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +47 -2
- package/dist/tmux-manager.js +103 -8
- package/dist/tmux-manager.js.map +1 -1
- package/dist/topic-commands.d.ts +43 -1
- package/dist/topic-commands.js +196 -66
- package/dist/topic-commands.js.map +1 -1
- package/dist/tui-glyphs.d.ts +25 -0
- package/dist/tui-glyphs.js +26 -0
- package/dist/tui-glyphs.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/ui/view.html +291 -33
- package/dist/update-check.d.ts +22 -0
- package/dist/update-check.js +44 -0
- package/dist/update-check.js.map +1 -0
- package/dist/usage/providers.d.ts +50 -0
- package/dist/usage/providers.js +611 -0
- package/dist/usage/providers.js.map +1 -0
- package/dist/usage/usage-api.d.ts +50 -0
- package/dist/usage/usage-api.js +111 -0
- package/dist/usage/usage-api.js.map +1 -0
- package/dist/view-api.d.ts +10 -0
- package/dist/view-api.js +67 -14
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.js +5 -2
- package/dist/web-api.js.map +1 -1
- package/package.json +4 -1
- package/templates/systemd.service.ejs +9 -1
- package/dist/channel/tool-tracker.d.ts +0 -13
- package/dist/channel/tool-tracker.js +0 -58
- package/dist/channel/tool-tracker.js.map +0 -1
- package/dist/daemon-entry.d.ts +0 -1
- package/dist/daemon-entry.js +0 -30
- package/dist/daemon-entry.js.map +0 -1
- package/dist/fleet-system-prompt.d.ts +0 -11
- package/dist/fleet-system-prompt.js +0 -61
- package/dist/fleet-system-prompt.js.map +0 -1
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI subscription usage providers — read the credentials the CLI backends
|
|
3
|
+
* already saved on this machine and fetch live plan usage from each vendor's
|
|
4
|
+
* own usage endpoint. Powers `GET /api/ai-usage` (usage-api.ts) and the
|
|
5
|
+
* Usage panel on /view.
|
|
6
|
+
*
|
|
7
|
+
* Vendored from ai-usage-board (https://github.com/songsid/ai-usage-board, MIT),
|
|
8
|
+
* whose provider protocol logic is in turn ported from OpenUsage
|
|
9
|
+
* (https://github.com/robinebers/openusage, MIT, © Robin Ebers). See LICENSE.md
|
|
10
|
+
* in this directory. Not affiliated with or endorsed by OpenUsage.
|
|
11
|
+
*
|
|
12
|
+
* Token policy:
|
|
13
|
+
* - Claude/Codex: read-only, never refreshed — those vendors rotate refresh
|
|
14
|
+
* tokens, and refreshing behind the CLI's back could invalidate its login.
|
|
15
|
+
* Their credential files stay fresh as long as the CLIs are used (which, in
|
|
16
|
+
* a running fleet, they are).
|
|
17
|
+
* - Grok: access tokens expire within hours, so we refresh exactly like the
|
|
18
|
+
* Grok CLI does and persist rotated tokens back to auth.json — refusing to
|
|
19
|
+
* refresh at all when the file isn't writable, rather than risk the login.
|
|
20
|
+
*/
|
|
21
|
+
import { readFile, writeFile, access, constants } from "node:fs/promises";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { homedir } from "node:os";
|
|
24
|
+
import Database from "better-sqlite3";
|
|
25
|
+
const WEEK_MS = 7 * 24 * 60 * 60 * 1000;
|
|
26
|
+
const SESSION_MS = 5 * 60 * 60 * 1000;
|
|
27
|
+
function jwtExpiryMs(token) {
|
|
28
|
+
try {
|
|
29
|
+
const payload = JSON.parse(Buffer.from(token.split(".")[1], "base64url").toString("utf8"));
|
|
30
|
+
return typeof payload.exp === "number" ? payload.exp * 1000 : null;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// ── Claude ───────────────────────────────────────────────────────────────────
|
|
37
|
+
const CLAUDE_USAGE_URL = "https://api.anthropic.com/api/oauth/usage";
|
|
38
|
+
function claudeResetIso(value) {
|
|
39
|
+
if (typeof value === "string" && value.trim()) {
|
|
40
|
+
const d = new Date(value);
|
|
41
|
+
if (!Number.isNaN(d.getTime()))
|
|
42
|
+
return d.toISOString();
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
45
|
+
const ms = Math.abs(value) < 1e10 ? value * 1000 : value;
|
|
46
|
+
return new Date(ms).toISOString();
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
async function fetchClaudeUsage() {
|
|
51
|
+
const home = process.env.CLAUDE_HOME || join(homedir(), ".claude");
|
|
52
|
+
let oauth;
|
|
53
|
+
try {
|
|
54
|
+
oauth = JSON.parse(await readFile(join(home, ".credentials.json"), "utf8")).claudeAiOauth;
|
|
55
|
+
if (!oauth?.accessToken)
|
|
56
|
+
throw new Error("no token");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { status: "no-credentials", hint: "Log in with the Claude Code CLI (`claude`).", metrics: [] };
|
|
60
|
+
}
|
|
61
|
+
let plan = null;
|
|
62
|
+
if (oauth.subscriptionType?.trim()) {
|
|
63
|
+
plan = oauth.subscriptionType.trim().replace(/^./, c => c.toUpperCase());
|
|
64
|
+
const tier = oauth.rateLimitTier?.match(/\d+x/);
|
|
65
|
+
if (tier)
|
|
66
|
+
plan += ` ${tier[0]}`;
|
|
67
|
+
}
|
|
68
|
+
if (oauth.expiresAt && oauth.expiresAt < Date.now()) {
|
|
69
|
+
return { status: "error", plan, error: "Access token expired. Run `claude` once to refresh it.", metrics: [] };
|
|
70
|
+
}
|
|
71
|
+
let res;
|
|
72
|
+
try {
|
|
73
|
+
res = await fetch(CLAUDE_USAGE_URL, {
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: `Bearer ${oauth.accessToken.trim()}`,
|
|
76
|
+
Accept: "application/json",
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
"anthropic-beta": "oauth-2025-04-20",
|
|
79
|
+
"User-Agent": "claude-code/2.1.69",
|
|
80
|
+
},
|
|
81
|
+
signal: AbortSignal.timeout(10_000),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return { status: "error", plan, error: "Could not reach api.anthropic.com.", metrics: [] };
|
|
86
|
+
}
|
|
87
|
+
if (res.status === 401 || res.status === 403) {
|
|
88
|
+
return { status: "error", plan, error: "Token rejected. Run `claude` once to refresh the login.", metrics: [] };
|
|
89
|
+
}
|
|
90
|
+
if (res.status === 429) {
|
|
91
|
+
return { status: "error", plan, error: "Rate limited by Anthropic — try again later.", metrics: [] };
|
|
92
|
+
}
|
|
93
|
+
if (!res.ok)
|
|
94
|
+
return { status: "error", plan, error: `Usage request failed (HTTP ${res.status}).`, metrics: [] };
|
|
95
|
+
let body;
|
|
96
|
+
try {
|
|
97
|
+
body = await res.json();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return { status: "error", plan, error: "Invalid response from usage endpoint.", metrics: [] };
|
|
101
|
+
}
|
|
102
|
+
const metrics = [];
|
|
103
|
+
const window = (obj, label, windowMs) => {
|
|
104
|
+
const o = obj;
|
|
105
|
+
if (typeof o?.utilization !== "number")
|
|
106
|
+
return;
|
|
107
|
+
metrics.push({ label, type: "percent", used: o.utilization, resetsAt: claudeResetIso(o.resets_at), windowMs });
|
|
108
|
+
};
|
|
109
|
+
window(body.five_hour, "Session", SESSION_MS);
|
|
110
|
+
window(body.seven_day, "Weekly", WEEK_MS);
|
|
111
|
+
window(body.seven_day_sonnet, "Sonnet (weekly)", WEEK_MS);
|
|
112
|
+
// Per-model weekly windows live in the `limits` array (kind: weekly_scoped).
|
|
113
|
+
for (const entry of Array.isArray(body.limits) ? body.limits : []) {
|
|
114
|
+
const e = entry;
|
|
115
|
+
if (e?.kind !== "weekly_scoped")
|
|
116
|
+
continue;
|
|
117
|
+
const model = e.scope?.model?.display_name;
|
|
118
|
+
if (!model || typeof e.percent !== "number")
|
|
119
|
+
continue;
|
|
120
|
+
metrics.push({ label: `${model} (weekly)`, type: "percent", used: e.percent, resetsAt: claudeResetIso(e.resets_at), windowMs: WEEK_MS });
|
|
121
|
+
}
|
|
122
|
+
const extra = body.extra_usage;
|
|
123
|
+
if (extra?.is_enabled === true && typeof extra.used_credits === "number") {
|
|
124
|
+
const used = extra.used_credits / 100;
|
|
125
|
+
const limit = typeof extra.monthly_limit === "number" && extra.monthly_limit > 0 ? extra.monthly_limit / 100 : null;
|
|
126
|
+
if (limit)
|
|
127
|
+
metrics.push({ label: "Extra usage", type: "dollars", used, limit });
|
|
128
|
+
else if (used > 0)
|
|
129
|
+
metrics.push({ label: "Extra usage", type: "dollars", used });
|
|
130
|
+
}
|
|
131
|
+
return { status: "ok", plan, metrics };
|
|
132
|
+
}
|
|
133
|
+
// ── Codex ────────────────────────────────────────────────────────────────────
|
|
134
|
+
const CODEX_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
|
|
135
|
+
const CREDIT_USD_RATE = 0.04;
|
|
136
|
+
function codexResetIso(win, nowMs) {
|
|
137
|
+
if (typeof win.reset_at === "number" && Number.isFinite(win.reset_at))
|
|
138
|
+
return new Date(win.reset_at * 1000).toISOString();
|
|
139
|
+
if (typeof win.reset_after_seconds === "number" && Number.isFinite(win.reset_after_seconds)) {
|
|
140
|
+
return new Date(nowMs + win.reset_after_seconds * 1000).toISOString();
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
// Codex normally puts the 5-hour window in primary and weekly in secondary, but
|
|
145
|
+
// a window's own limit_window_seconds wins when present. Some plans (e.g. Team)
|
|
146
|
+
// report a monthly window — label by actual duration, never by slot.
|
|
147
|
+
function codexWindows(rateLimit, labels, nowMs) {
|
|
148
|
+
const candidates = [
|
|
149
|
+
{ win: rateLimit?.primary_window, fallback: "session" },
|
|
150
|
+
{ win: rateLimit?.secondary_window, fallback: "weekly" },
|
|
151
|
+
].filter(c => c.win && typeof c.win === "object");
|
|
152
|
+
const metrics = [];
|
|
153
|
+
for (const { win, fallback } of candidates) {
|
|
154
|
+
if (!win || typeof win.used_percent !== "number")
|
|
155
|
+
continue;
|
|
156
|
+
const explicitMs = typeof win.limit_window_seconds === "number" && Number.isFinite(win.limit_window_seconds)
|
|
157
|
+
? win.limit_window_seconds * 1000 : null;
|
|
158
|
+
const windowMs = explicitMs ?? (fallback === "session" ? SESSION_MS : WEEK_MS);
|
|
159
|
+
let label;
|
|
160
|
+
if (windowMs === SESSION_MS)
|
|
161
|
+
label = labels.session;
|
|
162
|
+
else if (windowMs === WEEK_MS)
|
|
163
|
+
label = labels.weekly;
|
|
164
|
+
else if (windowMs >= 27 * 864e5 && windowMs <= 32 * 864e5)
|
|
165
|
+
label = labels.monthly;
|
|
166
|
+
else if (explicitMs)
|
|
167
|
+
label = labels.other(Math.round(windowMs / 864e5));
|
|
168
|
+
else
|
|
169
|
+
label = fallback === "session" ? labels.session : labels.weekly;
|
|
170
|
+
metrics.push({ label, type: "percent", used: win.used_percent, resetsAt: codexResetIso(win, nowMs), windowMs });
|
|
171
|
+
}
|
|
172
|
+
return metrics;
|
|
173
|
+
}
|
|
174
|
+
function codexPlan(planType) {
|
|
175
|
+
if (typeof planType !== "string" || !planType.trim())
|
|
176
|
+
return null;
|
|
177
|
+
switch (planType.trim().toLowerCase()) {
|
|
178
|
+
case "prolite": return "Pro 5x";
|
|
179
|
+
case "pro": return "Pro 20x";
|
|
180
|
+
default: return planType.trim().split("_").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function fetchCodexUsage() {
|
|
184
|
+
const home = process.env.CODEX_HOME || join(homedir(), ".codex");
|
|
185
|
+
let auth;
|
|
186
|
+
try {
|
|
187
|
+
auth = JSON.parse(await readFile(join(home, "auth.json"), "utf8"));
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return { status: "no-credentials", hint: "Log in with the Codex CLI (`codex`).", metrics: [] };
|
|
191
|
+
}
|
|
192
|
+
const accessToken = auth?.tokens?.access_token;
|
|
193
|
+
if (!accessToken) {
|
|
194
|
+
return { status: "no-credentials", hint: "auth.json has no OAuth login (API-key-only auth cannot read usage).", metrics: [] };
|
|
195
|
+
}
|
|
196
|
+
const exp = jwtExpiryMs(accessToken);
|
|
197
|
+
if (exp && exp < Date.now()) {
|
|
198
|
+
return { status: "error", error: "Access token expired. Run `codex` once to refresh it.", metrics: [] };
|
|
199
|
+
}
|
|
200
|
+
const headers = {
|
|
201
|
+
Authorization: `Bearer ${accessToken}`,
|
|
202
|
+
Accept: "application/json",
|
|
203
|
+
"User-Agent": "agend-usage",
|
|
204
|
+
};
|
|
205
|
+
if (auth.tokens?.account_id)
|
|
206
|
+
headers["ChatGPT-Account-Id"] = auth.tokens.account_id;
|
|
207
|
+
let res;
|
|
208
|
+
try {
|
|
209
|
+
res = await fetch(CODEX_USAGE_URL, { headers, signal: AbortSignal.timeout(10_000) });
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return { status: "error", error: "Could not reach chatgpt.com.", metrics: [] };
|
|
213
|
+
}
|
|
214
|
+
if (res.status === 401 || res.status === 403) {
|
|
215
|
+
return { status: "error", error: "Token rejected. Run `codex` once to refresh the login.", metrics: [] };
|
|
216
|
+
}
|
|
217
|
+
if (!res.ok)
|
|
218
|
+
return { status: "error", error: `Usage request failed (HTTP ${res.status}).`, metrics: [] };
|
|
219
|
+
let body;
|
|
220
|
+
try {
|
|
221
|
+
body = await res.json();
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return { status: "error", error: "Invalid response from usage endpoint.", metrics: [] };
|
|
225
|
+
}
|
|
226
|
+
const nowMs = Date.now();
|
|
227
|
+
const metrics = codexWindows(body.rate_limit, {
|
|
228
|
+
session: "Session", weekly: "Weekly", monthly: "Monthly", other: d => `${d}-day window`,
|
|
229
|
+
}, nowMs);
|
|
230
|
+
// Model-specific limits (e.g. Spark) ride in additional_rate_limits, same window shape.
|
|
231
|
+
for (const entry of Array.isArray(body.additional_rate_limits) ? body.additional_rate_limits : []) {
|
|
232
|
+
const e = entry;
|
|
233
|
+
if (!e || typeof e !== "object" || !e.rate_limit)
|
|
234
|
+
continue;
|
|
235
|
+
const rawName = e.limit_name || e.metered_feature || "Model limit";
|
|
236
|
+
metrics.push(...codexWindows(e.rate_limit, {
|
|
237
|
+
session: rawName, weekly: `${rawName} (weekly)`, monthly: `${rawName} (monthly)`, other: d => `${rawName} (${d}d)`,
|
|
238
|
+
}, nowMs));
|
|
239
|
+
}
|
|
240
|
+
const resets = body.rate_limit_reset_credits;
|
|
241
|
+
if (typeof resets?.available_count === "number" && resets.available_count >= 0) {
|
|
242
|
+
metrics.push({ label: "Rate limit resets", type: "count", value: Math.floor(resets.available_count), unit: "available" });
|
|
243
|
+
}
|
|
244
|
+
const credits = body.credits;
|
|
245
|
+
let remaining = null;
|
|
246
|
+
if (typeof credits?.balance === "number")
|
|
247
|
+
remaining = credits.balance;
|
|
248
|
+
else if (credits?.has_credits === false)
|
|
249
|
+
remaining = 0;
|
|
250
|
+
if (remaining !== null) {
|
|
251
|
+
const count = Math.max(0, Math.floor(remaining));
|
|
252
|
+
metrics.push({ label: "Credits", type: "count", value: count, unit: "credits", note: `≈ $${(count * CREDIT_USD_RATE).toFixed(2)}` });
|
|
253
|
+
}
|
|
254
|
+
return { status: "ok", plan: codexPlan(body.plan_type), metrics };
|
|
255
|
+
}
|
|
256
|
+
// ── Grok ─────────────────────────────────────────────────────────────────────
|
|
257
|
+
const GROK_CREDITS_URL = "https://cli-chat-proxy.grok.com/v1/billing?format=credits";
|
|
258
|
+
const GROK_SETTINGS_URL = "https://cli-chat-proxy.grok.com/v1/settings";
|
|
259
|
+
const GROK_REFRESH_URL = "https://auth.x.ai/oauth2/token";
|
|
260
|
+
const GROK_DEFAULT_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
|
|
261
|
+
const GROK_WEEKLY_PERIOD = "USAGE_PERIOD_TYPE_WEEKLY";
|
|
262
|
+
const GROK_REFRESH_BUFFER_MS = 5 * 60 * 1000;
|
|
263
|
+
function grokEntryExpiryMs(entry, token) {
|
|
264
|
+
const fromJwt = jwtExpiryMs(token);
|
|
265
|
+
if (fromJwt)
|
|
266
|
+
return fromJwt;
|
|
267
|
+
const raw = entry.expires_at || entry.expires;
|
|
268
|
+
if (typeof raw === "string") {
|
|
269
|
+
const ms = new Date(raw).getTime();
|
|
270
|
+
if (!Number.isNaN(ms))
|
|
271
|
+
return ms;
|
|
272
|
+
}
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
async function grokRefreshAndPersist(file, auth, entryKey, entry) {
|
|
276
|
+
// Refuse to refresh unless the rotated tokens can be written back — a rotated
|
|
277
|
+
// refresh token that only lives in our memory would break `grok` itself.
|
|
278
|
+
try {
|
|
279
|
+
await access(file, constants.W_OK);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return { error: "Token expired and auth.json is read-only. Run `grok` once to refresh it." };
|
|
283
|
+
}
|
|
284
|
+
const refreshToken = (entry.refresh_token || entry.refresh || "").trim();
|
|
285
|
+
if (!refreshToken)
|
|
286
|
+
return { error: "Token expired and no refresh token found. Run `grok login`." };
|
|
287
|
+
const clientId = entry.oidc_client_id?.trim()
|
|
288
|
+
|| entryKey.split("::").pop()?.trim()
|
|
289
|
+
|| GROK_DEFAULT_CLIENT_ID;
|
|
290
|
+
let res;
|
|
291
|
+
try {
|
|
292
|
+
res = await fetch(GROK_REFRESH_URL, {
|
|
293
|
+
method: "POST",
|
|
294
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
295
|
+
body: new URLSearchParams({ grant_type: "refresh_token", client_id: clientId, refresh_token: refreshToken }),
|
|
296
|
+
signal: AbortSignal.timeout(15_000),
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return { error: "Could not reach auth.x.ai to refresh the token." };
|
|
301
|
+
}
|
|
302
|
+
if (!res.ok)
|
|
303
|
+
return { error: "Grok session expired. Run `grok login` again." };
|
|
304
|
+
let body;
|
|
305
|
+
try {
|
|
306
|
+
body = await res.json();
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return { error: "Invalid refresh response from auth.x.ai." };
|
|
310
|
+
}
|
|
311
|
+
if (!body.access_token)
|
|
312
|
+
return { error: "Grok session expired. Run `grok login` again." };
|
|
313
|
+
// Update only this entry's fields, preserving everything else in the file
|
|
314
|
+
// (other accounts' entries included).
|
|
315
|
+
const updated = { ...(auth[entryKey] ?? {}) };
|
|
316
|
+
updated.key = body.access_token;
|
|
317
|
+
if (body.refresh_token)
|
|
318
|
+
updated.refresh_token = body.refresh_token;
|
|
319
|
+
if (body.id_token)
|
|
320
|
+
updated.id_token = body.id_token;
|
|
321
|
+
if (typeof body.expires_in === "number")
|
|
322
|
+
updated.expires_at = new Date(Date.now() + body.expires_in * 1000).toISOString();
|
|
323
|
+
try {
|
|
324
|
+
await writeFile(file, JSON.stringify({ ...auth, [entryKey]: updated }, null, 2));
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
return { error: "Refreshed but could not write auth.json — refusing to continue without persisting. Run `grok` once instead." };
|
|
328
|
+
}
|
|
329
|
+
return { token: body.access_token };
|
|
330
|
+
}
|
|
331
|
+
function grokHeaders(token) {
|
|
332
|
+
return {
|
|
333
|
+
Authorization: `Bearer ${token.trim()}`,
|
|
334
|
+
"X-XAI-Token-Auth": "xai-grok-cli",
|
|
335
|
+
Accept: "application/json",
|
|
336
|
+
"User-Agent": "agend-usage",
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
async function fetchGrokUsage() {
|
|
340
|
+
const home = process.env.GROK_HOME || join(homedir(), ".grok");
|
|
341
|
+
const file = join(home, "auth.json");
|
|
342
|
+
let auth;
|
|
343
|
+
try {
|
|
344
|
+
auth = JSON.parse(await readFile(file, "utf8"));
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return { status: "no-credentials", hint: "Log in with the Grok CLI (`grok login`).", metrics: [] };
|
|
348
|
+
}
|
|
349
|
+
const entries = Object.entries(auth).filter(([, e]) => typeof e?.key === "string" && e.key.trim());
|
|
350
|
+
if (!entries.length)
|
|
351
|
+
return { status: "no-credentials", hint: "auth.json has no usable login. Run `grok login`.", metrics: [] };
|
|
352
|
+
const [entryKey, entry] = entries[0];
|
|
353
|
+
let token = entry.key.trim();
|
|
354
|
+
const expiry = grokEntryExpiryMs(entry, token);
|
|
355
|
+
if (expiry && expiry - Date.now() <= GROK_REFRESH_BUFFER_MS) {
|
|
356
|
+
const refreshed = await grokRefreshAndPersist(file, auth, entryKey, entry);
|
|
357
|
+
if (refreshed.error)
|
|
358
|
+
return { status: "error", error: refreshed.error, metrics: [] };
|
|
359
|
+
token = refreshed.token;
|
|
360
|
+
}
|
|
361
|
+
const fetchBoth = async (tok) => {
|
|
362
|
+
const [credits, settings] = await Promise.all([
|
|
363
|
+
fetch(GROK_CREDITS_URL, { headers: grokHeaders(tok), signal: AbortSignal.timeout(10_000) }),
|
|
364
|
+
fetch(GROK_SETTINGS_URL, { headers: grokHeaders(tok), signal: AbortSignal.timeout(10_000) }).catch(() => null),
|
|
365
|
+
]);
|
|
366
|
+
return { credits, settings };
|
|
367
|
+
};
|
|
368
|
+
let credits, settings;
|
|
369
|
+
try {
|
|
370
|
+
({ credits, settings } = await fetchBoth(token));
|
|
371
|
+
if (credits.status === 401 || credits.status === 403) {
|
|
372
|
+
const refreshed = await grokRefreshAndPersist(file, auth, entryKey, entry);
|
|
373
|
+
if (refreshed.error)
|
|
374
|
+
return { status: "error", error: refreshed.error, metrics: [] };
|
|
375
|
+
token = refreshed.token;
|
|
376
|
+
({ credits, settings } = await fetchBoth(token));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return { status: "error", error: "Could not reach cli-chat-proxy.grok.com.", metrics: [] };
|
|
381
|
+
}
|
|
382
|
+
if (credits.status === 401 || credits.status === 403) {
|
|
383
|
+
return { status: "error", error: "Grok session expired. Run `grok login` again.", metrics: [] };
|
|
384
|
+
}
|
|
385
|
+
if (!credits.ok)
|
|
386
|
+
return { status: "error", error: `Billing request failed (HTTP ${credits.status}).`, metrics: [] };
|
|
387
|
+
let body;
|
|
388
|
+
try {
|
|
389
|
+
body = await credits.json();
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
return { status: "error", error: "Invalid response from billing endpoint.", metrics: [] };
|
|
393
|
+
}
|
|
394
|
+
const config = body?.config;
|
|
395
|
+
const period = config?.currentPeriod;
|
|
396
|
+
if (!config || !period?.type)
|
|
397
|
+
return { status: "error", error: "Grok billing response changed.", metrics: [] };
|
|
398
|
+
const metrics = [];
|
|
399
|
+
if (period.type === GROK_WEEKLY_PERIOD) {
|
|
400
|
+
// proto-JSON drops zero-valued fields: an absent creditUsagePercent means 0%.
|
|
401
|
+
const pct = typeof config.creditUsagePercent === "number" ? config.creditUsagePercent : 0;
|
|
402
|
+
const start = new Date(period.start ?? "").getTime();
|
|
403
|
+
const end = new Date(period.end ?? "").getTime();
|
|
404
|
+
metrics.push({
|
|
405
|
+
label: "Weekly limit",
|
|
406
|
+
type: "percent",
|
|
407
|
+
used: Math.min(100, Math.max(0, pct)),
|
|
408
|
+
resetsAt: Number.isNaN(end) ? null : new Date(end).toISOString(),
|
|
409
|
+
windowMs: Number.isNaN(end - start) ? null : end - start,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
const cap = typeof config.onDemandCap?.val === "number" ? config.onDemandCap.val : 0;
|
|
413
|
+
metrics.push({ label: "Pay as you go", type: "text", value: cap > 0 ? `${cap} cap` : "Disabled" });
|
|
414
|
+
let plan = null;
|
|
415
|
+
if (settings?.ok) {
|
|
416
|
+
try {
|
|
417
|
+
const s = await settings.json();
|
|
418
|
+
if (typeof s.subscription_tier_display === "string" && s.subscription_tier_display.trim()) {
|
|
419
|
+
plan = s.subscription_tier_display.trim();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
catch { /* plan is optional */ }
|
|
423
|
+
}
|
|
424
|
+
return { status: "ok", plan, metrics };
|
|
425
|
+
}
|
|
426
|
+
// ── Kiro (Amazon Q Developer) ────────────────────────────────────────────────
|
|
427
|
+
// Original research, no OpenUsage upstream: the Kiro CLI stores its login in
|
|
428
|
+
// data.sqlite3 `auth_kv` (social or Identity Center token) and usage rides on
|
|
429
|
+
// the CodeWhisperer GetUsageLimits API — the exact call the CLI itself makes.
|
|
430
|
+
// Read-only: the CLI refreshes its own tokens.
|
|
431
|
+
const KIRO_TARGET = "AmazonCodeWhispererService.GetUsageLimits";
|
|
432
|
+
export function kiroAuthKind(token) {
|
|
433
|
+
return typeof token.start_url === "string" && token.start_url.trim().length > 0
|
|
434
|
+
? "q-developer-pro"
|
|
435
|
+
: "builder-id";
|
|
436
|
+
}
|
|
437
|
+
function readKiroToken() {
|
|
438
|
+
const home = process.env.KIRO_CLI_HOME || join(homedir(), ".local", "share", "kiro-cli");
|
|
439
|
+
let db;
|
|
440
|
+
try {
|
|
441
|
+
db = new Database(join(home, "data.sqlite3"), { readonly: true, fileMustExist: true });
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
return { missing: true };
|
|
445
|
+
}
|
|
446
|
+
try {
|
|
447
|
+
const rows = db.prepare("SELECT key, value FROM auth_kv WHERE key IN ('kirocli:social:token','codewhisperer:odic:token')").all();
|
|
448
|
+
const byKey = Object.fromEntries(rows.map(r => [r.key, r.value]));
|
|
449
|
+
const parse = (raw) => {
|
|
450
|
+
if (!raw)
|
|
451
|
+
return null;
|
|
452
|
+
try {
|
|
453
|
+
const t = JSON.parse(raw);
|
|
454
|
+
return t.access_token ? t : null;
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
const candidates = [parse(byKey["kirocli:social:token"]), parse(byKey["codewhisperer:odic:token"])]
|
|
461
|
+
.filter((t) => t !== null);
|
|
462
|
+
if (candidates.length === 0)
|
|
463
|
+
return { missing: true };
|
|
464
|
+
// Switching login type leaves the old token behind, so "first key wins"
|
|
465
|
+
// could report a stale account. Prefer a token that has not expired, then
|
|
466
|
+
// the one that expires latest.
|
|
467
|
+
const expiry = (t) => (t.expires_at ? new Date(t.expires_at).getTime() : 0);
|
|
468
|
+
const now = Date.now();
|
|
469
|
+
const live = candidates.filter(t => expiry(t) > now);
|
|
470
|
+
const token = (live.length ? live : candidates).sort((a, b) => expiry(b) - expiry(a))[0];
|
|
471
|
+
return { token, kind: kiroAuthKind(token) };
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
return { missing: true };
|
|
475
|
+
}
|
|
476
|
+
finally {
|
|
477
|
+
try {
|
|
478
|
+
db.close();
|
|
479
|
+
}
|
|
480
|
+
catch { /* best-effort */ }
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
function kiroTitleCase(s) {
|
|
484
|
+
return s.toLowerCase().replace(/(^|\s)\S/g, c => c.toUpperCase());
|
|
485
|
+
}
|
|
486
|
+
function kiroEpochIso(sec) {
|
|
487
|
+
return typeof sec === "number" && Number.isFinite(sec) && sec > 0
|
|
488
|
+
? new Date(sec * 1000).toISOString()
|
|
489
|
+
: null;
|
|
490
|
+
}
|
|
491
|
+
/** Exported for tests: the Q-Pro and expired paths return without any network call. */
|
|
492
|
+
export async function fetchKiroUsage() {
|
|
493
|
+
const { token, kind, missing } = readKiroToken();
|
|
494
|
+
if (missing || !token) {
|
|
495
|
+
return { status: "no-credentials", hint: "Log in with the Kiro CLI (`kiro-cli`).", metrics: [] };
|
|
496
|
+
}
|
|
497
|
+
const expiresAt = token.expires_at ? new Date(token.expires_at).getTime() : null;
|
|
498
|
+
if (expiresAt && expiresAt < Date.now()) {
|
|
499
|
+
// Not an error state: kiro-cli refreshes its own login on next use, and the
|
|
500
|
+
// panel showing a red failure for a routine token rollover is just noise.
|
|
501
|
+
return { status: "no-credentials", hint: "Sign-in needed — run `kiro-cli` once and it refreshes itself.", metrics: [] };
|
|
502
|
+
}
|
|
503
|
+
if (kind === "q-developer-pro") {
|
|
504
|
+
// Seat-licensed subscription: GetUsageLimits describes Builder-ID credit
|
|
505
|
+
// buckets, not this, so there is nothing to meter and no call to make.
|
|
506
|
+
return {
|
|
507
|
+
status: "ok",
|
|
508
|
+
plan: "Q Developer Pro",
|
|
509
|
+
hint: "Subscription — no credit usage to report.",
|
|
510
|
+
metrics: [],
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
const region = token.region
|
|
514
|
+
|| (typeof token.profile_arn === "string" ? token.profile_arn.split(":")[3] : "")
|
|
515
|
+
|| "us-east-1";
|
|
516
|
+
let res;
|
|
517
|
+
try {
|
|
518
|
+
res = await fetch(`https://codewhisperer.${region}.amazonaws.com/`, {
|
|
519
|
+
method: "POST",
|
|
520
|
+
headers: {
|
|
521
|
+
"Content-Type": "application/x-amz-json-1.0",
|
|
522
|
+
"X-Amz-Target": KIRO_TARGET,
|
|
523
|
+
Authorization: `Bearer ${token.access_token}`,
|
|
524
|
+
},
|
|
525
|
+
body: JSON.stringify(token.profile_arn ? { profileArn: token.profile_arn } : {}),
|
|
526
|
+
signal: AbortSignal.timeout(15_000),
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
catch {
|
|
530
|
+
return { status: "error", error: `Could not reach codewhisperer.${region}.amazonaws.com.`, metrics: [] };
|
|
531
|
+
}
|
|
532
|
+
if (res.status === 401 || res.status === 403) {
|
|
533
|
+
return { status: "error", error: "Token rejected. Use `kiro-cli` once to refresh the login.", metrics: [] };
|
|
534
|
+
}
|
|
535
|
+
if (!res.ok)
|
|
536
|
+
return { status: "error", error: `Usage request failed (HTTP ${res.status}).`, metrics: [] };
|
|
537
|
+
let body;
|
|
538
|
+
try {
|
|
539
|
+
body = await res.json();
|
|
540
|
+
}
|
|
541
|
+
catch {
|
|
542
|
+
return { status: "error", error: "Invalid response from GetUsageLimits.", metrics: [] };
|
|
543
|
+
}
|
|
544
|
+
const plan = typeof body.subscriptionInfo?.subscriptionTitle === "string"
|
|
545
|
+
? kiroTitleCase(body.subscriptionInfo.subscriptionTitle)
|
|
546
|
+
: null;
|
|
547
|
+
const metrics = [];
|
|
548
|
+
for (const ub of Array.isArray(body.usageBreakdownList) ? body.usageBreakdownList : []) {
|
|
549
|
+
const unit = (ub.displayNamePlural || ub.displayName || "credits").toLowerCase();
|
|
550
|
+
const used = ub.currentUsageWithPrecision ?? ub.currentUsage ?? null;
|
|
551
|
+
const limit = ub.usageLimitWithPrecision ?? ub.usageLimit ?? null;
|
|
552
|
+
if (used !== null && limit !== null && limit > 0) {
|
|
553
|
+
metrics.push({
|
|
554
|
+
label: `${ub.displayNamePlural || ub.displayName || "Usage"} (monthly)`,
|
|
555
|
+
type: "percent",
|
|
556
|
+
used: Math.min(100, (used / limit) * 100),
|
|
557
|
+
resetsAt: kiroEpochIso(ub.nextDateReset ?? body.nextDateReset),
|
|
558
|
+
note: `${+used.toFixed(1)} / ${+limit.toFixed(0)} ${unit}`,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
// Bonus / gift credits (redeemed promo codes), aggregated across active codes.
|
|
562
|
+
const bonuses = (ub.bonuses ?? []).filter(b => b?.status === "ACTIVE");
|
|
563
|
+
if (bonuses.length) {
|
|
564
|
+
const bUsed = bonuses.reduce((s, b) => s + (b.currentUsage ?? 0), 0);
|
|
565
|
+
const bLimit = bonuses.reduce((s, b) => s + (b.usageLimit ?? 0), 0);
|
|
566
|
+
const expiries = bonuses.map(b => b.expiresAt).filter((e) => typeof e === "number" && e > 0);
|
|
567
|
+
if (bLimit > 0) {
|
|
568
|
+
metrics.push({
|
|
569
|
+
label: "Bonus credits",
|
|
570
|
+
type: "percent",
|
|
571
|
+
used: Math.min(100, (bUsed / bLimit) * 100),
|
|
572
|
+
resetsAt: expiries.length ? kiroEpochIso(Math.min(...expiries)) : null,
|
|
573
|
+
note: `${+bUsed.toFixed(1)} / ${+bLimit.toFixed(0)} ${unit} · ${bonuses.length} codes`,
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
const overages = ub.currentOveragesWithPrecision ?? ub.currentOverages ?? 0;
|
|
578
|
+
if (overages > 0 && typeof ub.overageCharges === "number") {
|
|
579
|
+
metrics.push({ label: "Overage charges", type: "dollars", used: ub.overageCharges });
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
const overageStatus = body.overageConfiguration?.overageStatus;
|
|
583
|
+
if (typeof overageStatus === "string") {
|
|
584
|
+
metrics.push({ label: "Pay-per-use", type: "text", value: kiroTitleCase(overageStatus.replace(/_/g, " ")) });
|
|
585
|
+
}
|
|
586
|
+
return { status: "ok", plan, metrics };
|
|
587
|
+
}
|
|
588
|
+
// ── Registry ─────────────────────────────────────────────────────────────────
|
|
589
|
+
const PROVIDERS = [
|
|
590
|
+
{ id: "claude", name: "Claude", fetch: fetchClaudeUsage },
|
|
591
|
+
{ id: "codex", name: "Codex", fetch: fetchCodexUsage },
|
|
592
|
+
{ id: "grok", name: "Grok", fetch: fetchGrokUsage },
|
|
593
|
+
{ id: "kiro", name: "Kiro", fetch: fetchKiroUsage },
|
|
594
|
+
];
|
|
595
|
+
/** Fetch every provider in parallel. Providers without local credentials are
|
|
596
|
+
* skipped (per the panel's contract: absent CLIs simply don't show). */
|
|
597
|
+
export async function fetchAllUsage() {
|
|
598
|
+
const results = await Promise.all(PROVIDERS.map(async (p) => {
|
|
599
|
+
try {
|
|
600
|
+
return { id: p.id, name: p.name, ...(await p.fetch()) };
|
|
601
|
+
}
|
|
602
|
+
catch (err) {
|
|
603
|
+
return { id: p.id, name: p.name, status: "error", error: String(err?.message ?? err), metrics: [] };
|
|
604
|
+
}
|
|
605
|
+
}));
|
|
606
|
+
return {
|
|
607
|
+
fetchedAt: new Date().toISOString(),
|
|
608
|
+
providers: results.filter(r => r.status !== "no-credentials"),
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/usage/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAwBtC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACxC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3F,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AAErE,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACzD,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnE,IAAI,KAAsG,CAAC;IAC3G,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;QAC1F,IAAI,CAAC,KAAK,EAAE,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,6CAA6C,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxG,CAAC;IAED,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,wDAAwD,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjH,CAAC;IAED,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAClC,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;gBACnD,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,kBAAkB;gBACpC,YAAY,EAAE,oBAAoB;aACnC;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,oCAAoC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,yDAAyD,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAClH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,8CAA8C,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACvG,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,8BAA8B,GAAG,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEhH,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uCAAuC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAChG,CAAC;IAED,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,GAAY,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;QAC/D,MAAM,CAAC,GAAG,GAAiE,CAAC;QAC5E,IAAI,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ;YAAE,OAAO;QAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjH,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAE1D,6EAA6E;IAC7E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClE,MAAM,CAAC,GAAG,KAAiH,CAAC;QAC5H,IAAI,CAAC,EAAE,IAAI,KAAK,eAAe;YAAE,SAAS;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;QAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3I,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAoG,CAAC;IACxH,IAAI,KAAK,EAAE,UAAU,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACzE,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACpH,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;aAC3E,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,gFAAgF;AAEhF,MAAM,eAAe,GAAG,4CAA4C,CAAC;AACrE,MAAM,eAAe,GAAG,IAAI,CAAC;AAI7B,SAAS,aAAa,CAAC,GAAgB,EAAE,KAAa;IACpD,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1H,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,qEAAqE;AACrE,SAAS,YAAY,CACnB,SAA+E,EAC/E,MAA6F,EAC7F,KAAa;IAEb,MAAM,UAAU,GAAG;QACjB,EAAE,GAAG,EAAE,SAAS,EAAE,cAAyC,EAAE,QAAQ,EAAE,SAAkB,EAAE;QAC3F,EAAE,GAAG,EAAE,SAAS,EAAE,gBAA2C,EAAE,QAAQ,EAAE,QAAiB,EAAE;KAC7F,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;IAElD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;YAAE,SAAS;QAC3D,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,oBAAoB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC;YAC1G,CAAC,CAAC,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/E,IAAI,KAAa,CAAC;QAClB,IAAI,QAAQ,KAAK,UAAU;YAAE,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;aAC/C,IAAI,QAAQ,KAAK,OAAO;YAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;aAChD,IAAI,QAAQ,IAAI,EAAE,GAAG,KAAK,IAAI,QAAQ,IAAI,EAAE,GAAG,KAAK;YAAE,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;aAC7E,IAAI,UAAU;YAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;;YACnE,KAAK,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,QAAiB;IAClC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAClE,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACtC,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,SAAS,CAAC;QAC7B,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,IAAiE,CAAC;IACtE,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,sCAAsC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjG,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;IAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,qEAAqE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAChI,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,uDAAuD,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1G,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,MAAM,EAAE,kBAAkB;QAC1B,YAAY,EAAE,aAAa;KAC5B,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU;QAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAEpF,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjF,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,wDAAwD,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,GAAG,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE1G,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,uCAAuC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAmB,EAAE;QACrD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa;KACxF,EAAE,KAAK,CAAC,CAAC;IAEV,wFAAwF;IACxF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClG,MAAM,CAAC,GAAG,KAAgF,CAAC;QAC3F,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,UAAU;YAAE,SAAS;QAC3D,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,eAAe,IAAI,aAAa,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,UAAmB,EAAE;YAClD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI;SACnH,EAAE,KAAK,CAAC,CAAC,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAqE,CAAC;IAC1F,IAAI,OAAO,MAAM,EAAE,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAmE,CAAC;IACzF,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ;QAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;SACjE,IAAI,OAAO,EAAE,WAAW,KAAK,KAAK;QAAE,SAAS,GAAG,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvI,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC;AAED,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,2DAA2D,CAAC;AACrF,MAAM,iBAAiB,GAAG,6CAA6C,CAAC;AACxE,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;AAC1D,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AACtE,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AACtD,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAY7C,SAAS,iBAAiB,CAAC,KAAoB,EAAE,KAAa;IAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,IAAY,EACZ,IAAmC,EACnC,QAAgB,EAChB,KAAoB;IAEpB,8EAA8E;IAC9E,yEAAyE;IACzE,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACjD,OAAO,EAAE,KAAK,EAAE,0EAA0E,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC;IAEnG,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE;WACxC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE;WAClC,sBAAsB,CAAC;IAE5B,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;YAC5G,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IAE/E,IAAI,IAA+F,CAAC;IACpG,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAiB,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IAE1F,0EAA0E;IAC1E,sCAAsC;IACtC,MAAM,OAAO,GAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7D,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;IAChC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpD,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1H,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,6GAA6G,EAAE,CAAC;IAClI,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO;QACL,aAAa,EAAE,UAAU,KAAK,CAAC,IAAI,EAAE,EAAE;QACvC,kBAAkB,EAAE,cAAc;QAClC,MAAM,EAAE,kBAAkB;QAC1B,YAAY,EAAE,aAAa;KAC5B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrC,IAAI,IAAmC,CAAC;IACxC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,0CAA0C,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnG,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,kDAAkD,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEhI,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,KAAK,GAAI,KAAK,CAAC,GAAc,CAAC,IAAI,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,sBAAsB,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3E,IAAI,SAAS,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACrF,KAAK,GAAG,SAAS,CAAC,KAAe,CAAC;IACpC,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;QACtC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5C,KAAK,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3F,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAC/G,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC,CAAC;IAEF,IAAI,OAAiB,EAAE,QAAyB,CAAC;IACjD,IAAI,CAAC;QACH,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3E,IAAI,SAAS,CAAC,KAAK;gBAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACrF,KAAK,GAAG,SAAS,CAAC,KAAe,CAAC;YAClC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,0CAA0C,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAClG,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gCAAgC,OAAO,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEpH,IAAI,IAAqJ,CAAC;IAC1J,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAiB,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,EAAE,aAAa,CAAC;IACrC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE/G,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACvC,8EAA8E;QAC9E,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACrC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YAChE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK;SACzD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,WAAW,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnG,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4C,CAAC;YAC1E,IAAI,OAAO,CAAC,CAAC,yBAAyB,KAAK,QAAQ,IAAI,CAAC,CAAC,yBAAyB,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1F,IAAI,GAAG,CAAC,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,+CAA+C;AAE/C,MAAM,WAAW,GAAG,2CAA2C,CAAC;AAwBhE,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC7E,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,YAAY,CAAC;AACnB,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACzF,IAAI,EAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iGAAiG,CAAC,CAAC,GAAG,EAAsC,CAAC;QACrK,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,CAAC,GAAY,EAAoB,EAAE;YAC/C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;gBACvC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;QAC1B,CAAC,CAAC;QACF,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;aAChG,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,wEAAwE;QACxE,0EAA0E;QAC1E,+BAA+B;QAC/B,MAAM,MAAM,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;QAC/D,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IACjD,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,wCAAwC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnG,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACxC,4EAA4E;QAC5E,0EAA0E;QAC1E,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,+DAA+D,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1H,CAAC;IACD,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,yEAAyE;QACzE,uEAAuE;QACvE,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,2CAA2C;YACjD,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;WACtB,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;WAC9E,WAAW,CAAC;IAEjB,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,yBAAyB,MAAM,iBAAiB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,4BAA4B;gBAC5C,cAAc,EAAE,WAAW;gBAC3B,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE;aAC9C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,MAAM,iBAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3G,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,2DAA2D,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9G,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,GAAG,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAU1G,IAAI,IAKH,CAAC;IACF,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAiB,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,uCAAuC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,KAAK,QAAQ;QACvE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;QACxD,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACvF,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,EAAE,CAAC,yBAAyB,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC;QACrE,MAAM,KAAK,GAAG,EAAE,CAAC,uBAAuB,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,CAAC;QAClE,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,GAAG,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,WAAW,IAAI,OAAO,YAAY;gBACvE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;gBACzC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;gBAC9D,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,+EAA+E;QAC/E,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1G,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;oBAC3C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;oBACtE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,QAAQ;iBACvF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,4BAA4B,IAAI,EAAE,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5E,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC;IAC/D,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,gFAAgF;AAEhF,MAAM,SAAS,GAA6F;IAC1G,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACzD,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE;IACtD,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE;IACnD,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE;CACpD,CAAC;AAEF;wEACwE;AACxE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAA0B,EAAE;QAClF,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAE,GAAa,EAAE,OAAO,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjH,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC;KAC9D,CAAC;AACJ,CAAC"}
|