jcc_hyper_tool 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +394 -0
- package/dist/cli/confirm.d.ts +2 -0
- package/dist/cli/confirm.d.ts.map +1 -0
- package/dist/cli/confirm.js +22 -0
- package/dist/cli/confirm.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +189 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/perpKline.d.ts +19 -0
- package/dist/cli/perpKline.d.ts.map +1 -0
- package/dist/cli/perpKline.js +39 -0
- package/dist/cli/perpKline.js.map +1 -0
- package/dist/cli/stateCli.d.ts +3 -0
- package/dist/cli/stateCli.d.ts.map +1 -0
- package/dist/cli/stateCli.js +158 -0
- package/dist/cli/stateCli.js.map +1 -0
- package/dist/cli/strategyCli.d.ts +3 -0
- package/dist/cli/strategyCli.d.ts.map +1 -0
- package/dist/cli/strategyCli.js +198 -0
- package/dist/cli/strategyCli.js.map +1 -0
- package/dist/cli/tradingCli.d.ts +3 -0
- package/dist/cli/tradingCli.d.ts.map +1 -0
- package/dist/cli/tradingCli.js +587 -0
- package/dist/cli/tradingCli.js.map +1 -0
- package/dist/cli/util.d.ts +28 -0
- package/dist/cli/util.d.ts.map +1 -0
- package/dist/cli/util.js +62 -0
- package/dist/cli/util.js.map +1 -0
- package/dist/core/config.d.ts +32 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +101 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +17 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hyperliquid/asset.d.ts +24 -0
- package/dist/core/hyperliquid/asset.d.ts.map +1 -0
- package/dist/core/hyperliquid/asset.js +88 -0
- package/dist/core/hyperliquid/asset.js.map +1 -0
- package/dist/core/hyperliquid/candles.d.ts +24 -0
- package/dist/core/hyperliquid/candles.d.ts.map +1 -0
- package/dist/core/hyperliquid/candles.js +113 -0
- package/dist/core/hyperliquid/candles.js.map +1 -0
- package/dist/core/hyperliquid/client.d.ts +36 -0
- package/dist/core/hyperliquid/client.d.ts.map +1 -0
- package/dist/core/hyperliquid/client.js +92 -0
- package/dist/core/hyperliquid/client.js.map +1 -0
- package/dist/core/hyperliquid/exchange.d.ts +14 -0
- package/dist/core/hyperliquid/exchange.d.ts.map +1 -0
- package/dist/core/hyperliquid/exchange.js +42 -0
- package/dist/core/hyperliquid/exchange.js.map +1 -0
- package/dist/core/hyperliquid/exchangeParse.d.ts +7 -0
- package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -0
- package/dist/core/hyperliquid/exchangeParse.js +44 -0
- package/dist/core/hyperliquid/exchangeParse.js.map +1 -0
- package/dist/core/hyperliquid/float.d.ts +6 -0
- package/dist/core/hyperliquid/float.d.ts.map +1 -0
- package/dist/core/hyperliquid/float.js +24 -0
- package/dist/core/hyperliquid/float.js.map +1 -0
- package/dist/core/hyperliquid/klineCoin.d.ts +10 -0
- package/dist/core/hyperliquid/klineCoin.d.ts.map +1 -0
- package/dist/core/hyperliquid/klineCoin.js +90 -0
- package/dist/core/hyperliquid/klineCoin.js.map +1 -0
- package/dist/core/hyperliquid/orders.d.ts +91 -0
- package/dist/core/hyperliquid/orders.d.ts.map +1 -0
- package/dist/core/hyperliquid/orders.js +116 -0
- package/dist/core/hyperliquid/orders.js.map +1 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.d.ts +3 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.d.ts.map +1 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.js +10 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.js.map +1 -0
- package/dist/core/hyperliquid/signed-exchange.d.ts +10 -0
- package/dist/core/hyperliquid/signed-exchange.d.ts.map +1 -0
- package/dist/core/hyperliquid/signed-exchange.js +23 -0
- package/dist/core/hyperliquid/signed-exchange.js.map +1 -0
- package/dist/core/hyperliquid/signing.d.ts +23 -0
- package/dist/core/hyperliquid/signing.d.ts.map +1 -0
- package/dist/core/hyperliquid/signing.js +65 -0
- package/dist/core/hyperliquid/signing.js.map +1 -0
- package/dist/core/hyperliquid/types.d.ts +11 -0
- package/dist/core/hyperliquid/types.d.ts.map +1 -0
- package/dist/core/hyperliquid/types.js +2 -0
- package/dist/core/hyperliquid/types.js.map +1 -0
- package/dist/core/hyperliquid/watchOrders.d.ts +10 -0
- package/dist/core/hyperliquid/watchOrders.d.ts.map +1 -0
- package/dist/core/hyperliquid/watchOrders.js +38 -0
- package/dist/core/hyperliquid/watchOrders.js.map +1 -0
- package/dist/core/state/bracketReconcile.d.ts +23 -0
- package/dist/core/state/bracketReconcile.d.ts.map +1 -0
- package/dist/core/state/bracketReconcile.js +297 -0
- package/dist/core/state/bracketReconcile.js.map +1 -0
- package/dist/core/state/cancelOpenPlan.d.ts +23 -0
- package/dist/core/state/cancelOpenPlan.d.ts.map +1 -0
- package/dist/core/state/cancelOpenPlan.js +126 -0
- package/dist/core/state/cancelOpenPlan.js.map +1 -0
- package/dist/core/state/gcTradeState.d.ts +13 -0
- package/dist/core/state/gcTradeState.d.ts.map +1 -0
- package/dist/core/state/gcTradeState.js +48 -0
- package/dist/core/state/gcTradeState.js.map +1 -0
- package/dist/core/state/gridReconcile.d.ts +46 -0
- package/dist/core/state/gridReconcile.d.ts.map +1 -0
- package/dist/core/state/gridReconcile.js +307 -0
- package/dist/core/state/gridReconcile.js.map +1 -0
- package/dist/core/state/intentFactory.d.ts +58 -0
- package/dist/core/state/intentFactory.d.ts.map +1 -0
- package/dist/core/state/intentFactory.js +95 -0
- package/dist/core/state/intentFactory.js.map +1 -0
- package/dist/core/state/present.d.ts +17 -0
- package/dist/core/state/present.d.ts.map +1 -0
- package/dist/core/state/present.js +100 -0
- package/dist/core/state/present.js.map +1 -0
- package/dist/core/state/runCancelOpen.d.ts +32 -0
- package/dist/core/state/runCancelOpen.d.ts.map +1 -0
- package/dist/core/state/runCancelOpen.js +101 -0
- package/dist/core/state/runCancelOpen.js.map +1 -0
- package/dist/core/state/runReconcile.d.ts +20 -0
- package/dist/core/state/runReconcile.d.ts.map +1 -0
- package/dist/core/state/runReconcile.js +248 -0
- package/dist/core/state/runReconcile.js.map +1 -0
- package/dist/core/state/schema.d.ts +1161 -0
- package/dist/core/state/schema.d.ts.map +1 -0
- package/dist/core/state/schema.js +151 -0
- package/dist/core/state/schema.js.map +1 -0
- package/dist/core/state/snapshot.d.ts +22 -0
- package/dist/core/state/snapshot.d.ts.map +1 -0
- package/dist/core/state/snapshot.js +115 -0
- package/dist/core/state/snapshot.js.map +1 -0
- package/dist/core/state/statePaths.d.ts +2 -0
- package/dist/core/state/statePaths.d.ts.map +1 -0
- package/dist/core/state/statePaths.js +7 -0
- package/dist/core/state/statePaths.js.map +1 -0
- package/dist/core/state/store.d.ts +12 -0
- package/dist/core/state/store.d.ts.map +1 -0
- package/dist/core/state/store.js +95 -0
- package/dist/core/state/store.js.map +1 -0
- package/dist/core/state/types.d.ts +40 -0
- package/dist/core/state/types.d.ts.map +1 -0
- package/dist/core/state/types.js +2 -0
- package/dist/core/state/types.js.map +1 -0
- package/dist/core/trading.d.ts +8 -0
- package/dist/core/trading.d.ts.map +1 -0
- package/dist/core/trading.js +22 -0
- package/dist/core/trading.js.map +1 -0
- package/dist/core/wallet.d.ts +3 -0
- package/dist/core/wallet.d.ts.map +1 -0
- package/dist/core/wallet.js +14 -0
- package/dist/core/wallet.js.map +1 -0
- package/dist/daemon/index.d.ts +3 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +104 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/meta/version.d.ts +2 -0
- package/dist/meta/version.d.ts.map +1 -0
- package/dist/meta/version.js +12 -0
- package/dist/meta/version.js.map +1 -0
- package/dist/strategies/grid.d.ts +46 -0
- package/dist/strategies/grid.d.ts.map +1 -0
- package/dist/strategies/grid.js +101 -0
- package/dist/strategies/grid.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { ConfigError } from "../core/errors.js";
|
|
3
|
+
import { loadEffectiveConfig, requireUserContext } from "../core/config.js";
|
|
4
|
+
import { HyperliquidInfoClient } from "../core/hyperliquid/client.js";
|
|
5
|
+
import { HyperliquidExchangeClient } from "../core/hyperliquid/exchange.js";
|
|
6
|
+
import { perpCoinToExchangeAssetId } from "../core/hyperliquid/asset.js";
|
|
7
|
+
import { buildCancelOrdersAction, buildPlaceOrderAction, buildTpslTriggerOrderAction, } from "../core/hyperliquid/orders.js";
|
|
8
|
+
import { buildSignedExchangePayload } from "../core/hyperliquid/signed-exchange.js";
|
|
9
|
+
import { diffOrderSnapshots, fetchOpenOrdersSnapshot } from "../core/hyperliquid/watchOrders.js";
|
|
10
|
+
import { requireTraderWallet } from "../core/trading.js";
|
|
11
|
+
import { extractOrderOidsFromExchangeResponse } from "../core/hyperliquid/exchangeParse.js";
|
|
12
|
+
import { createBracketIntentRecord, createSingleLimitIntentRecord, createStandaloneTpslIntentRecord, } from "../core/state/intentFactory.js";
|
|
13
|
+
import { summarizeIntent } from "../core/state/present.js";
|
|
14
|
+
import { runTradeReconcile } from "../core/state/runReconcile.js";
|
|
15
|
+
import { upsertIntentInStateFileAtomic } from "../core/state/store.js";
|
|
16
|
+
import { requireStdinYes } from "./confirm.js";
|
|
17
|
+
import { inferHlDexFromPrefixedCoin, logVerbose, printJson, readGlobalOptions, resolveTradeStatePath, } from "./util.js";
|
|
18
|
+
function parseTif(raw) {
|
|
19
|
+
const s = raw.trim();
|
|
20
|
+
if (s === "Gtc" || s === "Ioc" || s === "Alo") {
|
|
21
|
+
return s;
|
|
22
|
+
}
|
|
23
|
+
throw new ConfigError(`Invalid --tif '${raw}'. Use Gtc | Ioc | Alo.`);
|
|
24
|
+
}
|
|
25
|
+
function parseTpslKind(raw) {
|
|
26
|
+
const s = raw.trim().toLowerCase();
|
|
27
|
+
if (s === "tp" || s === "sl") {
|
|
28
|
+
return s;
|
|
29
|
+
}
|
|
30
|
+
throw new ConfigError(`Invalid --tpsl '${raw}'. Use tp | sl.`);
|
|
31
|
+
}
|
|
32
|
+
function parseOrderGrouping(raw) {
|
|
33
|
+
const s = raw.trim();
|
|
34
|
+
if (s === "na" || s === "normalTpsl" || s === "positionTpsl") {
|
|
35
|
+
return s;
|
|
36
|
+
}
|
|
37
|
+
throw new ConfigError(`Invalid --grouping '${raw}'. Use na | normalTpsl | positionTpsl.`);
|
|
38
|
+
}
|
|
39
|
+
function isMainnet(cfg) {
|
|
40
|
+
return cfg.network === "mainnet";
|
|
41
|
+
}
|
|
42
|
+
function filterOrdersByCoin(snapshot, coin) {
|
|
43
|
+
if (!coin) {
|
|
44
|
+
return snapshot;
|
|
45
|
+
}
|
|
46
|
+
if (!Array.isArray(snapshot)) {
|
|
47
|
+
return snapshot;
|
|
48
|
+
}
|
|
49
|
+
return snapshot.filter((o) => {
|
|
50
|
+
if (typeof o !== "object" || o === null) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return o.coin === coin;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function sleep(ms, signal) {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
if (signal.aborted) {
|
|
59
|
+
reject(Object.assign(new Error("aborted"), { name: "AbortError" }));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const t = setTimeout(() => {
|
|
63
|
+
signal.removeEventListener("abort", onAbort);
|
|
64
|
+
resolve();
|
|
65
|
+
}, ms);
|
|
66
|
+
const onAbort = () => {
|
|
67
|
+
clearTimeout(t);
|
|
68
|
+
signal.removeEventListener("abort", onAbort);
|
|
69
|
+
reject(Object.assign(new Error("aborted"), { name: "AbortError" }));
|
|
70
|
+
};
|
|
71
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function attachTradingCli(program) {
|
|
75
|
+
const order = program.command("order").description("Perp order commands (exchange / Phase 2)");
|
|
76
|
+
order
|
|
77
|
+
.command("place")
|
|
78
|
+
.requiredOption("--coin <sym>", "HL perp coin symbol (BTC, ETH, HIP-3 names, ...)")
|
|
79
|
+
.requiredOption("--side <side>", "buy | sell")
|
|
80
|
+
.requiredOption("--limit-px <px>", "limit price (decimal number)")
|
|
81
|
+
.requiredOption("--sz <sz>", "order size (decimal number)")
|
|
82
|
+
.option("--tif <tif>", "Gtc | Ioc | Alo", "Gtc")
|
|
83
|
+
.option("--reduce-only", "reduce-only", false)
|
|
84
|
+
.option("--cloid <hex>", "optional Cloid hex (0x + 32 hex chars)")
|
|
85
|
+
.option("--live", "sign + POST /exchange", false)
|
|
86
|
+
.option("--assume-yes", "with --live: skip stdin YES (dangerous)", false)
|
|
87
|
+
.option("--dex <dex>", "HIP-3 perp dex for meta resolution (omit: infer deployer prefix from COIN)")
|
|
88
|
+
.option("--state-file <path>", "Override root --state-file or JCC_HYPER_STATE_FILE; default ~/.jcc_hyper_tool/trade-state.json")
|
|
89
|
+
.action(async (opts, command) => {
|
|
90
|
+
const o = opts;
|
|
91
|
+
const globals = readGlobalOptions(command);
|
|
92
|
+
const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
|
|
93
|
+
const side = String(o.side ?? "").toLowerCase();
|
|
94
|
+
if (side !== "buy" && side !== "sell") {
|
|
95
|
+
throw new ConfigError(`Invalid --side (buy|sell): ${o.side}`);
|
|
96
|
+
}
|
|
97
|
+
const isBuy = side === "buy";
|
|
98
|
+
const limitPx = Number(o.limitPx);
|
|
99
|
+
const sz = Number(o.sz);
|
|
100
|
+
if (!Number.isFinite(limitPx) || !Number.isFinite(sz)) {
|
|
101
|
+
throw new ConfigError("--limit-px / --sz must be finite numbers.");
|
|
102
|
+
}
|
|
103
|
+
const tif = parseTif(String(o.tif ?? "Gtc"));
|
|
104
|
+
const clRaw = o.cloid?.trim();
|
|
105
|
+
if (clRaw) {
|
|
106
|
+
if (!/^0x[0-9a-f]{32}$/i.test(clRaw)) {
|
|
107
|
+
throw new ConfigError("Invalid --cloid (expect exactly 128-bit hex, e.g. 0xf…32 hex)");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const coin = o.coin ?? "";
|
|
111
|
+
const dex = o.dex?.trim() || inferHlDexFromPrefixedCoin(coin);
|
|
112
|
+
logVerbose(command, `[order place] coin=${coin} dex=${dex ?? "(default)"} fetch meta`);
|
|
113
|
+
const info = new HyperliquidInfoClient({ infoOrigin: cfg.infoOrigin });
|
|
114
|
+
const meta = await info.meta(dex);
|
|
115
|
+
const perpDexs = dex ? await info.perpDexs() : undefined;
|
|
116
|
+
const assetIndex = perpCoinToExchangeAssetId({
|
|
117
|
+
coin,
|
|
118
|
+
meta,
|
|
119
|
+
dex,
|
|
120
|
+
perpDexs,
|
|
121
|
+
});
|
|
122
|
+
const action = buildPlaceOrderAction({
|
|
123
|
+
assetIndex,
|
|
124
|
+
isBuy,
|
|
125
|
+
limitPx,
|
|
126
|
+
sz,
|
|
127
|
+
reduceOnly: Boolean(o.reduceOnly),
|
|
128
|
+
tif,
|
|
129
|
+
cloidHex: clRaw ? clRaw.toLowerCase() : undefined,
|
|
130
|
+
});
|
|
131
|
+
const statePath = resolveTradeStatePath(command, o.stateFile);
|
|
132
|
+
let singleRec;
|
|
133
|
+
const nowMs = Date.now();
|
|
134
|
+
if (statePath) {
|
|
135
|
+
singleRec = createSingleLimitIntentRecord({
|
|
136
|
+
nowMs,
|
|
137
|
+
coin,
|
|
138
|
+
dex,
|
|
139
|
+
entrySide: isBuy ? "buy" : "sell",
|
|
140
|
+
limitPx,
|
|
141
|
+
sz,
|
|
142
|
+
tif,
|
|
143
|
+
reduceOnly: Boolean(o.reduceOnly),
|
|
144
|
+
});
|
|
145
|
+
await upsertIntentInStateFileAtomic(statePath, singleRec, [
|
|
146
|
+
{
|
|
147
|
+
t: nowMs,
|
|
148
|
+
intentId: singleRec.id,
|
|
149
|
+
type: "intent_created",
|
|
150
|
+
message: "single_limit",
|
|
151
|
+
},
|
|
152
|
+
], nowMs);
|
|
153
|
+
}
|
|
154
|
+
const live = Boolean(o.live);
|
|
155
|
+
if (!live) {
|
|
156
|
+
printJson({
|
|
157
|
+
mode: "dry_run",
|
|
158
|
+
preview: {
|
|
159
|
+
network: cfg.network,
|
|
160
|
+
coin,
|
|
161
|
+
dex: dex ?? null,
|
|
162
|
+
assetIndex,
|
|
163
|
+
side,
|
|
164
|
+
limitPx,
|
|
165
|
+
sz,
|
|
166
|
+
tif,
|
|
167
|
+
reduceOnly: Boolean(o.reduceOnly),
|
|
168
|
+
action,
|
|
169
|
+
},
|
|
170
|
+
stateIntentId: singleRec?.id ?? null,
|
|
171
|
+
note: "No signing or exchange request. Provide private key env for --live submissions (requires YES unless --assume-yes).",
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const trader = requireTraderWallet(cfg);
|
|
176
|
+
process.stderr.write(`LIVE order preview:\n${JSON.stringify({ action }, null, 2)}\n`);
|
|
177
|
+
if (!o.assumeYes) {
|
|
178
|
+
await requireStdinYes("Type YES to submit this LIVE order:\n");
|
|
179
|
+
}
|
|
180
|
+
const ex = new HyperliquidExchangeClient({ apiOrigin: cfg.infoOrigin });
|
|
181
|
+
const body = await buildSignedExchangePayload(trader.wallet, action, {
|
|
182
|
+
isMainnet: isMainnet(cfg),
|
|
183
|
+
});
|
|
184
|
+
const resp = await ex.exchange(body);
|
|
185
|
+
if (statePath && singleRec) {
|
|
186
|
+
const oids = extractOrderOidsFromExchangeResponse(resp);
|
|
187
|
+
const oid = oids[0];
|
|
188
|
+
const updated = {
|
|
189
|
+
...singleRec,
|
|
190
|
+
oid: typeof oid === "number" ? oid : singleRec.oid,
|
|
191
|
+
updatedAtMs: Date.now(),
|
|
192
|
+
};
|
|
193
|
+
await upsertIntentInStateFileAtomic(statePath, updated, [{ t: Date.now(), intentId: updated.id, type: "live_response", message: "oid assigned" }], Date.now());
|
|
194
|
+
}
|
|
195
|
+
printJson(resp);
|
|
196
|
+
});
|
|
197
|
+
order
|
|
198
|
+
.command("cancel")
|
|
199
|
+
.requiredOption("--coin <sym>", "HL perp coin symbol")
|
|
200
|
+
.requiredOption("--oid <oid>", "order id (oid from HL)")
|
|
201
|
+
.option("--live", "sign + POST /exchange", false)
|
|
202
|
+
.option("--assume-yes", "skip stdin YES with --live (dangerous)", false)
|
|
203
|
+
.option("--dex <dex>", "HIP-3 perp dex for meta resolution (omit: infer deployer prefix from COIN)")
|
|
204
|
+
.action(async (opts, command) => {
|
|
205
|
+
const o = opts;
|
|
206
|
+
const globals = readGlobalOptions(command);
|
|
207
|
+
const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
|
|
208
|
+
const oid = Number(o.oid ?? "");
|
|
209
|
+
if (!Number.isFinite(oid) || oid <= 0 || !Number.isInteger(oid)) {
|
|
210
|
+
throw new ConfigError("--oid must be a positive integer");
|
|
211
|
+
}
|
|
212
|
+
const coin = o.coin ?? "";
|
|
213
|
+
const dex = o.dex?.trim() || inferHlDexFromPrefixedCoin(coin);
|
|
214
|
+
logVerbose(command, `[order cancel] coin=${coin} dex=${dex ?? "(default)"} fetch meta`);
|
|
215
|
+
const info = new HyperliquidInfoClient({ infoOrigin: cfg.infoOrigin });
|
|
216
|
+
const meta = await info.meta(dex);
|
|
217
|
+
const perpDexs = dex ? await info.perpDexs() : undefined;
|
|
218
|
+
const assetIndex = perpCoinToExchangeAssetId({
|
|
219
|
+
coin,
|
|
220
|
+
meta,
|
|
221
|
+
dex,
|
|
222
|
+
perpDexs,
|
|
223
|
+
});
|
|
224
|
+
const action = buildCancelOrdersAction(assetIndex, [oid]);
|
|
225
|
+
const live = Boolean(o.live);
|
|
226
|
+
if (!live) {
|
|
227
|
+
printJson({
|
|
228
|
+
mode: "dry_run",
|
|
229
|
+
preview: { coin, dex: dex ?? null, assetIndex, oid, action },
|
|
230
|
+
note: "No signing or exchange request. Provide private key for --live (requires YES unless --assume-yes).",
|
|
231
|
+
});
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const trader = requireTraderWallet(cfg);
|
|
235
|
+
process.stderr.write(`LIVE cancel preview:\n${JSON.stringify({ action }, null, 2)}\n`);
|
|
236
|
+
if (!o.assumeYes) {
|
|
237
|
+
await requireStdinYes("Type YES to submit this LIVE cancel:\n");
|
|
238
|
+
}
|
|
239
|
+
const ex = new HyperliquidExchangeClient({ apiOrigin: cfg.infoOrigin });
|
|
240
|
+
const body = await buildSignedExchangePayload(trader.wallet, action, {
|
|
241
|
+
isMainnet: isMainnet(cfg),
|
|
242
|
+
});
|
|
243
|
+
printJson(await ex.exchange(body));
|
|
244
|
+
});
|
|
245
|
+
order
|
|
246
|
+
.command("tpsl")
|
|
247
|
+
.description("Take-profit / stop-loss trigger perp order (dry-run unless --live)")
|
|
248
|
+
.requiredOption("--coin <sym>", "HL perp coin symbol (BTC, ETH, HIP-3 names, ...)")
|
|
249
|
+
.requiredOption("--side <side>", "buy | sell")
|
|
250
|
+
.requiredOption("--sz <sz>", "order size (decimal number)")
|
|
251
|
+
.requiredOption("--trigger-px <px>", "trigger price (decimal number)")
|
|
252
|
+
.requiredOption("--tpsl <kind>", "tp | sl")
|
|
253
|
+
.option("--is-market", "execute as market after trigger", false)
|
|
254
|
+
.option("--limit-px <px>", "limit price after trigger (omit when --is-market)")
|
|
255
|
+
.option("--no-reduce-only", "allow orders that increase position (default is reduce-only)")
|
|
256
|
+
.option("--cloid <hex>", "optional Cloid hex (0x + 32 hex chars)")
|
|
257
|
+
.option("--live", "sign + POST /exchange", false)
|
|
258
|
+
.option("--assume-yes", "with --live: skip stdin YES (dangerous)", false)
|
|
259
|
+
.option("--dex <dex>", "HIP-3 perp dex for meta resolution (omit: infer deployer prefix from COIN)")
|
|
260
|
+
.option("--grouping <g>", "order grouping: na | normalTpsl | positionTpsl", "na")
|
|
261
|
+
.option("--state-file <path>", "Override root --state-file or JCC_HYPER_STATE_FILE; default ~/.jcc_hyper_tool/trade-state.json")
|
|
262
|
+
.action(async (opts, command) => {
|
|
263
|
+
const o = opts;
|
|
264
|
+
const globals = readGlobalOptions(command);
|
|
265
|
+
const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
|
|
266
|
+
const side = String(o.side ?? "").toLowerCase();
|
|
267
|
+
if (side !== "buy" && side !== "sell") {
|
|
268
|
+
throw new ConfigError(`Invalid --side (buy|sell): ${o.side}`);
|
|
269
|
+
}
|
|
270
|
+
const isBuy = side === "buy";
|
|
271
|
+
const grouping = parseOrderGrouping(String(o.grouping ?? "na"));
|
|
272
|
+
if (grouping === "positionTpsl" && o.reduceOnly === false) {
|
|
273
|
+
throw new ConfigError("--grouping positionTpsl requires reduce-only — do not pass --no-reduce-only.");
|
|
274
|
+
}
|
|
275
|
+
const triggerPxRaw = Number(o.triggerPx ?? "");
|
|
276
|
+
if (!Number.isFinite(triggerPxRaw) || triggerPxRaw <= 0) {
|
|
277
|
+
throw new ConfigError("--trigger-px must be a finite number greater than 0.");
|
|
278
|
+
}
|
|
279
|
+
const szNum = Number(o.sz ?? "");
|
|
280
|
+
if (!Number.isFinite(szNum)) {
|
|
281
|
+
throw new ConfigError("--sz must be a finite number.");
|
|
282
|
+
}
|
|
283
|
+
if (grouping === "positionTpsl") {
|
|
284
|
+
if (szNum < 0) {
|
|
285
|
+
throw new ConfigError("--sz must be >= 0 when --grouping positionTpsl.");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else if (szNum <= 0) {
|
|
289
|
+
throw new ConfigError("--sz must be a finite number greater than 0.");
|
|
290
|
+
}
|
|
291
|
+
const tpslKind = parseTpslKind(String(o.tpsl ?? ""));
|
|
292
|
+
const isMarket = Boolean(o.isMarket);
|
|
293
|
+
const limitPxTrim = o.limitPx?.trim();
|
|
294
|
+
const hasLimitPx = Boolean(limitPxTrim);
|
|
295
|
+
if (isMarket && hasLimitPx) {
|
|
296
|
+
throw new ConfigError("--is-market cannot be combined with --limit-px.");
|
|
297
|
+
}
|
|
298
|
+
if (!isMarket && !hasLimitPx) {
|
|
299
|
+
throw new ConfigError("Pass either --is-market (trigger then market), or omit --is-market and pass --limit-px (trigger then limit).");
|
|
300
|
+
}
|
|
301
|
+
let wireLimitPx;
|
|
302
|
+
if (!isMarket) {
|
|
303
|
+
const lp = Number(limitPxTrim);
|
|
304
|
+
if (!Number.isFinite(lp) || lp <= 0) {
|
|
305
|
+
throw new ConfigError("--limit-px must be a finite number greater than 0.");
|
|
306
|
+
}
|
|
307
|
+
wireLimitPx = lp;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
wireLimitPx = triggerPxRaw;
|
|
311
|
+
}
|
|
312
|
+
const clRaw = o.cloid?.trim();
|
|
313
|
+
if (clRaw) {
|
|
314
|
+
if (!/^0x[0-9a-f]{32}$/i.test(clRaw)) {
|
|
315
|
+
throw new ConfigError("Invalid --cloid (expect exactly 128-bit hex, e.g. 0xf…32 hex)");
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const coin = o.coin ?? "";
|
|
319
|
+
const dex = o.dex?.trim() || inferHlDexFromPrefixedCoin(coin);
|
|
320
|
+
logVerbose(command, `[order tpsl] coin=${coin} dex=${dex ?? "(default)"} fetch meta`);
|
|
321
|
+
const info = new HyperliquidInfoClient({ infoOrigin: cfg.infoOrigin });
|
|
322
|
+
const meta = await info.meta(dex);
|
|
323
|
+
const perpDexs = dex ? await info.perpDexs() : undefined;
|
|
324
|
+
const assetIndex = perpCoinToExchangeAssetId({
|
|
325
|
+
coin,
|
|
326
|
+
meta,
|
|
327
|
+
dex,
|
|
328
|
+
perpDexs,
|
|
329
|
+
});
|
|
330
|
+
const reduceOnly = grouping === "positionTpsl" ? true : o.reduceOnly !== false;
|
|
331
|
+
const sz = szNum;
|
|
332
|
+
const action = buildTpslTriggerOrderAction({
|
|
333
|
+
assetIndex,
|
|
334
|
+
isBuy,
|
|
335
|
+
sz,
|
|
336
|
+
reduceOnly,
|
|
337
|
+
triggerPx: triggerPxRaw,
|
|
338
|
+
isMarket,
|
|
339
|
+
wireLimitPx,
|
|
340
|
+
tpsl: tpslKind,
|
|
341
|
+
cloidHex: clRaw ? clRaw.toLowerCase() : undefined,
|
|
342
|
+
}, { grouping });
|
|
343
|
+
const statePathT = resolveTradeStatePath(command, o.stateFile);
|
|
344
|
+
let tpslRec;
|
|
345
|
+
const tpslNow = Date.now();
|
|
346
|
+
if (statePathT) {
|
|
347
|
+
tpslRec = createStandaloneTpslIntentRecord({
|
|
348
|
+
nowMs: tpslNow,
|
|
349
|
+
coin,
|
|
350
|
+
dex,
|
|
351
|
+
side: isBuy ? "buy" : "sell",
|
|
352
|
+
sz,
|
|
353
|
+
triggerPx: triggerPxRaw,
|
|
354
|
+
tpsl: tpslKind,
|
|
355
|
+
isMarket,
|
|
356
|
+
limitPx: isMarket ? undefined : wireLimitPx,
|
|
357
|
+
reduceOnly,
|
|
358
|
+
});
|
|
359
|
+
await upsertIntentInStateFileAtomic(statePathT, tpslRec, [
|
|
360
|
+
{
|
|
361
|
+
t: tpslNow,
|
|
362
|
+
intentId: tpslRec.id,
|
|
363
|
+
type: "intent_created",
|
|
364
|
+
message: "standalone_tpsl",
|
|
365
|
+
},
|
|
366
|
+
], tpslNow);
|
|
367
|
+
}
|
|
368
|
+
const live = Boolean(o.live);
|
|
369
|
+
if (!live) {
|
|
370
|
+
const baseNote = "No signing or exchange request. Provide private key env for --live submissions (requires YES unless --assume-yes).";
|
|
371
|
+
const marketNote = " For --is-market, the wire price field `p` is still set — this preview uses `triggerPx` as `p`.";
|
|
372
|
+
printJson({
|
|
373
|
+
mode: "dry_run",
|
|
374
|
+
preview: {
|
|
375
|
+
network: cfg.network,
|
|
376
|
+
coin,
|
|
377
|
+
dex: dex ?? null,
|
|
378
|
+
assetIndex,
|
|
379
|
+
side,
|
|
380
|
+
sz,
|
|
381
|
+
grouping,
|
|
382
|
+
triggerPx: triggerPxRaw,
|
|
383
|
+
tpsl: tpslKind,
|
|
384
|
+
isMarket,
|
|
385
|
+
limitPx: wireLimitPx,
|
|
386
|
+
reduceOnly,
|
|
387
|
+
action,
|
|
388
|
+
},
|
|
389
|
+
stateIntentId: tpslRec?.id ?? null,
|
|
390
|
+
note: isMarket ? baseNote + marketNote : baseNote,
|
|
391
|
+
});
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const trader = requireTraderWallet(cfg);
|
|
395
|
+
process.stderr.write(`LIVE tpsl preview:\n${JSON.stringify({ action }, null, 2)}\n`);
|
|
396
|
+
if (!o.assumeYes) {
|
|
397
|
+
await requireStdinYes("Type YES to submit this LIVE tpsl order:\n");
|
|
398
|
+
}
|
|
399
|
+
const ex = new HyperliquidExchangeClient({ apiOrigin: cfg.infoOrigin });
|
|
400
|
+
const body = await buildSignedExchangePayload(trader.wallet, action, {
|
|
401
|
+
isMainnet: isMainnet(cfg),
|
|
402
|
+
});
|
|
403
|
+
const tpslResp = await ex.exchange(body);
|
|
404
|
+
if (statePathT && tpslRec) {
|
|
405
|
+
const oids = extractOrderOidsFromExchangeResponse(tpslResp);
|
|
406
|
+
const oid = oids[0];
|
|
407
|
+
const updated = {
|
|
408
|
+
...tpslRec,
|
|
409
|
+
oid: typeof oid === "number" ? oid : tpslRec.oid,
|
|
410
|
+
updatedAtMs: Date.now(),
|
|
411
|
+
};
|
|
412
|
+
await upsertIntentInStateFileAtomic(statePathT, updated, [{ t: Date.now(), intentId: updated.id, type: "live_response" }], Date.now());
|
|
413
|
+
}
|
|
414
|
+
printJson(tpslResp);
|
|
415
|
+
});
|
|
416
|
+
order
|
|
417
|
+
.command("bracket")
|
|
418
|
+
.description("Bracket intent: entry limit, then TP/SL only after entry fills (local state + reconcile)")
|
|
419
|
+
.requiredOption("--coin <sym>", "HL perp coin symbol (BTC, ETH, HIP-3 names, ...)")
|
|
420
|
+
.requiredOption("--side <side>", "buy | sell")
|
|
421
|
+
.requiredOption("--limit-px <px>", "entry limit price (decimal number)")
|
|
422
|
+
.requiredOption("--sz <sz>", "entry order size (decimal number)")
|
|
423
|
+
.requiredOption("--tp <px>", "take-profit trigger price")
|
|
424
|
+
.requiredOption("--sl <px>", "stop-loss trigger price")
|
|
425
|
+
.option("--state-file <path>", "Override root --state-file or JCC_HYPER_STATE_FILE; default ~/.jcc_hyper_tool/trade-state.json")
|
|
426
|
+
.option("--tif <tif>", "Gtc | Ioc | Alo", "Gtc")
|
|
427
|
+
.option("--reduce-only", "reduce-only on entry leg", false)
|
|
428
|
+
.option("--is-market", "TP/SL execute as market after trigger", false)
|
|
429
|
+
.option("--protection-limit-px <px>", "When not --is-market: limit price after TP/SL trigger (shared for both legs)")
|
|
430
|
+
.option("--expires-in-ms <n>", "optional TTL from now; expires working entry leg")
|
|
431
|
+
.option("--live", "Create intent + run reconcile LIVE (places exchange orders)", false)
|
|
432
|
+
.option("--assume-yes", "with --live: skip confirmations where applicable", false)
|
|
433
|
+
.option("--dex <dex>", "HIP-3 perp dex for meta resolution (omit: infer deployer prefix from COIN)")
|
|
434
|
+
.action(async (opts, command) => {
|
|
435
|
+
const o = opts;
|
|
436
|
+
const globals = readGlobalOptions(command);
|
|
437
|
+
const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
|
|
438
|
+
const side = String(o.side ?? "").toLowerCase();
|
|
439
|
+
if (side !== "buy" && side !== "sell") {
|
|
440
|
+
throw new ConfigError(`Invalid --side (buy|sell): ${o.side}`);
|
|
441
|
+
}
|
|
442
|
+
const entrySide = side === "buy" ? "buy" : "sell";
|
|
443
|
+
const limitPx = Number(o.limitPx);
|
|
444
|
+
const sz = Number(o.sz);
|
|
445
|
+
const tp = Number(o.tp);
|
|
446
|
+
const sl = Number(o.sl);
|
|
447
|
+
if (!Number.isFinite(limitPx) || !Number.isFinite(sz) || sz <= 0) {
|
|
448
|
+
throw new ConfigError("--limit-px and --sz must be finite; --sz must be > 0.");
|
|
449
|
+
}
|
|
450
|
+
if (!Number.isFinite(tp) || !Number.isFinite(sl) || tp <= 0 || sl <= 0) {
|
|
451
|
+
throw new ConfigError("--tp / --sl must be finite numbers > 0.");
|
|
452
|
+
}
|
|
453
|
+
const isMarket = Boolean(o.isMarket);
|
|
454
|
+
const protLimRaw = o.protectionLimitPx?.trim();
|
|
455
|
+
if (isMarket && protLimRaw) {
|
|
456
|
+
throw new ConfigError("--is-market cannot be combined with --protection-limit-px.");
|
|
457
|
+
}
|
|
458
|
+
if (!isMarket && !protLimRaw) {
|
|
459
|
+
throw new ConfigError("Pass --is-market for market-after-trigger TP/SL, or pass --protection-limit-px for limit-after-trigger.");
|
|
460
|
+
}
|
|
461
|
+
let tpslLimitPx;
|
|
462
|
+
if (!isMarket) {
|
|
463
|
+
const lp = Number(protLimRaw);
|
|
464
|
+
if (!Number.isFinite(lp) || lp <= 0) {
|
|
465
|
+
throw new ConfigError("--protection-limit-px must be a finite number > 0.");
|
|
466
|
+
}
|
|
467
|
+
tpslLimitPx = lp;
|
|
468
|
+
}
|
|
469
|
+
const tif = parseTif(String(o.tif ?? "Gtc"));
|
|
470
|
+
const coin = o.coin ?? "";
|
|
471
|
+
const dex = o.dex?.trim() || inferHlDexFromPrefixedCoin(coin);
|
|
472
|
+
let expiresAtMs;
|
|
473
|
+
if (o.expiresInMs !== undefined && o.expiresInMs !== "") {
|
|
474
|
+
const n = Number(o.expiresInMs);
|
|
475
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
476
|
+
throw new ConfigError("--expires-in-ms must be a positive number.");
|
|
477
|
+
}
|
|
478
|
+
expiresAtMs = Date.now() + n;
|
|
479
|
+
}
|
|
480
|
+
const statePath = resolveTradeStatePath(command, o.stateFile);
|
|
481
|
+
if (!statePath) {
|
|
482
|
+
throw new ConfigError("`order bracket` requires local trade state; remove `--no-state` or pass `--state-file`.");
|
|
483
|
+
}
|
|
484
|
+
const nowMs = Date.now();
|
|
485
|
+
const intent = createBracketIntentRecord({
|
|
486
|
+
nowMs,
|
|
487
|
+
coin,
|
|
488
|
+
dex,
|
|
489
|
+
network: cfg.network,
|
|
490
|
+
entrySide,
|
|
491
|
+
entryLimitPx: limitPx,
|
|
492
|
+
entrySz: sz,
|
|
493
|
+
tif,
|
|
494
|
+
entryReduceOnly: Boolean(o.reduceOnly),
|
|
495
|
+
tpTriggerPx: tp,
|
|
496
|
+
slTriggerPx: sl,
|
|
497
|
+
tpslIsMarket: isMarket,
|
|
498
|
+
tpslLimitPx,
|
|
499
|
+
expiresAtMs,
|
|
500
|
+
});
|
|
501
|
+
await upsertIntentInStateFileAtomic(statePath, intent, [
|
|
502
|
+
{
|
|
503
|
+
t: nowMs,
|
|
504
|
+
intentId: intent.id,
|
|
505
|
+
type: "intent_created",
|
|
506
|
+
message: "bracket",
|
|
507
|
+
},
|
|
508
|
+
], nowMs);
|
|
509
|
+
const rec = await runTradeReconcile({
|
|
510
|
+
statePath,
|
|
511
|
+
cfg,
|
|
512
|
+
mode: o.live ? "live" : "dry",
|
|
513
|
+
assumeYes: Boolean(o.assumeYes),
|
|
514
|
+
intentFilter: intent.id,
|
|
515
|
+
confirmLive: (p) => requireStdinYes(p),
|
|
516
|
+
});
|
|
517
|
+
const row = rec.state.intents[intent.id];
|
|
518
|
+
if (!row || row.kind !== "bracket") {
|
|
519
|
+
throw new ConfigError("Bracket intent missing after reconcile.");
|
|
520
|
+
}
|
|
521
|
+
printJson({
|
|
522
|
+
bracketIntentId: intent.id,
|
|
523
|
+
reconcile: {
|
|
524
|
+
mode: o.live ? "live" : "dry",
|
|
525
|
+
actionsExecuted: rec.actionsExecuted,
|
|
526
|
+
dryPlan: rec.dryPlan,
|
|
527
|
+
},
|
|
528
|
+
summary: summarizeIntent(row),
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
program
|
|
532
|
+
.command("watch")
|
|
533
|
+
.description("Poll open orders (HTTP) and print JSON lines on change")
|
|
534
|
+
.addCommand(new Command("orders")
|
|
535
|
+
.option("--poll-ms <n>", "poll interval (ms)", "2000")
|
|
536
|
+
.option("--coin <sym>", "filter to a single perp coin")
|
|
537
|
+
.option("--full", "include full snapshot object on each change", false)
|
|
538
|
+
.action(async (opts, command) => {
|
|
539
|
+
const globals = readGlobalOptions(command);
|
|
540
|
+
const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
|
|
541
|
+
const user = requireUserContext(cfg);
|
|
542
|
+
const pollMs = Number(opts.pollMs ?? "2000");
|
|
543
|
+
if (!Number.isFinite(pollMs) || pollMs < 500) {
|
|
544
|
+
throw new ConfigError("--poll-ms must be >= 500");
|
|
545
|
+
}
|
|
546
|
+
const client = new HyperliquidInfoClient({ infoOrigin: user.infoOrigin });
|
|
547
|
+
const ac = new AbortController();
|
|
548
|
+
process.on("SIGINT", () => ac.abort());
|
|
549
|
+
let prev = filterOrdersByCoin(await fetchOpenOrdersSnapshot(client, user), opts.coin);
|
|
550
|
+
process.stdout.write(`${JSON.stringify({
|
|
551
|
+
event: "watch_start",
|
|
552
|
+
at: Date.now(),
|
|
553
|
+
pollMs,
|
|
554
|
+
coin: opts.coin ?? null,
|
|
555
|
+
})}\n`);
|
|
556
|
+
try {
|
|
557
|
+
while (!ac.signal.aborted) {
|
|
558
|
+
await sleep(pollMs, ac.signal);
|
|
559
|
+
const next = filterOrdersByCoin(await fetchOpenOrdersSnapshot(client, user), opts.coin);
|
|
560
|
+
const diff = diffOrderSnapshots(prev, next);
|
|
561
|
+
const jsonChanged = JSON.stringify(prev) !== JSON.stringify(next);
|
|
562
|
+
if (jsonChanged) {
|
|
563
|
+
const line = {
|
|
564
|
+
event: "orders_changed",
|
|
565
|
+
at: Date.now(),
|
|
566
|
+
coin: opts.coin ?? null,
|
|
567
|
+
addedOids: diff.added,
|
|
568
|
+
removedOids: diff.removed,
|
|
569
|
+
};
|
|
570
|
+
if (opts.full) {
|
|
571
|
+
line.snapshot = next;
|
|
572
|
+
}
|
|
573
|
+
process.stdout.write(`${JSON.stringify(line)}\n`);
|
|
574
|
+
}
|
|
575
|
+
prev = next;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
catch (e) {
|
|
579
|
+
if (e instanceof Error && e.name === "AbortError") {
|
|
580
|
+
process.stdout.write(`${JSON.stringify({ event: "watch_stop", at: Date.now() })}\n`);
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
throw e;
|
|
584
|
+
}
|
|
585
|
+
}));
|
|
586
|
+
}
|
|
587
|
+
//# sourceMappingURL=tradingCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tradingCli.js","sourceRoot":"","sources":["../../src/cli/tradingCli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAEjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oCAAoC,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,0BAA0B,EAC1B,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,kBAAkB,GAAG,yBAAyB,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,mBAAmB,GAAG,iBAAiB,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,cAAc,EAAE,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,uBAAuB,GAAG,wCAAwC,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,SAAS,CAAC,GAAoB;IACrC,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAmB,EAAE,IAAa;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAQ,CAA6B,CAAC,IAAI,KAAK,IAAI,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAmB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAE/F,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,cAAc,CAAC,cAAc,EAAE,kDAAkD,CAAC;SAClF,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC;SAC7C,cAAc,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;SACjE,cAAc,CAAC,WAAW,EAAE,6BAA6B,CAAC;SAC1D,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,KAAK,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC;SAC7C,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,cAAc,EAAE,yCAAyC,EAAE,KAAK,CAAC;SACxE,MAAM,CACL,aAAa,EACb,4EAA4E,CAC7E;SACA,MAAM,CACL,qBAAqB,EACrB,gGAAgG,CACjG;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAc9B,MAAM,CAAC,GAAG,IAAe,CAAC;QAE1B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,WAAW,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC;QAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,WAAW,CAAC,2CAA2C,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,WAAW,CAAC,+DAA+D,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAC9D,UAAU,CAAC,OAAO,EAAE,sBAAsB,IAAI,QAAQ,GAAG,IAAI,WAAW,aAAa,CAAC,CAAC;QAEvF,MAAM,IAAI,GAAG,IAAI,qBAAqB,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,UAAU,GAAG,yBAAyB,CAAC;YAC3C,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,QAAQ;SACT,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACnC,UAAU;YACV,KAAK;YACL,OAAO;YACP,EAAE;YACF,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;YACjC,GAAG;YACH,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;SAClD,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,SAA8C,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,GAAG,6BAA6B,CAAC;gBACxC,KAAK;gBACL,IAAI;gBACJ,GAAG;gBACH,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gBACjC,OAAO;gBACP,EAAE;gBACF,GAAG;gBACH,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;aAClC,CAAC,CAAC;YACH,MAAM,6BAA6B,CACjC,SAAS,EACT,SAAS,EACT;gBACE;oBACE,CAAC,EAAE,KAAK;oBACR,QAAQ,EAAE,SAAS,CAAC,EAAE;oBACtB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,cAAc;iBACxB;aACF,EACD,KAAK,CACN,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,IAAI;oBACJ,GAAG,EAAE,GAAG,IAAI,IAAI;oBAChB,UAAU;oBACV,IAAI;oBACJ,OAAO;oBACP,EAAE;oBACF,GAAG;oBACH,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;oBACjC,MAAM;iBACP;gBACD,aAAa,EAAE,SAAS,EAAE,EAAE,IAAI,IAAI;gBACpC,IAAI,EAAE,oHAAoH;aAC3H,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAEtF,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,eAAe,CAAC,uCAAuC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,yBAAyB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;YACnE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,oCAAoC,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,OAAO,GAA4B;gBACvC,GAAG,SAAS;gBACZ,GAAG,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG;gBAClD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;aACxB,CAAC;YACF,MAAM,6BAA6B,CACjC,SAAS,EACT,OAAO,EACP,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EACzF,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,cAAc,CAAC,cAAc,EAAE,qBAAqB,CAAC;SACrD,cAAc,CAAC,aAAa,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,cAAc,EAAE,wCAAwC,EAAE,KAAK,CAAC;SACvE,MAAM,CACL,aAAa,EACb,4EAA4E,CAC7E;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAQ9B,MAAM,CAAC,GAAG,IAAe,CAAC;QAE1B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtF,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,WAAW,CAAC,kCAAkC,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAC9D,UAAU,CAAC,OAAO,EAAE,uBAAuB,IAAI,QAAQ,GAAG,IAAI,WAAW,aAAa,CAAC,CAAC;QAExF,MAAM,IAAI,GAAG,IAAI,qBAAqB,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,UAAU,GAAG,yBAAyB,CAAC;YAC3C,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,QAAQ;SACT,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE;gBAC5D,IAAI,EAAE,oGAAoG;aAC3G,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAEvF,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,eAAe,CAAC,wCAAwC,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,yBAAyB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;YACnE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;SAC1B,CAAC,CAAC;QACH,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oEAAoE,CAAC;SACjF,cAAc,CAAC,cAAc,EAAE,kDAAkD,CAAC;SAClF,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC;SAC7C,cAAc,CAAC,WAAW,EAAE,6BAA6B,CAAC;SAC1D,cAAc,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SACrE,cAAc,CAAC,eAAe,EAAE,SAAS,CAAC;SAC1C,MAAM,CAAC,aAAa,EAAE,iCAAiC,EAAE,KAAK,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;SAC9E,MAAM,CAAC,kBAAkB,EAAE,8DAA8D,CAAC;SAC1F,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,cAAc,EAAE,yCAAyC,EAAE,KAAK,CAAC;SACxE,MAAM,CACL,aAAa,EACb,4EAA4E,CAC7E;SACA,MAAM,CAAC,gBAAgB,EAAE,gDAAgD,EAAE,IAAI,CAAC;SAChF,MAAM,CACL,qBAAqB,EACrB,gGAAgG,CACjG;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAiB9B,MAAM,CAAC,GAAG,IAAe,CAAC;QAE1B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,WAAW,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC;QAE7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC;QAEhE,IAAI,QAAQ,KAAK,cAAc,IAAI,CAAC,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC1D,MAAM,IAAI,WAAW,CACnB,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,WAAW,CAAC,sDAAsD,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,WAAW,CAAC,+BAA+B,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;YAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,IAAI,WAAW,CAAC,iDAAiD,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,WAAW,CAAC,8CAA8C,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAExC,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,WAAW,CAAC,iDAAiD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,WAAW,CACnB,8GAA8G,CAC/G,CAAC;QACJ,CAAC;QAED,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,WAAW,CAAC,oDAAoD,CAAC,CAAC;YAC9E,CAAC;YACD,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,YAAY,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,WAAW,CAAC,+DAA+D,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAC9D,UAAU,CAAC,OAAO,EAAE,qBAAqB,IAAI,QAAQ,GAAG,IAAI,WAAW,aAAa,CAAC,CAAC;QAEtF,MAAM,IAAI,GAAG,IAAI,qBAAqB,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,UAAU,GAAG,yBAAyB,CAAC;YAC3C,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC;QAE/E,MAAM,EAAE,GAAG,KAAK,CAAC;QAEjB,MAAM,MAAM,GAAG,2BAA2B,CACxC;YACE,UAAU;YACV,KAAK;YACL,EAAE;YACF,UAAU;YACV,SAAS,EAAE,YAAY;YACvB,QAAQ;YACR,WAAW;YACX,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;SAClD,EACD,EAAE,QAAQ,EAAE,CACb,CAAC;QAEF,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,OAA+C,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,gCAAgC,CAAC;gBACzC,KAAK,EAAE,OAAO;gBACd,IAAI;gBACJ,GAAG;gBACH,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gBAC5B,EAAE;gBACF,SAAS,EAAE,YAAY;gBACvB,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;gBAC3C,UAAU;aACX,CAAC,CAAC;YACH,MAAM,6BAA6B,CACjC,UAAU,EACV,OAAO,EACP;gBACE;oBACE,CAAC,EAAE,OAAO;oBACV,QAAQ,EAAE,OAAO,CAAC,EAAE;oBACpB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,iBAAiB;iBAC3B;aACF,EACD,OAAO,CACR,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,QAAQ,GACZ,oHAAoH,CAAC;YACvH,MAAM,UAAU,GACd,iGAAiG,CAAC;YACpG,SAAS,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,IAAI;oBACJ,GAAG,EAAE,GAAG,IAAI,IAAI;oBAChB,UAAU;oBACV,IAAI;oBACJ,EAAE;oBACF,QAAQ;oBACR,SAAS,EAAE,YAAY;oBACvB,IAAI,EAAE,QAAQ;oBACd,QAAQ;oBACR,OAAO,EAAE,WAAW;oBACpB,UAAU;oBACV,MAAM;iBACP;gBACD,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,IAAI;gBAClC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ;aAClD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAErF,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,eAAe,CAAC,4CAA4C,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,yBAAyB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;YACnE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;SAC1B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,oCAAoC,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,OAAO,GAA+B;gBAC1C,GAAG,OAAO;gBACV,GAAG,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;gBAChD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;aACxB,CAAC;YACF,MAAM,6BAA6B,CACjC,UAAU,EACV,OAAO,EACP,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAChE,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,0FAA0F,CAC3F;SACA,cAAc,CAAC,cAAc,EAAE,kDAAkD,CAAC;SAClF,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC;SAC7C,cAAc,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SACvE,cAAc,CAAC,WAAW,EAAE,mCAAmC,CAAC;SAChE,cAAc,CAAC,WAAW,EAAE,2BAA2B,CAAC;SACxD,cAAc,CAAC,WAAW,EAAE,yBAAyB,CAAC;SACtD,MAAM,CACL,qBAAqB,EACrB,gGAAgG,CACjG;SACA,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,KAAK,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,0BAA0B,EAAE,KAAK,CAAC;SAC1D,MAAM,CAAC,aAAa,EAAE,uCAAuC,EAAE,KAAK,CAAC;SACrE,MAAM,CACL,4BAA4B,EAC5B,8EAA8E,CAC/E;SACA,MAAM,CAAC,qBAAqB,EAAE,kDAAkD,CAAC;SACjF,MAAM,CAAC,QAAQ,EAAE,6DAA6D,EAAE,KAAK,CAAC;SACtF,MAAM,CAAC,cAAc,EAAE,kDAAkD,EAAE,KAAK,CAAC;SACjF,MAAM,CACL,aAAa,EACb,4EAA4E,CAC7E;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAkB9B,MAAM,CAAC,GAAG,IAAe,CAAC;QAE1B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,WAAW,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,WAAW,CAAC,uDAAuD,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,WAAW,CAAC,yCAAyC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,WAAW,CAAC,4DAA4D,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,WAAW,CACnB,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QACD,IAAI,WAA+B,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,WAAW,CAAC,oDAAoD,CAAC,CAAC;YAC9E,CAAC;YACD,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,WAA+B,CAAC;QACpC,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;YACxD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,WAAW,CAAC,4CAA4C,CAAC,CAAC;YACtE,CAAC;YACD,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CACnB,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,yBAAyB,CAAC;YACvC,KAAK;YACL,IAAI;YACJ,GAAG;YACH,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS;YACT,YAAY,EAAE,OAAO;YACrB,OAAO,EAAE,EAAE;YACX,GAAG;YACH,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;YACtC,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,QAAQ;YACtB,WAAW;YACX,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,6BAA6B,CACjC,SAAS,EACT,MAAM,EACN;YACE;gBACE,CAAC,EAAE,KAAK;gBACR,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,SAAS;aACnB;SACF,EACD,KAAK,CACN,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC;YAClC,SAAS;YACT,GAAG;YACH,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAC7B,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/B,YAAY,EAAE,MAAM,CAAC,EAAE;YACvB,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;SACvC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,WAAW,CAAC,yCAAyC,CAAC,CAAC;QACnE,CAAC;QAED,SAAS,CAAC;YACR,eAAe,EAAE,MAAM,CAAC,EAAE;YAC1B,SAAS,EAAE;gBACT,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;gBAC7B,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB;YACD,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wDAAwD,CAAC;SACrE,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;SAClB,MAAM,CAAC,eAAe,EAAE,oBAAoB,EAAE,MAAM,CAAC;SACrD,MAAM,CAAC,cAAc,EAAE,8BAA8B,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,IAAwD,EAAE,OAAO,EAAE,EAAE;QAClF,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YAC7C,MAAM,IAAI,WAAW,CAAC,0BAA0B,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAEvC,IAAI,IAAI,GAAG,kBAAkB,CAAC,MAAM,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC;YAChB,KAAK,EAAE,aAAa;YACpB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;SACxB,CAAC,IAAI,CACP,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM,IAAI,GAAG,kBAAkB,CAC7B,MAAM,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,EAC3C,IAAI,CAAC,IAAI,CACV,CAAC;gBAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAElE,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,IAAI,GAA4B;wBACpC,KAAK,EAAE,gBAAgB;wBACvB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;wBACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;wBACvB,SAAS,EAAE,IAAI,CAAC,KAAK;wBACrB,WAAW,EAAE,IAAI,CAAC,OAAO;qBAC1B,CAAC;oBACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACvB,CAAC;oBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,CAAC;gBAED,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
export declare function getRootProgram(cmd: Command): Command;
|
|
3
|
+
export type GlobalCliOptions = {
|
|
4
|
+
network: string;
|
|
5
|
+
apiUrl?: string;
|
|
6
|
+
verbose?: boolean;
|
|
7
|
+
/** Root `--state-file` override (path to trade-state.json). */
|
|
8
|
+
stateFile?: string;
|
|
9
|
+
/** Root `--no-state`: disable state read/write for stateful order commands. */
|
|
10
|
+
noState?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function readGlobalOptions(cmd: Command): GlobalCliOptions;
|
|
13
|
+
/**
|
|
14
|
+
* Pure resolver for tests and CLI helpers.
|
|
15
|
+
* Precedence: subcommand `--state-file` → root `--state-file` → env `JCC_HYPER_STATE_FILE` → default `~/.jcc_hyper_tool/trade-state.json`
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveTradeStatePathFromGlobals(globals: Pick<GlobalCliOptions, "noState" | "stateFile">, localStateFile?: string | undefined, homeDir?: string, envStateFile?: string | undefined): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Resolved path for persisting trade state. Returns `undefined` when `--no-state` is set on the root command.
|
|
20
|
+
* Precedence: `localStateFile` (subcommand `--state-file`) → root `--state-file` → env `JCC_HYPER_STATE_FILE` → default ~/.jcc_hyper_tool/trade-state.json
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveTradeStatePath(cmd: Command, localStateFile?: string | undefined): string | undefined;
|
|
23
|
+
export declare function requireStateCliEnabled(cmd: Command, hint: string): void;
|
|
24
|
+
export declare function printJson(value: unknown): void;
|
|
25
|
+
export declare function logVerbose(cmd: Command, message: string): void;
|
|
26
|
+
/** HIP-3 `deployer:ASSET` → infer `/info` meta `dex` (substring before `:`). */
|
|
27
|
+
export { inferHlDexFromPrefixedPerpCoin as inferHlDexFromPrefixedCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
|
|
28
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/cli/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMpD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAIhE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,WAAW,CAAC,EACxD,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,CAAC,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAiBpB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,GAClC,MAAM,GAAG,SAAS,CAQpB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKvE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAK9D;AAED,gFAAgF;AAChF,OAAO,EAAE,8BAA8B,IAAI,0BAA0B,EAAE,MAAM,yCAAyC,CAAC"}
|