@sharpe-terminal/mcp-server 1.6.1 → 1.7.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/README.md +4 -4
- package/dist/api-client.d.ts +2 -5
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +8 -18
- package/dist/api-client.js.map +1 -1
- package/dist/contracts/manifest.d.ts.map +1 -1
- package/dist/contracts/manifest.js +1 -1
- package/dist/contracts/manifest.js.map +1 -1
- package/dist/server.d.ts +9 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +33 -8
- package/dist/server.js.map +1 -1
- package/dist/tool-runtime.d.ts +1 -12
- package/dist/tool-runtime.d.ts.map +1 -1
- package/dist/tool-runtime.js +1 -18
- package/dist/tool-runtime.js.map +1 -1
- package/package.json +1 -1
- package/dist/composite-tools.d.ts +0 -60
- package/dist/composite-tools.d.ts.map +0 -1
- package/dist/composite-tools.js +0 -595
- package/dist/composite-tools.js.map +0 -1
package/dist/composite-tools.js
DELETED
|
@@ -1,595 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composite tools that call several API endpoints concurrently and return
|
|
3
|
-
* formatted markdown. Mirrors the Python server's analyze_coin,
|
|
4
|
-
* market_briefing and find_opportunities line for line.
|
|
5
|
-
*
|
|
6
|
-
* Every number a composite prints is a field the API serves, the value the web
|
|
7
|
-
* page and /api/v1 give for the same request (engine L4 WP-D14): the
|
|
8
|
-
* rankings, floors, averages and APRs are request parameters and response
|
|
9
|
-
* fields, never recomputed here. A report ends with the freshness of every
|
|
10
|
-
* answer it read.
|
|
11
|
-
*/
|
|
12
|
-
import { freshnessOf } from "./api-client.js";
|
|
13
|
-
import { endpointTool, toolRoutes } from "./endpoint-tools.js";
|
|
14
|
-
import { splitPaginated } from "./tool-runtime.js";
|
|
15
|
-
// ── Formatting helpers ────────────────────────────────────────────────
|
|
16
|
-
export function fmtUsd(value) {
|
|
17
|
-
if (value == null)
|
|
18
|
-
return "N/A";
|
|
19
|
-
const abs = Math.abs(value);
|
|
20
|
-
const sign = value < 0 ? "-" : "";
|
|
21
|
-
if (abs >= 1_000_000_000_000)
|
|
22
|
-
return `${sign}$${(abs / 1_000_000_000_000).toFixed(2)}T`;
|
|
23
|
-
if (abs >= 1_000_000_000)
|
|
24
|
-
return `${sign}$${(abs / 1_000_000_000).toFixed(2)}B`;
|
|
25
|
-
if (abs >= 1_000_000)
|
|
26
|
-
return `${sign}$${(abs / 1_000_000).toFixed(2)}M`;
|
|
27
|
-
if (abs >= 1_000)
|
|
28
|
-
return `${sign}$${(abs / 1_000).toFixed(1)}K`;
|
|
29
|
-
return `${sign}$${abs.toFixed(2)}`;
|
|
30
|
-
}
|
|
31
|
-
export function fmtPct(value) {
|
|
32
|
-
if (value == null)
|
|
33
|
-
return "N/A";
|
|
34
|
-
return `${value >= 0 ? "+" : ""}${value.toFixed(2)}%`;
|
|
35
|
-
}
|
|
36
|
-
export function fmtRate(value) {
|
|
37
|
-
if (value == null)
|
|
38
|
-
return "N/A";
|
|
39
|
-
return `${(value * 100).toFixed(4)}%`;
|
|
40
|
-
}
|
|
41
|
-
/** An annualized fraction (0.25 = 25%) as a percentage, or N/A. */
|
|
42
|
-
export function fmtApr(value) {
|
|
43
|
-
const n = finiteOrNull(value);
|
|
44
|
-
return n == null ? "N/A" : `${(n * 100).toFixed(1)}%`;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* The open-interest floor (USD) the composites ask the API to apply: funding
|
|
48
|
-
* extremes (`min_oi_usd`), the spot-perp perp leg and both cross-exchange legs
|
|
49
|
-
* (`minOiUsd`, `minVolUsd`). Unfloored, every extreme was a dust market (ESIM
|
|
50
|
-
* on KuCoin: $33K of OI at -16,862% APR, 2026-09-24 audit). The API applies
|
|
51
|
-
* it; unknown open interest fails it there.
|
|
52
|
-
*/
|
|
53
|
-
export const LIQUIDITY_FLOOR_USD = 1_000_000;
|
|
54
|
-
/**
|
|
55
|
-
* `max_age_h` on the funding calls: v1 leaves out rows not written for six
|
|
56
|
-
* hours (V1_MAX_AGE_HOURS in the funding read model), so a keyless answer
|
|
57
|
-
* counts the same rows as a keyed one. v1 ignores the parameter.
|
|
58
|
-
*/
|
|
59
|
-
export const FUNDING_MAX_AGE_HOURS = 6;
|
|
60
|
-
function isRecord(value) {
|
|
61
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
62
|
-
}
|
|
63
|
-
function finiteOrNull(value) {
|
|
64
|
-
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
65
|
-
}
|
|
66
|
-
function text(value) {
|
|
67
|
-
return typeof value === "string" && value !== "" ? value : null;
|
|
68
|
-
}
|
|
69
|
-
/** Rows of a list payload that may be wrapped as `{ data, pagination }` or `{ items }`. */
|
|
70
|
-
function listRows(payload) {
|
|
71
|
-
let rows = splitPaginated(payload).rows;
|
|
72
|
-
if (isRecord(rows) && "items" in rows)
|
|
73
|
-
rows = rows.items;
|
|
74
|
-
return Array.isArray(rows) ? rows.filter(isRecord) : null;
|
|
75
|
-
}
|
|
76
|
-
function records(value) {
|
|
77
|
-
return Array.isArray(value) ? value.filter(isRecord) : [];
|
|
78
|
-
}
|
|
79
|
-
function safeGet(obj, ...keys) {
|
|
80
|
-
let current = obj;
|
|
81
|
-
for (const k of keys) {
|
|
82
|
-
if (current != null && typeof current === "object" && k in current) {
|
|
83
|
-
current = current[k];
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return current;
|
|
90
|
-
}
|
|
91
|
-
/** A market's name with its asset class when it is not a token (TSLL is a stock, not a coin). */
|
|
92
|
-
function marketLabel(row) {
|
|
93
|
-
const coin = text(row.base_coin) ?? text(row.symbol) ?? "?";
|
|
94
|
-
const assetClass = text(row.asset_class);
|
|
95
|
-
return assetClass == null || assetClass === "crypto"
|
|
96
|
-
? coin
|
|
97
|
-
: `${coin} (${assetClass})`;
|
|
98
|
-
}
|
|
99
|
-
// ── Freshness ─────────────────────────────────────────────────────────
|
|
100
|
-
/** One answer's freshness, as the Python server prints it: `dataset · as of … · status[ · degraded] (warnings)`. */
|
|
101
|
-
export function freshnessLine(freshness) {
|
|
102
|
-
const parts = [
|
|
103
|
-
freshness.dataset_id || "data",
|
|
104
|
-
freshness.as_of ? `as of ${freshness.as_of}` : "as of unknown",
|
|
105
|
-
freshness.freshness_status,
|
|
106
|
-
];
|
|
107
|
-
if (freshness.runtime_status === "degraded")
|
|
108
|
-
parts.push("degraded");
|
|
109
|
-
const line = parts.join(" · ");
|
|
110
|
-
return freshness.warnings.length > 0
|
|
111
|
-
? `${line} (${freshness.warnings.join("; ")})`
|
|
112
|
-
: line;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* The report with a closing line naming the freshness of every answer it read
|
|
116
|
-
* (engine L5 WP-S12), each once, in the order the calls were made. Nothing
|
|
117
|
-
* changes when no answer said anything.
|
|
118
|
-
*/
|
|
119
|
-
export function withFreshnessReport(report, answers) {
|
|
120
|
-
const seen = [];
|
|
121
|
-
const keys = new Set();
|
|
122
|
-
for (const answer of answers) {
|
|
123
|
-
const freshness = freshnessOf(answer);
|
|
124
|
-
if (freshness === null)
|
|
125
|
-
continue;
|
|
126
|
-
const key = JSON.stringify(freshness);
|
|
127
|
-
if (keys.has(key))
|
|
128
|
-
continue;
|
|
129
|
-
keys.add(key);
|
|
130
|
-
seen.push(freshness);
|
|
131
|
-
}
|
|
132
|
-
return seen.length === 0
|
|
133
|
-
? report
|
|
134
|
-
: `${report}\n\n**Data freshness:** ${seen.map(freshnessLine).join("; ")}`;
|
|
135
|
-
}
|
|
136
|
-
/** Calls an endpoint tool's routes (from the manifest) and keeps a failure as a data gap instead of throwing. */
|
|
137
|
-
async function safeCall(callApi, toolName, args, label) {
|
|
138
|
-
try {
|
|
139
|
-
const { apiPath, fallbackPath } = toolRoutes(endpointTool(toolName));
|
|
140
|
-
const data = await callApi(apiPath, fallbackPath, args);
|
|
141
|
-
return { data, error: null };
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
145
|
-
return { data: null, error: `[${label}] ${msg}` };
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
async function settleAll(tasks) {
|
|
149
|
-
const results = await Promise.allSettled(tasks);
|
|
150
|
-
return results.map((r) => r.status === "fulfilled"
|
|
151
|
-
? r.value
|
|
152
|
-
: { data: null, error: "Promise rejected" });
|
|
153
|
-
}
|
|
154
|
-
function finish(lines, settled) {
|
|
155
|
-
const errors = settled.filter((s) => s.error).map((s) => s.error);
|
|
156
|
-
if (errors.length > 0) {
|
|
157
|
-
lines.push("");
|
|
158
|
-
lines.push(`**Data gaps:** ${errors.join("; ")}`);
|
|
159
|
-
}
|
|
160
|
-
return withFreshnessReport(lines.join("\n"), settled.map((s) => s.data));
|
|
161
|
-
}
|
|
162
|
-
// ── Price-prediction coin resolution ──────────────────────────────────
|
|
163
|
-
/**
|
|
164
|
-
* Find the prediction row for a ticker in the endpoint's own coverage list.
|
|
165
|
-
*
|
|
166
|
-
* The price-prediction endpoint is keyed by CoinGecko slug ("bitcoin",
|
|
167
|
-
* "avalanche-2", "matic-network"), never by ticker, and a lowercased ticker is
|
|
168
|
-
* not a slug. Guessing one either 404s or — far worse — resolves to whichever
|
|
169
|
-
* unrelated asset happens to own that slug, and tickers are shared across
|
|
170
|
-
* thousands of assets in this dataset. So the guess is a silent wrong-coin
|
|
171
|
-
* risk, never a convenience: it is resolve-or-say-so here.
|
|
172
|
-
*
|
|
173
|
-
* The list response (`GET .../price-prediction/data` with no `coin`) carries
|
|
174
|
-
* both the ticker (`coin`) and the `slug` for every covered asset, so an exact
|
|
175
|
-
* ticker match against it is the endpoint's own documented contract.
|
|
176
|
-
*/
|
|
177
|
-
export function findPredictionRow(payload, ticker) {
|
|
178
|
-
let rows = payload;
|
|
179
|
-
if (typeof rows === "object" && rows !== null && !Array.isArray(rows)) {
|
|
180
|
-
rows = rows.coins;
|
|
181
|
-
}
|
|
182
|
-
if (!Array.isArray(rows))
|
|
183
|
-
return null;
|
|
184
|
-
const wanted = ticker.toUpperCase();
|
|
185
|
-
for (const row of rows) {
|
|
186
|
-
if (typeof row !== "object" || row === null)
|
|
187
|
-
continue;
|
|
188
|
-
const rec = row;
|
|
189
|
-
if (String(rec.coin ?? "").toUpperCase() === wanted)
|
|
190
|
-
return rec;
|
|
191
|
-
}
|
|
192
|
-
return null;
|
|
193
|
-
}
|
|
194
|
-
// ── analyze_coin ──────────────────────────────────────────────────────
|
|
195
|
-
function capitalize(value) {
|
|
196
|
-
return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
|
|
197
|
-
}
|
|
198
|
-
function predictionLines(prediction, coinUpper) {
|
|
199
|
-
const row = prediction.data
|
|
200
|
-
? findPredictionRow(prediction.data, coinUpper)
|
|
201
|
-
: null;
|
|
202
|
-
if (!row) {
|
|
203
|
-
return prediction.data
|
|
204
|
-
? [
|
|
205
|
-
`\n*No price prediction for ${coinUpper}: this ticker is not in the price-prediction coverage universe. Call get_price_prediction with no coin to list covered tickers and their slugs.*`,
|
|
206
|
-
]
|
|
207
|
-
: ["\n*Price prediction data unavailable*"];
|
|
208
|
-
}
|
|
209
|
-
const bias = String(row.direction ?? row.bias ?? "unknown");
|
|
210
|
-
const score = finiteOrNull(row.consensusScore ?? row.score);
|
|
211
|
-
const price = finiteOrNull(row.spotPrice ?? row.price);
|
|
212
|
-
const change24h = finiteOrNull(row.priceChange24h ?? row.price_change_24h);
|
|
213
|
-
const lines = [
|
|
214
|
-
"",
|
|
215
|
-
`**Price:** ${fmtUsd(price)} | **24h:** ${change24h != null ? fmtPct(change24h) : ""}`,
|
|
216
|
-
`**Prediction:** ${capitalize(bias)} (score: ${score != null ? `${score}/100` : "N/A"})`,
|
|
217
|
-
];
|
|
218
|
-
const signals = row.signals ?? row.technical;
|
|
219
|
-
if (Array.isArray(signals)) {
|
|
220
|
-
const parts = records(signals)
|
|
221
|
-
.map((s) => {
|
|
222
|
-
const label = text(s.label ?? s.name);
|
|
223
|
-
const sigBias = text(s.bias);
|
|
224
|
-
return label && sigBias ? `${label}: ${sigBias}` : null;
|
|
225
|
-
})
|
|
226
|
-
.filter((part) => part !== null)
|
|
227
|
-
.slice(0, 6);
|
|
228
|
-
if (parts.length > 0)
|
|
229
|
-
lines.push(`**Signals:** ${parts.join(", ")}`);
|
|
230
|
-
}
|
|
231
|
-
else if (isRecord(signals)) {
|
|
232
|
-
const parts = [];
|
|
233
|
-
if (signals.rsi != null)
|
|
234
|
-
parts.push(`RSI ${Number(signals.rsi).toFixed(0)}`);
|
|
235
|
-
if (signals.ema_trend)
|
|
236
|
-
parts.push(`EMA ${signals.ema_trend}`);
|
|
237
|
-
if (parts.length > 0)
|
|
238
|
-
lines.push(`**Technicals:** ${parts.join(", ")}`);
|
|
239
|
-
}
|
|
240
|
-
return lines;
|
|
241
|
-
}
|
|
242
|
-
function fundingRowLine(row) {
|
|
243
|
-
const market = [text(row.exchange) ?? "Unknown", text(row.symbol)]
|
|
244
|
-
.filter(Boolean)
|
|
245
|
-
.join(" ");
|
|
246
|
-
return ` ${market}: ${fmtRate(finiteOrNull(row.rate_8h))} per 8h (${fmtApr(row.apr)} APR) | OI ${fmtUsd(finiteOrNull(row.open_interest))}`;
|
|
247
|
-
}
|
|
248
|
-
/** One asset of a `summary=1` answer: the API's average and median across venues. */
|
|
249
|
-
function fundingSummaryLine(entry) {
|
|
250
|
-
const stale = finiteOrNull(entry.funding_venues_stale) ?? 0;
|
|
251
|
-
const parts = [
|
|
252
|
-
` **Average (${marketLabel(entry)}):** ${fmtRate(finiteOrNull(entry.funding_avg_8h))} per 8h (${text(entry.funding_method) ?? "n/a"})`,
|
|
253
|
-
`**Median:** ${fmtRate(finiteOrNull(entry.funding_median_8h))} per 8h`,
|
|
254
|
-
`${finiteOrNull(entry.funding_venues_used) ?? 0} venues`,
|
|
255
|
-
];
|
|
256
|
-
let line = parts.join(" | ");
|
|
257
|
-
if (stale > 0)
|
|
258
|
-
line += `, ${stale} stale venues left out`;
|
|
259
|
-
if (entry.funding_all_stale === true)
|
|
260
|
-
line += " *(every venue is stale: the figures are over stale rates)*";
|
|
261
|
-
return line;
|
|
262
|
-
}
|
|
263
|
-
export async function analyzeCoin(callApi, coin) {
|
|
264
|
-
const coinUpper = coin.toUpperCase();
|
|
265
|
-
const fundingScope = {
|
|
266
|
-
type: "current",
|
|
267
|
-
coin: coinUpper,
|
|
268
|
-
max_age_h: FUNDING_MAX_AGE_HOURS,
|
|
269
|
-
};
|
|
270
|
-
const settled = await settleAll([
|
|
271
|
-
// No `coin` param: the endpoint is slug-keyed and the caller gives us a
|
|
272
|
-
// ticker, so ask for the coverage list and match the ticker in it rather
|
|
273
|
-
// than shipping a guessed slug that can resolve to another asset.
|
|
274
|
-
safeCall(callApi, "get_price_prediction", {}, "prediction"),
|
|
275
|
-
// The API resolves `coin` to an asset (PEPE brings its 1000PEPE and KPEPE
|
|
276
|
-
// contracts) and orders the markets by their own open interest.
|
|
277
|
-
safeCall(callApi, "get_funding_rates", { ...fundingScope, sort: "-open_interest" }, "funding"),
|
|
278
|
-
// The asset's funding across venues: the funding grid's Avg Rate.
|
|
279
|
-
safeCall(callApi, "get_funding_rates", { ...fundingScope, summary: "1" }, "funding-summary"),
|
|
280
|
-
// The asset's open-interest total (L4 oi.asset_total_usd): /global's row,
|
|
281
|
-
// every contract of the asset once, lots included, venues the API keeps
|
|
282
|
-
// out of totals left out, latest reading within six hours.
|
|
283
|
-
safeCall(callApi, "get_global_overview", {}, "open-interest"),
|
|
284
|
-
// The dollar value paid at the next settlement: the coin's own rows, never
|
|
285
|
-
// `totals` (which stays scoped to the whole class).
|
|
286
|
-
safeCall(callApi, "get_funding_settlement", { coin: coinUpper, window: "current" }, "settlement"),
|
|
287
|
-
]);
|
|
288
|
-
const [prediction, funding, summary, global, settlement] = settled;
|
|
289
|
-
const lines = [`## ${coinUpper} Analysis`];
|
|
290
|
-
lines.push(...predictionLines(prediction, coinUpper));
|
|
291
|
-
// Funding: the markets in the API's open-interest order, then its summary.
|
|
292
|
-
const fundingRows = funding.data ? (listRows(funding.data) ?? []) : null;
|
|
293
|
-
if (fundingRows === null) {
|
|
294
|
-
lines.push("\n*Funding rate data unavailable*");
|
|
295
|
-
}
|
|
296
|
-
else if (fundingRows.length === 0) {
|
|
297
|
-
lines.push("\n*No funding rates found for this coin*");
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
lines.push("");
|
|
301
|
-
lines.push("**Funding (current, largest markets by open interest):**");
|
|
302
|
-
for (const row of fundingRows.slice(0, 10))
|
|
303
|
-
lines.push(fundingRowLine(row));
|
|
304
|
-
for (const entry of records(safeGet(summary.data, "summary"))) {
|
|
305
|
-
lines.push(fundingSummaryLine(entry));
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
// Open interest: the asset's row on the global board, found by the asset
|
|
309
|
-
// symbol the funding answer resolved (coin=1000PEPE files under PEPE).
|
|
310
|
-
if (global.data) {
|
|
311
|
-
const assetSymbol = fundingRows?.map((row) => text(row.asset_symbol)).find(Boolean) ??
|
|
312
|
-
coinUpper;
|
|
313
|
-
const row = records(safeGet(global.data, "rows")).find((candidate) => text(candidate.symbol) === assetSymbol);
|
|
314
|
-
lines.push("");
|
|
315
|
-
lines.push("**Open Interest:**");
|
|
316
|
-
if (row) {
|
|
317
|
-
lines.push(` **Total:** ${fmtUsd(finiteOrNull(row.openInterestUsd))} across ${finiteOrNull(row.venueCount) ?? "N/A"} venues | 1h ${fmtPct(finiteOrNull(row.oiChange1hPct))} | 24h ${fmtPct(finiteOrNull(row.oiChange24hPct))}`);
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
lines.push(` *No open-interest total for ${assetSymbol} on the global board.*`);
|
|
321
|
-
}
|
|
322
|
-
const excluded = records(safeGet(global.data, "metrics", "openInterestExcludedVenues"))
|
|
323
|
-
.map((venue) => {
|
|
324
|
-
const exchange = text(venue.exchange);
|
|
325
|
-
const reason = text(venue.reason);
|
|
326
|
-
return exchange ? `${exchange}${reason ? ` (${reason})` : ""}` : null;
|
|
327
|
-
})
|
|
328
|
-
.filter((venue) => venue !== null);
|
|
329
|
-
if (excluded.length > 0) {
|
|
330
|
-
lines.push(` *Left out of the total: ${excluded.join("; ")}*`);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
lines.push("\n*Open interest data unavailable*");
|
|
335
|
-
}
|
|
336
|
-
// Settlement: dollar value actually paid at the next settlement.
|
|
337
|
-
if (settlement.data) {
|
|
338
|
-
const payload = settlement.data;
|
|
339
|
-
const rows = records(payload.rows ?? payload.data);
|
|
340
|
-
lines.push("");
|
|
341
|
-
lines.push("**Settlement (next, estimated):**");
|
|
342
|
-
if (rows.length === 0) {
|
|
343
|
-
lines.push(" No funding data for the next settlement.");
|
|
344
|
-
}
|
|
345
|
-
for (const row of rows) {
|
|
346
|
-
const net = finiteOrNull(safeGet(row, "windows", "current", "net"));
|
|
347
|
-
const prefix = rows.length > 1 ? `${marketLabel(row)}: ` : "";
|
|
348
|
-
if (net == null) {
|
|
349
|
-
lines.push(` ${prefix}No funding data for the next settlement.`);
|
|
350
|
-
}
|
|
351
|
-
else if (net > 0) {
|
|
352
|
-
lines.push(` ${prefix}Longs pay ${fmtUsd(net)} to shorts.`);
|
|
353
|
-
}
|
|
354
|
-
else if (net < 0) {
|
|
355
|
-
lines.push(` ${prefix}Shorts pay ${fmtUsd(-net)} to longs.`);
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
lines.push(` ${prefix}No net funding at the next settlement.`);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
else {
|
|
363
|
-
lines.push("\n*Settlement data unavailable*");
|
|
364
|
-
}
|
|
365
|
-
return finish(lines, settled);
|
|
366
|
-
}
|
|
367
|
-
// ── market_briefing ───────────────────────────────────────────────────
|
|
368
|
-
function fundingExtremeLine(row) {
|
|
369
|
-
return ` ${marketLabel(row)} on ${text(row.exchange) ?? "?"}: ${fmtApr(row.apr)} APR (${fmtRate(finiteOrNull(row.rate_8h))} per 8h; raw ${fmtRate(finiteOrNull(row.rate))} per ${finiteOrNull(row.interval_hours) ?? "?"}h)`;
|
|
370
|
-
}
|
|
371
|
-
export async function marketBriefing(callApi) {
|
|
372
|
-
const settled = await settleAll([
|
|
373
|
-
safeCall(callApi, "get_market_overview", {}, "market-overview"),
|
|
374
|
-
// Ranked by the API: missing 24h changes are never ranked.
|
|
375
|
-
safeCall(callApi, "get_narratives", { sort: "-change24h", top: 5, bottom: 3 }, "narratives"),
|
|
376
|
-
// The book's extremes, ranked by the API on the 8h-equivalent rate among
|
|
377
|
-
// fresh markets with a usable interval above the floor.
|
|
378
|
-
safeCall(callApi, "get_funding_rates", {
|
|
379
|
-
type: "current",
|
|
380
|
-
extremes: 3,
|
|
381
|
-
min_oi_usd: LIQUIDITY_FLOOR_USD,
|
|
382
|
-
max_age_h: FUNDING_MAX_AGE_HOURS,
|
|
383
|
-
}, "funding"),
|
|
384
|
-
// No coin filter, so `totals` reflects the whole requested class.
|
|
385
|
-
safeCall(callApi, "get_funding_settlement", { window: "current" }, "settlement"),
|
|
386
|
-
]);
|
|
387
|
-
const [overview, narratives, funding, settlement] = settled;
|
|
388
|
-
const lines = ["## Market Briefing"];
|
|
389
|
-
// Market overview
|
|
390
|
-
if (isRecord(overview.data)) {
|
|
391
|
-
const d = overview.data;
|
|
392
|
-
const mcap = finiteOrNull(d.total_market_cap);
|
|
393
|
-
const vol = finiteOrNull(d.total_volume_24h ?? d.total_volume);
|
|
394
|
-
// Served in percent (57.3 = 57.3%); `btc_dominance` is the same figure.
|
|
395
|
-
const btcDom = finiteOrNull(d.btc_dominance_pct ?? d.btc_dominance);
|
|
396
|
-
const fg = d.fgi ?? d.fear_greed_index ?? d.fear_greed;
|
|
397
|
-
lines.push("");
|
|
398
|
-
lines.push("### Market Stats");
|
|
399
|
-
if (mcap != null)
|
|
400
|
-
lines.push(`**Total Market Cap:** ${fmtUsd(mcap)}`);
|
|
401
|
-
if (vol != null)
|
|
402
|
-
lines.push(`**24h Volume:** ${fmtUsd(vol)}`);
|
|
403
|
-
if (btcDom != null)
|
|
404
|
-
lines.push(`**BTC Dominance:** ${btcDom.toFixed(1)}%`);
|
|
405
|
-
if (fg != null) {
|
|
406
|
-
const fgVal = isRecord(fg) ? fg.value : fg;
|
|
407
|
-
let fgLabel = isRecord(fg) ? (text(fg.label) ?? "") : "";
|
|
408
|
-
if (!fgLabel)
|
|
409
|
-
fgLabel = text(d.fgi_classification) ?? "";
|
|
410
|
-
lines.push(`**Fear & Greed:** ${fgVal} ${fgLabel}`);
|
|
411
|
-
}
|
|
412
|
-
for (const [key, heading] of [
|
|
413
|
-
["top_gainers", "### Top Gainers (24h)"],
|
|
414
|
-
["top_losers", "### Top Losers (24h)"],
|
|
415
|
-
]) {
|
|
416
|
-
const movers = records(d[key]);
|
|
417
|
-
if (movers.length === 0)
|
|
418
|
-
continue;
|
|
419
|
-
lines.push("");
|
|
420
|
-
lines.push(heading);
|
|
421
|
-
for (const m of movers.slice(0, 5)) {
|
|
422
|
-
const sym = text(m.symbol) ?? text(m.name) ?? "?";
|
|
423
|
-
lines.push(` ${sym}: ${fmtPct(finiteOrNull(m.price_change_24h ?? m.change))}`);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
else {
|
|
428
|
-
lines.push("\n*Market overview data unavailable*");
|
|
429
|
-
}
|
|
430
|
-
// Narratives, as the API ranked them.
|
|
431
|
-
if (isRecord(narratives.data)) {
|
|
432
|
-
const top = narratives.data.top;
|
|
433
|
-
const bottom = narratives.data.bottom;
|
|
434
|
-
if (Array.isArray(top) && Array.isArray(bottom)) {
|
|
435
|
-
lines.push("");
|
|
436
|
-
lines.push("### Top Narratives (24h)");
|
|
437
|
-
for (const n of records(top)) {
|
|
438
|
-
lines.push(` **${text(n.name) ?? "?"}:** ${fmtPct(finiteOrNull(n.change24h))} (mcap: ${fmtUsd(finiteOrNull(n.marketCap))})`);
|
|
439
|
-
}
|
|
440
|
-
lines.push("");
|
|
441
|
-
lines.push("### Worst Narratives (24h)");
|
|
442
|
-
for (const n of records(bottom)) {
|
|
443
|
-
lines.push(` **${text(n.name) ?? "?"}:** ${fmtPct(finiteOrNull(n.change24h))}`);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
lines.push("\n*Narrative ranking unavailable*");
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
else {
|
|
451
|
-
lines.push("\n*Narrative data unavailable*");
|
|
452
|
-
}
|
|
453
|
-
// Funding highlights: the API's extremes, never re-ranked here.
|
|
454
|
-
const extremes = safeGet(funding.data, "extremes");
|
|
455
|
-
if (isRecord(extremes)) {
|
|
456
|
-
const highest = records(extremes.highest);
|
|
457
|
-
const lowest = records(extremes.lowest);
|
|
458
|
-
lines.push("");
|
|
459
|
-
lines.push("### Funding Rate Highlights");
|
|
460
|
-
lines.push(`*Ranked by the API on the 8h-equivalent rate (rate x 8 / interval_hours) among fresh markets with at least ${fmtUsd(LIQUIDITY_FLOOR_USD)} open interest; APR = rate x 8760 / interval_hours.*`);
|
|
461
|
-
const omitted = isRecord(extremes.omitted) ? extremes.omitted : {};
|
|
462
|
-
for (const [key, reason] of [
|
|
463
|
-
["stale", "stale, past the funding freshness SLA"],
|
|
464
|
-
["no_interval", "no rate or no published settlement interval"],
|
|
465
|
-
[
|
|
466
|
-
"below_floor",
|
|
467
|
-
`open interest below ${fmtUsd(LIQUIDITY_FLOOR_USD)} or unknown`,
|
|
468
|
-
],
|
|
469
|
-
]) {
|
|
470
|
-
const count = finiteOrNull(omitted[key]);
|
|
471
|
-
if (count)
|
|
472
|
-
lines.push(`*${count} markets left out: ${reason}.*`);
|
|
473
|
-
}
|
|
474
|
-
if (highest.length === 0 && lowest.length === 0) {
|
|
475
|
-
lines.push("*No market clears the floor.*");
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
lines.push("**Highest (longs paying most):**");
|
|
479
|
-
for (const row of highest)
|
|
480
|
-
lines.push(fundingExtremeLine(row));
|
|
481
|
-
lines.push("**Lowest (shorts paying most):**");
|
|
482
|
-
for (const row of lowest)
|
|
483
|
-
lines.push(fundingExtremeLine(row));
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
487
|
-
lines.push("\n*Funding rate data unavailable*");
|
|
488
|
-
}
|
|
489
|
-
// Funding settlement: whole-market dollar total, not a per-row rate.
|
|
490
|
-
if (settlement.data) {
|
|
491
|
-
const totals = settlement.data.totals;
|
|
492
|
-
const net = finiteOrNull(safeGet(totals, "current", "net"));
|
|
493
|
-
const longPaid = finiteOrNull(safeGet(totals, "current", "long_paid"));
|
|
494
|
-
const shortPaid = finiteOrNull(safeGet(totals, "current", "short_paid"));
|
|
495
|
-
lines.push("");
|
|
496
|
-
lines.push("### Funding Settlement (next, estimated)");
|
|
497
|
-
if (net == null) {
|
|
498
|
-
lines.push("*No funding data for the next settlement.*");
|
|
499
|
-
}
|
|
500
|
-
else if (net > 0) {
|
|
501
|
-
lines.push(`Longs will pay ${fmtUsd(net)} to shorts (long ${fmtUsd(longPaid)} / short ${fmtUsd(shortPaid)}).`);
|
|
502
|
-
}
|
|
503
|
-
else if (net < 0) {
|
|
504
|
-
lines.push(`Shorts will pay ${fmtUsd(-net)} to longs (long ${fmtUsd(longPaid)} / short ${fmtUsd(shortPaid)}).`);
|
|
505
|
-
}
|
|
506
|
-
else {
|
|
507
|
-
lines.push("No net funding expected at the next settlement.");
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
else {
|
|
511
|
-
lines.push("\n*Funding settlement data unavailable*");
|
|
512
|
-
}
|
|
513
|
-
return finish(lines, settled);
|
|
514
|
-
}
|
|
515
|
-
// ── find_opportunities ────────────────────────────────────────────────
|
|
516
|
-
/** A row's own status flags, printed only when they say something. */
|
|
517
|
-
function statusSuffix(row) {
|
|
518
|
-
const parts = [text(row.executionStatus) ?? "n/a"];
|
|
519
|
-
const pair = text(row.pairStatus);
|
|
520
|
-
if (pair && pair !== "eligible")
|
|
521
|
-
parts.push(pair);
|
|
522
|
-
if (row.fundingIsStale === true)
|
|
523
|
-
parts.push("funding stale");
|
|
524
|
-
return parts.join(" | ");
|
|
525
|
-
}
|
|
526
|
-
export async function findOpportunities(callApi) {
|
|
527
|
-
const settled = await settleAll([
|
|
528
|
-
// The API floors the perp leg's open interest (unknown fails it) and
|
|
529
|
-
// keeps its board order: net APR first, then gross APR.
|
|
530
|
-
safeCall(callApi, "get_arbitrage_spot_perp", { exchange: "all", direction: "all", minOiUsd: LIQUIDITY_FLOOR_USD }, "spot-perp-arb"),
|
|
531
|
-
// Both legs must clear the floor; the API ranks executable rows first and
|
|
532
|
-
// cuts the board to the rows shown.
|
|
533
|
-
safeCall(callApi, "get_arbitrage_cross_exchange", {
|
|
534
|
-
minOiUsd: LIQUIDITY_FLOOR_USD,
|
|
535
|
-
minVolUsd: LIQUIDITY_FLOOR_USD,
|
|
536
|
-
limit: 10,
|
|
537
|
-
}, "cross-exchange-arb"),
|
|
538
|
-
// The whole book's funding stats (the v1 derivatives overview's
|
|
539
|
-
// computation, as APRs).
|
|
540
|
-
safeCall(callApi, "get_funding_rates", { type: "current", stats: "1" }, "funding"),
|
|
541
|
-
]);
|
|
542
|
-
const [spotPerp, crossEx, funding] = settled;
|
|
543
|
-
const floorLabel = fmtUsd(LIQUIDITY_FLOOR_USD);
|
|
544
|
-
const lines = ["## Arbitrage Opportunities"];
|
|
545
|
-
// Spot-perp basis trades
|
|
546
|
-
if (spotPerp.data) {
|
|
547
|
-
const rows = listRows(spotPerp.data) ?? [];
|
|
548
|
-
lines.push("");
|
|
549
|
-
lines.push("### Spot-Perp Basis Trades (Top 10)");
|
|
550
|
-
lines.push("*Long spot + short perp (or vice versa) to capture funding*");
|
|
551
|
-
lines.push(`*Perp legs with at least ${floorLabel} open interest, in the API's order: net APR first, then gross APR.*`);
|
|
552
|
-
lines.push("");
|
|
553
|
-
if (rows.length === 0) {
|
|
554
|
-
lines.push(" *No spot-perp row clears the liquidity floor.*");
|
|
555
|
-
}
|
|
556
|
-
for (const a of rows.slice(0, 10)) {
|
|
557
|
-
lines.push(` **${text(a.symbol) ?? "?"}** on ${text(a.exchange) ?? "?"} | Net APR: ${fmtApr(a.netApr)} | Gross APR: ${fmtApr(a.apr)} | Rate: ${fmtRate(finiteOrNull(a.fundingRate))} per ${finiteOrNull(a.intervalHours) ?? "?"}h | Dir: ${text(a.direction) ?? "?"} | OI ${fmtUsd(finiteOrNull(a.perpOpenInterestUsd))} | ${statusSuffix(a)}`);
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
lines.push("\n*Spot-perp arbitrage data unavailable*");
|
|
562
|
-
}
|
|
563
|
-
// Cross-exchange funding arb
|
|
564
|
-
if (crossEx.data) {
|
|
565
|
-
const rows = listRows(crossEx.data) ?? [];
|
|
566
|
-
lines.push("");
|
|
567
|
-
lines.push("### Cross-Exchange Funding Arb (Top 10)");
|
|
568
|
-
lines.push("*Long on low-rate exchange, short on high-rate exchange*");
|
|
569
|
-
lines.push(`*Both legs have at least ${floorLabel} open interest and 24h volume, in the API's order: executable (book-priced) rows first by net APR, then indicative rows by gross APR.*`);
|
|
570
|
-
lines.push("");
|
|
571
|
-
if (rows.length === 0) {
|
|
572
|
-
lines.push(" *No cross-exchange row clears the liquidity floor.*");
|
|
573
|
-
}
|
|
574
|
-
for (const a of rows.slice(0, 10)) {
|
|
575
|
-
lines.push(` **${text(a.symbol) ?? "?"}** | Long ${text(a.longExchange) ?? "?"} / Short ${text(a.shortExchange) ?? "?"} | Net APR: ${fmtApr(a.netApr)} | Gross APR: ${fmtApr(a.apr)} | Spread: ${fmtRate(finiteOrNull(a.spreadRate))} | ${statusSuffix(a)}`);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
else {
|
|
579
|
-
lines.push("\n*Cross-exchange arbitrage data unavailable*");
|
|
580
|
-
}
|
|
581
|
-
// Funding rate summary: the API's market stats.
|
|
582
|
-
const market = safeGet(funding.data, "market");
|
|
583
|
-
if (isRecord(market)) {
|
|
584
|
-
lines.push("");
|
|
585
|
-
lines.push("### Funding Rate Summary");
|
|
586
|
-
lines.push("*The API's market stats: the fresh primary contract of every (venue, asset), all asset classes.*");
|
|
587
|
-
lines.push(`**Avg APR:** ${fmtApr(market.funding_apr_mean)} | **OI-weighted APR:** ${fmtApr(market.funding_apr_oi_weighted)}`);
|
|
588
|
-
lines.push(`**Positive (longs pay):** ${finiteOrNull(market.positive) ?? "N/A"} | **Negative (shorts pay):** ${finiteOrNull(market.negative) ?? "N/A"}`);
|
|
589
|
-
}
|
|
590
|
-
else {
|
|
591
|
-
lines.push("\n*Funding rate data unavailable*");
|
|
592
|
-
}
|
|
593
|
-
return finish(lines, settled);
|
|
594
|
-
}
|
|
595
|
-
//# sourceMappingURL=composite-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"composite-tools.js","sourceRoot":"","sources":["../src/composite-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAsB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,yEAAyE;AAEzE,MAAM,UAAU,MAAM,CAAC,KAAgC;IACrD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,IAAI,GAAG,IAAI,iBAAiB;QAC1B,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,GAAG,IAAI,aAAa;QACtB,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACxE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAgC;IACrD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAgC;IACtD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,2FAA2F;AAC3F,SAAS,QAAQ,CAAC,OAAgB;IAChC,IAAI,IAAI,GAAY,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IACjD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACzD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,OAAO,CAAC,GAAY,EAAE,GAAG,IAAc;IAC9C,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACnE,OAAO,GAAI,OAAmC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iGAAiG;AACjG,SAAS,WAAW,CAAC,GAA4B;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,UAAU,IAAI,IAAI,IAAI,UAAU,KAAK,QAAQ;QAClD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,IAAI,KAAK,UAAU,GAAG,CAAC;AAChC,CAAC;AAED,yEAAyE;AAEzE,oHAAoH;AACpH,MAAM,UAAU,aAAa,CAAC,SAAwB;IACpD,MAAM,KAAK,GAAG;QACZ,SAAS,CAAC,UAAU,IAAI,MAAM;QAC9B,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe;QAC9D,SAAS,CAAC,gBAAgB;KAC3B,CAAC;IACF,IAAI,SAAS,CAAC,cAAc,KAAK,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC,CAAC,GAAG,IAAI,KAAK,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC9C,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,OAAkB;IAElB,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,SAAS,KAAK,IAAI;YAAE,SAAS;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;QACtB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,GAAG,MAAM,2BAA2B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/E,CAAC;AAYD,iHAAiH;AACjH,KAAK,UAAU,QAAQ,CACrB,OAAkB,EAClB,QAAgB,EAChB,IAA6B,EAC7B,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAA4B;IACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvB,CAAC,CAAC,MAAM,KAAK,WAAW;QACtB,CAAC,CAAC,CAAC,CAAC,KAAK;QACT,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAC9C,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,KAAe,EAAE,OAAqB;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,mBAAmB,CACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,yEAAyE;AAEzE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgB,EAChB,MAAc;IAEd,IAAI,IAAI,GAAY,OAAO,CAAC;IAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,IAAI,GAAI,IAAgC,CAAC,KAAK,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QACtD,MAAM,GAAG,GAAG,GAA8B,CAAC;QAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AAEzE,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,eAAe,CAAC,UAAsB,EAAE,SAAiB;IAChE,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI;QACzB,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,UAAU,CAAC,IAAI;YACpB,CAAC,CAAC;gBACE,8BAA8B,SAAS,kJAAkJ;aAC1L;YACH,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,cAAc,MAAM,CAAC,KAAK,CAAC,eAAe,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QACtF,mBAAmB,UAAU,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;KACzF,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;aAC/C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACf,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI;YACrB,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B;IAClD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC/D,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,KAAK,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,YAAY,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;AAC9I,CAAC;AAED,qFAAqF;AACrF,SAAS,kBAAkB,CAAC,KAA8B;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG;QACZ,gBAAgB,WAAW,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,GAAG;QACvI,eAAe,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,SAAS;QACtE,GAAG,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS;KACzD,CAAC;IACF,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC;QAAE,IAAI,IAAI,KAAK,KAAK,wBAAwB,CAAC;IAC1D,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI;QAClC,IAAI,IAAI,6DAA6D,CAAC;IACxE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAkB,EAClB,IAAY;IAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG;QACnB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,qBAAqB;KACjC,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC;QAC9B,wEAAwE;QACxE,yEAAyE;QACzE,kEAAkE;QAClE,QAAQ,CACN,OAAO,EACP,sBAAsB,EACtB,EAAE,EACF,YAAY,CACb;QACD,0EAA0E;QAC1E,gEAAgE;QAChE,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAC3C,SAAS,CACV;QACD,kEAAkE;QAClE,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,EACjC,iBAAiB,CAClB;QACD,0EAA0E;QAC1E,wEAAwE;QACxE,2DAA2D;QAC3D,QAAQ,CACN,OAAO,EACP,qBAAqB,EACrB,EAAE,EACF,eAAe,CAChB;QACD,2EAA2E;QAC3E,oDAAoD;QACpD,QAAQ,CACN,OAAO,EACP,wBAAwB,EACxB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EACtC,YAAY,CACb;KACF,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC;IAEnE,MAAM,KAAK,GAAa,CAAC,MAAM,SAAS,WAAW,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtD,2EAA2E;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACvE,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,WAAW,GACf,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/D,SAAS,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CACpD,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,WAAW,CACtD,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,gBAAgB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,UAAU,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CACrN,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CACR,iCAAiC,WAAW,wBAAwB,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CACtB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAC9D;aACE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;IAED,iEAAiE;IACjE,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,UAAU,CAAC,IAA+B,CAAC;QAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,0CAA0C,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,aAAa,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,cAAc,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,wCAAwC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,yEAAyE;AAEzE,SAAS,kBAAkB,CAAC,GAA4B;IACtD,OAAO,KAAK,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,gBAAgB,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC;AAChO,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAkB;IACrD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC;QAC9B,QAAQ,CACN,OAAO,EACP,qBAAqB,EACrB,EAAE,EACF,iBAAiB,CAClB;QACD,2DAA2D;QAC3D,QAAQ,CACN,OAAO,EACP,gBAAgB,EAChB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EACzC,YAAY,CACb;QACD,yEAAyE;QACzE,wDAAwD;QACxD,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB;YACE,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,mBAAmB;YAC/B,SAAS,EAAE,qBAAqB;SACjC,EACD,SAAS,CACV;QACD,kEAAkE;QAClE,QAAQ,CACN,OAAO,EACP,wBAAwB,EACxB,EAAE,MAAM,EAAE,SAAS,EAAE,EACrB,YAAY,CACb;KACF,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC;IAE5D,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,CAAC;IAE/C,kBAAkB;IAClB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/D,wEAAwE;QACxE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,UAAU,CAAC;QAEvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,GAAG,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,MAAM,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3E,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,OAAO;gBAAE,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI;YAC3B,CAAC,aAAa,EAAE,uBAAuB,CAAC;YACxC,CAAC,YAAY,EAAE,sBAAsB,CAAC;SAC9B,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;gBAClD,KAAK,CAAC,IAAI,CACR,KAAK,GAAG,KAAK,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrD,CAAC;IAED,sCAAsC;IACtC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAClH,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CACrE,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC/C,CAAC;IAED,gEAAgE;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CACR,8GAA8G,MAAM,CAAC,mBAAmB,CAAC,sDAAsD,CAChM,CAAC;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI;YAC1B,CAAC,OAAO,EAAE,uCAAuC,CAAC;YAClD,CAAC,aAAa,EAAE,6CAA6C,CAAC;YAC9D;gBACE,aAAa;gBACb,uBAAuB,MAAM,CAAC,mBAAmB,CAAC,aAAa;aAChE;SACO,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAsB,MAAM,IAAI,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC/C,KAAK,MAAM,GAAG,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC/C,KAAK,MAAM,GAAG,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;IAED,qEAAqE;IACrE,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,GAAI,UAAU,CAAC,IAAgC,CAAC,MAAM,CAAC;QACnE,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QAEzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACvD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CACR,kBAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,YAAY,MAAM,CAAC,SAAS,CAAC,IAAI,CACnG,CAAC;QACJ,CAAC;aAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,CAAC,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,YAAY,MAAM,CAAC,SAAS,CAAC,IAAI,CACpG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,yEAAyE;AAEzE,sEAAsE;AACtE,SAAS,YAAY,CAAC,GAA4B;IAChD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,IAAI,KAAK,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,GAAG,CAAC,cAAc,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAkB;IACxD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC;QAC9B,qEAAqE;QACrE,wDAAwD;QACxD,QAAQ,CACN,OAAO,EACP,yBAAyB,EACzB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EACpE,eAAe,CAChB;QACD,0EAA0E;QAC1E,oCAAoC;QACpC,QAAQ,CACN,OAAO,EACP,8BAA8B,EAC9B;YACE,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE,mBAAmB;YAC9B,KAAK,EAAE,EAAE;SACV,EACD,oBAAoB,CACrB;QACD,gEAAgE;QAChE,yBAAyB;QACzB,QAAQ,CACN,OAAO,EACP,mBAAmB,EACnB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAC/B,SAAS,CACV;KACF,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAa,CAAC,4BAA4B,CAAC,CAAC;IAEvD,yBAAyB;IACzB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CACR,4BAA4B,UAAU,qEAAqE,CAC5G,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,eAAe,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,EAAE,CACrU,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CACR,4BAA4B,UAAU,wIAAwI,CAC/K,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,eAAe,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,EAAE,CAClP,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC9D,CAAC;IAED,gDAAgD;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CACR,kGAAkG,CACnG,CAAC;QACF,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,CACnH,CAAC;QACF,KAAK,CAAC,IAAI,CACR,6BAA6B,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,iCAAiC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAC7I,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC"}
|